找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2469|回复: 1
打印 上一主题 下一主题
收起左侧

基于51单片机GSM防盗报警设计

[复制链接]
跳转到指定楼层
楼主
ID:570658 发表于 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;   //发送消息指示灯
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();        //发送短信函数
}   
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:570658 发表于 2019-6-24 14:23 | 只看该作者
其他的资料后续会上传的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表