|
用AD7705測試電壓,LCD1602上顯示的電壓值是正常的,但設(shè)置的報(bào)警條件不起作用。償試了好久都不成功,各位老師幫忙看看是哪出錯(cuò)了。
謝謝。
- #include<reg52.h>
- #include"lcd.h"
- #define uint unsigned int
- #define uchar unsigned char
- #define ulong unsigned long
- sbit ADC_CS=P1^0; //AD7705使能端
- sbit ADC_CLK=P1^1; //AD7705外部時(shí)鐘信號(hào)輸入端
- sbit ADC_DIN=P1^2; //單片機(jī)給AD7705數(shù)據(jù)輸入端
- sbit ADC_DOUT=P1^3; //AD7705模數(shù)轉(zhuǎn)換結(jié)果輸出端
- sbit ADC_DRDY=P1^4; //AD7705邏輯輸出端,用于控制結(jié)果是否輸出
- uchar AD_data; //采樣值存儲(chǔ)
- sbit Alarm_led_red =P3^0; //超過電壓上限紅色led報(bào)警定義
- sbit Alarm_led_green=P3^1; //低于電壓下限蜂鳴器報(bào)警定義
- unsigned char ad_alarm; //報(bào)警值存儲(chǔ)單元
- uchar date[6]={0,0,0,0,0,0};
- uint result0[8]={0,0,0,0,0,0,0,0};
- uint result1[8]={0,0,0,0,0,0,0,0};
- void Display(uint AD_data);
- void Display1(uint AD_data);
- void Delay_1ms(uint c)
- {
- uchar a,b;
- for(;c>0;c--)
- {
- for(b=199;b>0;b--)
- {
- for(a=1;a>0;a--);
- }
- }
- }
- void WriteToReg_ADC(uint byteword ) //發(fā)送控制字
- {
- uint AD16bit,Token;
- uchar i;
- ADC_CLK=1;
- ADC_CS=0;
- Token=0x80;
- AD16bit=byteword;
- for(i=0;i<8;i++)
- {
- if(AD16bit&Token)
- ADC_DIN=1;
- else
- ADC_DIN=0;
- ADC_CLK=1;
- ADC_CLK=0;
- ADC_CLK=1;
- Token=Token>>1;
- }
- ADC_CLK=1;
- ADC_DIN=1;
- }
- uint ReadADC_16BitValue(uchar channel) //發(fā)送控制字準(zhǔn)備讀取的通道,接著讀取數(shù)據(jù)
- {
- uint AD16bit;
- uchar i;
- WriteToReg_ADC(0x38|channel);
- while(ADC_DRDY==1);
- ADC_CLK=1;
- ADC_CS=0;
- AD16bit=0x00;
- for(i=0;i<16;i++)
- {
- AD16bit=AD16bit<<1;
- ADC_CLK=0;
- if(ADC_DOUT==1)
- AD16bit=AD16bit|0x01;
- ADC_CLK=1;
- }
- ADC_CLK=1;
- ADC_DIN=1;
- return(AD16bit);
- }
- void InitADC()
- {
- uchar i;
- ADC_CLK=1;
- ADC_DIN=1;
- ADC_CS=0;
- for(i=0;i<40;i++) //自校驗(yàn)
- {
- ADC_CLK=0;
- ADC_CLK=1;
- }
- WriteToReg_ADC(0x20);
- WriteToReg_ADC(0x02);
- WriteToReg_ADC(0x10);
- WriteToReg_ADC(0x44);
- WriteToReg_ADC(0x21);
- WriteToReg_ADC(0x02);
- WriteToReg_ADC(0x11);
- WriteToReg_ADC(0x44);
- Delay_1ms(50);
- }
- void main()
- {
- uchar i;
- ulong sum=0;
- uint result;
- float h;
- lcd1602init();
- InitADC();
- lcd1602writecom(0x80);
- lcd1602writedata('1');
- lcd1602writecom(0x81);
- lcd1602writedata(':');
- lcd1602writecom(0x83);
- lcd1602writedata('.');
- lcd1602writecom(0x87);
- lcd1602writedata('V');
- lcd1602writecom(0xc0);
- lcd1602writedata('2');
- lcd1602writecom(0xc1);
- lcd1602writedata(':');
- lcd1602writecom(0xc3);
- lcd1602writedata('.');
- lcd1602writecom(0xc7);
- lcd1602writedata('V');
- while(1)
- {
- WriteToReg_ADC(0x20);
- WriteToReg_ADC(0x02);
- WriteToReg_ADC(0x10);
- WriteToReg_ADC(0x44);
- Delay_1ms(60);
- for(i=0;i<8;i++)
- {
- result0[i]=ReadADC_16BitValue(0);
- sum=sum+result0[i];
- }
- sum=sum/8;
- result=(uint)sum;
- sum=0;
- h=result;
- result=h*5000/65536;
- Display(result);
- result=0;
- // Delay_1ms(500);
-
- WriteToReg_ADC(0x21);
- WriteToReg_ADC(0x02);
- WriteToReg_ADC(0x11);
- WriteToReg_ADC(0x44);
- Delay_1ms(60);
- for(i=0;i<8;i++)
- {
- result1[i]=ReadADC_16BitValue(1);
- sum=sum+result1[i];
- }
- sum=sum/8;
- result=(uint)sum;
- sum=0;
- h=result;
- result=(float)h*5000/65536;
- Display1(result);
- result=0;
- // Delay_1ms(500);
- }
- }
- void Display(uint AD_data)
- {
- date[4]=AD_data%10000/1000;
- date[2]=AD_data%1000/100;
- date[1]=AD_data%100/10;
- date[0]=AD_data%10;
- lcd1602writecom(0x82);
- lcd1602writedata(48+date[4]);
- lcd1602writecom(0x84);
- lcd1602writedata(48+date[2]);
- lcd1602writecom(0x85);
- lcd1602writedata(48+date[1]);
- lcd1602writecom(0x86);
- lcd1602writedata(48+date[0]);
- }
- void Display1(uint AD_data)
- {
- date[4]=AD_data%10000/1000;
- date[2]=AD_data%1000/100;
- date[1]=AD_data%100/10;
- date[0]=AD_data%10;
- lcd1602writecom(0xc2);
- lcd1602writedata(48+date[4]);
- lcd1602writecom(0xc4);
- lcd1602writedata(48+date[2]);
- lcd1602writecom(0xc5);
- lcd1602writedata(48+date[1]);
- lcd1602writecom(0xc6);
- lcd1602writedata(48+date[0]);
- }
- /*****************報(bào)警子函數(shù)*******************/
- void alarm(void)
- {
- if((AD_data<=2000)&&(AD_data>=1500)) //電壓高于1.5V,低于2.0V
- {
- (Alarm_led_green=0)&(Alarm_led_red=1); //綠燈亮,蜂鳴器關(guān)閉
- }
- else if((AD_data<=200)) //電壓低于0.2V
- {
- (Alarm_led_red=1)&(Alarm_led_green=1); //綠燈滅,蜂鳴器關(guān)閉
- }
- else
- (Alarm_led_green=1)&(Alarm_led_red=0); //綠燈滅,蜂鳴器打開
- }
復(fù)制代碼
|
|