機(jī)械社區(qū)

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 18138|回復(fù): 40
打印 上一主題 下一主題

DIY定時自動打鈴器

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

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

圖片 014.jpg

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

圖片 019.jpg
回復(fù)

使用道具 舉報

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

使用道具 舉報

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;
}
}
回復(fù) 支持 反對

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

點(diǎn)評

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

GMT+8, 2024-11-2 08:30 , Processed in 0.067798 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表