《單片機(jī)電子時鐘設(shè)計畢業(yè)論文1》由會員分享,可在線閱讀,更多相關(guān)《單片機(jī)電子時鐘設(shè)計畢業(yè)論文1(13頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、
單片機(jī)電子時鐘設(shè)計畢業(yè)論文
一. 題目:單片機(jī)電子時鐘時鐘
二. 內(nèi)容:
設(shè)計一個數(shù)字時鐘,顯示范圍為00:00:00~23:59:59。通過幾個開關(guān)進(jìn)行控制,其中開關(guān)K1用于切換時間設(shè)置(調(diào)節(jié)時鐘)和時鐘運(yùn)行(正常運(yùn)行)狀態(tài);開關(guān)K2用于切換修改時、分、秒數(shù)值;開關(guān)K3用于使相應(yīng)數(shù)值加1調(diào)節(jié);開關(guān)K4用于減1調(diào)節(jié);開關(guān)K5用于設(shè)定鬧鐘,鬧鐘同樣可以設(shè)定初值,并且設(shè)定好后到時間通過實(shí)驗箱音頻放出一段樂曲作為鬧鈴。
選做增加項目:還可增加秒表功能(精確到0.01s)或年月日設(shè)定功能。
三. 要求:
2、開關(guān)K3進(jìn)行加1調(diào)節(jié)時,當(dāng)加至最大值(時為24,分和秒均為60)時要能正常歸零。開關(guān)K4進(jìn)行減1調(diào)節(jié)時,當(dāng)減至最小值00時,均能再回到從相應(yīng)最大值(時為23,分、秒均為59)。鬧鐘樂曲自定。
四. 電路及功能說明:
電路圖如圖所示:
圖A
圖B
圖C
該數(shù)字鐘是用一片AT8
3、9C51A單片機(jī)通過編程去驅(qū)動8個數(shù)碼管實(shí)現(xiàn)的。通過6個開關(guān)控制,從上到下6個開關(guān)KEY1~KEY6的功能分別為:KEY1,切換至秒表;KEY2,調(diào)節(jié)時間,每調(diào)一次時加1;KEY3, 調(diào)節(jié)時間,每調(diào)一次分加1;KEY4,從其它狀態(tài)切換至?xí)r鐘狀態(tài);KEY5,切換至鬧鐘設(shè)置狀態(tài),也可以對秒表清零;KEY6,秒表暫停.控制鍵分別與P1.0~P1.5口連接.其中:
A.通過P2口和P3口去控制數(shù)碼管的顯示如圖所示P2口接數(shù)碼管的a——g端,是控制輸出編碼,P3口接數(shù)碼管的1——8端,是控制動態(tài)掃描輸出.
B.從P0.0輸出一個信號使二極管發(fā)光,二極管在設(shè)置的鬧鐘時間到了時候發(fā)光,若有樂曲可以去驅(qū)動
4、揚(yáng)聲器實(shí)現(xiàn)。
(圖A是時鐘運(yùn)行狀態(tài),圖B是鬧鐘運(yùn)行狀態(tài),圖C是秒表運(yùn)行狀態(tài))
功能說明:
1. 各個控制鍵的功能:可對時間進(jìn)行校準(zhǔn)調(diào)節(jié)(只能加1);按下設(shè)置鍵數(shù)字時鐘進(jìn)入鬧鐘設(shè)置狀態(tài),設(shè)置鬧鐘的時間;時加1、分加1鍵是在校準(zhǔn)時間時或設(shè)置鬧鐘時間對小時數(shù)或分鐘數(shù)調(diào)節(jié)而設(shè)置的;按下秒切換鍵就可以進(jìn)入秒表模式,同時秒表也開始計時,按下秒表暫停、復(fù)位鍵就暫停、歸零,如果要重新對秒計時則可以按秒表開始、復(fù)位;清零鍵可以對鬧鐘清零。
2. AT89C51單片機(jī),通過編寫程序?qū)?shù)碼顯示進(jìn)行控制。
3. 八個7段數(shù)碼管顯示時鐘和秒表信號。
五. 實(shí)驗程序流程圖:
1. 主程序流程圖:
5、
2. 中斷程序流程圖
2. 秒表中斷程序流程圖:
3. 按鍵程序流程圖:
第一圖為時鐘和鬧鐘的調(diào)節(jié).
第二圖為進(jìn)入中斷和清零
六. 實(shí)驗結(jié)果分析:
此時鐘設(shè)計是利用protues仿真軟件進(jìn)行仿真?;旧蠈?shí)現(xiàn)了要求的功能,該多功能數(shù)字鐘實(shí)現(xiàn)的時鐘顯示、鬧鐘設(shè)置和秒表功能,校準(zhǔn)時鐘時只設(shè)計了時加鍵和分加鍵以及清零鍵,沒有設(shè)置減分減時鍵??砂l(fā)通過循環(huán)調(diào)節(jié)得到正確的調(diào)節(jié)數(shù)值。另外,要求有一段樂曲來作為鬧鐘,可這里只是用了一個二級管的發(fā)光來實(shí)現(xiàn)這個功能。若用一個揚(yáng)聲器和一個樂曲
6、能夠?qū)崿F(xiàn)。
七. 程序清單:
#include
#define uchar unsigned char
#define uint unsigned int
#define delay_time 3
uchar k,dat[]={0,0,0,0,0,0,0,0};
uint tcount,t,u;
uchar dat1[]={0,0,0,0,0,0,0,0};
uchar dat2[]={0,0,0,0,0,0,0,0};
uchar alarms[]={0,0,0,0,0,0,0,0};
uchar dis_bit[]={0x80,0x40,0x20
7、,0x10,0x08,0x04,0x02,0x01};
unsigned char code SEG7[11]={0xC0,/*0*/
0xF9,/*1*/
0xA4,/*2*/
0xB0,/*3*/
0x99,/*4*/
0x92,/*5*/
8、 0x82,/*6*/
0xF8,/*7*/
0x80,/*8*/
0x90,/*9*/
0xBF,/*-*/
};
sbit miaobiao1=P1^0;
sbit tminute=P1^1;
sbit thour=P1^2;
sbit miaobiao2=P1^3;
sbit alarm=P1
9、^4;
sbit P0_0=P0^0;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
uchar ms=0;
uchar flag=0;
uchar sec=0;
uchar minit=0;
struct time{uchar second;uchar minute;uchar hour;}time1;
uchar n,i;
void delay(n)
{
while(n--)
{
for(i=120;i>0;i--);
}
}
void mod
10、ify(void)
{
EA=0;
if(thour==0)
{
if(flag==0)
{
dat1[6]++;delay(180);
if(dat1[6]>9)
{
dat1[6]=0;dat1[7]++;
if(dat1[7]>2)
{
dat1[7]=0;
}
}
}
if(flag==1)
{
alarms[6]++;delay(200);
if(alarms[6]>9)
{
alarms[6]=0
11、;alarms[7]++;
if(alarms[7]>2)
{
alarms[7]=0;
}
}
dat[6]=alarms[6];
dat[7]=alarms[7];
}
}
if(tminute==0)
{
if(flag==0)
{
dat1[3]++;delay(180);
if(dat[3]>=10)
{
dat1[4]++;dat1[3]=0;
if(dat1[4]>5)
{
dat1[4]
12、=0;
}
}
}
if(flag==1)
{
alarms[3]++; delay(200);
if(alarms[3]>9)
{
alarms[4]++;alarms[3]=0;
if(alarms[4]>5)
{
alarms[4]=0;
}
}
dat[3]=alarms[3];
dat[4]=alarms[4];
}
}
if(miaobiao1==0)
{
TR0=0;ET0=0;TR
13、1=1;ET1=1;
}
if(miaobiao2==0)
{
TR0=1;ET0=1;TR1=0;ET1=0;
dat2[0]=0;
dat2[1]=0;
dat2[3]=0;
dat2[4]=0;
dat2[6]=0;
dat2[7]=0;
ms=0;
sec=0;
minit=0;
}
if(P1_5==0)
{
TR0=0;ET0=0;TR1=0;ET1=0;
}
if(alarm==0)
{
TR0=0;ET
14、0=0;TR1=0;ET1=0;flag=1;
dat[0]=0;
dat[1]=0;
dat[2]=10;
dat[3]=0;
dat[4]=0;
dat[5]=10;
dat[6]=0;
dat[7]=0;
}
EA=1;
}
void init(void)
{
TMOD = 0x11;
TH0 = 0xDB;
TL0 =0xFF;
TH1=0xDB;
TL1=0xFF;
ET0 = 1; //10ms
ET1=1;
// TR1=1;
15、TR0=1;
tcount=0;
ms=0;
sec=0;
minit=0;
EA = 1;
}
void test(void)
{
for(k=0;k<8;k++)
{
P3=dis_bit[k];P2=SEG7[dat[k]]; delay(1);P3=0X00;
}
}
void main()
{
init();
delay(10);
while(1)
{
modify();
16、 test();
}
}
void diplay() interrupt 1
{
ET0=0;
TR0=0;
TH0 = 0xDB;
TL0 = 0xff;
TR0=1;
tcount++;
if(tcount==100)
{
time1.second++;
tcount=0;
dat1[0]=(time1.second)%10;
dat1[1]=(time1.second)/10;
}
if(time1.second==60)
{
17、 time1.second=0;
time1.minute++;
dat1[3]=(time1.minute)%10;
dat1[4]=(time1.minute)/10;
}
if(time1.minute==60)
{
time1.minute=0;
time1.hour++;
dat1[6]=time1.hour%10;
dat1[7]=time1.hour/10;
}
if(time1.hour>23)
{
time1.hour=0;
}
18、 dat[5]=10;
dat[2]=10;
dat[0]=dat1[0];
dat[1]=dat1[1];
dat[3]=dat1[3];
dat[4]=dat1[4];
dat[6]=dat1[6];
dat[7]=dat1[7];
flag=0;
P0=0x00;
if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3]))
{
P0=0x01;
}
19、ET0=1;
}
void time_2(void)interrupt 3
{
EA=0;
TR0=0;
TH1=0xDB;
TL1=0xFF;
TR1=1;
ms++;
dat2[0]=ms%10;
dat2[1]=ms/10;
if(ms>=100)
{
ms=0;
sec++;
dat2[3]=sec%10;
dat2[4]=sec/10;
if(sec>=60)
{
sec=0;
minit++;
dat2[6]=minit%10;
dat2[7]=minit/10;
}
}
dat[5]=10;
dat[2]=10;
dat[0]=dat2[0];
dat[1]=dat2[1];
dat[3]=dat2[3];
dat[4]=dat2[4];
dat[6]=dat2[6];
dat[7]=dat2[7];
EA=1;