基于AT89C51单片机温度报警系统设计与制作Word下载.docx
《基于AT89C51单片机温度报警系统设计与制作Word下载.docx》由会员分享,可在线阅读,更多相关《基于AT89C51单片机温度报警系统设计与制作Word下载.docx(17页珍藏版)》请在冰豆网上搜索。
实现对环境温度的测量和显示能通过按键设置报警温度温度超过设置值时,产生光声报警报警同时系统自带小风扇转动以降低温度主程序主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见下图所示附录:
源程序/*/*温度报警器*/*/#include#include#defineucharunsignedchar#defineTubeP0/数码管端口#defineKeyP1/键盘端口sbitDQ=P14;
/温度传感器DS18B20数据传输端sbitBUZZER=P15;
/蜂鸣器端口sbitRUN=P16;
/运行指示灯端口sbitSET=P17;
/设置指示灯端口sbitFeng=P33;
/风扇端口bitStatus;
/设置状态标志位bitWarning;
/警报标志位bitInt;
/外部中断标志位ucharOP1L;
/原P1端低4位状态ucharNP1L;
/现P1端低4位状态ucharFinT;
/最终测得温度ucharLimT;
/警报温度下限ucharCount;
/定时器计数/*/#includeDelay.h#includeDisplay.h#includeInitialize.h#includeError.h#includeKeyScan.h#includeMeasure.h#includeInterrupt.h/*/*主程序*/*/voidmain()Initialize();
/初始化do/开机自检,跳过默认初始的85Measure();
while(FinT=0X55);
while
(1)KeyScan();
/键盘扫描Measure();
/获取测量温度Display();
/显示/*/*初始化*/*/voidInitialize()Status=0;
/初始化设置状态标志位Warning=0;
/初始化警报标志位BUZZER=1;
/初始化蜂鸣器状态RUN=0;
/初始化运行指示灯SET=1;
/初始化设置指示灯Feng=1;
/初始化风扇端口OP1L=0X00;
/初始化原P1低4位NP1L=0X00;
/初始化新P1低4位LimT=0X1B;
/初始化警报温度下限为27Count=0X00;
/初始化定时器计数单元EA=1;
/开总中断EX0=1;
/开外部中断0中断允许IT0=1;
/设置外部中断0为边沿触发方式/*/*温度测量*/*/voidInitDS18B20();
/初始化DS18B20voidWriteDS18B20(ucharch);
/写DS18B20数据ucharReadDS18B20();
/读DS18B20数据voidMeasure()ucharTemH;
/保存传感器发送数据高8位ucharTemL;
/保存传感器发送数据低8位InitDS18B20();
WriteDS18B20(0XCC);
/跳过ROM_nop_();
InitDS18B20();
WriteDS18B20(0X44);
/发送温度转换指令Delay1ms(25);
Delay1ms(25);
/等待1s转换InitDS18B20();
/跳过ROMWriteDS18B20(0XBE);
/发送温度转换指令TemL=ReadDS18B20();
/读低位温度值TemH=ReadDS18B20();
/读高位温度值Delay1ms
(2);
TemH=(TemH4);
/保留温度值整数部分FinT=TemH;
if(FinTLimT)/判断是否警报Warning=1;
elseWarning=0;
ucharReadDS18B20()/读DS18B20数据ucharch;
ucharq;
for(q=0;
q1;
DQ=0;
_nop_();
DQ=1;
if(DQ=1)ch=ch|0X80;
elsech=ch&
0X7f;
Delay15us(3);
return(ch);
voidWriteDS18B20(ucharch)/写DS18B20数据uchari;
for(i=0;
i1;
voidInitDS18B20()/初始化DS18B20DQ=0;
Delay15us(33);
/至少延时480usDQ=1;
Delay15us(10);
/至少延时100us/*/*显示*/*/voidDisplay()ucharT;
if(Status=1)/判断状态T=LimT;
elseT=FinT;
T=T%10+T/10*16;
/将2进制码转化为BCD码Tube=T;
/数码管显示RUN=Warning;
/运行指示灯显示BUZZER=!
Warning|Int;
/蜂鸣器Feng=!
Warning;
/风扇SET=!
Status;
/设置指示灯显示Delay1ms(20);
/*/*键盘扫描*/*/voidKeyScan()NP1L=Key;
/读取按键状态NP1L=NP1L&
0X0F;
NP1L=NP1L0X0F;
if(NP1L!
=OP1L)switch(NP1L)/判断按键case0X01:
/按键为“设置”Status=1;
/进入设置状态break;
case0X02:
/按键为“+1”if(Status=1)/判断是否为设置状态LimT+;
/警报温度下限+1LimT=LimT%100;
/超过99清零Delay1ms(255);
elseError();
break;
case0X04:
/按键为“-1”if(Status=1)/判断是否为设置状态LimT-;
/警报温度下限-1if(LimT0)LimT=0X63;
/低于0变为99Delay1ms(255);
case0X08:
/按键为“确认”Status=0;
/返回测温状态break;
default:
/多键按下Error();
/出错复位break;
NP1L=0X00;
/重新初始化/*/*中断服务*/*/voidInt0(void)interrupt0Int=1;
/外部中断标志位置1EX0=0;
/关外部中断0中断允许TMOD=0X01;
/设置定时器0工作在模式1TH0=0X3C;
TL0=0XB0;
/为T0赋初值,令其定时50msCount=0X3C;
/设置计数次数ET0=1;
/开T0中断允许TR0=1;
/开T0中断/*/voidTimer0(void)interrupt1if(Count=0)/判断定时计数是否结束ET0=0;
/关T0中断允许TR0=0;
/关T0中断Int=0;
/外部中断标志位置0EX0=1;
/开外部中断0中断允许elseTL0=0XB0;
/重新赋T0初值TH0=0X3C;
Count-;
/定时计数减1/*/*延迟函数*/*/voidDelay15us(ucharn)/延迟n*15usdo_nop_();
n-;
while(n);
voidDelay1ms(uchardelay)/延迟delay*1msuchari;
while(delay-)for(i=0;
i124;
i+);
/*/*报错复位*/*/voidError()Tube=0XAA;
/出错显示BUZZER=0;
/鸣蜂鸣器RUN=1;
/LED警报Delay1ms(255);
/延迟Delay1ms(255);
Delay1ms(255);
(*(void(*)()0)();
/软复位