蜂鸣器不响,我自己也不太懂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(); } }
|