|
本程序使用STC8H8K64U單片機(jī)
測(cè)量0-100K的阻值時(shí),讀數(shù)沒什么問題,但是測(cè)100K以上阻值時(shí),顯示結(jié)果不正常。
把電路中51K的阻值換成300K阻值,測(cè)試結(jié)果還是不行。
出現(xiàn)這種情況是那方面的問題呢。
以下是與測(cè)試阻值有關(guān)的程序。
- #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; //測(cè)阻1
- sbit ADKB=P1^1; //測(cè)阻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; //數(shù)據(jù)
- sbit HC595_SRCLK = P0^1; //移位時(shí)鐘
- sbit HC595_RCLK = P0^2; //鎖存
- uchar code table[]={ //共陰數(shù)碼管段碼標(biāo)準(zhǔn)字庫(kù)
- // 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; //測(cè)電壓A
- uint VinB; //測(cè)電壓B
- uint RinD; //測(cè)電阻
- uint VADC; //ADC轉(zhuǎn)換結(jié)果
- uint vector; //向量
- bit flag=0; //標(biāo)志
- bit flag1=0; //
- bit allow; //允許
- uint count; //計(jì)數(shù)
- uint count1;
- uint count2;
- uint VR;
- /*本地子函數(shù)*/
- void Delay500us(void); //延時(shí)函數(shù)
- void Delay_ms(uint t); //延時(shí)函數(shù)
- void Timer0_Init(void); //初始化定時(shí)器0
- void ADC_Init(void); //初始化ADC
- uint ADC_Read(uchar ch); //讀取ADC結(jié)果
- uint ADC_R(uchar dat); //換算ADC電阻
- uint ADC_V(uchar dat); //換算ADC電壓
- uint exist_VR(uchar dat); //測(cè)量VR存在
- void symmetry_VR(void); //測(cè)量VR電阻程序
- void Send_595(uchar dat); //595發(fā)送一個(gè)字節(jié)
- void DisplayScan(); //595多字節(jié)驅(qū)動(dòng)數(shù)碼管靜態(tài)顯示
- void Renewal(); //數(shù)碼管緩存更新
- //主函數(shù)
- void main()
- {
- uchar RH,RL;
- //初始化端口模式配置
- P0M0 = 0x00;P0M1 = 0x00; //全部為準(zhǔn)雙向口
- P1M0 = 0x00;P1M1 = 0xfb; //除P1.2NC外全部高阻
- P2M0 = 0x00;P2M1 = 0x00; //全部為準(zhǔn)雙向口
- P3M0 = 0x00;P3M1 = 0x00; //全部為準(zhǔn)雙向口
- P4M0 = 0x00;P4M1 = 0x00; //全部為準(zhǔn)雙向口
- P5M0 = 0x00;P5M1 = 0x00; //全部為準(zhǔn)雙向口
- P6M0 = 0x00;P6M1 = 0x00; //全部為準(zhǔn)雙向口
- P7M0 = 0x00;P7M1 = 0x00; //全部為準(zhǔn)雙向口
- Delay_ms(100);
- ADC_Init(); //初始化ADC
-
- while(1)
- {
- symmetry_VR(); //測(cè)量VR電阻
- dis_buf[0]=~(table[20]); //卜表示K
- dis_buf[1]=~(table[RinD/10%10]);
- dis_buf[2]=~(table[RinD/100%10]|0x80);//加小數(shù)點(diǎn)
- 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; //繼續(xù)
- }
- else //阻值正常
- {
- LEDG=0; //綠燈亮 正常
- LEDR=1; //紅燈熄
- flag=1;
- }
- }
- }
- //延時(shí)函數(shù)
- void Delay500us(void) //500us@11.0592MHz
- {
- unsigned char data i, j;
- _nop_();
- _nop_();
- i = 8;
- j = 43;
- do
- {
- while (--j);
- } while (--i);
- }
- //延時(shí)函數(shù)
- 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; //開擴(kuò)展寄存器
- ADCTIM = 0x3f; //設(shè)置ADC內(nèi)部時(shí)序
- P_SW2 &= 0x7f; //關(guān)擴(kuò)展寄存器
- ADCCFG = 0x2f; //設(shè)置ADC時(shí)鐘為系統(tǒng)時(shí)鐘/2/16,12位結(jié)果右對(duì)齊
- ADC_CONTR = 0x80; //使能ADC模塊
- }
- //讀取ADC結(jié)果
- uint ADC_Read(uchar ch)
- {
- ADC_CONTR = 0xc0|ch; //啟動(dòng)AD轉(zhuǎn)換
- _nop_(); //小延時(shí)
- _nop_();
- while (!(ADC_CONTR & 0x20)); //查詢ADC完成標(biāo)志
- ADC_CONTR &= ~0x20; //清完成標(biāo)志
- return ADC_RES << 8 | ADC_RESL;//返回12位ADC結(jié)果
- }
- //ADC電阻換算公式:被測(cè)阻值=((固定分壓電阻值*AD轉(zhuǎn)換值)/(4096-AD轉(zhuǎn)換值)
- uint ADC_R(uchar dat)
- {
- uint teme;
- ADC_Read(dat); //丟掉兩次檢測(cè)
- ADC_Read(dat);
- VADC=ADC_Read(dat); //讀取第x通道ADC結(jié)果
- teme=(VCR*(ulong)VADC)/(4096-VADC)-30;//計(jì)算阻值(減30為IO口限流電阻)
- return teme;
- }
復(fù)制代碼
|
|