在之前的文章中我們學(xué)習(xí)了數(shù)碼管定時(shí)鬧鐘中的按鍵中斷的寫法,接下來我們需要將我們的按鍵、蜂鳴器和我們之前設(shè)計(jì)的數(shù)碼管計(jì)時(shí)器相結(jié)合起來,就可以實(shí)現(xiàn)一個(gè)數(shù)字時(shí)間現(xiàn)實(shí)的定時(shí)鬧鐘了。
一、功能概述
通過按鍵來控制設(shè)定的時(shí)間,當(dāng)?shù)竭_(dá)時(shí)間后進(jìn)入外部中斷,蜂鳴器開始工作,實(shí)現(xiàn)定時(shí)鬧鐘的功能。時(shí)間數(shù)字在四位數(shù)碼管上進(jìn)行顯示,分鐘倒計(jì)時(shí)定時(shí)鬧鐘的功能,在此基礎(chǔ)上還可以添加小時(shí)的數(shù)碼管,來對(duì)小時(shí)的時(shí)間進(jìn)行設(shè)置,原理還是類似的。
二、顯示原
本設(shè)計(jì)同樣采用的AT89C51單片機(jī)來實(shí)現(xiàn)多位數(shù)碼管的控制,附帶按鍵設(shè)置時(shí)間,以及蜂鳴器鬧鐘的功能。
電路連接如下:
三、程序代碼設(shè)計(jì)
結(jié)合我們前幾章所學(xué)的數(shù)碼管以及定時(shí)器、中斷的方法來對(duì)程序進(jìn)行編寫。
程序如下:
#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};//數(shù)碼管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};//時(shí)鐘顯示數(shù)組
uchar time[]={0,0,0};//時(shí)鐘 時(shí)分秒
uchar time_In[]={0,0,0,0,0,0};
uchar time_clk[]={0,0,0};//鬧鐘 時(shí)分秒
uchar num=0;
uchar mode=0;
uchar keydown=0;
uchar clk_state=0;
uchar keyIn,keyvalue,i,temp;//矩陣鍵盤讀入
void key();
void init();
uchar keyscan();//矩陣鍵盤掃描函數(shù)
void delayms(uint x);//延時(shí)函數(shù)
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)//時(shí)鐘
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()//初始化函數(shù)
{
P3=0xff;//給高電平
TMOD=0x01;//定時(shí)器工作方式選擇1
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
EA=1; //開總中斷
ET0=1;//允許定時(shí)器0中斷
TR0=1;//開始計(jì)數(shù)
//P1=1;
}
void delayms(uint x)//延時(shí)函數(shù)
{
uint i,j;
for(i=x;i >0;i