#include<reg52.h>
#include<string.h>
#include<stdio.h>
#define Buf_Max 60 //快取長度200
#define Delay_Time 250 //延時長度
#define uint unsigned int
#define uchar unsigned char
sbit zhendong=P3^4;
sbit lvled=P0^1;
sbit huangled=P0^0;
sbit hongled=P0^2;
sbit beer=P3^7;
sbit chefangbtn=P1^1;
sbit bufangbtn=P1^0;
sbit baojingbtn=P3^3;
uchar kongzhi=0;//打開報警器
unsigned char i = 0; //定義快取指標
unsigned char Rec_Buf[Buf_Max]; //定義快取陣列
void Serial_Init(void); //宣告串口初始化函式
void Send_ASCII(unsigned char *b); //宣告發送字符(ASCII碼)函式
void Delay_ms(unsigned int time); //宣告延時函式
void CLR_Buf(void); //宣告清除快取內容
void Send_Hex(unsigned char b); //宣告發送字符(十六進制)函式
bit Hand(unsigned char *a); //宣告判斷快取中是否含有指定的字串函式
//延時函式大概是1s鐘,不過延時大的話不準...
void DelaySec(int sec)
{
unsigned int i , j= 0;
for(i=0; i<sec; i++)
{
for(j=0; j<65535; j++)
{
}
}
}
void Uart1Send(unsigned char c)
{
SBUF=c;
while(!TI);//等待發送完成信號(TI=1)出現
TI=0;
}
//串行口連續發送char型陣列,遇到終止號/0將停止
void Uart1Sends(unsigned char *str)
{
while(*str!='\0')
{
SBUF=*str;
while(!TI);//等待發送完成信號(TI=1)出現
TI=0;
str++;
}
}
void main()
{
unsigned int t=0;
unsigned char time_temp=0;
// led1=0;
Serial_Init(); //初始化串口
CLR_Buf(); //清除快取內容
Send_ASCII("AT"); //發送"AT"指令
while(!Hand("OK")) //判斷是否正確連接
{
Delay_ms(100); //延時
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT"); //發送"AT"指令
}
}
time_temp =0;
CLR_Buf(); //清除快取內容
Send_ASCII("AT+CMGF=1"); //發送"AT+CMGF=1"指令
while(!Hand("OK")) //判斷是否設定為文本格式
{
Delay_ms(100);
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGF=1"); //發送"AT+CMGF=1"指令
}
}
time_temp =0;
CLR_Buf();
Send_ASCII("AT+CMGD=1,4");//發送"AT+CMGD=1,4"指令
while(!Hand("OK")) //判斷是否洗掉SIM卡記憶體的短訊息
{
Delay_ms(100);
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGD=1,4"); //發送"AT+CMGD=1,4"指令
}
}
time_temp =0;
CLR_Buf();
t=0;
// led_test=0;
// led2=0;
while(1)
{
if(bufangbtn==1)
{
kongzhi=1;
lvled=0;
}
if(chefangbtn==1)
{
kongzhi=0;
}
if(baojingbtn==1)
{
kongzhi=2;
}
//kongzhi==0的情況下為撤防 為1 的情況下為布防 為2的情況下是緊急報警
if(zhendong==1)
{
beer=0;
hongled=0;
lvled=1;
huangled=1;
Uart1Sends("AT+CMGF=1\r\n");
DelaySec(1);//延時1秒
Uart1Sends("AT+CSCS=\"GSM\"\r\n");
DelaySec(1);//延時1秒
Uart1Sends("AT+CMGS=\"+8617513235451\"\r\n");//此處修改為對方的電話號
DelaySec(1);//延時1秒
Uart1Sends("zhen dong bao jing");//修改短信內容
Uart1Send(0x1a);
DelaySec(2);//延時2秒
kongzhi=0;
}
if(kongzhi==2)//緊急報警
{
lvled=0;
hongled=0;
huangled=0;
beer=0;
}
if(kongzhi==0)
{
huangled=0;
lvled=1;
hongled=1;
beer=1;
}
if(strstr(Rec_Buf,"+CMTI")!=NULL) //由快取字串中是否含有"+CMTI"來判斷是否有新的短訊息
{
CLR_Buf();
Send_ASCII("AT+CMGR=1"); //發送"AT+CMGR=1"指令
while(!Hand("OK")) //判斷是否成功讀取短訊息
{
Delay_ms(100);
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGR=1"); //發送"AT+CMGR=1"指令
}
}
if(strstr(Rec_Buf,"bufang")!=NULL) //判斷資訊內容是否有"kai"
{
kongzhi=1; //布防
// led_test =0;
}
if(strstr(Rec_Buf,"chefang")!=NULL) //判斷資訊內容是否有"guan"
{
kongzhi=0;//撤防
}
if(strstr(Rec_Buf,"baojing")!=NULL) //判斷資訊內容是否有"guan"
{
kongzhi=2;//撤防
}
// CLR_Buf();
Send_ASCII("AT+CMGD=1,4"); //發送"AT+CMGD=1,4"指令
while(!Hand("OK")) //判斷是否洗掉SIM卡記憶體的短訊息
{
Delay_ms(100);
time_temp++;
if(time_temp>10)
{
time_temp =0;
Send_ASCII("AT+CMGD=1,4"); //發送"AT+CMGD=1,4"指令
}
CLR_Buf();
t=0;
}
t++;
if(t/2500)
{
t=0;
// led1=~led1; //閃爍表示系統運行中,等待指令輸入
}
}
// }
}
}
void Serial_Init(void)//串口初始化函式
{
SCON = 0x50;//串口:方式1,允許發送和接收
TMOD = 0x20;//定時器1:模式2,8位自動重裝模式,用于產生波特率
TH1 = 0xFD; //11.0592MHZ晶振,波特率為9600
TL1 = 0xFD;
TR1 = 1; //開啟定時器1
ES = 1; //開啟串口中斷
EA = 1; //開啟全域中斷
}
void Serial_Int() interrupt 4 //串口中斷處理函式
{
ES = 0; //關串口中斷,防止中斷嵌套
if(RI) //如果是接送中斷,則進行處理
{
RI = 0; //清除接收中斷標志位
Rec_Buf[i] = SBUF; //將接收到的字串存到快取中
i++; //快取指標向后移動
if(i>(Buf_Max-1)) //如果快取滿,將快取指標指向快取的首地址
{
i = 0;
}
}
ES = 1; //開啟串口中斷
}
void Send_ASCII(unsigned char *b) //發送字符(ASCII)函式
{
ES = 0; //關串口中斷
for (b; *b!='\0';b++)
{
SBUF = *b;
while(TI!=1); //等待發送完成
TI = 0; //清除發送中斷標志位
}
ES = 1; //開串口中斷
Send_Hex(0x0d); //發送回車符
Send_Hex(0x0a); //發送換行符
}
void Delay_ms(unsigned int time)//延時函式
{
unsigned char j;
for(;time>0;time--)
{
j = 1500;
while(j--);
}
}
void CLR_Buf(void)//清除快取資料函式
{
unsigned char k;
for(k=0;k<Buf_Max;k++) //將快取內容清零
{
Rec_Buf[k] = 0;
}
i = 0; //接收字串的起始存盤位置
}
void Send_Hex(unsigned char c)//發送字符(十六進制)函式
{
ES = 0; //關串口中斷
SBUF = c;
while(TI!=1); //等待發送完成
TI = 0; //清除發送中斷標志位
ES = 1; //開串口中斷
}
bit Hand(unsigned char *a)//判斷快取中是否含有指定的字串函式
{
if(strstr(Rec_Buf,a)!=NULL)
return 1;
else
return 0;
}
uj5u.com熱心網友回復:
好長。。。。。。uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/284764.html
標籤:單片機/工控
