该方案从网上收集整理得到,采用了一些常用的外围电路模块,以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; //取消键值
}
}