附录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.注意事项
磁性开关在安装时,一定要隐蔽不要让人察觉。内部的硬件硬件电路我们可以将它装在与匹配的钟表壳内或其它容器内。总之要让别人觉得这只是一个普通的钟表。