8051單片機(jī)電子時(shí)鐘設(shè)計(jì)_第1頁
8051單片機(jī)電子時(shí)鐘設(shè)計(jì)_第2頁
8051單片機(jī)電子時(shí)鐘設(shè)計(jì)_第3頁
8051單片機(jī)電子時(shí)鐘設(shè)計(jì)_第4頁
8051單片機(jī)電子時(shí)鐘設(shè)計(jì)_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 單片機(jī)原理及應(yīng)用綜合實(shí)訓(xùn)報(bào)告題目: 電子時(shí)鐘的設(shè)計(jì) 院 別: 自動(dòng)化學(xué)院 專 業(yè): 電氣工程及其自動(dòng)化 1 姓 名: 笑嘻嘻 學(xué) 號(hào): 2009104143036 指導(dǎo)教師: 祁偉 答辯日期: 2011年9月19日 電子時(shí)鐘制作摘 要本實(shí)訓(xùn)借用實(shí)驗(yàn)板的MCS51單片機(jī)定時(shí)、中斷功能完成電子時(shí)鐘的定時(shí)工作,應(yīng)用8051對(duì)單片機(jī)I/O口驅(qū)動(dòng)發(fā)光二極管、LED進(jìn)行電子時(shí)鐘時(shí)、分、秒顯示。應(yīng)用8051P3口、8255B口完成時(shí)間的設(shè)定工作。利用P1口加入華彩設(shè)計(jì),如發(fā)光二極管按鍵指示、時(shí)鐘報(bào)時(shí)等。再根據(jù)電子時(shí)鐘實(shí)際應(yīng)用完成系統(tǒng)總體設(shè)計(jì)。,根據(jù)系統(tǒng)總體設(shè)計(jì)完成編程設(shè)計(jì)工作,最后通電、軟件調(diào)試、運(yùn)行。關(guān)

2、鍵詞:電子時(shí)鐘;8051; 8051P3;8255B目錄1電子時(shí)鐘的概述12電子時(shí)鐘的硬件電路設(shè)計(jì)12.1選用單片機(jī)22.2發(fā)光二極管8字?jǐn)?shù)碼管的顯示32.3單片機(jī)I/O口擴(kuò)展42.4獨(dú)立式按鍵53電子時(shí)鐘軟件設(shè)計(jì)部分63.1程序流程圖63.2定時(shí)中斷服務(wù)程序流程圖83.3擴(kuò)展功能程序流程84電子時(shí)鐘實(shí)用說明94心得體會(huì)95附錄10程序代碼101電子時(shí)鐘的概述電子時(shí)鐘功用,能利用MCS51單片機(jī)定時(shí)、中斷功能完成時(shí)間的定時(shí)工作。整個(gè)系統(tǒng)具有參數(shù)設(shè)定、時(shí)間運(yùn)行、報(bào)時(shí)、查詢當(dāng)前年、月、日等功能。開機(jī)可顯示HELLO-,按某個(gè)特定的按鍵后,時(shí)鐘還可以開始計(jì)時(shí),還可以通過另一些鍵功能,完成分,時(shí)、日、

3、月、年參數(shù)設(shè)定。參數(shù)設(shè)定完后,也可以通過一些鍵繼續(xù)計(jì)時(shí)。電子時(shí)鐘常顯示的是當(dāng)前的時(shí)間,年、月、日還可以通過按幾個(gè)特定的鍵切換、查詢, 6位LED顯示查詢的內(nèi)容,如現(xiàn)在的年月日。注意事項(xiàng):時(shí)鐘計(jì)時(shí)時(shí)可進(jìn)行時(shí)間查詢,但不能更改參數(shù),若要更改參數(shù),必須先停止時(shí)鐘運(yùn)行。2電子時(shí)鐘的硬件電路設(shè)計(jì)2.1選用單片機(jī)MCS51系統(tǒng)選用8051單片機(jī),如圖1所示。8051單片機(jī)內(nèi)有4KROM、256字節(jié)RAM,程序存放在4KROM。8051單片機(jī)最小系統(tǒng)組成有:1)時(shí)鐘電路:工作時(shí)鐘;2)復(fù)位電路,如圖2所示;3)RAM:數(shù)據(jù)存儲(chǔ)4)ROM:程序存儲(chǔ)5)I/O接口:與外界交互 晶振電路如圖3所示。圖3 圖2 圖

4、12.2發(fā)光二極管8字?jǐn)?shù)碼管的顯示LED顯示有靜態(tài)顯示和動(dòng)態(tài)顯示兩種方式。動(dòng)態(tài)顯示接口電路簡圖如圖4所示。將各位數(shù)碼管的段并聯(lián)接在一起,由P1口控制(字型口),每一個(gè)數(shù)碼管的共陰極(共陽極)接到P2.0、P2.1作為位選信號(hào)。雖說要顯示的字型碼通過P1口同時(shí)送到了每一個(gè)數(shù)碼管,但它們不會(huì)同時(shí)顯示同一個(gè)字符,只有控制共陰極(共陽極)的位選信號(hào)有效時(shí),對(duì)應(yīng)的數(shù)碼管才會(huì)顯示相應(yīng)字符。這種由字型口控制要顯示字符的字形碼,依此循環(huán)選通每位數(shù)碼管的位選信號(hào)就得到了動(dòng)態(tài)顯示效果。它主要是利用人眼的視覺暫留特性及數(shù)碼管得余光特性,看上去似乎是多位數(shù)碼管同時(shí)顯示。是當(dāng)顯示位數(shù)較多時(shí),節(jié)省硬件,接口電路簡單,但顯

5、示占用CPU時(shí)間。靜態(tài)顯示占用CPU時(shí)間短,顯示簡單、穩(wěn)定,但當(dāng)顯示位數(shù)較多時(shí),占用接口資源多。動(dòng)態(tài)顯示接口電路較簡單,但占用CPU時(shí)間,顯示亮度 較靜態(tài)顯示差,一般說,顯示位數(shù)較多時(shí),采用動(dòng)態(tài)或串并轉(zhuǎn)換;顯示位數(shù)較少時(shí),采用靜態(tài)顯示方式。 圖4靜態(tài)顯示接口電路如圖5所示。選用共陰極LED,將共陰極點(diǎn)連接在一起接地,每一位的段選線與一個(gè)8位并行口相連,只要將要 顯示的字符的字型碼送至并行口鎖存, 圖5LED顯示器上便立即顯示出該字符,直到CPU送來一個(gè)新的字型碼為止,由于靜態(tài)顯示每位數(shù)碼管均有獨(dú)立的段選碼,耗電量大,硬件多。如要外接6個(gè)數(shù)碼管,則需要6個(gè)8位并行口。2.3單片機(jī)I/O口擴(kuò)展當(dāng)單

6、片機(jī)構(gòu)成系統(tǒng)時(shí),常常I/O口不夠用,此時(shí)可利用MCS51的擴(kuò)展能力,根據(jù)需要擴(kuò)展相應(yīng)接口,如可編程接口芯片8255與MCS51單片機(jī)連接可擴(kuò)展I/O;利用MCS-51單片機(jī)的 串行口擴(kuò)展并行I/O接口。實(shí)驗(yàn)板原理圖的顯示部分就是利用串入/并出技術(shù)實(shí)現(xiàn)2位數(shù)碼管的顯示。2.4獨(dú)立式按鍵 鍵盤是一組按鈕式開關(guān)的集合,常采用軟件來識(shí)別。鍵盤的操作步驟:識(shí)鍵。判斷是否有鍵按下(鍵入),若有,則需進(jìn)一步譯鍵。譯鍵。在有鍵入的情況下,進(jìn)一步識(shí)別是哪一個(gè)鍵,以便作進(jìn)一步處理。鍵義分析。根據(jù)識(shí)別的結(jié)果,明確相應(yīng)的鍵義。如果是數(shù)字鍵,應(yīng)得出輸出的數(shù)值;如果是功能鍵,則應(yīng)知道具體的操作要求。 鍵盤構(gòu)成:獨(dú)立聯(lián)接式

7、非編碼鍵盤。 特點(diǎn):每個(gè)鍵相互獨(dú)立,各自接通一條輸入數(shù)據(jù)線。鍵未按下時(shí),相應(yīng)的數(shù)據(jù)線處于高電平,即為“1”態(tài)。當(dāng)某鍵按下時(shí),該鍵所連之?dāng)?shù)據(jù)線接地,即為“0”態(tài)。獨(dú)立聯(lián)接式編碼鍵盤。 特點(diǎn):在鍵數(shù)較多時(shí),可采用獨(dú)立式編碼鍵盤,由4線-16線編碼電路進(jìn)行編碼。 矩陣聯(lián)接式非編碼。特點(diǎn):先使一行線接地,然后檢查列線。如果某條列線也是低電位,則可判別兩線相交處的某號(hào)鍵已按下。假如在掃描時(shí)沒有發(fā)現(xiàn)有列線為地電位,則說明此行中無鍵按下。那么可將下一行線接地,如此逐一掃描列線,直到查完最后一行為止。 實(shí)驗(yàn)板中鍵盤電路設(shè)計(jì)可根據(jù)需要組合成獨(dú)立聯(lián)接式非編碼鍵盤及矩陣聯(lián)接式非編碼,見圖6所示。 圖63電子時(shí)鐘軟件

8、設(shè)計(jì)部分3.1程序流程圖編寫程序之前先繪制程序流程圖,理清思路,使之能簡明、直觀指示程序流向,且很容易由此編寫出具體的源程序。將程序以模塊方式分割成具有相應(yīng)功能的子程序。根據(jù)系統(tǒng)功能,合理安排主程序任務(wù),中斷服務(wù)程序任務(wù)。圖1-6主程序框圖開始各功能的初始化有按鍵否?顯示HELLO-YNP3.2鍵嗎?時(shí)鐘運(yùn)行K12鍵嗎?K13鍵嗎?Y參數(shù)設(shè)定YNN日查詢顯示K14鍵嗎?月查詢顯示K15鍵嗎?年查詢顯示YYYNNN程序設(shè)計(jì)有兩個(gè)分支:參數(shù)設(shè)定及時(shí)鐘運(yùn)行。靜態(tài)參數(shù)設(shè)定時(shí),定時(shí)器關(guān)閉,只完成參數(shù)“加一鍵”的設(shè)定工作。時(shí)鐘運(yùn)行時(shí),啟動(dòng)定時(shí)器開始計(jì)時(shí)。編寫程序時(shí), 圖7首先理清思路,即通過流程圖確定算法

9、。主程序框圖 如圖7所示。在主程序中,分別初始化了定時(shí)器0和外部中斷0。定時(shí)器0的中斷服務(wù)程序用于實(shí)現(xiàn)時(shí)鐘運(yùn)進(jìn)入中斷圖1-7中斷服務(wù)程序框圖定時(shí)初值重置秒到否?NYN秒加1分到否?分加1時(shí)到否?時(shí)加1日到否?日加1月到否?月加1年到否?年加1Y中斷返回NNNNYYYY行時(shí)的秒加1及進(jìn)位功能。外部中斷0的中斷服務(wù)程序使r=1。因此,當(dāng)開始運(yùn)行程序時(shí),r=0,數(shù)碼管顯示HELLO-;當(dāng)P3.2按下時(shí),進(jìn)入外部中斷0中斷服務(wù)程序,使r=1,退出中斷服務(wù)程序后,時(shí)鐘開始運(yùn)行;在時(shí)鐘 運(yùn)行過程中,如果分別按下K13、K14、K15可設(shè)置時(shí)間,查詢年、月、日。3.2定時(shí)中斷服務(wù)程序流程圖定時(shí)中斷服務(wù)程序流

10、程圖如圖8所示。圖8 圖8圖83.3擴(kuò)展功能程序流程擴(kuò)展功能程序流程如圖9所示。年查詢顯示月查詢顯示日查詢顯示K12或k13?k12或k13?K12或k15?加或減參數(shù)加或減參數(shù)加或減參數(shù)時(shí)鐘運(yùn)行P3.2按下圖94電子時(shí)鐘實(shí)用說明1、開機(jī)時(shí),顯示HELLO-。2、按下K16鍵,電子時(shí)鐘開始運(yùn)行,數(shù)碼管顯示時(shí)、分、秒。3、按下K13鍵,進(jìn)入時(shí)間參數(shù)設(shè)置,此時(shí)可再次通過K13鍵進(jìn)行年、月日、時(shí)分的切換,并通過K12、K14可分別對(duì)年、月、日、時(shí)、分加1、減1,由此完成時(shí)間的設(shè)定。4、當(dāng)數(shù)碼管顯示時(shí)分秒,可通過K14、K15查詢年、月、日。4心得體會(huì)在本次實(shí)驗(yàn)中重新復(fù)習(xí)了單片機(jī)實(shí)驗(yàn)的內(nèi)容,更加深了對(duì)

11、程序和項(xiàng)目的訓(xùn)練。雖然開始的時(shí)候感覺比較,后來經(jīng)過多天的努力和溫習(xí),終于可以把以前半懂不懂的知識(shí)比較完整的拼湊在一起。這次實(shí)驗(yàn)程序的編寫和調(diào)試所花時(shí)間比較多,寫報(bào)告的用的時(shí)間比較少。對(duì)于這次實(shí)驗(yàn)的不足之處還是需要更深刻的檢討,希望以后更加努力。5附錄程序代碼/*/程序名shizhong.C/功能描述:電子時(shí)鐘 /硬件電路參看實(shí)驗(yàn)板/*/#include<reg51.h>#include<ABSACC.H>#define uchar unsigned char#define uint unsigned int#define COM8255 XBYTE0xffff#defi

12、ne PA8255 XBYTE0Xfffc#define PB8255 XBYTE0Xfffd#define PC8255 XBYTE0Xfffe#define OSC_FREQ 12000000 /12Mhz#define C1ms (65536 - OSC_FREQ/(12000000/980) /1ms定時(shí) sbit P1_4=P14;/位選控制sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;sbit P2_0=P20; /數(shù)碼管段碼控制 asbit P2_1=P21;sbit P2_2=P22;sbit P2_3=P23;sbit P2_4=P24;

13、sbit P2_5=P25;sbit P2_6=P26;sbit P2_7=P27;/數(shù)碼管段碼控制 dpsbit P3_2=P32; /中斷、返回計(jì)時(shí)sbit es=P24; /更新靜態(tài)顯示sbit P1_2=P12;/8255片選P1_2=0sbit P1_1=P11;/8255片選P1_1=1sbit P1_0=P10;/8255片選P1_0=0uchar code hello=0x89,0x86,0xc7,0xc7,0xfc,0x02; /HELLO-uchar code number1=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90

14、; /動(dòng)態(tài)顯示0-9uchar code number2=0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6; /靜態(tài)顯示0-9uchar code number3=0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10; /動(dòng)態(tài)顯示0-9 dp點(diǎn)亮uint year=2011,month=9,day=3,hour=15,minute=35,second=25;uint x,y,m,n,i=0,j=0,k=0,r=0;void Timer_1ms(uint _1ms); /延時(shí)1msvoid Set_I

15、nit_Timer0(); /定時(shí)器0初始化函數(shù)void Set_Init_Xint0(); /外部中斷0初始化函數(shù)void Set_Init_8255(); /8255初始化程序void dis_hello();/開機(jī)顯示HELLO-void dis_year();/顯示年void dis_month();void dis_day();void dis_hour();void dis_minute();void dis_second();void undis_second(); /不顯示秒void set_timer(); /設(shè)置時(shí)間void dis_year2(); /在查詢狀態(tài)下顯示年v

16、oid dis_day2(); /在查詢狀態(tài)下顯示日期void main()Set_Init_Xint0();Set_Init_8255();Set_Init_Timer0();doif(r=0)dis_hello();else EX0=0;/外部中斷0 關(guān)中斷dis_hour();dis_minute();dis_second();Set_Init_8255();switch(PB8255) case 0xDF: set_timer();break; /PB=0xDF,K13鍵按下 切換到設(shè)置時(shí)間程序case 0xBF: dis_day2();break; /PB=0xBF,K14鍵按下 切

17、換到顯示日期程序case 0x7F: dis_year2();break; /PB=0x7F,K15鍵按下 切換到顯示年的程序while(1);void Timer_1ms(uint _1ms) /延時(shí)函數(shù) TMOD =0x11; TR1 = 1; while (_1ms-) TH1 = C1ms/256; TL1 = C1ms%256; while (!TF1); TF1 = 0; TR1 = 0;void Set_Init_Timer0()/定時(shí)器0初始化函數(shù)TMOD=0x11; /定時(shí)器0,方式一TH0=0x3C;TL0=0xAF; /裝入初值15535 設(shè)成50ms定時(shí)器ET0=1;T

18、R0=1;EA=1;void Set_Init_Xint0() /外部中斷0初始化函數(shù)IT0=1; /外部中斷0,邊沿觸發(fā)方式EX0=1; /外部中斷0 開中斷EX1=1;/打開總中斷void dis_hello() /顯示HELLO- P1=0x70; /位選P2=hello0; /數(shù)碼管顯示HTimer_1ms(5);P1=0xb0;P2=hello1;Timer_1ms(5); P1=0xd0;P2=hello2;Timer_1ms(5);P1=0xe0;P2=hello3;Timer_1ms(5);SCON=0x00;es=0;SBUF=hello4;while(!TI)TI=0;SB

19、UF=hello5;while(!TI)TI=0;es=1; /靜態(tài)顯示更新/對(duì)year變量通過除法、取余運(yùn)算得到各位的數(shù)值,并送到對(duì)應(yīng)的數(shù)碼管上void dis_year() x=year/100;y=x%10; /百位x=x/10; /千位m=year%100;n=m%10; /個(gè)位m=m/10; /十位P1=0x70;P2=number1x;Timer_1ms(5);P1=0xb0;P2=number1y;Timer_1ms(5);P1=0xd0;P2=number1m;Timer_1ms(5);P1=0xe0;P2=number1n;Timer_1ms(5);undis_second(

20、);/對(duì)month變量通過除法、取余運(yùn)算得到十位、個(gè)位的數(shù)值,并送到對(duì)應(yīng)的數(shù)碼管上void dis_month()x=month/10;y=month%10;P1=0x70;P2=number1x;Timer_1ms(5);P1=0xb0;P2=number1y;Timer_1ms(5);/對(duì)day變量通過除法、取余運(yùn)算得到十位、個(gè)位的數(shù)值,并送到對(duì)應(yīng)的數(shù)碼管上void dis_day()x=day/10;y=day%10;P1=0xd0;P2=number1x;Timer_1ms(5);P1=0xe0;P2=number1y;Timer_1ms(5);undis_second();/對(duì)hou

21、r變量通過除法、取余運(yùn)算得到十位、個(gè)位的數(shù)值,并送到對(duì)應(yīng)的數(shù)碼管上void dis_hour()x=hour/10;y=hour%10;P1=0x70;P2=number1x;Timer_1ms(5);P1=0xb0;P2=number3y;Timer_1ms(5);/對(duì)minute變量通過除法、取余運(yùn)算得到十位、個(gè)位的數(shù)值,并送到對(duì)應(yīng)的數(shù)碼管上void dis_minute() uint x,y;x=minute/10;y=minute%10;P1=0xd0;P2=number1x;Timer_1ms(5);P1=0xe0;P2=number1y;Timer_1ms(5);/對(duì)second變

22、量通過除法、取余運(yùn)算得到十位、個(gè)位的數(shù)值,并送到對(duì)應(yīng)的數(shù)碼管上void dis_second() x=second/10;y=second%10;SCON=0x00;es=0;SBUF=number2x;while(!TI)TI=0;SBUF=number2y;while(!TI)TI=0;es=1;/將0x00送到顯示秒的數(shù)碼管上,讓這兩個(gè)數(shù)碼管不顯示void undis_second() SCON=0x00;es=0;SBUF=0x00;while(!TI)TI=0;SBUF=0x00;while(!TI)TI=0;es=1;/時(shí)間設(shè)置函數(shù),K12對(duì)變量加1 K13實(shí)現(xiàn)變量切換(使用got

23、o語句) K14對(duì)變量減1 void set_timer() TR0=0; /關(guān)閉定時(shí)器0dofor(i=0;i<=5;i+)dis_year();undis_second();Timer_1ms(5);Set_Init_8255( );switch(PB8255) case 0xEF: year+;break; /PB=0xEF,K12鍵按下 year加1case 0xBF: year-;break; /PB=0xEF,K14鍵按下 year減1case 0xDF: goto month; break; /PB=0xDF,K13鍵按下切換到設(shè)置月程序 while(1);month:do

24、if(month=13) /判斷進(jìn)位month=1;for(i=0;i<=5;i+)dis_month();dis_day();undis_second();Set_Init_8255( );switch(PB8255) case 0xEF: month+;break; /PB=0xEF,K12鍵按下 month加1case 0xBF: month-;break; /PB=0xEF,K14鍵按下 month減1case 0xDF: goto day;break; /PB=0xDF,K13鍵按下 切換到設(shè)置日程序 while(1);day:doif(day=31) /判斷進(jìn)位day=1;f

25、or(i=0;i<=5;i+)dis_month();dis_day();undis_second();Set_Init_8255( );switch(PB8255) case 0xEF: day+;break; /PB=0xEF,K12鍵按下 day加1case 0xBF: day-;break; /PB=0xEF,K14鍵按下 day減1case 0xDF: goto hour;break; /PB=0xDF,K13鍵按下,切換到設(shè)置時(shí)程序 while(1);hour:doif(hour=24) /判斷進(jìn)位 hour=0; for(i=0;i<=5;i+) dis_hour(); dis_minute(); dis_second(); Set_Init_8255( );switch(PB8255) case 0xEF: hour+;break; /PB=0xEF,K12鍵按下 hour加1case 0xBF: hour-;break; /PB=0xEF,K14鍵按下 hour減1case 0xDF: goto minute;break; /PB=0xDF,K13鍵按下 切換到設(shè)置分程序 while(1);minute:doif(minute=60) /判斷進(jìn)位minute=0;for(i=0;i&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論