51单片机数字温度报警器_DS18B20可调上下限
(仿真+程序+原理图)
原理图:Altium Designer
仿真版本:proteus 7.8
程序编译器:keil 4/keil 5
编程语言:C语言
设计编号:S0009
目录标题
51单片机数字温度报警器_DS18B20可调上下限主要功能操作说明仿真图原理图程序设计主函数外部中断函数DS18B20驱动资料清单主要功能
1、实时温度测量及显示,超出温度范围声光报警,上下限温度可通过按键设定等功能;
2、温度测量范围0到99.9摄氏度,精度为0.1摄氏度;
3、可设置上下限报警温度,默认上限报警温度为38℃、默认下限报警温度为5℃(通过程序可以更改上下限值);
4、报警值可设置范围:最低上限报警值等于当前下限报警值,最高下限报警值等于当前上限报警值。将下限报警值调为0时为关闭下限报警功能。
操作说明
1、开机:打开电源,机器进入初始化状态,此时数码管显示 - - - -;片刻即开始显示当前温度。
2、查看当前上下限温度范围:按下【S1】键(左边键),数码管闪烁显示Hxxx,H表示上限温度,再次按下【S1】键,数码管闪烁显示Lxxx, L表示下限温度。再按【S1】键时退出设置,数码管显示当前实时温度。
3、重新设定上下限温度范围:按下【S1】键一次,数码管闪烁显示Hxxx时,此时是设定上限温度,按【S3】键加温度,【S2】键减温度。再按下【S1】键一次,此时是设定下限温度,数码管闪烁显示Lxxx时,按【S3】键加温度,【S2】键减温度。再按下【S1】键一次,设置成功并退出设置。
4、报警:当检测到当前实时温度高于上限温度值,或者低于下限温度值,系统会自动发出报警,报警为红灯一直闪烁且蜂鸣器随着灯的频率响。除非重设上下限温度范围,否则报警一直持续。
仿真图
原理图
程序设计
主函数
void main(void){uint z;InitTimer(); //初始化定时器EA=1;//全局中断开关TR0=1;ET0=1;//开启定时器0IT0=1; IT1=1;check_wendu();check_wendu();for(z=0;z<300;z++){Disp_init(); }while(1){if(SET==0){Delay(2000);do{}while(SET==0);set_st++;x=0;shanshuo_st=1;if(set_st>2)set_st=0;}if(set_st==0){EX0=0; //关闭外部中断0EX1=0; //关闭外部中断1check_wendu();Disp_Temperature();Alarm(); //报警检测}else if(set_st==1){BEEP=1; //关闭蜂鸣器ALAM=1;EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st) {Disp_alarm(shangxian);}}else if(set_st==2){BEEP=1; //关闭蜂鸣器ALAM=1;EX0=1; //开启外部中断0EX1=1; //开启外部中断1if(x>=10){shanshuo_st=~shanshuo_st;x=0;}if(shanshuo_st) {Disp_alarm(xiaxian);}}}}
外部中断函数
/*****外部中断0服务程序*****/void int0(void) interrupt 0{EX0=0;//关外部中断0if(DEC==0&&set_st==1){do{Disp_alarm(shangxian);}while(DEC==0);shangxian--;if(shangxian<xiaxian)shangxian=xiaxian;}else if(DEC==0&&set_st==2){do{Disp_alarm(xiaxian);}while(DEC==0);xiaxian--;if(xiaxian<0)xiaxian=0;}}/*****外部中断1服务程序*****/void int1(void) interrupt 2{EX1=0;//关外部中断1if(ADD==0&&set_st==1){do{Disp_alarm(shangxian);}while(ADD==0);shangxian++;if(shangxian>99)shangxian=99;}else if(ADD==0&&set_st==2){do{Disp_alarm(xiaxian);}while(ADD==0);xiaxian++;if(xiaxian>shangxian)xiaxian=shangxian;} }
DS18B20驱动
程序流程图
unsigned int ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0x44); //启动温度转换Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作WriteOneChar(0xBE); //读取温度寄存器a=ReadOneChar();//读低8位b=ReadOneChar(); //读高8位t=b; //高8位转移到tt<<=8; //t数据左移8位t=t|a; //将t和a按位或,得到一个16位的数tt=t*0.0625; //将t乘以0.0625得到实际温度值(温度传感器设置12位精度,最小分辨率是0.0625)t= tt*10+0.5;//放大10倍(将小数点后一位显示出来)输出并四舍五入return(t); //返回温度值}
资料清单
资料下载链接