自动温度报警器毕设援助.docx
- 文档编号:5858461
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:18
- 大小:1.45MB
自动温度报警器毕设援助.docx
《自动温度报警器毕设援助.docx》由会员分享,可在线阅读,更多相关《自动温度报警器毕设援助.docx(18页珍藏版)》请在冰豆网上搜索。
自动温度报警器毕设援助
自动温度报警器报警(毕设援助)
一、简介:
该温度报警器采用+5V,500~700mA直流电源供电。
数码管的显示范围是0~99℃,温度误差是±0.5℃。
上电自动读取当前环境温度并检测是否超过设定的温度范围,若超过则蜂鸣器会报警。
首次使用需要设置报警温度的上下限,设置后会自动保存到EEPROM中,断电也不会丢失数据,下次上电后自动从EEPROM中读取上次设置的报警上下限。
报警器从左到又有四个按键,分别是“设置键”,“下调键”,“上调键”和“复位键”。
按一次“设置”键进入上限温度设置,通过上调和下调键来调节。
设置好上限后再按一次则进入下限温度设置,同样是通过上调和下调键调节,按第三次“设置”则退出设置。
即按一次“设置键”设置上限温度,按第二次“设置键”设置下限温度,按第三次“设置键”退出设置。
二、成品外观图:
工作中
设置报警温度上限,“H”表示“高温”
设置报警温度下限,“L”表示“低”
上电和按下“复位键”后的界面
背面:
三、源程序
主程序(main.c)
/******************************************************************
程序名称:
DS18B20温度测量、报警系统
简要说明:
DS18B20温度计,温度测量范围0~99.9摄氏度
可用按键设置上限报警温度、下限报警温度
即高于上限值或者低于下限值时蜂鸣器报警
默认上限报警温度为38℃、默认下限报警温度为5℃
报警值可设置范围:
最低上限报警值等于当前下限报警值
最高下限报警值等于当前上限报警值
将下限报警值调为0时为关闭下限报警功能
******************************************************************/
#include
#include
#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;//状态标志
unsignedintshangxian=38;//上限报警温度,默认值为38
unsignedintxiaxian=5;//下限报警温度,默认值为38
ucharcodeLEDData[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/***写入报警阀值到EEPROM***/
voideeprom(uintdatup,datlow)
{
IapEraseSector(0x2000);//擦除0x2000扇区的内容
IapProgramuchar(0x2002,datup/256);//在0x2002地址上写入报警上限温度的十位数
IapProgramuchar(0x2003,datup%256);//在0x2003地址上写入报警上限温度的个位数
IapProgramuchar(0x2004,datlow/256);//在0x2004地址上写入报警下限温度的十位数
IapProgramuchar(0x2005,datlow%256);//在0x2005地址上写入报警下限温度的个位数
}
/*****延时子程序*****/
voidDelay(uintnum)
{
while(--num);
}
/*****初始化定时器0*****/
voidInitTimer(void)
{
TMOD=0x1;
TH0=0x3c;
TL0=0xb0;//50ms(晶振12M)
}
/*****定时器0中断服务程序*****/
voidtimer0(void)interrupt1
{
TH0=0x3c;
TL0=0xb0;
x++;
}
/*****外部中断0服务程序*****/
voidint0(void)interrupt0
{
EX0=0;//关外部中断0
if(DEC==0&&set_st==1)
{
shangxian--;
if(shangxian } elseif(DEC==0&&set_st==2) { xiaxian--; if(xiaxian<0)xiaxian=0; } eeprom(shangxian,xiaxian);//写入报警阀值到EEPROM } /*****外部中断1服务程序*****/ voidint1(void)interrupt2 { EX1=0;//关外部中断1 if(ADD==0&&set_st==1) { shangxian++; if(shangxian>99)shangxian=99; } elseif(ADD==0&&set_st==2) { xiaxian++; if(xiaxian>shangxian)xiaxian=shangxian; } eeprom(shangxian,xiaxian);//写入报警阀值到EEPROM } /*****读取温度*****/ voidcheck_wendu(void) { uinta,b,c; c=ReadTemperature()-0.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;}//设置温度显示上限 } /*****显示开机初始化等待画面*****/ voidDisp_init() { P2=0xbf;//显示- P1=0xf7; Delay(200); P1=0xfb; Delay(200); P1=0xfd; Delay(200); P1=0xfe; Delay(200); P1=0xff;//关闭显示 } /*****显示温度子程序*****/ voidDisp_Temperature()//显示温度 { P2=0xc6;//显示C P1=0xf7; Delay(200); P1=0xff; P2=LEDData[n];//显示个位 P1=0xfb; Delay(200); P1=0xff; P2=LEDData[m%10];//显示十位 DIAN=0;//显示小数点 P1=0xfd; Delay(200); P1=0xff; P2=LEDData[m/10];//显示百位 P1=0xfe; Delay(200); P1=0xff;//关闭显示 } /*****显示报警温度子程序*****/ voidDisp_alarm(ucharbaojing) { P2=0xc6;//显示C P1=0xf7; Delay(200); P1=0xff; P2=LEDData[baojing%10];//显示十位 P1=0xfb; Delay(200); P1=0xff; P2=LEDData[baojing/10];//显示百位 P1=0xfd; Delay(200); P1=0xff; if(set_st==1)P2=0x89; elseif(set_st==2)P2=0xc7;//上限H、下限L标示 P1=0xfe; Delay(200); P1=0xff;//关闭显示 } /*****报警子程序*****/ voidAlarm() { if(x>=10){beep_st=~beep_st;x=0;} if((m>=shangxian&&beep_st==1)||(m elseBEEP=1; } /*****主函数*****/ voidmain(void) {uintz; shangxian=IapReaduchar(0x2002)*256+IapReaduchar(0x2003);//读取掉电前温度上限 xiaxian=IapReaduchar(0x2004)*256+IapReaduchar(0x2005);//读取掉电前温度下限 InitTimer();//初始化定时器 EA=1;//全局中断开关 TR0=1;//开启定时器0 ET0=1;//开启定时器中断 IT0=1;//中断外部0触发方式控制位,0表示电平触发,1表示边沿触发方式(下降沿有效) IT1=1;//同上一条语句类似 check_wendu(); check_wendu(); for(z=0;z<300;z++) { Disp_init(); } while (1) { if(SET==0) { Delay(200); do{}while(SET==0); set_st++;x=0;shanshuo_st=1; if(set_st>2)set_st=0; } if(set_st==0) { EX0=0;//关闭外部中断0 EX1=0;//关闭外部中断1 check_wendu(); Disp_Temperature(); Alarm();//报警检测 } elseif(set_st==1) { BEEP=1;//关闭蜂鸣器 EX0=1;//开启外部中断0 EX1=1;//开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st){Disp_alarm(shangxian);} } elseif(set_st==2) { BEEP=1;//关闭蜂鸣器 EX0=1;//开启外部中断0 EX1=1;//开启外部中断1 if(x>=10){shanshuo_st=~shanshuo_st;x=0;} if(shanshuo_st){Disp_alarm(xiaxian);} } } } /*****END*****/ 头文件(DS18B20.H) #include #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 DQ=1;//拉高总线 Delay_DS18B20(14); x=DQ;//稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay_DS18B20(20); } /*****读一个字节*****/ unsignedcharReadOneChar(void) { unsignedchari=0; unsignedchardat=0; for(i=8;i>0;i--) { DQ=0;//给脉冲信号 dat>>=1; DQ=1;//给脉冲信号 if(DQ) dat|=0x80; Delay_DS18B20(4); } return(dat); } /*****写一个字节*****/ voidWriteOneChar(unsignedchardat) { unsignedchari=0; for(i=8;i>0;i--) { DQ=0; DQ=dat&0x01; Delay_DS18B20(5); DQ=1; dat>>=1; } } /*****读取温度*****/ unsignedintReadTemperature(void) { unsignedchara=0; unsignedcharb=0; unsignedintt=0; floattt=0; Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 WriteOneChar(0x44);//启动温度转换 Init_DS18B20(); WriteOneChar(0xCC);//跳过读序号列号的操作 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); } /*****END*****/ 掉电保存头文件(STC89C52_EEPROM.H) #include"intrins.h" #defineucharunsignedchar/*宏定义字符型数据整型数据*/ #defineuintunsignedint /*声明SFR与IAP*/ sfrIAP_DATA=0xE2;//Flash数据寄存器 sfrIAP_ADDRH=0xE3;//Flash地址高字节 sfrIAP_ADDRL=0xE4;//Flash地址低字节 sfrIAP_CMD=0xE5;//Flash命令寄存器 sfrIAP_TRIG=0xE6;//Flash命令触发 sfrIAP_CONTR=0xE7;//Flash控制寄存器 /*定义ISP/IAP/EEPROM命令*/ #defineCMD_IDLE0//待用 #defineCMD_READ1//字节读 #defineCMD_PROGRAM2//字节编程 #defineCMD_ERASE3//扇区擦除 /*定义ISP/IAP/EEPROM的操作常量IAP_CONTR*/ #defineENABLE_IAP0x80//ifSYSCLK<40MHz //#defineENABLE_IAP0x81//ifSYSCLK<20MHz //#defineENABLE_IAPx82//ifSYSCLK<10MHz //#defineENABLE_IAP0x83//ifSYSCLK<5MHz //起始地址STC89C58xxEEPROM #defineIAP_ADDRESS0x2000 voidIapIdle(); ucharIapReaduchar(uintaddr); voidIapProgramuchar(uintaddr,uchardat); voidIapEraseSector(uintaddr); /*---------------------------- 禁止ISP/IAP/EEPROM功能 MCU处于安全状态 ----------------------------*/ voidIapIdle() { IAP_CONTR=0;//关闭IAP功能 IAP_CMD=0;//清除命令到待机状态 IAP_TRIG=0;//清除触发寄存器 IAP_ADDRH=0x80;//数据指针指向非EEPROM区 IAP_ADDRL=0;//清除IAP地址,以防止误操作 } /*---------------------------- 从ISP/IAP/EEPROM区中读取一个字节 输入: 地址(ISP/IAP/EEPROM地址) 输出: Flash数据 ----------------------------*/ ucharIapReaduchar(uintaddr) { uchardat;//数据缓冲 IAP_CONTR=ENABLE_IAP;//打开IAP功能,并设置等待时间 IAP_CMD=CMD_READ;//设置ISP/IAP/EEPROM读命令 IAP_ADDRL=addr;//设置ISP/IAP/EEPROM地址低字节 IAP_ADDRH=addr>>8;//设置ISP/IAP/EEPROM地址高字节 IAP_TRIG=0x46;//发送触发命令(0x46) IAP_TRIG=0xb9;//发送触发命令(0xb9) _nop_();//MCU将在这里等待,直到ISP/IAP/EEPROM操作完成 dat=IAP_DATA;//ISP/IAP/EEPROM数据 IapIdle();//关闭ISP/IAP/EEPROM功能 returndat;//返回闪存数据 } /*---------------------------- 编程一个字节的ISP/IAP/EEPROM区 输入: 地址(ISP/IAP/EEPROM地址) DAT(ISP/IAP/EEPROM数据) 输出: - ----------------------------*/ voidIapProgramuchar(uintaddr,uchardat) { IAP_CONTR=ENABLE_IAP;//打开IAP功能,并设置等待时间 IAP_CMD=CMD_PROGRAM;//设置ISP/IAP/EEPROM程序命令 IAP_ADDRL=addr;//设置ISP/IAP/EEPROM地址低字节 IAP_ADDRH=addr>>8;//设置ISP/IAP/EEPROM地址高字节 IAP_DATA=dat;//ISP/IAP/EEPROM写入数据 IAP_TRIG=0x46;//发送触发命令(0x46) IAP_TRIG=0xb9;//发送触发命令(0xb9) _nop_();//MCU将在这里等待,直到ISP/IAP/EEPROM操作完成 IapIdle(); } /*---------------------------- 擦除一个扇区的 输入: 地址(ISP/IAP/EEPROM地址) 输出: - ----------------------------*/ voidIapEraseSector(uintaddr) { IAP_CONTR=ENABLE_IAP;//打开IAP功能,并设置等待时间 IAP_CMD=CMD_ERASE;//设置ISP/IAP/EEPROM擦除命令 IAP_ADDRL=addr;//设置ISP/IAP/EEPROM地址低字节 IAP_ADDRH=addr>>8;//设置ISP/IAP/EEPROM地址高字节 IAP_TRIG=0x46;//发送触发命令(0x46) IAP_TRIG=0xb9;//发送触发命令(0xb9) _nop_();//MCU将在这里等待,直到ISP/IAP/EEPROM操作完成 IapIdle(); } 四、proteus仿真图 五、ALtiumDsigner原理图及pcb图 原理图 PCB图 总结: 本作品可以作为毕业设计的,有需要源文件的可以“私信”我,我看到到会回复,这个作品本人亲测成功,那些都是实拍图或截图,获得源文件后毕设绝对不是问题!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自动 温度 报警器 援助