找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2443|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于51單片機GSM防盜報警設(shè)計

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:570658 發(fā)表于 2019-6-24 14:19 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
這是我們寫的代碼,大家給檢查一下哪里有錯誤,沒有錯誤的話供大家參考
#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ù)
}   
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:570658 發(fā)表于 2019-6-24 14:23 | 只看該作者
其他的資料后續(xù)會上傳的
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表