|
1.简介:通过按键可以设定温度上限和温度下限的值,当温度低于温度下限值或者当温度高于上限值时,蜂鸣器发出声音提醒。
2.元件:STC15W408AS单片机+共阴数码管+有源蜂鸣器+3个按键+DS18B20
3.设计思路:利用单片机逐点扫描的方式直接驱动三位共阴数码管,通过DS18B20读取温度与设定的温度进行比较,如果温度异常则蜂鸣器发出滴滴的声音提醒,按下K3键则清除报警声(温度恢复正常后再次异常时自动报警)。
4.使用方法:程序下载后首次使用前需同时按下K2键和K3键(对最初的温度上下限值写入EEPROM中)以后断电自动保存无需进行此操作
5.按下K1键则进入温度上限设置菜单,可以通过按K2进行加 K3进行减,再次按K1键则进入温度下限报警值的设定界面。设置后5秒无操作则自动保存设定的数据并返回温度显示界面。
所有资料下载:
温度控制超温报警stc15w.rar
(80.31 KB, 下载次数: 407)
- //2016.10.15编写
- /*********************************************************************************************/
- //作者:刘海龙
- //硬件:三位共阴数码管+stc15单片机+DS18B20温度芯片+蜂鸣器//选择内部12M晶振
- #include <STC15W.h>
- #include <intrins.h>
- #include<4LED_YIN.H>//数码管驱动显示程序
- #include<DS18B20.H>//DS18B20温度芯片驱动程序
- #include<EEPROM.H>//STC15系列内部EEPROM
- bit w=0,q;//报警标志位
- sbit beep=P5^4;//蜂鸣器负极连接IO正极接vcc
- sbit k1=P1^3;//设置键
- sbit k2=P1^4;// 加键
- sbit k3=P1^5;// 减键
- //sbit led1=P1^6;//
- //sbit led2=P1^7;//
- unsigned char menu=0,cou,HH,HL,LH,LL;//HH为温度上限高8位HL为温度上限低8位
- //LH为温度下限高8位LL为温度下限低8位
- unsigned int L,H;//H为温度上限,L为温度下限
- /************************************************************************/
- void delay1ms (unsigned int a){ // 1ms延时程序
- unsigned int i;
- while( --a != 0){
- for(i = 0; i < 629; i++);//STC15单片机在外部晶振为12MHz时i值上限为629
- }
- }
- /*****************************************************************************/
- void disp(unsigned int t){//数码管显示
- unsigned int i;
- i= t/100;//第一位数码管显示温度十位
- diplay_data (1,disdata);
- i=t%100/10;//第二位数码管显示温度个位
- diplay_data (2,disdata+0x80);//0x80为个位数后面的小数点
- i=t%100%10;//第三位数码管显示温度小数位
- diplay_data (3,disdata);
- }
- /***********************************************/
- void di(){//蜂鸣器驱动程序
- beep=0;
- delay1ms(500);
- beep=1;
- delay1ms(500);
- }
- /*********************************************************************************************
- 函数名:定时/计数器初始化函数
- 调 用:T_C_init();
- /**********************************************************************************************/
- void T_C_init (void){
- TMOD = 0x11; //高4位控制T/C1 [ GATE,C/T,M1,M0,GATE,C/T,M1,M0 ]
- EA = 1; //中断总开关
- TH0 = 0x3c; //16位计数寄存器T0高8位(写入初值)
- TL0 = 0xb0; //16位计数寄存器T0低8位
- ET0 = 1; //T/C1中断开关
- TR0 = 0; //T/C1关闭开关
- }
- /*********************************************************************************************
- 函数名:定时/计数器1中断处理函数
- 调 用:[T/C1溢出后中断处理]
- /*****************************/
- void T_C0 (void) interrupt 1 using 1{ //切换寄存器组到1
- cou++; // 软计数器加1
- if(cou > 99){// 计数值到(5s)
- cou = 0;// 软计数器清零
- IapEraseSector(0x00); //擦除整个扇区
- IapProgramByte(0x00,HH );//将 新的温度上限值高8位写入 EEPROM
- IapProgramByte(0x01, HL);//将 新的温度上限值低8位写入 EEPROM
- IapProgramByte(0x02,LH );//将 新的温度下限值高8位写入 EEPROM
- IapProgramByte(0x03, LL);//将 新的温度下限值低8位写入 EEPROM
- TR0 = 0; //T/C1停止计数
- menu=0;//返回 主菜单的温度显示界面
- }
- TH0 = 0x3c; //16位计数寄存器T0高8位(重新写入初值)
- TL0 = 0xb0; //16位计数寄存器T0低8位
- }
- /**********************************************************************************************/
- /**********************************************************************************************/
- void main (void){
- unsigned char i;
- delay1ms(300); //延时待系统稳定
- init();//IO工作方式初始化
- T_C_init();//定时器初始化
-
- ReadTemperature(); //读取温度
- HH = IapReadByte(0x00);//开机时从EEPROM中读取H高8位参数
- HL = IapReadByte(0x01);//开机时从EEPROM中读取H的低8位参数
- H=HH*256+HL;//读出温度上限值
- LH = IapReadByte(0x02);//开机时从EEPROM中读取L高8位参数
- LL = IapReadByte(0x03);//开机时从EEPROM中读取L的低8位参数
- L=LH*256+LL;//读出温度下限值
- while(1){//主循环
-
- /**********************显示温度界面******************************/
- if(menu==0){
- for(i=15;i>0;i--){
- disp(ReadTemperature());}
- if(tem>=H&&w==0||tem<=L&&w==0){
- di();//超温或者低温报警
- q=1;
- }
-
- if(k3==0&&q==1){w=1;}//如果报警时按下K1则关闭报警声
- if(tem<=H&&tem>=L){w=0;}//如果温度恢复正常把报警标志清除
- if(k2==0&&k3==0){//k2k3同时按下温度上限下限值恢复出厂设置
- delay1ms(10);
- if(k2==0&&k3==0){
- H=380;//温度上限38度
- L=370;//温度下限37度
- LL=L;
- LH=(L>>8);
- HL=H;
- HH=(H>>8);
- IapEraseSector(0x00); //擦除整个扇区
- IapProgramByte(0x00,HH );//将 新的温度上限值高8位写入 EEPROM
- IapProgramByte(0x01, HL);//将 新的温度上限值低8位写入 EEPROM
- IapProgramByte(0x02,LH );//将 新的温度下限值高8位写入 EEPROM
- IapProgramByte(0x03, LL);//将 新的温度下限值低8位写入 EEPROM
- di();
- }
- }
- }
- /*********************进入调温度上限界面*******************************/
- if(menu==1){
- diplay_data (1,disdata[H/100]);
- diplay_data (2,disdata[H%100/10]+0x80);
- diplay_data (3,disdata[H%10]);
- if(k2==0){
- delay1ms(10);
- if(k2==0){
- H++; //按下K1键则温度上限加零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
-
- while(!k2);
- HL=H;
- HH=(H>>8);
- }
- }
- if(k3==0){
- delay1ms(10);
- if(k3==0){
- H--; //按下K1键则温度上限减零点一度
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
-
- while(!k3);
- HL=H;
- HH=(H>>8);
- }
- }
-
- }
- /*******************进入调温度下限界面****************************/
- if(menu==2){
- diplay_data (1,disdata[L/100]);
- diplay_data (2,disdata[L%100/10]+0x80);
- diplay_data (3,disdata[L%10]);
- if(k2==0){
- delay1ms(10);
- if(k2==0){
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- L++; //按下K1键则温度下限加零点一度
- while(!k2);
- LL=L;
- LH=(L>>8);
- }
- }
- if(k3==0){
- delay1ms(10);
- if(k3==0){
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- L--; //按下K1键则温度下限减零点一度
- while(!k3);
- LL=L;
- LH=(L>>8);
- }
- }
- }
- /*************************按下K1键进入菜单设置界面***************************/
- if(k1==0){
- delay1ms(10);
- if(k1==0){
- cou=0;//重新计数
- TR0 = 1; //T/C1启动开关
- menu++; //按下K1键则菜单加一
- if(menu>2){menu=0;}
- while(!k1);
- }
- }
- }
- }
- /*****************************************************************************/
复制代码 |
评分
-
查看全部评分
|