![]() |
wulin 發表于 2020-5-12 07:20 確實用不了(ó﹏ò),不過還是十分感謝的 |
A_cherry 發表于 2020-5-11 12:31 給你整理了一下,可以通過編譯。是否能用未經驗證。
|
沒有 uchar 的定義 |
在include下面加上#define uchar unsigned char 或者直接把程序中的uchar替換成unsigned char |
//程序頭函數 #include <reg52.h> //宏定義 #define uint unsigned int #define uchar unsigned char sbit LED_R= P2^2; //COled sbit LED_Y= P2^0; sbit FENG = P2^5; //蜂鳴器 sbit san=P3^4; //風扇 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; sbit A0=P3^1; //0809A0地址腳 //按鍵 sbit Key1=P2^6; //設置鍵 sbit Key2=P2^7; //加鍵 sbit Key3=P3^7; //減鍵 bit bdata flag4,flag138; uchar set; //函數聲明 extern uchar ADC0809(); extern void Key(); /* |
程序開頭沒有使用宏定義 #define uchar unsigned char |
木木de 發表于 2020-5-11 11:29 這是原程序,用的是keil uVersion4版本。 |
木木de 發表于 2020-5-11 11:29 //程序頭函數 #include <reg52.h> sbit LED_R= P2^2; //COled sbit LED_Y= P2^0; sbit FENG = P2^5; //蜂鳴器 sbit san=P3^4; //風扇 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; sbit A0=P3^1; //0809A0地址腳 //按鍵 sbit Key1=P2^6; //設置鍵 sbit Key2=P2^7; //加鍵 sbit Key3=P3^7; //減鍵 bit bdata flag4,flag138; uchar set; //函數聲明 extern uchar ADC0809(); extern void Key(); /* void delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<121;j++); } */ // uchar MQ4=0,MQ138=0; //讀取傳感器數據變量 //指示燈變量 uchar WARNING4=30,WARNING138=60; //初始上限值 void init() //定時器初始化函數 { TMOD=0x01; //工作方式采用16位定時方式,通過TR1置位啟動 TL0=0xb0; //這是給定時器T0設定時初值。分別給T0高8位,低8位送初值,這個值在12MHZ時,應該是定時50ms TH0=0x3c; //賦初值 EA=1; //打開中斷總開關 ET0=1; //打開中斷允許開關 TR0=1; //打開中斷定時開關 } void main() //主函數 { Init1602(); //初始化顯示函數 init(); //初始化定時器 while(1) //進入循環 { A0=0; //地址腳=0時,讀取MQ4數據 MQ4=ADC0809(); A0=1; //地址腳=1時,讀取MQ138數據 MQ138=ADC0809(); if(set==0) //不在設置狀態時 Display_1602(MQ4,MQ138,WARNING4,WARNING138); //正常顯示數據 if(set==0) { if(MQ4<WARNING4) //判斷數據是否小于報警值 flag4=0; else if(MQ4>WARNING4) flag4=1; if(MQ138<WARNING138) flag138=0; else if(MQ138>WARNING138) flag138=1; } else { flag4=0;flag138=0; } Key(); //掃描按鍵函數 } } //ADC0809讀取信息 uchar ADC0809() { uchar temp_=0x00; OE=0; //初始化高阻太 ST=0; //轉化初始化 ST=1; //開始轉換 ST=0; while(EOC==0) //外部中斷等待AD轉換結束 OE=1; //讀取轉換的AD值 temp_=Data_ADC0809; OE=0; return temp_; } void Key() //按鍵函數 { if(Key1==0) //設置按鍵 { while(Key1==0);//按鍵釋放 FENG=0; //打開蜂鳴器 set++; //設置變量加 flag4=0; flag138=0; //報警變量清零 LED_Y=1; LED_R=1; //關閉LED san=1; //關閉風扇 TR0=0; //關閉定時器 } if(set==1) //設置報警值 { write_com(0x38);//屏幕初始化 write_com(0x80+0x40+6);//位置 write_com(0x0f);//打開顯示 無光標 光標閃爍 write_com(0x06);//當讀或寫一個字符是指針后一一位 FENG=1; } if(set==2) { write_com(0x38);//屏幕初始化 write_com(0x80+0x40+15);//位置 write_com(0x0f);//打開顯示 無光標 光標閃爍 write_com(0x06);//當讀或寫一個字符是指針后一一位 FENG=1; } else if(set>=3) //設置完 { set=0; //清零 write_com(0x38);//屏幕初始化 write_com(0x0c);//打開顯示 無光標 無光標閃爍 FENG=1; //關閉蜂鳴器 TR0=1; //打開定時器 } if(Key2==0&&set==1) //加按鍵按下 { while(Key2==0); //按鍵釋放 FENG=0; //打開蜂鳴器,做按鍵音 WARNING4++; //報警值加 if(WARNING4>=255) //報警值加到最大 WARNING4=0; //報警值清零 write_com(0x80+0x40+4); //選中位置顯示報警值 write_data('0'+WARNING4/100); //將報警值拆開成單獨的一位,顯示。例如報警值是123,那么123除以100的商是1,這里顯示的就是1 write_data('0'+WARNING4/10%10); //123除以10得到的商是12,,12除以10的余數就是2,這里顯示的就是2 write_data('0'+WARNING4%10); //123除以10的余數是3,這里顯示的就是3,數據+“0”是為了得到液晶中對應數字的顯示碼 write_com(0x80+0x40+6); //閃爍的位置 FENG=1; //關閉蜂鳴器 } if(Key2==0&&set==2) //注釋同上 { while(Key2==0); FENG=0; WARNING138++; if(WARNING138>=255) WARNING138=0; write_com(0x80+0x40+13); write_data('0'+WARNING138/100); write_data('0'+WARNING138/10%10); write_data('0'+WARNING138%10); write_com(0x80+0x40+15);//位置 FENG=1; } if(Key3==0&&set==1) { while(Key3==0); FENG=0; WARNING4--; if(WARNING4<=0) WARNING4=255; write_com(0x80+0x40+4); write_data('0'+WARNING4/100); write_data('0'+WARNING4/10%10); write_data('0'+WARNING4%10); write_com(0x80+0x40+6);//位置 FENG=1; } if(Key3==0&&set==2) { while(Key3==0); FENG=0; WARNING138--; if(WARNING138<=0) WARNING138=255; write_com(0x80+0x40+13); write_data('0'+WARNING138/100); write_data('0'+WARNING138/10%10); write_data('0'+WARNING138%10); write_com(0x80+0x40+15);//位置 FENG=1; } } void time1_int(void) interrupt 1//定時器工作函數 { uchar count; //定義變量用于定時 TL0=0xb0; TH0=0x3c; //定時器重新賦初值50ms count++; //變量50ms加一次 if(count==10) //加10次就是500ms { count=0; //變量清零 if(flag4==0) //報警關 LED_Y=1; //報警指示燈熄滅 else //報警開 LED_Y=0; //對應的報警指示燈點亮 if(flag138==0) LED_R=1; else LED_R=0; if(flag4==1||flag138==1) //有報警 { FENG=!FENG; //蜂鳴器閃爍報警 san=0; //打開繼電器啟動風扇 } if(flag4==0&&flag138==0) //都沒有報警 { FENG=1; //關閉蜂鳴器 san=1; //關閉風扇 } } } 顯示 //宏定義 #define uint unsigned int #define uchar unsigned char //LCD管腳聲明 sbit LCDRS = P2^3; sbit LCDEN= P2^4; //初始畫時顯示的內容 uchar code Init1[]="MQ4: MQ138 : "; uchar code Init2[]="H4 : H138 : "; //LCD延時 void LCDdelay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); } //寫命令 void write_com(uchar com) { LCDRS=0; P0=com; LCDdelay(5); LCDEN=1; LCDdelay(5); LCDEN=0; } //寫數據 void write_data(uchar date) { LCDRS=1; P0=date; LCDdelay(5); LCDEN=1; LCDdelay(5); LCDEN=0; } //1602初始化 void Init1602() { uchar i=0; write_com(0x38);//屏幕初始化 write_com(0x0c);//打開顯示 無光標 無光標閃爍 write_com(0x06);//當讀或寫一個字符是指針后一一位 write_com(0x01);//清屏 write_com(0x80);//設置位置 for(i=0;i<16;i++) { write_data(Init1); } write_com(0x80+0x40);//設置位置 for(i=0;i<16;i++) { write_data(Init2); } } void Display_1602(uchar NOW_GAS,uchar NOW_CO,uchar SET_GAS,uchar SET_CO) { write_com(0x80+4); write_data('0'+NOW_GAS/100); write_data('0'+NOW_GAS/10%10); write_data('0'+NOW_GAS%10); write_com(0x80+0x40+4); write_data('0'+SET_GAS/100); write_data('0'+SET_GAS/10%10); write_data('0'+SET_GAS%10); write_com(0x80+13); write_data('0'+NOW_CO/100); write_data('0'+NOW_CO/10%10); write_data('0'+NOW_CO%10); write_com(0x80+0x40+13); write_data('0'+SET_CO/100); write_data('0'+SET_CO/10%10); write_data('0'+SET_CO%10); } |
//程序頭函數 #include <reg52.h> sbit LED_R= P2^2; //COled sbit LED_Y= P2^0; sbit FENG = P2^5; //蜂鳴器 sbit san=P3^4; //風扇 //ADC0809 sbit ST=P3^3; sbit EOC=P3^6; sbit OE=P3^2; sbit A0=P3^1; //0809A0地址腳 //按鍵 sbit Key1=P2^6; //設置鍵 sbit Key2=P2^7; //加鍵 sbit Key3=P3^7; //減鍵 bit bdata flag4,flag138; uchar set; //函數聲明 extern uchar ADC0809(); extern void Key(); /* void delay(uint z) { uint i,j; for(i=0;i<z;i++) for(j=0;j<121;j++); } */ // uchar MQ4=0,MQ138=0; //讀取傳感器數據變量 //指示燈變量 uchar WARNING4=30,WARNING138=60; //初始上限值 void init() //定時器初始化函數 { TMOD=0x01; //工作方式采用16位定時方式,通過TR1置位啟動 TL0=0xb0; //這是給定時器T0設定時初值。分別給T0高8位,低8位送初值,這個值在12MHZ時,應該是定時50ms TH0=0x3c; //賦初值 EA=1; //打開中斷總開關 ET0=1; //打開中斷允許開關 TR0=1; //打開中斷定時開關 } void main() //主函數 { Init1602(); //初始化顯示函數 init(); //初始化定時器 while(1) //進入循環 { A0=0; //地址腳=0時,讀取MQ4數據 MQ4=ADC0809(); A0=1; //地址腳=1時,讀取MQ138數據 MQ138=ADC0809(); if(set==0) //不在設置狀態時 Display_1602(MQ4,MQ138,WARNING4,WARNING138); //正常顯示數據 if(set==0) { if(MQ4<WARNING4) //判斷數據是否小于報警值 flag4=0; else if(MQ4>WARNING4) flag4=1; if(MQ138<WARNING138) flag138=0; else if(MQ138>WARNING138) flag138=1; } else { flag4=0;flag138=0; } Key(); //掃描按鍵函數 } } //ADC0809讀取信息 uchar ADC0809() { uchar temp_=0x00; OE=0; //初始化高阻太 ST=0; //轉化初始化 ST=1; //開始轉換 ST=0; while(EOC==0) //外部中斷等待AD轉換結束 OE=1; //讀取轉換的AD值 temp_=Data_ADC0809; OE=0; return temp_; } void Key() //按鍵函數 { if(Key1==0) //設置按鍵 { while(Key1==0);//按鍵釋放 FENG=0; //打開蜂鳴器 set++; //設置變量加 flag4=0; flag138=0; //報警變量清零 LED_Y=1; LED_R=1; //關閉LED san=1; //關閉風扇 TR0=0; //關閉定時器 } if(set==1) //設置報警值 { write_com(0x38);//屏幕初始化 write_com(0x80+0x40+6);//位置 write_com(0x0f);//打開顯示 無光標 光標閃爍 write_com(0x06);//當讀或寫一個字符是指針后一一位 FENG=1; } if(set==2) { write_com(0x38);//屏幕初始化 write_com(0x80+0x40+15);//位置 write_com(0x0f);//打開顯示 無光標 光標閃爍 write_com(0x06);//當讀或寫一個字符是指針后一一位 FENG=1; } else if(set>=3) //設置完 { set=0; //清零 write_com(0x38);//屏幕初始化 write_com(0x0c);//打開顯示 無光標 無光標閃爍 FENG=1; //關閉蜂鳴器 TR0=1; //打開定時器 } if(Key2==0&&set==1) //加按鍵按下 { while(Key2==0); //按鍵釋放 FENG=0; //打開蜂鳴器,做按鍵音 WARNING4++; //報警值加 if(WARNING4>=255) //報警值加到最大 WARNING4=0; //報警值清零 write_com(0x80+0x40+4); //選中位置顯示報警值 write_data('0'+WARNING4/100); //將報警值拆開成單獨的一位,顯示。例如報警值是123,那么123除以100的商是1,這里顯示的就是1 write_data('0'+WARNING4/10%10); //123除以10得到的商是12,,12除以10的余數就是2,這里顯示的就是2 write_data('0'+WARNING4%10); //123除以10的余數是3,這里顯示的就是3,數據+“0”是為了得到液晶中對應數字的顯示碼 write_com(0x80+0x40+6); //閃爍的位置 FENG=1; //關閉蜂鳴器 } if(Key2==0&&set==2) //注釋同上 { while(Key2==0); FENG=0; WARNING138++; if(WARNING138>=255) WARNING138=0; write_com(0x80+0x40+13); write_data('0'+WARNING138/100); write_data('0'+WARNING138/10%10); write_data('0'+WARNING138%10); write_com(0x80+0x40+15);//位置 FENG=1; } if(Key3==0&&set==1) { while(Key3==0); FENG=0; WARNING4--; if(WARNING4<=0) WARNING4=255; write_com(0x80+0x40+4); write_data('0'+WARNING4/100); write_data('0'+WARNING4/10%10); write_data('0'+WARNING4%10); write_com(0x80+0x40+6);//位置 FENG=1; } if(Key3==0&&set==2) { while(Key3==0); FENG=0; WARNING138--; if(WARNING138<=0) WARNING138=255; write_com(0x80+0x40+13); write_data('0'+WARNING138/100); write_data('0'+WARNING138/10%10); write_data('0'+WARNING138%10); write_com(0x80+0x40+15);//位置 FENG=1; } } void time1_int(void) interrupt 1//定時器工作函數 { uchar count; //定義變量用于定時 TL0=0xb0; TH0=0x3c; //定時器重新賦初值50ms count++; //變量50ms加一次 if(count==10) //加10次就是500ms { count=0; //變量清零 if(flag4==0) //報警關 LED_Y=1; //報警指示燈熄滅 else //報警開 LED_Y=0; //對應的報警指示燈點亮 if(flag138==0) LED_R=1; else LED_R=0; if(flag4==1||flag138==1) //有報警 { FENG=!FENG; //蜂鳴器閃爍報警 san=0; //打開繼電器啟動風扇 } if(flag4==0&&flag138==0) //都沒有報警 { FENG=1; //關閉蜂鳴器 san=1; //關閉風扇 } } } 顯示 //宏定義 #define uint unsigned int #define uchar unsigned char //LCD管腳聲明 sbit LCDRS = P2^3; sbit LCDEN= P2^4; //初始畫時顯示的內容 uchar code Init1[]="MQ4: MQ138 : "; uchar code Init2[]="H4 : H138 : "; //LCD延時 void LCDdelay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=10;y>0;y--); } //寫命令 void write_com(uchar com) { LCDRS=0; P0=com; LCDdelay(5); LCDEN=1; LCDdelay(5); LCDEN=0; } //寫數據 void write_data(uchar date) { LCDRS=1; P0=date; LCDdelay(5); LCDEN=1; LCDdelay(5); LCDEN=0; } //1602初始化 void Init1602() { uchar i=0; write_com(0x38);//屏幕初始化 write_com(0x0c);//打開顯示 無光標 無光標閃爍 write_com(0x06);//當讀或寫一個字符是指針后一一位 write_com(0x01);//清屏 write_com(0x80);//設置位置 for(i=0;i<16;i++) { write_data(Init1[i]); } write_com(0x80+0x40);//設置位置 for(i=0;i<16;i++) { write_data(Init2[i]); } } void Display_1602(uchar NOW_GAS,uchar NOW_CO,uchar SET_GAS,uchar SET_CO) { write_com(0x80+4); write_data('0'+NOW_GAS/100); write_data('0'+NOW_GAS/10%10); write_data('0'+NOW_GAS%10); write_com(0x80+0x40+4); write_data('0'+SET_GAS/100); write_data('0'+SET_GAS/10%10); write_data('0'+SET_GAS%10); write_com(0x80+13); write_data('0'+NOW_CO/100); write_data('0'+NOW_CO/10%10); write_data('0'+NOW_CO%10); write_com(0x80+0x40+13); write_data('0'+SET_CO/100); write_data('0'+SET_CO/10%10); write_data('0'+SET_CO%10); } |
uchar不是標準的變量類型,可以改為unsigned char |