在之前的文章中我們學習了數碼管定時鬧鐘中的按鍵中斷的寫法,接下來我們需要將我們的按鍵、蜂鳴器和我們之前設計的數碼管計時器相結合起來,就可以實現一個數字時間現實的定時鬧鐘了。
一、功能概述
通過按鍵來控制設定的時間,當到達時間后進入外部中斷,蜂鳴器開始工作,實現定時鬧鐘的功能。時間數字在四位數碼管上進行顯示,分鐘倒計時定時鬧鐘的功能,在此基礎上還可以添加小時的數碼管,來對小時的時間進行設置,原理還是類似的。
二、顯示原
本設計同樣采用的AT89C51單片機來實現多位數碼管的控制,附帶按鍵設置時間,以及蜂鳴器鬧鐘的功能。
電路連接如下:
三、程序代碼設計
結合我們前幾章所學的數碼管以及定時器、中斷的方法來對程序進行編寫。
程序如下:
#include< reg52.h >
#include< intrins.h >
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^0;//按鍵
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit buffer=P2^3;//蜂鳴器
sbit DU =P2^6;//段選
sbit WE =P2^7;//位選
uchar bitdata[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//數碼管1-8
uchar segdata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//段選0-9,-
uchar dis_arr[]={10,10,10,10,10,10};//時鐘顯示數組
uchar time[]={0,0,0};//時鐘 時分秒
uchar time_In[]={0,0,0,0,0,0};
uchar time_clk[]={0,0,0};//鬧鐘 時分秒
uchar num=0;
uchar mode=0;
uchar keydown=0;
uchar clk_state=0;
uchar keyIn,keyvalue,i,temp;//矩陣鍵盤讀入
void key();
void init();
uchar keyscan();//矩陣鍵盤掃描函數
void delayms(uint x);//延時函數
void display(uchar duan1,uchar duan2,uchar duan3,uchar duan4,uchar duan5,uchar duan6);
void display_1(uchar wei,uchar duan);
void input();
void soundTime();
void main()
{
input();
init();
while(1)
{
key();
if(mode==0)//時鐘
display(time[0]/10,time[0]%10,time[1]/10,time[1]%10,time[2]/10,time[2]%10);
else if(mode==1)//鬧鐘
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);
}
}
void init()//初始化函數
{
P3=0xff;//給高電平
TMOD=0x01;//定時器工作方式選擇1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; //開總中斷
ET0=1;//允許定時器0中斷
TR0=1;//開始計數
//P1=1;
}
void delayms(uint x)//延時函數
{
uint i,j;
for(i=x;i >0;i