這是我們寫的代碼,大家給檢查一下哪里有錯誤,沒有錯誤的話供大家參考
#include<reg52.h>
#include <intrins.h>
#include <absacc.h> //頭文件
#define uint unsigned int
#define uchar unsigned char //宏定義
//按鍵
sbit key1=P3^2; //布防
sbit key2=P3^3; //撤防
sbit key3=P3^4; //緊急報警
sbit BUZZ=P0^4; //蜂鳴器
sbit rsd=P2^4; //熱釋電輸入
sbit LED_B=P2^3; //布防指示燈
sbit LED_S=P2^0; //發送消息指示燈
uchar code PhoneNO[] ="15046397767"; //接受號碼
uchar code somebody[] ="8BF76CE8610FFF0167094EBA8FDB516562A58B66830356F4FF01"; //請注意!有人進入報警范圍!
uint TIME_50ms=0; //計時的最小分辨率50ms
uint time_continue; //蜂鳴器鳴響時計時數據暫存
bit flag=0,flag_BF=0; //flag:值為0時,是布防計時模式,值為1時,是一分鐘等待模式。flag_BF:布防標志位
bit flag_time_start=0; //開始計時標志位
bit again=0; //一分鐘等待標志位(當發送一條短信后,不能馬上發送第二天,所以等待一分鐘后再檢測是否有人,有人再發送短信)
bit flag_alam; //報警標志位
bit SOS; //發送短信時是否是按下緊急按鍵
bit flag_continue; //繼續計時
bit into_BF=0;
void delay(uint z)//延時函數
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Uart_init()
{
TMOD= 0X20; //T1 方式2 ,8位 自動重裝
TH1=0Xfd;
TL1=0Xfd; //9600波特率
TR1=1; // 定時器1啟動
SM0=0; // 設置串口的工作模式
SM1=1; //方式1
REN=0; // 不允許串口接收數據
ES=0; // 串口中斷不允許
EA=1; // 開啟中斷總開關
}
void SendASC(uchar d) //串口發送字符
{
SBUF=d; //數據賦值到緩沖區
while(!TI); //發送完
TI=0; //清零
}
void SendString(uchar *str) //串口發送字符串
{
while(*str) //判斷是否發送完
{
SendASC(*str) ; //發送字符
str++; //字符位置加
//delay_uart(1);
}
}
void TIME() //計時函數
{
if(flag==0) //布防計時模式
{
delay(50); //50ms
TIME_50ms++; //50ms變量加1
if(TIME_50ms%10==0) //每500ms(50ms*10)
LED_B=!LED_B; //布防指示燈取反一次
if(TIME_50ms>=400) //加到400次,也就是50ms*400=20000ms=20s
{
TIME_50ms=0; //計時變量清零
flag_BF=1; //進入布防狀態
LED_B=0; //布防指示燈長亮
flag_time_start=0; //停止計時
again=1; //關閉一分鐘等待
}
}
else //一分鐘等待模式
{
delay(50); //50ms
TIME_50ms++; //變量加
if(TIME_50ms%10==0) //每加500ms
{
LED_B=!LED_B; //布防指示燈閃爍
if(flag_alam==1) //報警
{
if(flag_continue==0)//進入報警時
{
flag_continue=1;//此標志位置一,防止報警時進入
time_continue=TIME_50ms; //將進入報警時的計時數據暫存
}
BUZZ=!BUZZ; //蜂鳴器取反,也就是閃爍響
if(TIME_50ms>=time_continue+100)//當報警時間達到5s時
{
BUZZ=1; //關閉蜂鳴器
flag_continue=0; //標志位清零,等待下次報警
flag_alam=0; //報警變量清零,停止報警
time_continue=0; //暫存計時數據清零
}
}
}
if(TIME_50ms>=1200) //計時達到60秒
{
LED_B=0; //布防指示燈長亮,準備檢測熱釋電信號
TIME_50ms=0; //計時變量清零
flag_time_start=0; //停止計時
again=1; //關閉一分鐘等待
}
}
}
//按鍵掃描函數
void keyscan()
{
if(key1==0&&flag_BF==0)//在非布防狀態時布防按鍵按下
{
delay(5);//延時去抖
if(key1==0) //再次判斷按鍵是否按下
{
LED_B=0; //點亮布防LED燈
flag=0; //變量清零
flag_time_start=1;//開始計時變量置一
}
while(key1==0); //按鍵釋放
}
if(flag_time_start==1) //開始計時
{
TIME(); //調用計時函數
}
if(key2==0) //撤防按鍵按下
{
delay(5);//延時去抖
if(key2==0) //再次判斷按鍵是否按下
{
BUZZ=1; //關閉蜂鳴器
flag_alam=0; //報警變量清零
flag_BF=0; //布防變量清零
flag=0; //變量清零
flag_time_start=0;//開始計時變量清零
LED_S=1; //關閉發送短信指示燈
LED_B=1; //關閉布防指示燈
}
while(key2==0); //按鍵釋放
}
if(key3==0) //緊急按鍵按下
{
delay(5); //延時去抖
if(key3==0) //再次判斷按鍵是否按下
{
SOS=1; //手動發送短信變量置一,準備發送短信
flag_alam=1; //報警變量置一
}
while(key3==0); //按鍵釋放
}
}
void GSM_work() //發送GSM短信
{
unsigned char send_number; //定義發送手機號的變量
if(rsd==0&&flag_BF==1) //布防狀態且熱釋電有信號時
flag_alam=1; //報警變量置一
if((rsd==0&&flag_BF==1&&again==1)||SOS==1)//布防狀態且熱釋電有信號時且不在一分鐘等待時間內 或者 手動按下緊急按鍵
{
LED_S=0; //打開發送短信指示燈
BUZZ=1; //關閉蜂鳴器
SendString("AT+CMGF=1\r\n"); //設置文本模式
delay(1000); //延時,讓GSM模塊有一個反應時間
SendString("AT+CSCS=\"UCS2\"\r\n"); //設置短信格式,發送漢字模式
delay(1000); //延時
SendString("AT+CSMP=17,0,2,25\r\n"); //設置短信文本模式參數(具體內容參考開發資料內的模塊資料)
delay(1000); //延時
SendString("AT+CMGS="); //信息發送指令 AT+CMGS=//
SendASC('"'); //引號
for(send_number=0;send_number<11;send_number++) //在每位號碼前加003
{
SendASC('0');
SendASC('0');
SendASC('3');
SendASC(PhoneNO[send_number]); //接收手機號碼
}
SendASC('"'); //引號
SendASC('\r'); //發送回車指令//
SendASC('\n'); //發送換行指令//
delay(1000); //延時
SendString(somebody); //發送短信內容
delay(1000); //延時
SendASC(0x1a); //確定發送短信
if(SOS==0) //不是緊急按鍵發送短信
{
again=0; //again清零,也就是進入一分鐘等待,當計時到一分鐘后,該變量重新置一
flag_time_start=1; //開始計時
flag_alam=1; //報警
}
else if(SOS==1&&flag_time_start==1) //緊急按鍵發送短信后
{
TIME_50ms=0; //計時數據清零
flag_BF=1; //布防變量置一
LED_B=0; //點亮布防指示燈
flag_time_start=0; //停止計時
again=1; //不進入一分鐘等待
}
LED_S=1; //熄滅發送短信指示燈
SOS=0; //緊急變量清零
flag=1; //變量置一
}
}
void main() //主函數
{
Uart_init(); //調用中斷初始化函數
while(1) //進入while循環
{
keyscan(); //按鍵函數
GSM_work(); //發送短信函數
}
}
|