蜂鳴器不響,我自己也不太懂c語言,求大神指導,謝謝! #include<reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int
sbit DQ=P1^3; //DS18B20 定義使用單片機P17端口
sbit lcdrs=P2^7; //1602數據/命令選擇端 sbit lcdrw=P2^6; //1602讀/寫選擇端 sbit lcden=P2^5; //1602使能
sbit RJDQ=P1^4; //紅色LED 超過正常范圍值點亮 sbit BJDQ=P1^5; //藍色LED 低于正常范圍值點亮
sbit BELL=P2^4; //蜂鳴器報警控制端
sbit K1=P1^0; //設置鍵/確定鍵 sbit K2=P1^1; //數字調整鍵 加1 sbit K3=P1^2; //箭字調整鍵 減1
uint wendu=0; //溫度初始數值0度
uchar tem_h=30,tem_l=10;//溫濕度上下限變量
uchar keyflag_1=0; //按鍵標志位 根據按鍵次數執行操作內容
/********************延時函數,延時一毫秒************************/ void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=112;y>0;y--); } /**************************1602顯示****************************/
void write_cmd(char cmd) //寫指令函數 { lcdrs=0;//低電位送指令 P0=cmd; delay(1); lcden=1; delay(1); lcden=0;
} void write_data(uchar dat) //寫數據函數 { lcdrs=1;//高電位送數據 P0=dat ; delay(1); lcden=1; delay(1); lcden=0; } void write_str(uchar *str)//寫字符串函數 { while(*str!='\0') { write_data(*str++); delay(60); } }
/***************************初始化******************************/ void init() {
lcdrw=0;//先將RW拉低 lcden=0;//再把EN拉低 write_cmd(0x38);//顯示模式設置 write_cmd(0x0c);//開啟顯示屏,關光標,光標不閃爍 write_cmd(0x06);//顯示地址遞增,即寫一個數據后,顯示位置右移一位 write_cmd(0x01);//清除屏幕 write_cmd(0x80);//數據指針 把光標移到第一行第一個位置 } /************************DS18B20程序*************************/ bit init_DS18B20() { uchar num; bit flag; DQ=1; for(num=0;num<2;num++); //先拉高 DQ=0; for(num=0;num<200;num++); // 480-960us powerup DQ=1; for(num=0;num<20;num++); // >60us wait flag=DQ; // 響應 for(num=0;num<150;num++); // 60-240us ds18b20存在信號 DQ=1; return flag; }
void DS18B20_WR_CHAR(uchar byte)//寫18b20數據// { uchar num; uchar num1; for(num1=0;num1<8;num1++) { DQ=0; //拉低 _nop_(); //下拉1us _nop_(); DQ=byte&0x01; //寫數據,從地位開始 for(num=0;num<20;num++); // >60us wait byte>>=1; DQ=1; //拉高 _nop_(); _nop_(); } //8位數據,一位一位的寫入ds18b20 }
uchar DS18B20_RD_CHAR() //讀18b20數據 { uchar num; uchar num1; uchar byte=0; for(num1=0;num1<8;num1++) { DQ=0; //拉低 _nop_(); DQ=1; for(num=0;num<1;num++); // <10us byte>>=1; if(DQ==1) byte|=0x80; else byte|=0x00; DQ=1; //拉高 _nop_(); _nop_(); for(num=0;num<20;num++); // >60us
} return byte; } void DS18B20_WENDU() { uchartemperaturel=0; uchartemperatureh=0;
if(init_DS18B20()==0) { DS18B20_WR_CHAR(0xcc); //發命令:Skip ROM,跳過讀序列號 DS18B20_WR_CHAR(0x44); //啟動溫度轉換
if(init_DS18B20()==0) { DS18B20_WR_CHAR(0xcc); //發命令:SkipROM,跳過讀序列號 DS18B20_WR_CHAR(0xBE); //讀取溫度 _nop_(); temperaturel=DS18B20_RD_CHAR(); //溫度值低8為存入temperaturel temperatureh=DS18B20_RD_CHAR(); //溫度值高8為存入temperatureh wendu=(temperatureh*256+temperaturel)*0.625;//完成數據整合,溫度比正常大10倍 init_DS18B20(); } } }
void keyscan() //按鍵掃描 { if(K1==0) { delay(5); if(K1==0) { keyflag_1++; //鍵一按下,標志位加1 while(!K1); } } if(keyflag_1==3){keyflag_1=0;write_cmd(0x0c);} if(keyflag_1==1){write_cmd(0x89);write_cmd(0x0d);}//溫度上限末位打開光標 if(keyflag_1==2){write_cmd(0x8f);write_cmd(0x0d);} //溫度下限末位打開光標 if(keyflag_1!=0) { if(K2==0) //限值加鍵 { delay(5); //按鍵消除抖動判斷 if(K2==0) { while(!K2); if(keyflag_1==1) { tem_h++; if(tem_h==100)tem_h=0; write_cmd(0x88); write_data(tem_h/10+48); write_data(tem_h%10+48); } if(keyflag_1==2) { tem_l++; if(tem_l==100)tem_l=0; write_cmd(0x8e); write_data(tem_l/10+48); write_data(tem_l%10+48); } } } if(K3==0) //限值減鍵 { delay(5); //按鍵消除抖動判斷 if(K3==0) { while(!K3); if(keyflag_1==1) { tem_h--; if(tem_h==0)tem_h=99; write_cmd(0x88); write_data(tem_h/10+48); write_data(tem_h%10+48); } if(keyflag_1==2) { tem_l--; if(tem_l==0)tem_l=99; write_cmd(0x8e); write_data(tem_l/10+48); write_data(tem_l%10+48); } } } } }
/**********************報警判斷函數 ******************************/
void baojing() { uchar u; u=((wendu/100)%10)*10+(wendu/10)%10; //如果用同一個wendu變量,進入功能選擇是,wendu原來的值沒有保存變為0
if(u>=tem_h) //溫度大于設定上限值 {RJDQ=0; BELL=0;} //紅燈亮 蜂鳴器響 elseif(u<tem_l) //溫度低于下限值 {BJDQ=0; BELL=0;} //藍燈亮 蜂鳴器響 else{BELL=1;BJDQ=1;RJDQ=1;} //正常值 紅藍燈關 蜂鳴器關
}
/************************主函數******************************/ void main() { init(); //初始化1602界面 write_str(" SET: H= L= "); write_cmd(0x88); write_data((tem_h/10)+48); write_data(tem_h%10+48); write_cmd(0x8e); write_data((tem_l/10)+48); write_data(tem_l%10+48); write_cmd(0xc0); write_str(" temp: "); DS18B20_WENDU(); delay(1000); while(1) { keyscan(); if((init_DS18B20()==0)&&(keyflag_1==0)) { DS18B20_WENDU(); write_cmd(0xc7);//把光標移到第二行第七個位置 write_data((wendu/100)%10+48); write_data((wendu/10)%10+48); write_data('.'); write_data(wendu%10+48); write_data(0xdf); write_data('C'); } baojing(); } }
|