温度报警器制作Word格式文档下载.docx
《温度报警器制作Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《温度报警器制作Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
编写:
JiangX.net
最后更新:
09/04/16晚于寝室
******************************************************************/
#include<
AT89X52.h>
#include"
DS18B20.h"
#defineuintunsignedint
#defineucharunsignedchar//宏定义
#defineSETP3_1//定义调整键
#defineDECP3_2//定义减少键
#defineADDP3_3//定义增加键
#defineBEEPP3_7//定义蜂鸣器
bitshanshuo_st;
//闪烁间隔标志
bitbeep_st;
//蜂鸣器间隔标志
sbitDIAN=P2^7;
//小数点
ucharx=0;
//计数器
signedcharm;
//温度值全局变量
ucharn;
ucharset_st=0;
//状态标志
signedcharshangxian=38;
//上限报警温度,默认值为38
signedcharxiaxian=5;
//下限报警温度,默认值为5
ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器0*****/
voidInitTimer(void)
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;
//50ms(晶振12M)
/*****定时器0中断服务程序*****/
voidtimer0(void)interrupt1
x++;
/*****外部中断0服务程序*****/
voidint0(void)interrupt0
EX0=0;
//关外部中断0
if(DEC==0&
&
set_st==1)
{
shangxian--;
if(shangxian<
xiaxian)shangxian=xiaxian;
}
elseif(DEC==0&
set_st==2)
xiaxian--;
if(xiaxian<
0)xiaxian=0;
/*****外部中断1服务程序*****/
voidint1(void)interrupt2
EX1=0;
//关外部中断1
if(ADD==0&
shangxian++;
if(shangxian>
99)shangxian=99;
elseif(ADD==0&
xiaxian++;
if(xiaxian>
shangxian)xiaxian=shangxian;
}
/*****读取温度*****/
voidcheck_wendu(void)
uinta,b,c;
c=ReadTemperature()-5;
//获取温度值并减去DS18B20的温漂误差
a=c/100;
//计算得到十位数字
b=c/10-a*10;
//计算得到个位数字
m=c/10;
//计算得到整数位
n=c-a*100-b*10;
//计算得到小数位
if(m<
0){m=0;
n=0;
}//设置温度显示上限
if(m>
99){m=99;
n=9;
}//设置温度显示上限
/*****显示开机初始化等待画面*****/
Disp_init()
P2=0xbf;
//显示-
P1=0xf7;
Delay(200);
P1=0xfb;
P1=0xfd;
P1=0xfe;
P1=0xff;
//关闭显示
/*****显示温度子程序*****/
Disp_Temperature()//显示温度
P2=0xc6;
//显示C
Delay(300);
P2=LEDData[n];
//显示个位
P2=LEDData[m%10];
//显示十位
DIAN=0;
//显示小数点
P2=LEDData[m/10];
//显示百位
/*****显示报警温度子程序*****/
Disp_alarm(ucharbaojing)
P2=LEDData[baojing%10];
P2=LEDData[baojing/10];
if(set_st==1)P2=0x89;
elseif(set_st==2)P2=0xc7;
//上限H、下限L标示
/*****报警子程序*****/
voidAlarm()
if(x>
=10){beep_st=~beep_st;
x=0;
if((m>
=shangxian&
beep_st==1)||(m<
xiaxian&
beep_st==1))BEEP=0;
elseBEEP=1;
/*****主函数*****/
voidmain(void)
uintz;
InitTimer();
//初始化定时器
EA=1;
//全局中断开关
TR0=1;
ET0=1;
//开启定时器0
IT0=1;
IT1=1;
check_wendu();
for(z=0;
z<
300;
z++)
Disp_init();
while
(1)
if(SET==0)
Delay(2000);
do{}while(SET==0);
set_st++;
shanshuo_st=1;
if(set_st>
2)set_st=0;
if(set_st==0)
//关闭外部中断0
//关闭外部中断1
Disp_Temperature();
Alarm();
//报警检测
elseif(set_st==1)
BEEP=1;
//关闭蜂鸣器
EX0=1;
//开启外部中断0
EX1=1;
//开启外部中断1
=10){shanshuo_st=~shanshuo_st;
if(shanshuo_st){Disp_alarm(shangxian);
elseif(set_st==2)
if(shanshuo_st){Disp_alarm(xiaxian);
/*****END*****/
DS18B20.h:
#defineDQP3_6//定义DS18B20总线I/O
voidDelay_DS18B20(intnum)
while(num--);
/*****初始化DS18B20*****/
voidInit_DS18B20(void)
unsignedcharx=0;
DQ=1;
//DQ复位
Delay_DS18B20(8);
//稍做延时
DQ=0;
//单片机将DQ拉低
Delay_DS18B20(80);
//精确延时,大于480us
//拉高总线
Delay_DS18B20(14);
x=DQ;
//稍做延时后,如果x=0则初始化成功,x=1则初始化失败
Delay_DS18B20(20);
/*****读一个字节*****/
unsignedcharReadOneChar(void)
unsignedchari=0;
unsignedchardat=0;
for(i=8;
i>
0;
i--)
//给脉冲信号
dat>
>
=1;
if(DQ)
dat|=0x80;
Delay_DS18B20(4);
return(dat);
/*****写一个字节*****/
voidWriteOneChar(unsignedchardat)
i>
i--)
DQ=dat&
0x01;
Delay_DS18B20(5);
unsignedintReadTemperature(void)
unsignedchara=0;
unsignedcharb=0;
unsignedintt=0;
floattt=0;
Init_DS18B20();
WriteOneChar(0xCC);
//跳过读序号列号的操作
WriteOneChar(0x44);
//启动温度转换
WriteOneChar(0xBE);
//读取温度寄存器
a=ReadOneChar();
//读低8位
b=ReadOneChar();
//读高8位
t=b;
t<
<
=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;
//放大10倍输出并四舍五入
return(t);