第一章 系統(tǒng)設(shè)計要求1.1 基本功能 (1)能夠顯示時分秒 (2)能夠調(diào)整時分秒 1.2 擴(kuò)展功能 (1)能夠任意設(shè)置定時時間 (2)定時時間到鬧鈴能夠報警 (3)實現(xiàn)了秒表功能 第二章 硬件總體設(shè)計方案本次設(shè)計時鐘電路,使用了AT89C51單片機(jī)芯片控制電路,單片機(jī)控制電路簡單且省去了很多復(fù)雜的線路,使得電路簡明易懂,使用鍵盤鍵上的按鍵來調(diào)整時鐘的時、分、秒,用一揚(yáng)聲器來進(jìn)行定時提醒,同時使用C語言程序來控制整個時鐘顯示,使得編程變得更容易,這樣通過四個模塊:鍵盤、芯片、揚(yáng)聲器、顯示屏即可滿足設(shè)計要求。 2.1系統(tǒng)功能實現(xiàn)總體設(shè)計思路此設(shè)計原理框圖如圖2-1所示,此電路包括以下四個部分:單片機(jī),鍵盤,鬧鈴電路及顯示電路。 file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps42C7.tmp.pngfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps42C8.tmp.png 圖2-1 設(shè)計原理框圖 詳細(xì)元器件列表下表所示: 詳細(xì)元器件列表: AT89c51 1片 74SED八位共陽極數(shù)碼管 1片 NPN三極管 1個 104p電容 6個 30p電容 2個 10K電阻 6個 560歐姆電阻 8個 200歐姆電阻 1個 100歐姆電阻 6個 2.2各部分功能實現(xiàn)(1) 單片機(jī)發(fā)送的信號通過程序控制最終在數(shù)碼管上顯示出來。 (2) 單片機(jī)通過輸出各種電脈沖信號來驅(qū)動控制各部分正常工作。 (3) 為使時鐘走時與標(biāo)準(zhǔn)時間一致,校時電路是必不可少的,鍵盤用來校正數(shù)碼管上顯示的時間。 (4) 單片機(jī)通過控制鬧鈴電路來完成 定時鬧鐘的功能。 2.3系統(tǒng)工作原理設(shè)計的電路主要由四模塊構(gòu)成:單片機(jī)控制電路,顯示電路、鬧鈴電路以及校正電路。 詳細(xì)電路功能圖下圖所示: file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps42C9.tmp.png 詳細(xì)電路功能圖 本設(shè)計采用C語言程序設(shè)計,使單片機(jī)控制數(shù)碼管顯示時、分、秒,當(dāng)秒計數(shù)計滿60時就向分進(jìn)位,分計數(shù)器計滿60后向時計數(shù)器進(jìn)位,小時計數(shù)器按“23翻0”規(guī)律計數(shù)。時、分、秒的計數(shù)結(jié)果經(jīng)過數(shù)據(jù)處理可直接送顯示器顯示。當(dāng)計時發(fā)生誤差的時候可以用校時電路進(jìn)行校正。設(shè)計采用的是時、分、秒顯示,單片機(jī)對數(shù)據(jù)進(jìn)行處理同時在數(shù)碼管上顯示。 2.4電路功能使用說明(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è)計方案控制電路的C語言源程序根據(jù)流程圖,經(jīng)過認(rèn)真分析得出控制電路的源程序如下:
#include<reg51.h> #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,2,1}; 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,0x10,0x08,0x04,0x02,0x01}; unsigned char code SEG7[11]={0xC0,/*0*/ 0xF9,/*1*/ 0xA4,/*2*/ 0xB0,/*3*/ 0x99,/*4*/ 0x92,/*5*/ 0x82,/*6*/ 0xF8,/*7*/ 0x80,/*8*/ 0x90,/*9*/ 0xBF,/*-*/ };/*數(shù)字顯示數(shù)組*/ sbit miaobiao1=P1^0; sbit tminute=P1^1; sbit thour=P1^2; sbit miaobiao2=P1^3; sbit alarm=P1^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 modify(void) { EA=0; if(thour==0) { if(flag==0) { dat1[6]++;delay(280); if(dat1[6]>9) { dat1[6]=0; dat1[7]++; } else if((dat1[7]>1)&&(dat1[6]>3)) {dat1[7]=0; dat1[6]=0; } } if(flag==1) { alarms[6]++;delay(300); if(alarms[6]>9) { alarms[6]=0;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(280); if(dat[3]>=9) { dat1[4]++;dat1[3]=0; if(dat1[4]>5) { dat1[4]=0; } } } if(flag==1) { alarms[3]++; delay(300); 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;TR1=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;ET0=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; 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; } }/*數(shù)字顯示*/ void main() {init(); delay(10); while(1) { modify(); test(); } }/*主函數(shù)*/ 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) { dat1[0]=0; dat1[1]=0; 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; } 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=0x01; if((alarms[7]==dat1[7])&&(alarms[6]==dat1[6])&&(alarms[4]==dat1[4])&&(alarms[3]==dat1[3])&&(dat1[1]<1)) { P0=0x00; } 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;
|