找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1259|回复: 2
打印 上一主题 下一主题
收起左侧

单片机测电阻阻值程序出现的问题

[复制链接]
跳转到指定楼层
楼主
本程序使用STC8H8K64U单片机
测量0-100K的阻值时,读数没什么问题,但是测100K以上阻值时,显示结果不正常。
把电路中51K的阻值换成300K阻值,测试结果还是不行。

出现这种情况是那方面的问题呢。
以下是与测试阻值有关的程序。
  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;  //数据
  20. sbit HC595_SRCLK = P0^1;  //移位时钟
  21. sbit HC595_RCLK  = P0^2;  //锁存

  22. uchar code table[]={      //共阴数码管段码标准字库
  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;                 //计数
  40. uint  count1;
  41. uint  count2;
  42. uint  VR;


  43. /*本地子函数*/
  44. void  Delay500us(void);       //延时函数
  45. void  Delay_ms(uint t);       //延时函数
  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发送一个字节
  54. void  DisplayScan();          //595多字节驱动数码管静态显示
  55. void  Renewal();              //数码管缓存更新
  56. //主函数
  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);//加小数点
  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;               //继续
  85.                         }
  86.                         else                     //阻值正常
  87.                         {
  88.                                 LEDG=0;               //绿灯亮 正常
  89.                                 LEDR=1;               //红灯熄         
  90.                                 flag=1;
  91.                         }
  92. }        
  93. }

  94. //延时函数
  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. //延时函数
  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时钟为系统时钟/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, 下载次数: 23)

测试电阻接线图

测试电阻接线图
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:879809 发表于 2024-6-5 22:56 | 只看该作者
数据溢出了呗,把数据带进去人工计算一下就能知道哪里超范围了。
回复

使用道具 举报

板凳
ID:1045846 发表于 2024-6-8 21:39 | 只看该作者
rundstedt 发表于 2024-6-5 22:56
数据溢出了呗,把数据带进去人工计算一下就能知道哪里超范围了。

感谢回复,换了一种电路和计算方式解决了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表