基于51单片机的电话拨号报警器(2)

简介: 基于51单片机的电话拨号报警器(2)

附录1:程序清单

(1) 电话拨号报警程序
  程序设计时需要设立3个数组DATA[20]、X[3]、Y[3]。DATA[20]用于存放电话号码(最长20位),X[3]用于存放时间t1(000~999s),Y[3]用于存放时间t2(000~999s)。
  另外还要设立3个软件计数器data_flag、t1_flag、t2_flag。Data_flag用于统计输入的电话号码位长,t1_flag用于统计输入的时间t1位长,t2位长。
uchar DATA[20];     /*存放电话号码的数组*/
uchar X[3];         /*存放时间t1数组*/
uchar Y[3];         /*存放时间t2数组*/
uchar flag;         /*RAM区防干扰标志*/
uchar data_flag=0; /*输入电话号码计数器(最长20位)*/
uchar set=0;     /*功能键值*/
uchar m=0;      //全局变量
uchar n=0;
uint f;
uchar t1_flag=0;     /*输入时间t1计数器(最长3位)*/
uchar t2_flag=0;     /*输入时间t2计数器(最长3位)*/
uchar cnt_1=0;        /*时间t1单元数学运算后暂存单元*/
uchar cnt_2=0;       /*时间t2单元数学运算后暂存单元*/
/*定时器T0初始化*/
viod init_timer()
{
TMOD=0x01;             //定时器T0方式1
TH0=-(50000/256);      //装载100ms定时初值
TL0=-(50000%256);
IE=0x82;               //开中断
}
  启动报警器子程序模块
/*---启动报警器进入警戒---*/
void work()
{uchar h;
 p1=0xdf;    /*数码管左上角显示“1”*/
 delay(1);
if(set==1)   /*进入时间1循环*/
{while(cnt<=x[0]*100+X[1]*10+X[2])
     {
      delay(1000);
      cnt_1++;                 /*计数器cnt_1累加*/
      if(set!=1){EX1=0;cnt_1=0;break;}
      }                         /*如按下Set键,则推出此循环*/
}
else {EX1=1;PCON=0x00;}
if(set==1)
{if(cnt_1>=X[0]*100+X[1]*10+X[2])
   {EX1=1;cnt_1=0;}   /*时间1到,打开外中断1,计数器归零*/
/*进入待机。若有1s以上开关动作,退出待机*/
while(1)
{PCON=0x01;if(f>=5{PCON=0x00;break;})
}
/*-----------------------------------------------------------*/
EX1=0;  /*关闭外中断1*/
if(set==1)    /*进入时间2循环*/
{while(cnt_2<=Y[0]*100+Y[1]*10+Y[2])
   {
     delay(1000);
     cnt_2++;   /*计时器cnt_2累加*/
     if(set!=1){cnt_2=0;break;}
   }           /*如按下Set键,则退出此循环*/
}
if(set==1)
{
bh();        /*时间2到,调用拨号子程序*/
delay(3000);
p3_7=0;    //控制输出端为低,可驱动蜂鸣器等
for(h=0;h<60;h++)   /*发出60s警音*/
{   for(f=0;f<500;f++)
    {f++;
     P3_1=! P3_1;P1=0x5f;
     delay(1);
     }
    P3_1=0;P1=0x7f;delay(500);
}
P3_7=1;//控制输出端恢复高
cnt_1=0;cnt_2=0;   /*有关计数器、端口回到初始状态*/
P3_0=0;P3_1=0;P1_7=1;
for(f=0;f<3;f++)delay(60000);  /*关闭3min,让接警人进行手机或电话座机报警*/
}
}
     拨号脉冲子程序模块
/*---拨号---*/
void bh()
{data_flag=0;   /*电话号码计数器(20位)归零*/
   P3_0=1;     /*接通线路*/
   p1_7=0;     /*数码管小数点亮*/
   delay(1000);
while (DATA[data_flag]<10)  /*号码小于10进入循环拨号状态*/
{
  if(DATA[data_flag]==0)    /*若号码为0*/
  {TR0=1;                 /*启动T0定时器*/ 
    if(n==20){data_flag++;   /*进行20次中断,产生10个脉冲*/
      n=0;TR0=0;
      P3_0=1;P1_7=0;
      delay(500);
              }
}
if(DATA[data_flag]>0)   /*若号码〉0但<10*/
 {TR=1;                 /*启动T0定时器*/
 if(n==((DATA[data_flag]*2))   /*进行号码x2次中断,产生号码个脉冲*/
      {data_flag++;
        n=0;TR0=0;
        P3_0=1;P1_7=0;
        delay(500);
       }
 }
}
TR0=0;
}
      关机子程序模块 
void stop()             //*关机子程序
{if(flag==0x55)P1=0xfb; //*若标志为55H,说明内存区未受干扰,数码
                        //管右下角显示“1”
    else P1=0x86;      //否则数码管显示“E”
delay(1);               //延时1ms再判
if(flag==0x55)PCON=0x01; //进入低耗节电待机状态
delay(1);    //延时1ms
}
     完整代码 
#include   //器件配置文件
#define uchar unsigned char  //变量类型的宏定义
#define uint unsigned int
uchar code DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99
                          0x92,0x82,0xF8,0x80,0x90,}; /*0~9数码管段码*/
uchar DATA[20]; /*存放电话号码的数组*/
uchar x[3];    /*存放时间t2数组*/
uchar flag;   /*RAM区防干扰标志*/
uchar data_flag=0;   /*输入电话号码计数器(最长20位)*/
uchar set=0;    /* 功能键值*/
uchar m=0;  //全局变量
uchar n=0;
uint f;
uchar t1_flag=0;    /*输入时间1计数器(最长3位)*/
uchar t2_flag=0;   /*输入时间2 计数器(最长3位)*/
uchar cnt_1=0;     /*时间t1单元数学运算后暂存单元*/
uchar cnt_2=0;     /*时间t2单元数学运算后暂存单元*/
/*************************************************/
void delay(uint k);   /*延时子函数声明*/
void stop();          /*关机子函数声明*/
void bh();           /*拨号子函数声明*/
/*************************************************/
/*定时器T0初始化*/
void init_timer()
{
TMOD=0x01;
TH0=-(50000/256);
TL0=-(50000%256);
IE=0x82;
}
/***********************************************************/
/*100ms定时中断服务子函数*/
void zd0()interrupt 1
{
P3_0=! P3_0;   //P3.0每100ms取反一次,送出脉冲
P1_7=! P1_7;   //数码管小数点同步闪烁
n++;
TH0=-(50000/256);
TL0=-(50000%256);
}
/********************************************************/
/*100ms定时中断服务子函数*/
void zd0()interrupt 1
{
p3_0=!P3_0;  //P3.0每100ms取反一次,送出脉冲
P1_7=!P1_7;  //数码管小数点同步闪烁
n++;
TH0=-(50000/256);
TL0=-(50000%256);
}
/*********************************************/
/*INT0中断服务子函数*/
viod zd_int0()interrupt 0
{
delay(10);            
if(P3_2==0)set++;    //功能键值递增
if(set>=5)set=0;       //键值的范围0~4
if(set==1)flag=0x55;   //向RAM区的标志flag写入55H
PCON=0x00;f=8;
again:if(P3_2==0)goto again;  //若按键未释放,则等待
}
/*****************************************/
/*INT1中断服务子函数*/
void zd_int1()interrupt 2
{uchar h;
f=0;
for(h=0;h<10;h++)   /*检查磁性开关(P3_3状态)10次,共1s*/
{
delay(100)
if(P3_3==0)f++;
}
}
/********************************************************************/
/*---关机---*/
void stop()
{if(flag==0x55)P1=0xfb;
elsep1=0x86;                           //数码管右下角显示“1”。
delay(1);
if(flag==0x55)PCON=0x01;               /*进入节电待机状态*/
delay(1);
}
/*********************************************************************/
/*延时1ms*K子函数*/
void delay(uint k)
{
uint i,j;
for(i=1;j
for(j=0;j<60;j++)
{;}}
}
/*********************************************************************/
/*----输入时间t1----*/
viod in_time1()
{
P1=0xf7;delay(1);                    /*数码管显示“—”*/
if(P3_5==0)
{
   delay(10);                        /*按下OK键确认并点亮小数点*/
   if(P3_5==0){P1=0x7f;m=0;t1_flag=0;delay(500);}
while(t1_flag<3)
    {
     if(P3_4==0)
{delay(10);if(P3_4==0)               /*按下UP键数码管作0~9递增显示*/
            {m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1);           /*若不按下UP键数码管也作0~9显示*/
if(P3_5==0)                        
{delay(10);if(P3_5==0)              /*按下OK键显示的数据存入数组X中*/
   {X[t1_flag]=m;t1_flag++;P1=0x7f;delay(500);}
    }
   }
}
if(t1_flag>=3)t1_flag=0;            /*时间1计数器>=3时归零*/
}
/**********************************************************************
/
 /*-----输入时间t2-----*/
viod in_time2()
{
P1=0xb7;delay(1);                  /*数码管显示“二”*/
if(P3_5==0)
{
   delay(10);                      /*按下OK键确认并点亮小数点*/
   if(P3_5==0){P1=0X7f;m=0;t2_flag=0;delay(500);}
while(t2_flag<3)
 {
if(P3_4==0)
   {delay(10);if(P3_4==0)           /*按下UP键数码管作0~9递增显示*/
               {m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
}
P1=DATA_7SEG[m];delay(1);           /*若不按UP键数码管也作0~9显示*/
if(P3_5==0)
{delay(10);if(P3_5==0)              /*按下OK键显示的数据存入数组Y中*/
  {Y[t2_flag=m;t2_flag++;P1=0x7f;delay(500);}
   }
  } 
 }
if(t2_flag>=3)t2_flag=0;            /*时间2计数器>=3时归零*/ 
}
/***********************************************************************
/
    /*----输入电话号码----*/
vioa in_data()
{uchar g;                        
P1=0xb6;delay(1);                    /*数码管显示三*/
if(P3_5==0)
{delay(10);if(P3_5==0)
           {p1=0x7f;m=0;data_flag=0; /*按下OK键确认并点亮小数点*/
           for(g=0;g<20;g++){DATA[g]=10;}
           delay(500);                /*同时DATA数组中全部写入10*/ 
           while(1)
           {
           if(P3_4==0){delay(10);      /*按下UP键数码管作0~9递增显示*/        
               if(P3_4==0);{m++;if(m==10)m=0;P1=DATA_7SEG[m];delay(300);}
                      }
           P1=DATA_7SEG[m];delay(1);     /*若不按UP键数码管也作0~9显示*/ 
           if(P3_5==0) 
               {delay(10);
                if(P3_5==0)                /*按下OK键显示的数据(号码)存入数组DATA中*/
                {DATA[data_flag]=m;data_flag++;P1=0x7f;delay(500);}
                 }                          /按下OK键超过2s则退出向数组DATA送入号码*/
                if(P3_5==0){delay(2000);if(P3_5==0)break;}
                }
}
}
F1:if(P3_5==0){delay(10);if(P3_5==0){P1=0xb6;delay(1);goto F1;}}
/********************************************************************/
/*--主函数--*/
void main()
{
int_timer();   /*定时器T0初始化*/
EA=1;EX0=1;    /*开总中断,开外中断0*/
p3_0=0;        /*关闭线路(挂机)*/
p3_1=0;
while(1)       /*无限循环*/
{
switch(set)    /*根据Set标志散转*/
{
case 0:stop();break;  /*关机*/
case 1:work();break;  /*警戒工作*/
case 3:in_time2();break; /*输入时间t1*/
case 4:in_data();break;
}
     if(flag!=0x55)
       {p1=0x86;delay(1);}
}
}
(2) 时钟计时器程序
/**************************************************************/
//          采用6位LED动态扫描时钟演示程序
//         使用Keil C51
//         2004.03.31
/*************************************************************/
/*使用AT89S52单片机,12MHZ晶振,P0口输出段码,P2口作列扫描,用共阳LED数码管*/
//key0为调时位选用,key1为加1键,key2为减1键
#include "reg51.h"
#define char unsigned char
//
char code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};
/*共阳LED段码表"0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "不亮"*/
char code scan_con[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //列扫描控制字
char data timedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};             //计时单元数据初值,共6个
char data dis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,};      //显示单元数据,共6个数据
char data con1s=0x00,con04s=0x00,con=0x00;    //秒定时用
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P1^2;
//
/************/
//1ms延时函数//
/***********/
dalaylms(int t)
{
int i,j;
for(i=0;i
  for(j=0;j<120;j++)
  ;
} 
/*************/
//键扫描子函数//
keyscan()
{
EA=0;
if(key0==0)
 {
delaylms(10);
while(key0==0);
if(dis[con]==10)
{dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];}
con++;TR0=0;ET0=0;TR1=1;ET1=1;
if(con >=6)
  {con=0;TR1=0;ET1=0;TR0=1;ET0=1;}
}
//
if(con!=0)
{
  if(key1==0)
  {
   delaylms(10);
  while(key1==0);
  timedata[con]++
  if(timedata[con]>=10)
    {timedata[con]=0;}
dis[con]=timedata[con];dis[6]=0x0a;
    }
}
 //
if(con!=0)
{
 if(key2==0)
 {
  delaylms(10);
 while(key2==0);
   if(timedata[con]==0)
     {timedata[con]=0x90;}
   else{timedata[con]--;}
dis[con]=timedata[con];dis[6]=0x0a;
  }
}
EA=1;
}
//
/***********/
//显示函数//
/***********/
scan()
{
char k;
for(k=0;k<6;k++)
 {
 p0=dis_7[dis[k]];p2=scan_con[k];delaylms(1);p2=0xff;
  }
}
/*************/
//初始化函数//
/*************/
clearmen()
{
int i;
for(i=0;i<6;i++)
  {
  dis[i]=timedata[i];}
TH0=0x3C;TL0=0xB0;                             //50ms定时初值(T0计时用)
TH1=0x3C;TL1=0xB0;                             //50ms定时初值(T1计时用)
TMOD=0X11;ET0=1;ET1=1;TR1=0;TR0=1;EA=1;
}
/**********/
//主函数//
/*********/
main()
{
clearmen();
while(1)
  {
   scan();
   keyscan();
   }
}
/********************/
//1s中断处理函数//
/*******************/
viod time_intt0(viod) interrupt 1
{
ET0=0;TR0=0;TH0=0x3C;TL0=0xB0;TR0=1;
con1s++;
if(con1s==20)
  {
con1s=0x00;
timedata[0]++;
if(timedata[0]>=10)
{
timedata[0]=0;timedata[1]++;
if(timedata[1]>=6)
  {
   timedata[1]=0;timedata[2]++;
     if(timedata[2]>=10)
       {
        timedata[2]=0;timedata[3]++;
        if(timedata[3]>=6)
          {
           timedata[3]=0;timedata[4]++;
           if(timedata[4]>=10)
             {
              timedata[4]=0;timedata[5]++;
                 }
              if(timedata[5]==2)
                    {
                  if(timedata[4]==4)
                    {
                     timedata[4]=0;timedata[5]=0;
                    }
                 }
              }
         }
      }
  }
dis[0]=timedata[0];dis[1]=timedata[1];dis[2]=timedata[2];
dis[3]=timedata[3];dis[4]=timedata[4];dis[5]=timedata[5];
  }
ET0=1;
}
/********************/
//0.4S闪烁中断函数//
/*******************/
viod time_intt1(viod) interrupt3
{
 EA=0;TR1=0;TH1=0x3C;TL1=0xB0;TR1=1;
 con04s++;
if(con04s==8)
  {
   con04s=0x00;
   dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];
   }
   EA=1;
}

附录2:系统使用说明

1.电话防盗报警器的拨号报警功能简介

  采用磁性开关进行检测,磁性开关即为装于门或窗口的防盗感应开关,门关闭时常开,门打开时闭合接通。实现全方位远距离监测。为了防止外界对磁性开关的影响,使用光藕传递信号。当有人触动装有磁性开关的门或窗口时,这时磁性开关闭合,实现报警。这时数码管会把信息纪录下来,同时蜂鸣器会发出尖锐的声音。告知房主。

2.电话防盗报警器的时钟功能简介

  平时没有报警的情况下,数码管上显示的时间同我们的手表或钟表的时间是一致的。因此平时我们可以将它作为钟表来使用。数码管上显示时间的时,分,秒,以24小时计时方式运行,使用与单片机P1.0、P1.1、P1.2口相连接的按键T0、T1、T2实现对时、分、秒的调整。

3.注意事项

磁性开关在安装时,一定要隐蔽不要让人察觉。内部的硬件硬件电路我们可以将它装在与匹配的钟表壳内或其它容器内。总之要让别人觉得这只是一个普通的钟表。

相关文章
|
6月前
|
传感器
毕业设计 基于51单片机的智能水表水流量计流量报警器温度设计
毕业设计 基于51单片机的智能水表水流量计流量报警器温度设计
110 0
【单片机】按键声光报警实验(蜂鸣器)
【单片机】按键声光报警实验(蜂鸣器)
591 0
|
6月前
|
传感器
基于51单片机的车辆倒车雷达报警系统
该文描述了一个基于51单片机的超声波倒车雷达系统设计,要求包括:2cm至4m的测量范围,3mm精度,集成DS18B20温度传感器以校准声速,使用LCD1602显示距离和温度,具备按键设置预警距离及蜂鸣器报警功能。系统由AT89C51单片机、HC-SR04超声波模块、DS18B20温度模块、报警电路和LCD显示电路组成。文中还展示了Proteus仿真电路图和部分仿真结果分析,包括LCD显示示例和预警距离设置操作。
|
6月前
|
传感器 数据采集 监控
毕业设计|基于51单片机的配电室远程监控系统设计环境检测GSM环境报警设计
毕业设计|基于51单片机的配电室远程监控系统设计环境检测GSM环境报警设计
108 0
|
6月前
|
传感器
毕业设计 基于STM32的单片机智能门禁热释人体感应报警设计
毕业设计 基于STM32的单片机智能门禁热释人体感应报警设计
148 0
|
算法 编译器 网络性能优化
基于51单片机的电话拨号报警器(1)
基于51单片机的电话拨号报警器(1)
206 0
|
传感器 监控 安全
基于单片机的家庭防盗报警系统的设计与实现_kaic
摘要:本论文研究的是将AT89C52单片机芯片作为核心元器件的防盗报警系统,该系统除了具有直接报警的功能外,还额外增加了布防和红外感应的功能。和市场上的其他各类防盗报警器相比,该设计的不同之处在于它所具有的布防功能和红外检测功能。在到达指定布防时间的时候,红外检测电路与之相配合来达到防盗的目的。此外,不论何时只要有人经过,红外检测电路的热释电红外传感器都会感应到相应的人体红外信号,并将其转化为电平信号传送给单片机,从而驱动显示灯亮。这种报警器相对比较隐蔽,能够很好的掩人耳目,不至于被盗贼发现实行破坏行为。另外,增加的布防功能可以让住户有足够的开门关门时间,减小了误报率。 整体的设计运用了模块化
|
传感器 存储 监控
基于51单片机的室内湿度加湿温度声光报警智能自动控制装置设计
在日常生活中加湿器得到了广泛的应用,但是现有的加湿器都需要手工控制开启和关闭并且不具备对室内空气温湿度的监测,人们在使用过程中存在过度加湿和干烧的问题,不仅给室内空气舒适度造成负面影响并且还存在安全隐患。因此开发设计一种价格低廉、功耗低、具有自动控制功能的加湿器显得尤为必要。本设计采用智能控制,以AT89C51单片机为核心,外接辅助电路,通过实现加湿器的防干烧、声光报警、智能开启和关闭以及室内温湿度的显示功能基本实现加湿器的智能化。
219 0
|
传感器 编解码 监控
基于单片机的危险气体泄露报警器设计
基于单片机的危险气体泄露报警器设计
207 2
基于单片机的危险气体泄露报警器设计
|
传感器 编解码 监控
毕业设计 基于51单片机老人防跌倒GSM短信报警系统
毕业设计 基于51单片机老人防跌倒GSM短信报警系统
414 0
毕业设计 基于51单片机老人防跌倒GSM短信报警系统