在之前的文章中我們學習了多位數碼管時鐘,既然有了時間,那我們為何不將他變為一個可以定時的鬧鐘呢,這樣不就更加的方便我們了嗎。這一章我們將開始對數碼管定時鬧鐘的學習。
一、功能概述
既然我們已經可以實現多位數碼管顯示時間,那么我們在這個時間的基礎上加上一個蜂鳴器,用按鍵的方式來調整我們所需要定時的時間,當時間到時進入外部中斷來控制蜂鳴器,而按鍵同樣也是外部中斷的方法。外部中斷的觸發方法有電平觸發和邊沿觸發兩種方式,這兩種方式都可以我們人為的去設定它。
二、顯示原理
使用AT89C51單片機來對數碼管進行時間的顯示,外加蜂鳴器起到鬧鐘的作用。這一章節我們先了解按鍵外部中斷的原理以及如何對按鍵控制時間的增減。
外部中斷分為兩個部分,中斷初始化部分和外部中斷服務函數。初始化部分是對中斷進行設定,確定所選用的中斷是哪一個,以及觸發中斷的條件,還有中斷的優先級順序。
//中斷初始化
void Interrupt_eint()
{
EX0 = 1; //開啟外部中斷0
IT0 = 1; //設置外部中斷0觸發模式:下降沿觸發
EX1 = 1; //開啟外部中斷1
IT1 = 1; //設置外部中斷1觸發模式
EA = 1; //開啟總中斷
PX0 = 1; //將外部中斷的優先級提高
}
//外部0中斷服務函數
void int0() interrupt 0
{
uchar j = 0;
for(j = 0;j<=3;++j)
{
DisplayNum(j);
delay_ms(1000);
}
}
我們以代碼的方式進行中斷的解讀,之后的學習我們也可以利用這兩段代碼來進行運用外部中斷。
三、電路連接
這里我們選用P3.0、P3.1、P3.2作為我們三個按鍵控制的引腳
定義代碼如下:
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;*/}
}
}