在之前的文章中我們學(xué)習(xí)了多位數(shù)碼管時(shí)鐘,既然有了時(shí)間,那我們?yōu)楹尾粚⑺優(yōu)橐粋€(gè)可以定時(shí)的鬧鐘呢,這樣不就更加的方便我們了嗎。這一章我們將開始對數(shù)碼管定時(shí)鬧鐘的學(xué)習(xí)。
一、功能概述
既然我們已經(jīng)可以實(shí)現(xiàn)多位數(shù)碼管顯示時(shí)間,那么我們在這個(gè)時(shí)間的基礎(chǔ)上加上一個(gè)蜂鳴器,用按鍵的方式來調(diào)整我們所需要定時(shí)的時(shí)間,當(dāng)時(shí)間到時(shí)進(jìn)入外部中斷來控制蜂鳴器,而按鍵同樣也是外部中斷的方法。外部中斷的觸發(fā)方法有電平觸發(fā)和邊沿觸發(fā)兩種方式,這兩種方式都可以我們?nèi)藶榈娜ピO(shè)定它。
二、顯示原理
使用AT89C51單片機(jī)來對數(shù)碼管進(jìn)行時(shí)間的顯示,外加蜂鳴器起到鬧鐘的作用。這一章節(jié)我們先了解按鍵外部中斷的原理以及如何對按鍵控制時(shí)間的增減。
外部中斷分為兩個(gè)部分,中斷初始化部分和外部中斷服務(wù)函數(shù)。初始化部分是對中斷進(jìn)行設(shè)定,確定所選用的中斷是哪一個(gè),以及觸發(fā)中斷的條件,還有中斷的優(yōu)先級順序。
//中斷初始化
void Interrupt_eint()
{
EX0 = 1; //開啟外部中斷0
IT0 = 1; //設(shè)置外部中斷0觸發(fā)模式:下降沿觸發(fā)
EX1 = 1; //開啟外部中斷1
IT1 = 1; //設(shè)置外部中斷1觸發(fā)模式
EA = 1; //開啟總中斷
PX0 = 1; //將外部中斷的優(yōu)先級提高
}
//外部0中斷服務(wù)函數(shù)
void int0() interrupt 0
{
uchar j = 0;
for(j = 0;j<=3;++j)
{
DisplayNum(j);
delay_ms(1000);
}
}
我們以代碼的方式進(jìn)行中斷的解讀,之后的學(xué)習(xí)我們也可以利用這兩段代碼來進(jìn)行運(yùn)用外部中斷。
三、電路連接
這里我們選用P3.0、P3.1、P3.2作為我們?nèi)齻€(gè)按鍵控制的引腳
定義代碼如下:
voidkey()
{
while(key2==0)
{
input();
break;
}
if(key1==0)
{
delayms(200);
if(key1==0)
//{while(!key1){TR0=0;display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}TR0=1;}
{TR0=!TR0;while(!key1)display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}
//else if(TR0==0)TR0=1;}
else if(key1==1)
{mode++;if(mode==2)mode=0;}
}
if(key3==0)
{
delayms(200);
if(key3==0)
{if(mode==0{time[0]=0;time[1]=0;time[2]=0;num=0;
while(!key3)display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);}
else if(mode==1){time_clk[0]=0;time_clk[1]=0;time_clk[2]=0;
while(!key3)display(time_clk[0]/10,time_clk[0]%10,time_clk[1]/10,time_clk[1]%10,time_clk[2]/10,time_clk[2]%10);}}
else if(key3==1)
{buffer=1;/*P1=1;*/}
}
}