找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1284|回復: 2
打印 上一主題 下一主題
收起左側

單片機測電阻阻值程序出現(xiàn)的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:1045846 發(fā)表于 2024-6-2 12:42 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本程序使用STC8H8K64U單片機
測量0-100K的阻值時,讀數(shù)沒什么問題,但是測100K以上阻值時,顯示結果不正常。
把電路中51K的阻值換成300K阻值,測試結果還是不行。

出現(xiàn)這種情況是那方面的問題呢。
以下是與測試阻值有關的程序。
  1. #include "STC8H.H"
  2. #include "intrins.h"
  3. /*宏定義*/
  4. #define uint  unsigned int
  5. #define uchar unsigned char
  6. #define ulong unsigned long
  7. #define TOL   900         //公差
  8. #define VCC   5000        //電壓常量(毫伏)
  9. #define VCR   5100        //阻值常量
  10. #define LIM   4000        //開路電壓閾值常量(毫伏)


  11. /*端口定義*/
  12. sbit ADKA=P1^0;           //測阻1
  13. sbit ADKB=P1^1;           //測阻2
  14. sbit ADCA=P1^4;           //ADC1
  15. sbit ADCB=P1^5;           //ADC2
  16. sbit ADCO=P1^6;           //ADC4
  17. sbit LEDG=P5^0;           //綠燈
  18. sbit LEDR=P5^1;           //紅燈
  19. sbit HC595_SER   = P0^0;  //數(shù)據(jù)
  20. sbit HC595_SRCLK = P0^1;  //移位時鐘
  21. sbit HC595_RCLK  = P0^2;  //鎖存

  22. uchar code table[]={      //共陰數(shù)碼管段碼標準字庫
  23. //       0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  24.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  25. //      black  -   H    J    K    L    N    o    P    U    t    G    Q    r    M    y
  26.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  27. //       0.   1.   2.   3.   4.   5.   6.   7.   8.   9.   -1
  28.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};
  29. uchar data dis_buf[4]={~0x3F,~0x3F,~0x3F,~0x3F};//顯示緩存
  30. /*全局變量*/
  31. uint  VinA;                  //測電壓A
  32. uint  VinB;                  //測電壓B
  33. uint  RinD;                  //測電阻
  34. uint  VADC;                  //ADC轉換結果
  35. uint  vector;                //向量
  36. bit   flag=0;                //標志
  37. bit   flag1=0;               //
  38. bit   allow;                 //允許
  39. uint  count;                 //計數(shù)
  40. uint  count1;
  41. uint  count2;
  42. uint  VR;


  43. /*本地子函數(shù)*/
  44. void  Delay500us(void);       //延時函數(shù)
  45. void  Delay_ms(uint t);       //延時函數(shù)
  46. void  Timer0_Init(void);      //初始化定時器0
  47. void  ADC_Init(void);         //初始化ADC
  48. uint  ADC_Read(uchar ch);     //讀取ADC結果
  49. uint  ADC_R(uchar dat);       //換算ADC電阻
  50. uint  ADC_V(uchar dat);       //換算ADC電壓
  51. uint  exist_VR(uchar dat);    //測量VR存在
  52. void  symmetry_VR(void);     //測量VR電阻程序
  53. void  Send_595(uchar dat);    //595發(fā)送一個字節(jié)
  54. void  DisplayScan();          //595多字節(jié)驅動數(shù)碼管靜態(tài)顯示
  55. void  Renewal();              //數(shù)碼管緩存更新
  56. //主函數(shù)
  57. void main()
  58. {
  59.         uchar RH,RL;
  60.         //初始化端口模式配置
  61.         P0M0 = 0x00;P0M1 = 0x00; //全部為準雙向口
  62.         P1M0 = 0x00;P1M1 = 0xfb; //除P1.2NC外全部高阻
  63.         P2M0 = 0x00;P2M1 = 0x00; //全部為準雙向口
  64.         P3M0 = 0x00;P3M1 = 0x00; //全部為準雙向口
  65.         P4M0 = 0x00;P4M1 = 0x00; //全部為準雙向口
  66.         P5M0 = 0x00;P5M1 = 0x00; //全部為準雙向口
  67.         P6M0 = 0x00;P6M1 = 0x00; //全部為準雙向口
  68.         P7M0 = 0x00;P7M1 = 0x00; //全部為準雙向口
  69.         Delay_ms(100);
  70.         ADC_Init();              //初始化ADC
  71.         
  72.         while(1)
  73.         {
  74.                         symmetry_VR();          //測量VR電阻
  75.                         dis_buf[0]=~(table[20]); //卜表示K
  76.                         dis_buf[1]=~(table[RinD/10%10]);
  77.                         dis_buf[2]=~(table[RinD/100%10]|0x80);//加小數(shù)點
  78.                         dis_buf[3]=~(table[RinD/1000%10]);
  79.                         DisplayScan();           //顯示阻值
  80.       if(RinD<(1250-225) || RinD>(1250+225))//12.5K+/-18% 阻值超過誤差或沒有裝VR
  81.                         {
  82.                                 LEDG=1;               //綠燈熄
  83.                                 //LEDR=0;               //紅燈亮 有缺陷
  84.                                 flag=0;               //繼續(xù)
  85.                         }
  86.                         else                     //阻值正常
  87.                         {
  88.                                 LEDG=0;               //綠燈亮 正常
  89.                                 LEDR=1;               //紅燈熄         
  90.                                 flag=1;
  91.                         }
  92. }        
  93. }

  94. //延時函數(shù)
  95. void Delay500us(void)             //500us@11.0592MHz
  96. {
  97.         unsigned char data i, j;
  98.         _nop_();
  99.         _nop_();
  100.         i = 8;
  101.         j = 43;
  102.         do
  103.         {
  104.                 while (--j);
  105.         } while (--i);
  106. }
  107. //延時函數(shù)
  108. void Delay_ms(unsigned int t)        //@11.0592MHz
  109. {
  110.         unsigned char data i, j;
  111.         while (t--)
  112.         {
  113.                 i = 15;
  114.                 j = 90;
  115.                 do
  116.                 {
  117.                         while (--j);
  118.                 } while (--i);
  119.         }
  120. }


  121. //初始化ADC
  122. void ADC_Init(void)
  123. {
  124.         P_SW2 |= 0x80;           //開擴展寄存器
  125.         ADCTIM = 0x3f;           //設置ADC內部時序
  126.         P_SW2 &= 0x7f;           //關擴展寄存器
  127.         ADCCFG = 0x2f;           //設置ADC時鐘為系統(tǒng)時鐘/2/16,12位結果右對齊
  128.         ADC_CONTR = 0x80;        //使能ADC模塊
  129. }
  130. //讀取ADC結果
  131. uint ADC_Read(uchar ch)
  132. {
  133.         ADC_CONTR = 0xc0|ch;           //啟動AD轉換
  134.         _nop_();                       //小延時
  135.         _nop_();
  136.         while (!(ADC_CONTR & 0x20));   //查詢ADC完成標志
  137.         ADC_CONTR &= ~0x20;            //清完成標志
  138.         return ADC_RES << 8 | ADC_RESL;//返回12位ADC結果
  139. }
  140. //ADC電阻換算公式:被測阻值=((固定分壓電阻值*AD轉換值)/(4096-AD轉換值)
  141. uint ADC_R(uchar dat)
  142. {
  143.         uint teme;
  144.         ADC_Read(dat);                 //丟掉兩次檢測
  145.         ADC_Read(dat);
  146.         VADC=ADC_Read(dat);            //讀取第x通道ADC結果
  147.         teme=(VCR*(ulong)VADC)/(4096-VADC)-30;//計算阻值(減30為IO口限流電阻)
  148.         return teme;
  149. }


復制代碼



51hei圖片_20240602124507.png (21.42 KB, 下載次數(shù): 23)

測試電阻接線圖

測試電阻接線圖
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:879809 發(fā)表于 2024-6-5 22:56 | 只看該作者
數(shù)據(jù)溢出了唄,把數(shù)據(jù)帶進去人工計算一下就能知道哪里超范圍了。
回復

使用道具 舉報

板凳
ID:1045846 發(fā)表于 2024-6-8 21:39 | 只看該作者
rundstedt 發(fā)表于 2024-6-5 22:56
數(shù)據(jù)溢出了唄,把數(shù)據(jù)帶進去人工計算一下就能知道哪里超范圍了。

感謝回復,換了一種電路和計算方式解決了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表