本程序使用STC8H8K64U单片机
测量0-100K的阻值时,读数没什么问题,但是测100K以上阻值时,显示结果不正常。
把电路中51K的阻值换成300K阻值,测试结果还是不行。
出现这种情况是那方面的问题呢。
以下是与测试阻值有关的程序。
- #include "STC8H.H"
- #include "intrins.h"
- /*宏定义*/
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- #define TOL 900 //公差
- #define VCC 5000 //电压常量(毫伏)
- #define VCR 5100 //阻值常量
- #define LIM 4000 //开路电压阈值常量(毫伏)
- /*端口定义*/
- sbit ADKA=P1^0; //测阻1
- sbit ADKB=P1^1; //测阻2
- sbit ADCA=P1^4; //ADC1
- sbit ADCB=P1^5; //ADC2
- sbit ADCO=P1^6; //ADC4
- sbit LEDG=P5^0; //绿灯
- sbit LEDR=P5^1; //红灯
- sbit HC595_SER = P0^0; //数据
- sbit HC595_SRCLK = P0^1; //移位时钟
- sbit HC595_RCLK = P0^2; //锁存
- uchar code table[]={ //共阴数码管段码标准字库
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
- // black - H J K L N o P U t G Q r M y
- 0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
- // 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
- 0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};
- uchar data dis_buf[4]={~0x3F,~0x3F,~0x3F,~0x3F};//显示缓存
- /*全局变量*/
- uint VinA; //测电压A
- uint VinB; //测电压B
- uint RinD; //测电阻
- uint VADC; //ADC转换结果
- uint vector; //向量
- bit flag=0; //标志
- bit flag1=0; //
- bit allow; //允许
- uint count; //计数
- uint count1;
- uint count2;
- uint VR;
- /*本地子函数*/
- void Delay500us(void); //延时函数
- void Delay_ms(uint t); //延时函数
- void Timer0_Init(void); //初始化定时器0
- void ADC_Init(void); //初始化ADC
- uint ADC_Read(uchar ch); //读取ADC结果
- uint ADC_R(uchar dat); //换算ADC电阻
- uint ADC_V(uchar dat); //换算ADC电压
- uint exist_VR(uchar dat); //测量VR存在
- void symmetry_VR(void); //测量VR电阻程序
- void Send_595(uchar dat); //595发送一个字节
- void DisplayScan(); //595多字节驱动数码管静态显示
- void Renewal(); //数码管缓存更新
- //主函数
- void main()
- {
- uchar RH,RL;
- //初始化端口模式配置
- P0M0 = 0x00;P0M1 = 0x00; //全部为准双向口
- P1M0 = 0x00;P1M1 = 0xfb; //除P1.2NC外全部高阻
- P2M0 = 0x00;P2M1 = 0x00; //全部为准双向口
- P3M0 = 0x00;P3M1 = 0x00; //全部为准双向口
- P4M0 = 0x00;P4M1 = 0x00; //全部为准双向口
- P5M0 = 0x00;P5M1 = 0x00; //全部为准双向口
- P6M0 = 0x00;P6M1 = 0x00; //全部为准双向口
- P7M0 = 0x00;P7M1 = 0x00; //全部为准双向口
- Delay_ms(100);
- ADC_Init(); //初始化ADC
-
- while(1)
- {
- symmetry_VR(); //测量VR电阻
- dis_buf[0]=~(table[20]); //卜表示K
- dis_buf[1]=~(table[RinD/10%10]);
- dis_buf[2]=~(table[RinD/100%10]|0x80);//加小数点
- dis_buf[3]=~(table[RinD/1000%10]);
- DisplayScan(); //显示阻值
- if(RinD<(1250-225) || RinD>(1250+225))//12.5K+/-18% 阻值超过误差或没有装VR
- {
- LEDG=1; //绿灯熄
- //LEDR=0; //红灯亮 有缺陷
- flag=0; //继续
- }
- else //阻值正常
- {
- LEDG=0; //绿灯亮 正常
- LEDR=1; //红灯熄
- flag=1;
- }
- }
- }
- //延时函数
- void Delay500us(void) //500us@11.0592MHz
- {
- unsigned char data i, j;
- _nop_();
- _nop_();
- i = 8;
- j = 43;
- do
- {
- while (--j);
- } while (--i);
- }
- //延时函数
- void Delay_ms(unsigned int t) //@11.0592MHz
- {
- unsigned char data i, j;
- while (t--)
- {
- i = 15;
- j = 90;
- do
- {
- while (--j);
- } while (--i);
- }
- }
- //初始化ADC
- void ADC_Init(void)
- {
- P_SW2 |= 0x80; //开扩展寄存器
- ADCTIM = 0x3f; //设置ADC内部时序
- P_SW2 &= 0x7f; //关扩展寄存器
- ADCCFG = 0x2f; //设置ADC时钟为系统时钟/2/16,12位结果右对齐
- ADC_CONTR = 0x80; //使能ADC模块
- }
- //读取ADC结果
- uint ADC_Read(uchar ch)
- {
- ADC_CONTR = 0xc0|ch; //启动AD转换
- _nop_(); //小延时
- _nop_();
- while (!(ADC_CONTR & 0x20)); //查询ADC完成标志
- ADC_CONTR &= ~0x20; //清完成标志
- return ADC_RES << 8 | ADC_RESL;//返回12位ADC结果
- }
- //ADC电阻换算公式:被测阻值=((固定分压电阻值*AD转换值)/(4096-AD转换值)
- uint ADC_R(uchar dat)
- {
- uint teme;
- ADC_Read(dat); //丢掉两次检测
- ADC_Read(dat);
- VADC=ADC_Read(dat); //读取第x通道ADC结果
- teme=(VCR*(ulong)VADC)/(4096-VADC)-30;//计算阻值(减30为IO口限流电阻)
- return teme;
- }
复制代码
|