該方案從網(wǎng)上收集整理得到,采用了一些常用的外圍電路模塊,以51單片機為核心,實現(xiàn)了很酷的無線報警功能。這里提供完整的代碼,DIY愛好者可制作。
系統(tǒng)功能描述:
利用溫度傳感器采集環(huán)境溫度,當(dāng)溫度達到設(shè)定的溫度時,產(chǎn)生報警信號,通過GSM模塊來實現(xiàn)短信報警。報警溫度和報警電話號碼均可設(shè)置。短信內(nèi)容也可編輯。附加DS1302。
硬件部分:
AT89S52+TC35+DS18B20+12864液晶+紅外搖控+DS1302
TC35模塊就是GSM模塊,可以實現(xiàn)手機短信發(fā)送的功能,在某寶有很多,只需要簡單的幾個接口傳送命令與數(shù)據(jù),就能控制其給手機發(fā)短信。
代碼鏈接:http://www.torrancerestoration.com/f/GSM室溫監(jiān)控系統(tǒng).rar
/***********************************************
程序:單片機控制GSM模塊發(fā)送信息
編譯器:Keil UV2
更多免費資源,加MCU起航QQ:2246080671
日期:2010/06/11
************************************************/
#include "common.h"
uchar Alarm_Temp=32; //報警溫度設(shè)置為32度
void Key_Handle(void); //聲明按鍵處理程序
void Show_Temperature(void); //顯示溫度
void Show_Menu(void); //顯示菜單
void Show_Time(void); //顯示時間
//系統(tǒng)初始化
void Sys_Init()
{
PhoneNum[14]='\0';
USART_Init(); //串口初始化
Red_Init(); //紅外初始化
Read_18B20(); //先讀取兩次溫度,初次讀取會不準(zhǔn)確
//write_1302_time(times); //第一次編程時設(shè)定一個時間,以后就不用了
LcmInit(); //液晶初始化
LcmClearTXT(); //清除顯示
LcmClearBMP();
delay_ms(100);
PutStr(0,0,"Initial OK !");
delay_ms(1000);
LcmClearTXT(); //清除顯示
}
//主函數(shù)
void main()
{
Sys_Init(); //系統(tǒng)初始化
while(1)
{
Key_Handle();
Show_Time();
Show_Temperature();
delay_ms(150);
}
}
//顯示時間函數(shù)
void Show_Time(void)
{
read_1302_time(times);
PutStr(2,0,"日期:");
PutStr(3,0,"時間:");
PutTime();
}
//顯示溫度函數(shù)
void Show_Temperature(void)
{
PutStr(0,0,"GSM 溫度報警系統(tǒng)");
PutStr(1,0,"環(huán)境溫度:");
Read_18B20();
PutTemp(1,5);
PutStr(1,7,"℃");
if(zhengshu>=Alarm_Temp)key=72; //溫度超過閥值,進入發(fā)短信模式,即報警
}
//顯示主菜單
void Show_Menu(void)
{
LcmClearTXT(); //清除顯示
PutStr(0,0,"1.設(shè)定手機號碼");
PutStr(1,0,"2.設(shè)定報警溫度");
PutStr(2,0,"3.編輯短信內(nèi)容");
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: //發(fā)送短信
{
LcmClearTXT(); //清除顯示
PutStr(0,0,"短信發(fā)送模式");
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 : //設(shè)置手機號碼
{
key=255;
LcmClearTXT();
PutStr(0,0,"請輸入手機號碼");
key=255;
while(key==255);
WriteCommand(0x30);
WriteCommand(AC_TABLE[8]); //在第二行開始顯示鍵入值
while(key!=14) //不是確認(rèn)鍵
{
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 : //設(shè)置報警溫度
{
key=255;
LcmClearTXT();
PutStr(0,0,"請輸入報警溫度");
key=255;
while(key==255);
WriteCommand(0x30);
WriteCommand(AC_TABLE[8]); //在第二行開始顯示鍵入值
while(key!=14) //不是確認(rèn)鍵
{
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 : //設(shè)置時間
{
key=255;
for(i=6;i>=0;i--)
{
if(i!=5) //星期不設(shè)置
{
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) //輸入的是兩位數(shù)
{
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; //取消鍵值
}
}