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