专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

基于51的无线温度报警系统-完整代码

作者:MCU   来源:不详   点击数:  更新时间:2014年08月03日   【字体:

    该方案从网上收集整理得到,采用了一些常用的外围电路模块,以51单片机为核心,实现了很酷的无线报警功能。这里提供完整的代码,DIY爱好者可制作。

系统功能描述:
    利用温度传感器采集环境温度,当温度达到设定的温度时,产生报警信号,通过GSM模块来实现短信报警。报警温度和报警电话号码均可设置。短信内容也可编辑。附加DS1302

硬件部分:
    AT89S52+TC35+DS18B20+12864液晶+红外摇控+DS1302


 






 

TC35模块就是GSM模块,可以实现手机短信发送的功能,在某宝有很多,只需要简单的几个接口传送命令与数据,就能控制其给手机发短信。

代码链接:http://www.51hei.com/f/GSM室温监控系统.rar

 

/***********************************************

  程序:单片机控制GSM模块发送信息

编译器:Keil UV2

更多免费资源,加MCU起航QQ:2246080671

日期:2010/06/11

************************************************/

 

#include "common.h"

uchar Alarm_Temp=32; //报警温度设置为32度

void Key_Handle(void); //声明按键处理程序

void Show_Temperature(void); //显示温度

void Show_Menu(void); //显示菜单

void Show_Time(void); //显示时间

//系统初始化

void Sys_Init()

{

PhoneNum[14]='\0';

USART_Init(); //串口初始化

Red_Init(); //红外初始化

Read_18B20(); //先读取两次温度,初次读取会不准确

//write_1302_time(times); //第一次编程时设定一个时间,以后就不用了

LcmInit(); //液晶初始化

LcmClearTXT(); //清除显示

LcmClearBMP();

delay_ms(100);

PutStr(0,0,"Initial OK !");

delay_ms(1000);

LcmClearTXT(); //清除显示

}

 

//主函数

void main()

{

Sys_Init(); //系统初始化

while(1)

{

Key_Handle();

Show_Time();

Show_Temperature();

delay_ms(150);

}

}

 

//显示时间函数

void Show_Time(void)

{

read_1302_time(times);

PutStr(2,0,"日期:");

PutStr(3,0,"时间:");

PutTime();

}

//显示温度函数

void Show_Temperature(void)

{

PutStr(0,0,"GSM 温度报警系统");

PutStr(1,0,"环境温度:");

Read_18B20();

PutTemp(1,5);

PutStr(1,7,"℃");

if(zhengshu>=Alarm_Temp)key=72; //温度超过阀值,进入发短信模式,即报警

}

 

//显示主菜单

void Show_Menu(void)

{

LcmClearTXT(); //清除显示

PutStr(0,0,"1.设定手机号码");

PutStr(1,0,"2.设定报警温度");

PutStr(2,0,"3.编辑短信内容");

PutStr(3,0,"4.修改日期时间");

}

//红外按键处理程序

void Key_Handle(void)

{

unsigned long temp=0;

  signed char i=0;

    uchar cnt=0;

if(key!=255) //有键按下

{

switch(key) //在这里可以随便添加你的按键处理程序

{

case 72: //发送短信

{

LcmClearTXT(); //清除显示

PutStr(0,0,"短信发送模式");

PutStr(1,0,"请稍候...");

delay_ms(1000);

Send_Message(PhoneNum,MsContent);

while(key==72); //等待有键按下并退出

Read_18B20(); //再读一次

break;

}

case 14: //进入主菜单

{

Show_Menu();

key=255;

                while(key==255);     //等待有键按下  

switch(key)

                {

   case 1 :         //设置手机号码

                        {

                            key=255;

                            LcmClearTXT();

                            PutStr(0,0,"请输入手机号码");

                            key=255;

                            while(key==255); 

                            WriteCommand(0x30);

                            WriteCommand(AC_TABLE[8]); //在第二行开始显示键入值            

                       while(key!=14)     //不是确认键

                       {

if(key<10&&cnt<11) //11位手机号码

{

PhoneNum[(cnt++)+3]=key+48;

                                WriteData(key+48);

}

PhoneNum[14]='\0';

                           key=255;

                           while(key==255); //等待有键按下              

                       } 

                       key=255;

PutStr(2,0,PhoneNum);

PutStr(3,2,"修改成功!");

delay_ms(1000);

                       break;

                        }

 

                    case 2 :         //设置报警温度

                        {

                            key=255;

                            LcmClearTXT();

                            PutStr(0,0,"请输入报警温度");

                            key=255;

                            while(key==255); 

                            WriteCommand(0x30);

                            WriteCommand(AC_TABLE[8]); //在第二行开始显示键入值            

                       while(key!=14)     //不是确认键

                       {

                           temp=(temp*10)+key;

                                WriteData(key+48);

                           key=255;

                           while(key==255); //等待有键按下              

                       } 

                       key=255;

                       Alarm_Temp=(uchar)temp;   //更新报警温度

PutStr(3,2,"修改成功!");

delay_ms(1000);

                       break;

                        }

 

                    case 4 :         //设置时间

                        {

                            key=255;

for(i=6;i>=0;i--)

{

if(i!=5) //星期不设置

{

LcmClearTXT();

switch(i)

{

case 6:PutStr(0,0,"请输入年:");break;

case 4:PutStr(0,0,"请输入月:");break;

case 3:PutStr(0,0,"请输入日:");break;

case 2:PutStr(0,0,"请输入时:");break;

case 1:PutStr(0,0,"请输入分:");break;

case 0:PutStr(0,0,"请输入秒:");break;

default:break;

}

times[i]=0; //清0

                            WriteCommand(0x30);

                            WriteCommand(AC_TABLE[8]); //在第二行开始显示键入值 

                           while(cnt<2)     //输入的是两位数

                       {

  key=255;  

     while(key==255); //等待有键按下 

                           times[i]=(times[i]*10)+key;

                               WriteData(key+48);  

cnt++;

                       } 

  key=255;  

     while(key==255); //等待有键按下 

cnt=0;

}

else times[5]=1;

 

}

                       write_1302_time(times); //使时间生效

PutStr(3,2,"修改成功!");

delay_ms(1000);

                       break;

                        }

default:break;

                }  

break;

}

default: //其他

break;

}

LcmClearTXT(); //清除显示

delay_ms(100);

key=255; //取消键值

}

}

 

关闭窗口

相关文章