實(shí)用制作:基于單片機(jī)的數(shù)顯可調(diào)定時(shí)器
隨著電子技術(shù)的不斷發(fā)展,人們生活水平的不斷提高,充電型電子設(shè)備的種類和數(shù)量也跟著迅猛發(fā)展,尤其是電動(dòng)車和手機(jī)。這些電子設(shè)備在給我們生活和工作帶來便捷的同時(shí),充電的問題也使得人們不厭其煩,電動(dòng)車大約需要充電8小時(shí)左右,手機(jī)大約需要充電3小時(shí)左右,然而當(dāng)充電結(jié)束后,人們經(jīng)常忘記拔掉電源,更有甚者給電池充電達(dá)數(shù)天,這對(duì)電池的功能和使用壽命無疑是一種破壞。介于此,筆者萌生了自己動(dòng)手設(shè)計(jì)制作一個(gè)數(shù)顯可調(diào)定時(shí)器的想法,來解決一些生活中的問題。
數(shù)顯可調(diào)定時(shí)器數(shù)顯可調(diào)定時(shí)器原理介紹
通過小時(shí)和分鐘的“加”“、減”按鍵對(duì)需要的定時(shí)時(shí)間進(jìn)行預(yù)設(shè),確定無誤后,按下啟動(dòng)按鍵,定時(shí)開始,這時(shí),數(shù)碼管便會(huì)從預(yù)設(shè)時(shí)間開始倒計(jì)時(shí),同時(shí)充電發(fā)光二極管每秒閃爍一次,當(dāng)計(jì)時(shí)到零后,充電發(fā)光二極管由閃爍狀態(tài)變成常亮,繼電器動(dòng)作,切斷充電電源。
假如電路在運(yùn)行時(shí)出現(xiàn)故障或者運(yùn)行錯(cuò)誤,需要按單片機(jī)的復(fù)位鍵,然后對(duì)定時(shí)時(shí)間重新調(diào)整后,按啟動(dòng)按鍵,重新開始定時(shí)。
電路框圖如圖1所示。電路原理圖如圖2所示。
圖1 電路方框圖
圖2 電路原理圖
1. 輸入部分
輸入部分有五個(gè)按鍵組成,分別是分鐘+10、分鐘-10、小時(shí)+1、小時(shí)-1和設(shè)置完成按鍵。定時(shí)器的初始值是8小時(shí)。
使用前,先通過這五個(gè)按鍵進(jìn)行定時(shí)時(shí)間的設(shè)置,分鐘設(shè)置鍵的分辨率之所以10分鐘為一個(gè)步進(jìn)階梯完全是考慮的實(shí)際的需要,因?yàn)闊o論是電動(dòng)車還是手機(jī),都沒有必要以一分鐘為單位,當(dāng)然,使用者可以根據(jù)自己的需要?jiǎng)邮中薷某绦?,已達(dá)到自己的要求。
本制作所使用的按鍵均為四腳封裝常開型按鍵,使用前需通過萬用表對(duì)引腳進(jìn)行測(cè)量來確定那組引腳作為開關(guān)使用,當(dāng)然也可以直接使用對(duì)角線引腳作為開關(guān)按鍵,另外兩個(gè)引腳懸空,便不會(huì)出現(xiàn)問題。同時(shí)需要提醒的是,電路板上另外一個(gè)按鍵是單片機(jī)的復(fù)位按鍵,電路正常工作時(shí)不要去觸摸。
輸入部分的電路工作原理就是單片機(jī)對(duì)按鍵的識(shí)別,如圖3所示,單片機(jī)的P1口通過上拉電阻接高電平,當(dāng)沒有按鍵按下時(shí),P1.0~P1.4的管腳電壓為高電平,如果某一個(gè)按鍵按下,相應(yīng)的單片機(jī)并口就會(huì)被拉低為低電平。編程時(shí),只要掃描P1.0~P1.4的狀態(tài),便能完成對(duì)按鍵的識(shí)別。
圖3 輸入部分
2. 控制部分
控制部分采用AT89S51單片機(jī)作為控制器,它把按鍵的信息采集過來后,經(jīng)過單片機(jī)內(nèi)部的定時(shí)計(jì)數(shù)器T0運(yùn)算,完成相應(yīng)的定時(shí),同時(shí)單片機(jī)的并口也會(huì)將信息輸出給顯示部分和輸出部分。
控制部分的主要工作原理就是利用了單片機(jī)內(nèi)部的定時(shí)/ 計(jì)數(shù)器T 0 , 由于它的最大定時(shí)時(shí)間只有6 5 m s左右,所以,本制作利用T0的方式一,每次定時(shí)50ms,循環(huán)1200次,來實(shí)現(xiàn)精確的一分鐘定時(shí)。誤差在微秒級(jí)。
圖4 單片機(jī)最小系統(tǒng)
3. 顯示部分
顯示部分由兩個(gè)發(fā)光二極管和一個(gè)三位一體的數(shù)碼管組成。
紅色發(fā)光二極管為電源指示燈,當(dāng)電源通電其發(fā)光,斷電其熄滅。黃色發(fā)光二極管為充電指示燈,充電開始后,它每秒亮滅一次,充電完成后,其亮滅閃爍變?yōu)槌A痢T谠O(shè)計(jì)階段,筆者還建議在輸出繼電器加第三個(gè)發(fā)光二極管,作為繼電器吸合或斷開的指示燈,切忌一開始就加接強(qiáng)電,危險(xiǎn)極大。
數(shù)碼管是三位一體共陽(yáng)極封裝,高位數(shù)碼管顯示小時(shí),其它兩個(gè)數(shù)碼管顯示分鐘。
數(shù)碼管電路的主要工作原理就是電路驅(qū)動(dòng)和動(dòng)態(tài)掃描。
如圖5所示,數(shù)碼管的段驅(qū)動(dòng)采用自帶BCD譯碼的4線7段譯碼驅(qū)動(dòng)器74LS247。位驅(qū)動(dòng)則采用八同相三態(tài)緩沖器/線驅(qū)動(dòng)器的74HC244,由于它集成了八個(gè)同相驅(qū)動(dòng)器,所以可以驅(qū)動(dòng)八個(gè)數(shù)碼管。
圖5 顯示部分
數(shù)碼管動(dòng)態(tài)掃描就是利用人眼的視覺暫留現(xiàn)象,某一時(shí)刻只有一位數(shù)碼管顯示,其它熄滅,通過位選切換,快速的在三個(gè)數(shù)碼管上依次顯示所需信息,由于速度很快,加上數(shù)碼管的余輝現(xiàn)象和人眼的視覺暫留現(xiàn)象,使得人們能夠看到完整流暢的三個(gè)數(shù)字。
4.輸出部分
輸出部分主要是一個(gè)能控制220V市電通斷的繼電器。繼電器的驅(qū)動(dòng)部分則采用達(dá)林頓晶體管陣列ULN2003A(見圖6)。
圖6 輸出部分
它其實(shí)就是集成了七個(gè)繼電器驅(qū)動(dòng)的集成電路,所以本制作可以擴(kuò)展輸出七個(gè)繼電器,能滿足七個(gè)用電器的七種不同定時(shí),當(dāng)然,要實(shí)現(xiàn)此功能還需要修改程序。讀者也可以用分立元件來替代ULN2003A。
實(shí)物圖及PCB版圖如圖7~圖9所示。
圖7
圖8
圖9
程序清單:
#include <AT89X51.H>
#defi ne uchar unsigned char
#defi ne uint unsigned int
uchar bbit[]={0x04,0x02,0x01};
uchar buffer[]={0,0,0};
uchar hour=8,minute;//小時(shí)初始值為8,分鐘為00
uint count;
void delay(uchar ms)//毫秒級(jí)延時(shí)子程序
{
uchar j;
for(;ms>0;ms--)
for(j=0;j<120;j++);
}
void tt0() interrupt 1 using 1//定時(shí)器T0中斷子程序
{
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
if(count==1200) //50ms*1200=60s(秒)
{
count=0;
if(hour==0&&minute==0)
{
P3_0=1; //繼電器動(dòng)作
while(1){P1_7=0;}//充電完成 燈由閃爍變常亮
}
if(minute==0)
{
minute=60; hour--;
if(hour>=9)hour=9;
}
minute--;
if(minute>=59)minute=59;
}
buffer[0]=minute%10;//秒的低位放入顯示緩沖區(qū)
buffer[1]=minute/10;//秒的高位放入顯示緩沖區(qū)
buffer[2]=hour; //小時(shí)放入顯示緩沖區(qū)
count++;
if(count%10==0)
P1_7=!P1_7; //正在充電 充電指示燈每秒閃爍一次
}
void display()//數(shù)碼管顯示子程序
{uchar i;
for(i=2;i!=0xff;i--)
{
P0=buffer[i];
P2=bbit[i];
delay(10);
P0=0XFF;
}
}
void main()//主函數(shù)
{
P1=0xff; //初始化
P3=0;
TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;
ET0=1;
while(1)
{
buffer[0]=minute%10;
buffer[1]=minute/10;
buffer[2]=hour;
display();
if(P1_0==0)//分鐘“加十”
{
delay(5);
if(P1_0==0)
{minute+=10;if(minute>=59)minute=0;} while(P1_0==0);
}
if(P1_1==0)//分鐘“減十”
{
delay(5);
if(P1_1==0)
{minute-=10;if(minute>=59)minute=0;}while(P1_1==0);
}
if(P1_3==0)//小時(shí)“加一”
//P1_3和P1_2互換位置,完全是因?yàn)镻CB布局的需要
{
delay(5);
if(P1_3==0)
{hour++;if(hour>=9)hour=9;} while(P1_3==0);
}
if(P1_2==0)//小時(shí)“減一”
{
delay(5);
if(P1_2==0)
{hour--;if(hour>=9)hour=9;}while(P1_2==0);
}
if(P1_4==0)break;
//如果按下設(shè)置鍵,跳出本循環(huán),定時(shí)開始
}
TR0=1;
while(1)
{
display();
}
}