1五湖四海1 发表于 2011-11-20 18:46:59

DIY定时自动打铃器

DIY定时自动打铃器我厂为了搞好军事化管理,在每个厂房安装了电铃。按厂规定的休息时间打铃提示。安装这套装置需要一个定时自动控制电铃开启的装置。厂子安排我负责完成这套装置。我接下任务打算自行设计一套定时打铃器,我的设计方案得到厂领导批准后,我给自己立下军令状一周之内完成。在2011年11月20日制作完成了定时自动打铃器,我利用单片机技术计时产生秒信号首先完成了数字电子钟,在此基础上加入了继电器并通过软件实现了定时控制继电器。最后加入了键盘可以调整走时时间和设置多个定时时间。做到这里遇到一个问题,我是采用市电220v变压整流给单片机板供电的,如果突然停电就会丢失走时时钟和设置数据,所以一定要保证供电连续性。我想了一个办法如果停电时采用备用电池供电,停电时它们切换供电在切换过程中加入了10000uf的大电容解决了在切换过程中断电现象。在整个制作过程中遇到了许多问题,我需要面对问题去解决遇到的难题。我个人认为这是一个锻炼自己解决问题的好机会。制作中有苦有乐,我将制作方法拿出来和大家一起分享。下面是我的小型实验室制作过程:2011年11月15日,我走进我的小角落小型实验室,找出了51单片机开发板,打开电脑开始写程序,忙了一天写好了单片机数字电子钟。这套装置的核心就是电子钟,所以首先要制作出数字电子钟。然后在数字钟程序基础上加入了几条语句就可以按编写的时间控制继电器闭合触点了,很简单吧!通过计算机设定调整时间设置定时时间可不行,下一步要加入键盘,通过键盘调整走时时间和设置定时时间。图上面的三个按钮分别为设置键,小时调整键,分钟调整键。第二天完成了键盘调整函数模块程序编写,可以在一天中多了时间段控制电铃响起。一步一步的调试改进完成了自动打铃器,在喜悦中新问题来了,打铃器工作了一天后出现了走时误差,经过9个小时就会出现60秒的误差。我开始尝试了各种方法解决误差问题,采用自动调整法比较有效果,实验测出产生1秒误差所需用的时间,然后通过程序每过一段时间就将秒变量自动加1或是减1来清除误差。在电源供电方面考虑实际情况需用改进。单片机正常工作必须保证电能连续性。如果一旦停电数据将会丢失,所以要加入备用电池当停电时自动切换到电池供电。我将继电器接到变压器输出端,如果市电有电时继电器得电工作,停电时继电器失电,通过继电器常开常闭触点控制市电和电池切换,在供应电源输出端加入10000uf大电容起到市电和电池切换瞬间断电现象。电源电路中加入了一只光耦输出端送往单片机它起到判断何种方式供电,如果电池供电单片机板上面的数码管关闭以节省电能。下面有电源部分电路原理图,单片机部分电路原理图,实物图和单片机c51程序。

我在飞 发表于 2011-11-20 22:45:40

其实对于定时打铃的办法很多。比如管理体系健全的企业一般各个车间和部门都会安装广播系统的。利用这个系统,在办公电脑上装个定时播放音乐的软件,定时播放铃声即可。且电脑的时钟是可以联网校准的。更不怕断电产生时钟混乱。基本就是零投入。

1五湖四海1 发表于 2011-11-20 18:48:40

下面是自动打铃器c程序
#include<reg51.h>#define shum P1//数码#define saom P2 //数码扫描#define uchar unsigned char#define uint unsigned intchar DATA_7SEG={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,};uchar hour=0,min=0,sec=0,tauto=0;                  //时 分 秒uchar x=8,y=0,g=11,f=55,o=16,p=30;                           //x是定时1小时设定值 y是定时1分设定值uchar deda=0;uchar code xsjsbb;bit d_05s=0;uchar set=0;/*-----------------------走时函数--------------------------*/void init_timer() {TMOD=0x01;TH0=(65536-5000)/256;TL0=(65536-5000)%256;IE=0x82;TR0=1; }/*-----------------------5ms定时中断服务函数--------------------------*/void T0_srv(void) interrupt 1{TH0=(65536-5000)/256;TL0=(65536-5000)%256;deda++ ;}/*----------------------时,分,秒单元及走时单元转换-------------------------*/void conv(){ if(deda<=100)d_05s=0; else d_05s=1; if(deda>=200){sec++;deda=0;} if(sec==60){min++;tauto++;sec=0;} if(tauto==9){sec=sec+1;tauto=0;}                     //自动调时没过9分钟(tauto=9)秒变量sec自增1 if(min==60){hour++;min=0;} if(hour==24){hour=0;}}void display()                //数码管模块{char e,scan;if(deda<=100)P3_4=0; else P3_4=1;if(hour==x)a=1; else a=0;                     //定时设定值x,y g,f o,pif(min==y)b=1; else b=0;if(sec==2)c=1; else c=0;if(a&b&c) P0_3=0; else P0_3=1;if(hour==g)la=1; else la=0;if(min==f)lb=1; else lb=0;if(sec==2)lc=1; else lc=0;if(la&lb&lc) P0_3=0; else P0_3=1;if(hour==o)ia=1; else ia=0;if(min==p)ib=1; else ib=0;if(sec==2)ic=1; else ic=0;if(ia&ib&ic) P0_3=0; else P0_3=1;disp=hour/10;disp=hour%10;disp=min/10;disp=min%10;P1=0xff;scan=0xef;for(e=0;e<4;e++){shum=0xff;saom=scan; if(P3_6==0){    if(d_05s==1)    {if(e==2)P1_7=0;else P1_7=1;}}else {if(e==2) P1_7=1;} if(P3_6==0)            P1=DATA_7SEG]; else       P1=0xff; delay(4);scan>>=1;}}/*-------------------调整走时时间函数部分------------------------*/void set_time(){uchar m; if(P3_1==0)delay(1); if(P3_1==0)hour++; F1:if(P3_1==0)goto F1; if(hour==24)hour=0; for(m=0;m<30;m++){   display();if(d_05s==1)P2_7=0;else P2_7=1;   delay(1);} if(P3_0==0)delay(1); if(P3_0==0)min++; F2:if(P3_0==0)goto F2; if(min==60)min=0; for(m=0;m<30;m++){   display();   if(d_05s==1)P2_7=0;   else P2_7=1;   delay(1);}}}

1五湖四海1 发表于 2011-11-20 18:49:20

1五湖四海1 发表于 2011-11-20 18:48 static/image/common/back.gif
下面是自动打铃器c程序
#include#define shum P1//数码#define saom P2 //数码扫描#define uchar unsign ...

void set_t1(){ uchar m; if(P3_1==0)delay(1); if(P3_1==0)x++; F1:if(P3_1==0)goto F1; if(x==24)x=0; if(P3_0==0)delay(1); if(P3_0==0)y++; F2:if(P3_0==0)goto F2; if(y==60)y=0; for(m=0;m<30;m++){   char e,scan;   tdisp=1;   tdisp=x/10;   tdisp=x%10;   tdisp=y/10;   tdisp=y%10;   P1=0xff;   scan=0xef;   for(e=0;e<5;e++)   {   shum=0xff;   saom=scan;       P1=DATA_7SEG];   delay(4);   scan>>=1;   }   delay(1);} }void set_t2(){ uchar m; if(P3_1==0)delay(1); if(P3_1==0)g++; F1:if(P3_1==0)goto F1; if(g==24)g=0; if(P3_0==0)delay(1); if(P3_0==0)f++; F2:if(P3_0==0)goto F2; if(f==60)f=0; for(m=0;m<30;m++){   char e,scan;   tdisp=2;   tdisp=g/10;   tdisp=g%10;   tdisp=f/10;   tdisp=f%10;   P1=0xff;   scan=0xef;   for(e=0;e<5;e++)   {   shum=0xff;   saom=scan;       P1=DATA_7SEG];   delay(4);   scan>>=1;   }   delay(1);} }void set_t3(){ uchar m; if(P3_1==0)delay(1); if(P3_1==0)o++; F1:if(P3_1==0)goto F1; if(o==24)o=0; if(P3_0==0)delay(1); if(P3_0==0)p++; F2:if(P3_0==0)goto F2; if(p==60)p=0; for(m=0;m<30;m++){   char e,scan;   tdisp=3;   tdisp=o/10;   tdisp=o%10;   tdisp=p/10;   tdisp=p%10;   P1=0xff;   scan=0xef;   for(e=0;e<5;e++)   {   shum=0xff;   saom=scan;       P1=DATA_7SEG];   delay(4);   scan>>=1;   }   delay(1);} }/*-------------------按键扫描及延时等函数部分-------------------------*//*--------走时时间程序函数--------*/void time() {conv();display();}/*--------扫描按键函数--------*/void scan_key(){ delay(1); if(P3_2==0)set++; if(set>=5)set=0; if(set==1)flag=0x55; F0:if(P3_2==0)goto F0;}/*--------延时函数-------------*/void delay(uint k){ uint i,j; for(i=0;j<k;i++){   for(j=0;j<121;j++);}}/*-----------------主函数-------------------------------------*/void main(){ init_timer(); while(1) {if(P3_2==0)scan_key(); switch(set) {case 0:time(); break;case 1:set_time();break; case 2:set_t1();break;case 3:set_t2();break;case 4:set_t3();break;default:break; } }

往事随风LEO 发表于 2011-11-20 19:38:17

{:soso_e126:}打铃器还要自制啊!!!浪费时间,直接买一个,都是现成的,而且很便宜!

华山一道 发表于 2011-11-20 20:02:21

严重不懂为啥要自己做,廉价的现成东西不用?

水无香 发表于 2011-11-20 21:49:17

精神可嘉,认真钻研,工作本身也是一种生活,有时候不以金钱论罢

山寨版 发表于 2011-11-20 21:53:11

楼主赞一个。。。。。。。。。。

1五湖四海1 发表于 2011-11-20 22:51:53

华山一道 发表于 2011-11-20 20:02 static/image/common/back.gif
严重不懂为啥要自己做,廉价的现成东西不用?

我喜欢电子制作,将擅长的单片机技术应用到单位多好了,而且在制作过程中会遇到问题从中会学到很多东西。

904842999 发表于 2011-11-20 23:04:45

有时间自己做也好啊,我可还不会做
页: [1] 2 3 4 5
查看完整版本: DIY定时自动打铃器