機械社區(qū)

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 17880|回復: 40
打印 上一主題 下一主題

DIY定時自動打鈴器

[復制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-11-20 18:46:59 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
DIY定時自動打鈴器
  我廠為了搞好軍事化管理,在每個廠房安裝了電鈴。按廠規(guī)定的休息時間打鈴提示。安裝這套裝置需要一個定時自動控制電鈴開啟的裝置。廠子安排我負責完成這套裝置。我接下任務(wù)打算自行設(shè)計一套定時打鈴器,我的設(shè)計方案得到廠領(lǐng)導批準后,我給自己立下軍令狀一周之內(nèi)完成。
  在20111120日制作完成了定時自動打鈴器,我利用單片機技術(shù)計時產(chǎn)生秒信號首先完成了數(shù)字電子鐘,在此基礎(chǔ)上加入了繼電器并通過軟件實現(xiàn)了定時控制繼電器。最后加入了鍵盤可以調(diào)整走時時間和設(shè)置多個定時時間。做到這里遇到一個問題,我是采用市電220v變壓整流給單片機板供電的,如果突然停電就會丟失走時時鐘和設(shè)置數(shù)據(jù),所以一定要保證供電連續(xù)性。我想了一個辦法如果停電時采用備用電池供電,停電時它們切換供電在切換過程中加入了10000uf的大電容解決了在切換過程中斷電現(xiàn)象。
  在整個制作過程中遇到了許多問題,我需要面對問題去解決遇到的難題。我個人認為這是一個鍛煉自己解決問題的好機會。制作中有苦有樂,我將制作方法拿出來和大家一起分享。
下面是我的小型實驗室
制作過程:20111115日,我走進我的小角落小型實驗室,找出了51單片機開發(fā)板,打開電腦開始寫程序,忙了一天寫好了單片機數(shù)字電子鐘。這套裝置的核心就是電子鐘,所以首先要制作出數(shù)字電子鐘。然后在數(shù)字鐘程序基礎(chǔ)上加入了幾條語句就可以按編寫的時間控制繼電器閉合觸點了,很簡單吧!通過計算機設(shè)定調(diào)整時間設(shè)置定時時間可不行,下一步要加入鍵盤,通過鍵盤調(diào)整走時時間和設(shè)置定時時間。圖上面的三個按鈕分別為設(shè)置鍵,小時調(diào)整鍵,分鐘調(diào)整鍵。第二天完成了鍵盤調(diào)整函數(shù)模塊程序編寫,可以在一天中多了時間段控制電鈴響起。一步一步的調(diào)試改進完成了自動打鈴器,在喜悅中新問題來了,打鈴器工作了一天后出現(xiàn)了走時誤差,經(jīng)過9個小時就會出現(xiàn)60秒的誤差。我開始嘗試了各種方法解決誤差問題,采用自動調(diào)整法比較有效果,實驗測出產(chǎn)生1秒誤差所需用的時間,然后通過程序每過一段時間就將秒變量自動加1或是減1來清除誤差。在電源供電方面考慮實際情況需用改進。單片機正常工作必須保證電能連續(xù)性。如果一旦停電數(shù)據(jù)將會丟失,所以要加入備用電池當停電時自動切換到電池供電。我將繼電器接到變壓器輸出端,如果市電有電時繼電器得電工作,停電時繼電器失電,通過繼電器常開常閉觸點控制市電和電池切換,在供應電源輸出端加入10000uf大電容起到市電和電池切換瞬間斷電現(xiàn)象。電源電路中加入了一只光耦輸出端送往單片機它起到判斷何種方式供電,如果電池供電單片機板上面的數(shù)碼管關(guān)閉以節(jié)省電能。
  下面有電源部分電路原理圖,單片機部分電路原理圖,實物圖和單片機c51程序。

圖片 014.jpg (69.22 KB, 下載次數(shù): 106)

圖片 014.jpg

圖片 019.jpg (66.05 KB, 下載次數(shù): 99)

圖片 019.jpg
回復

使用道具 舉報

推薦
發(fā)表于 2011-11-20 22:45:40 | 只看該作者
其實對于定時打鈴的辦法很多。比如管理體系健全的企業(yè)一般各個車間和部門都會安裝廣播系統(tǒng)的。利用這個系統(tǒng),在辦公電腦上裝個定時播放音樂的軟件,定時播放鈴聲即可。且電腦的時鐘是可以聯(lián)網(wǎng)校準的。更不怕斷電產(chǎn)生時鐘混亂;揪褪橇阃度搿
回復 支持 1 反對 0

使用道具 舉報

2#
 樓主| 發(fā)表于 2011-11-20 18:48:40 | 只看該作者
下面是自動打鈴器c程序
#include<reg51.h>
#define shum P1  //數(shù)碼
#define saom P2 //數(shù)碼掃描
#define uchar unsigned char
#define uint unsigned int
char DATA_7SEG[10]={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小時設(shè)定值 y是定時1分設(shè)定值
uchar deda=0;
uchar code xsjsbb[60];
bit d_05s=0;
uchar set=0;
/*-----------------------走時函數(shù)--------------------------*/
void init_timer()
{
  TMOD=0x01;
  TH0=(65536-5000)/256;
  TL0=(65536-5000)%256;
  IE=0x82;
  TR0=1;
}
/*-----------------------5ms定時中斷服務(wù)函數(shù)--------------------------*/
void T0_srv(void) interrupt 1
{
  TH0=(65536-5000)/256;
  TL0=(65536-5000)%256;
  deda++ ;
}
/*----------------------時,分,秒單元及走時單元轉(zhuǎn)換-------------------------*/
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;}                       //自動調(diào)時沒過9分鐘(tauto=9)秒變量sec自增1
if(min==60){hour++;min=0;}
if(hour==24){hour=0;}
}
void display()                //數(shù)碼管模塊
{char e,scan;
if(deda<=100)P3_4=0; else P3_4=1;
if(hour==x)a=1; else a=0;                     //定時設(shè)定值xy g,f o,p
if(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[3]=hour/10;
disp[2]=hour%10;
disp[1]=min/10;
disp[0]=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[disp[e]];
else       P1=0xff;
delay(4);
scan>>=1;
}
}
/*-------------------調(diào)整走時時間函數(shù)部分------------------------*/
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);
  }
}
}
回復 支持 反對

使用道具 舉報

3#
 樓主| 發(fā)表于 2011-11-20 18:49:20 | 只看該作者
1五湖四海1 發(fā)表于 2011-11-20 18:48
下面是自動打鈴器c程序
#include#define shum P1  //數(shù)碼#define saom P2 //數(shù)碼掃描#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[4]=1;
     tdisp[3]=x/10;
     tdisp[2]=x%10;
     tdisp[1]=y/10;
     tdisp[0]=y%10;
     P1=0xff;
     scan=0xef;
     for(e=0;e<5;e++)
     {
     shum=0xff;
     saom=scan;
   
     P1=DATA_7SEG[tdisp[e]];
     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[4]=2;
     tdisp[3]=g/10;
     tdisp[2]=g%10;
     tdisp[1]=f/10;
     tdisp[0]=f%10;
     P1=0xff;
     scan=0xef;
     for(e=0;e<5;e++)
     {
     shum=0xff;
     saom=scan;
   
     P1=DATA_7SEG[tdisp[e]];
     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[4]=3;
     tdisp[3]=o/10;
     tdisp[2]=o%10;
     tdisp[1]=p/10;
     tdisp[0]=p%10;
     P1=0xff;
     scan=0xef;
     for(e=0;e<5;e++)
     {
     shum=0xff;
     saom=scan;
   
     P1=DATA_7SEG[tdisp[e]];
     delay(4);
     scan>>=1;
     }
   delay(1);
  }
}
/*-------------------按鍵掃描及延時等函數(shù)部分-------------------------*/
/*--------走時時間程序函數(shù)--------*/
void time()
{
  conv();
  display();
}
/*--------掃描按鍵函數(shù)--------*/
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;
}
/*--------延時函數(shù)-------------*/
void delay(uint k)
{
uint i,j;
for(i=0;j<k;i++)
  {
   for(j=0;j<121;j++);
  }
}
/*-----------------主函數(shù)-------------------------------------*/
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;
}
}
回復 支持 反對

使用道具 舉報

4#
發(fā)表于 2011-11-20 19:38:17 | 只看該作者
{:soso_e126:}  打鈴器還要自制啊。!浪費時間,直接買一個,都是現(xiàn)成的,而且很便宜!
回復 支持 反對

使用道具 舉報

5#
發(fā)表于 2011-11-20 20:02:21 | 只看該作者
嚴重不懂為啥要自己做,廉價的現(xiàn)成東西不用?
回復 支持 反對

使用道具 舉報

6#
發(fā)表于 2011-11-20 21:49:17 | 只看該作者
精神可嘉,認真鉆研,工作本身也是一種生活,有時候不以金錢論罷
回復 支持 反對

使用道具 舉報

7#
發(fā)表于 2011-11-20 21:53:11 | 只看該作者
樓主贊一個。。。。。。。。。。
回復 支持 反對

使用道具 舉報

9#
 樓主| 發(fā)表于 2011-11-20 22:51:53 | 只看該作者
華山一道 發(fā)表于 2011-11-20 20:02
嚴重不懂為啥要自己做,廉價的現(xiàn)成東西不用?

我喜歡電子制作,將擅長的單片機技術(shù)應用到單位多好了,而且在制作過程中會遇到問題從中會學到很多東西。

點評

以學習為目的的另當別論  發(fā)表于 2011-11-21 09:31
回復 支持 反對

使用道具 舉報

10#
發(fā)表于 2011-11-20 23:04:45 | 只看該作者
有時間自己做也好啊,我可還不會做
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規(guī)則

小黑屋|手機版|Archiver|機械社區(qū) ( 京ICP備10217105號-1,京ICP證050210號,浙公網(wǎng)安備33038202004372號 )

GMT+8, 2024-9-20 07:36 , Processed in 0.063578 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表