版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 一、課程設(shè)計(jì)名稱</b></p><p><b> 萬年歷</b></p><p><b> 二、課程設(shè)計(jì)目的</b></p><p> 1、掌握單片機(jī)的原理、應(yīng)用。</p><p> 2、學(xué)會(huì)利用單片機(jī)設(shè)計(jì)電路。</p>&
2、lt;p> 3、培養(yǎng)大家的創(chuàng)新意識(shí)及動(dòng)手能力。</p><p><b> 三、課程設(shè)計(jì)內(nèi)容</b></p><p><b> (一)方案設(shè)計(jì)</b></p><p> 我們組設(shè)計(jì)的萬年歷是以一片40引腳的單片機(jī)AT89C52為主體,結(jié)合16位定時(shí)器/計(jì)數(shù)器和LED數(shù)碼管等元器件來實(shí)現(xiàn)的,主要有幾個(gè)單元電路構(gòu)成
3、,分別是復(fù)位電路、振蕩電路、按鍵電路、整點(diǎn)報(bào)時(shí)電路和顯示電路,下面給出了電路框圖及其分析和說明。</p><p> 1、復(fù)位電路 </p><p> 此單元電路為手動(dòng)復(fù)位電路,由按鍵、電解電容、電阻等構(gòu)成,與單片機(jī)的RST引腳相連接,在單片機(jī)運(yùn)行過程中可以隨時(shí)按鍵</p><p> 復(fù)位,電路圖如圖1所示:</p><p>&l
4、t;b> 圖-1 復(fù)位電路</b></p><p><b> 2、振蕩電路 </b></p><p> 此單元電路由晶振和電容構(gòu)成,其中的晶振頻率為12MHz,與單片機(jī)的XTAL1和XTAL2引腳相連接,具體電路如圖2所示: </p><p><b>
5、圖-2振蕩電路</b></p><p><b> 3、調(diào)整電路 </b></p><p> 此單元電路主要由多個(gè)彈性按鍵構(gòu)成,在所設(shè)計(jì)的電路中與單片機(jī)的I/O(P1)口相連接,具體電路可參考圖3:</p><p><b> 圖-3按鍵調(diào)整電路</b></p><p> 圖中的按鍵
6、K0、K1、K2、K3分別具有不同的功能,其中K0、K1、K2用于校準(zhǔn),K0調(diào)節(jié)小時(shí)(或年)、K1調(diào)節(jié)分(或月)、K2調(diào)節(jié)秒(或日);K3用于切換,啟動(dòng)時(shí)萬年歷顯示的為時(shí)分秒,當(dāng)按下K3時(shí)可以切換到年月日顯示界面。</p><p><b> 4、整點(diǎn)報(bào)時(shí)電路 </b></p><p> 此部分電路通過采用晶體管驅(qū)動(dòng)蜂鳴器實(shí)現(xiàn)的,每當(dāng)顯示時(shí)間出現(xiàn)整點(diǎn)時(shí)(如12:00
7、:00),蜂鳴器會(huì)發(fā)出短暫響聲,起到整點(diǎn)報(bào)時(shí)功能。實(shí)際電路中與單片機(jī)的P1.3相連接,具體電路可參照?qǐng)D4:</p><p><b> 圖-4整點(diǎn)報(bào)時(shí)電路</b></p><p><b> 5、顯示電路</b></p><p> 此單元電路為萬年歷的顯示屏,由共陽數(shù)碼管構(gòu)成,采用動(dòng)態(tài)掃描的方式來顯示年月日和時(shí)分秒,示意
8、圖如圖5所示:</p><p> 圖-5數(shù)碼管顯示電路</p><p> 注意:實(shí)際中電路與上述電路不同,稍復(fù)雜些,而且采用的是兩個(gè)四位一體的數(shù)碼管,還要接限流電阻(較小,如470歐)和晶體管(如9012)。</p><p><b> ?。ǘ┫到y(tǒng)硬件設(shè)計(jì)</b></p><p> 該系統(tǒng)主要由時(shí)鐘電路部分、中央處
9、理單元、數(shù)碼管顯示部分組成,各組成部分如圖所示。</p><p> 1、AT89C52結(jié)構(gòu)與工作原理</p><p> AT89C52是51系列單片機(jī)的一個(gè)型號(hào),它是ATMEL公司生產(chǎn)的,是一個(gè)低電壓,高性能CMOS 8位單片機(jī),片內(nèi)含8k bytes的可反復(fù)擦寫的Flash只讀程序存儲(chǔ)器和256 bytes的隨機(jī)存取數(shù)據(jù)存儲(chǔ)器(RAM),器件采用ATMEL公司的高密度、非易失性存儲(chǔ)技
10、術(shù)生產(chǎn),兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng),片內(nèi)置通用8位中央處理器和Flash存儲(chǔ)單元,功能強(qiáng)大的AT89C52單片機(jī)可為您提供許多較復(fù)雜系統(tǒng)控制應(yīng)用場(chǎng)合。</p><p> AT89C52有40個(gè)引腳,32個(gè)外部雙向輸入/輸出(I/O)端口,同時(shí)內(nèi)含2個(gè)外中斷口,3個(gè)16位可編程定時(shí)計(jì)數(shù)器,2個(gè)全雙工串行通信口,2個(gè)讀寫口線,AT89C52可以按照常規(guī)方法進(jìn)行編程,但不可以在線編程(S系列的才支持在線編程)。其將
11、通用的微處理器和Flash存儲(chǔ)器結(jié)合在一起,特別是可反復(fù)擦寫的Flash存儲(chǔ)器可有效地降低開發(fā)成本。</p><p> 兼容MCS51指令系統(tǒng) · 8k可反復(fù)擦寫(>1000次)Flash ROM</p><p> · 32個(gè)雙向I/O口 · 256x8bit內(nèi)部RAM </p><p> · 3個(gè)16位可編程定時(shí)
12、/計(jì)數(shù)器中斷 · 時(shí)鐘頻率0-24MHz </p><p> · 2個(gè)串行中斷 · 可編程UART串行通道 </p><p> · 2個(gè)外部中斷源 · 共6個(gè)中斷源 </p><p> · 2個(gè)讀寫中斷口線 · 3級(jí)加密位 </p><p> · 低功耗空
13、閑和掉電模式 · 軟件設(shè)置睡眠和喚醒功能 </p><p> 40引腳雙列直插型AT89C52芯片引腳排列如右圖所示;該單片機(jī)為8 位通用微處理器,采用工業(yè)標(biāo)準(zhǔn)的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52 相同,其主要用于會(huì)聚調(diào)整時(shí)的功能控制。功能包括對(duì)會(huì)聚主IC 內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會(huì)聚調(diào)整控制,會(huì)聚測(cè)試圖控制,紅外遙控信號(hào)IR的接收解碼及與主板CPU通信等
14、。主要管腳有:XTAL1(19 腳)和XTAL2(18 腳)為振蕩器輸入輸出端口,外接12MHz 晶振。RST/Vpd(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。VCC(40 腳)和VSS(20 腳)為供電端口,分別接+5V電源的正負(fù)端。P0~P3 為可編程通用I/O 腳,其功能用途由軟件定義,下面詳細(xì)介紹一些引腳的主要功能:</p><p><b> ●P0 口</b><
15、/p><p> P0 口是一組8 位漏極開路型雙向I/O 口, 也即地址/數(shù)據(jù)總線復(fù)用口。作為輸出口用時(shí),每位能吸收電流的方式驅(qū)動(dòng)8 個(gè)TTL邏輯門電路,對(duì)端口P0 寫“1”時(shí),可作為高阻抗輸入端用,其結(jié)構(gòu)圖如圖6所示</p><p> 圖-6 P0口的一位結(jié)構(gòu)圖</p><p> 在訪問外部數(shù)據(jù)存儲(chǔ)器或程序存儲(chǔ)器時(shí),這組口線分時(shí)轉(zhuǎn)換地址(低8 位)和數(shù)據(jù)總線復(fù)用
16、,在訪問期間激活內(nèi)部上拉電阻。</p><p> 在Flash 編程時(shí),P0 口接收指令字節(jié),而在程序校驗(yàn)時(shí),輸出指令字節(jié),校驗(yàn)時(shí),要求外接上拉電阻。</p><p><b> ●P1 口</b></p><p> P1 是一個(gè)帶內(nèi)部上拉電阻的8 位雙向I/O 口, P1 的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4 個(gè)TTL 邏輯門電路。對(duì)端
17、口寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口。作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)輸出一個(gè)電流,其結(jié)構(gòu)圖如圖7所示:</p><p> 圖-7 P1口的一位結(jié)構(gòu)圖</p><p> 與AT89C51 不同之處是,P1.0 和P1.1 還可分別作為定時(shí)/計(jì)數(shù)器2 的外部計(jì)數(shù)輸入(P1.0/T2)和輸入(P1.1/T2EX),另外Flash 編
18、程和程序校驗(yàn)期間,P1 接收低8 位地址。</p><p><b> ●P2 口</b></p><p> P2 是一個(gè)帶有內(nèi)部上拉電阻的8 位雙向I/O 口,P2 的輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4 個(gè)TTL 邏輯門電路。對(duì)端口P2 寫“1”,通過內(nèi)部的上拉電阻把端口拉到高電平,此時(shí)可作輸入口,作輸入口使用時(shí),因?yàn)閮?nèi)部存在上拉電阻,某個(gè)引腳被外部信號(hào)拉低時(shí)會(huì)
19、輸出一個(gè)電流,其內(nèi)部結(jié)構(gòu)如圖8所示:</p><p> 圖-8 P2口的一位結(jié)構(gòu)圖</p><p> 在訪問外部程序存儲(chǔ)器或16 位地址的外部數(shù)據(jù)存儲(chǔ)器時(shí),P2 口送出高8 位地址數(shù)據(jù)。在訪問8 位地址的外部數(shù)據(jù)存儲(chǔ)器時(shí),P2 口輸出P2 鎖存器的內(nèi)容。Flash 編程或校驗(yàn)時(shí),P2亦接收高位地址和一些控制信號(hào)。</p><p><b> ●P3 口
20、</b></p><p> P3 口是一組帶有內(nèi)部上拉電阻的8 位雙向I/O 口。P3 口輸出緩沖級(jí)可驅(qū)動(dòng)(吸收或輸出電流)4 個(gè)TTL 邏輯門電路。對(duì)P3口寫入“1”時(shí),它們被內(nèi)部上拉電阻拉高并可作為輸入端口。此時(shí),被外部拉低的P3 口將用上拉電阻輸出電流。P3口的內(nèi)部結(jié)構(gòu)如圖9所示:</p><p> 圖-9 P3口的一位結(jié)構(gòu)圖</p><p>
21、 P3 口除了作為一般的I/O 口線外,更重要的用途是它的第二功能,另外,P3 口還接收一些用于Flash 閃速存儲(chǔ)器編程和程序校驗(yàn)的控制信號(hào)。</p><p> 表-1 P3口的第二功能</p><p><b> ●ALE/PROG</b></p><p> 當(dāng)訪問外部程序存儲(chǔ)器或數(shù)據(jù)存儲(chǔ)器時(shí),ALE(地址鎖存允許)輸出脈沖用于鎖存地
22、址的低8 位字節(jié)。一般情況下,ALE 仍以時(shí)鐘振蕩頻率的1/6 輸出固定的脈沖信號(hào),因此它可對(duì)外輸出時(shí)鐘或用于定時(shí)目的。要注意的是:每當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器時(shí)將跳過一個(gè)ALE 脈沖。對(duì)Flash 存儲(chǔ)器編程期間,該引腳還用于輸入編程脈沖(PROG)。如有必要,可通過對(duì)特殊功能寄存器(SFR)區(qū)中的8EH 單元的D0 位置位,可禁止ALE 操作。該位置位后,只有一條MOVX 和MOVC指令才能將ALE 激活。此外,該引腳會(huì)被微弱拉高,單片機(jī)
23、執(zhí)行外部程序時(shí),應(yīng)設(shè)置ALE 禁止位無效。</p><p><b> ●PSEN</b></p><p> 程序儲(chǔ)存允許(PSEN)輸出是外部程序存儲(chǔ)器的讀選通信號(hào),當(dāng)AT89C52 由外部程序存儲(chǔ)器取指令(或數(shù)據(jù))時(shí),每個(gè)機(jī)器周期兩次PSEN 有效,即輸出兩個(gè)脈沖。在此期間,當(dāng)訪問外部數(shù)據(jù)存儲(chǔ)器,將跳過兩次PSEN信號(hào)。</p><p>
24、<b> ●XTAL1</b></p><p> 振蕩器反相放大器的及內(nèi)部時(shí)鐘發(fā)生器的輸入端。</p><p><b> ●XTAL2</b></p><p> 振蕩器反相放大器的輸出端。</p><p><b> 其振蕩方式有兩種;</b></p>&
25、lt;p> 內(nèi)部震蕩方式 外部震蕩方式</p><p><b> ●EA/VPP</b></p><p> 外部訪問允許。欲使CPU 僅訪問外部程序存儲(chǔ)器(地址為0000H—FFFFH),EA 端必須保持低電平(接地)。如EA端為高電平(接Vcc端),CPU 則執(zhí)行內(nèi)部程序存儲(chǔ)器中的指令。</p>&l
26、t;p><b> ●RST</b></p><p> 復(fù)位輸入。當(dāng)振蕩器工作時(shí),RST引腳出現(xiàn)兩個(gè)機(jī)器周期以上高電平將使單片機(jī)復(fù)位。常見的復(fù)位電路有以下三種方式:</p><p> (a)上電復(fù)位 (b)按鍵電平復(fù)位 (c)按鍵脈沖復(fù)位</p><p> 在此次設(shè)計(jì)中,我們組設(shè)計(jì)的電路采用的為第二種復(fù)位方式,即按鍵電
27、平復(fù)位,以便在調(diào)試中隨時(shí)進(jìn)行手動(dòng)復(fù)位。</p><p> 2、四位一體共陽數(shù)碼管的結(jié)構(gòu)及工作原理</p><p> 在介紹四位一體數(shù)碼管之前,先簡(jiǎn)單介紹下單個(gè)七段LED數(shù)碼管的結(jié)構(gòu)及其工作原理,內(nèi)部結(jié)構(gòu)及引腳圖如下圖所示:</p><p> ?。╝)共陰極數(shù)碼管 (b)共陽極數(shù)碼管 (c)一位數(shù)碼管的管腳配置</p>&
28、lt;p> 上圖(a)中,共陰極的數(shù)碼管的發(fā)光二極管陰極公共端接地,當(dāng)某個(gè)發(fā)光二極管的陽極為高電平時(shí),放光二極管點(diǎn)亮;共陽極的數(shù)碼管的發(fā)光二極管陽極并聯(lián),如上圖(b)所示。</p><p> 通常的七段數(shù)碼管中有八個(gè)發(fā)光二極管,故也有人叫做八段數(shù)碼管。其中七個(gè)發(fā)光二極管構(gòu)成七筆字形“8”,一個(gè)發(fā)光二極管構(gòu)成小數(shù)點(diǎn)。</p><p> 數(shù)碼管與單片機(jī)接口簡(jiǎn)單,只要講一個(gè)8位并行輸
29、出口與顯示塊的發(fā)光二極管引腳相連即可。8位并行輸出口輸出不同的字節(jié)數(shù)據(jù)可獲得不同的數(shù)字或字符。見表-2。通常將控制發(fā)光二極管的8位字節(jié)數(shù)據(jù)稱為段選碼。共陽極與共陰極的段選碼互為補(bǔ)嗎。</p><p> 在實(shí)際使用數(shù)碼管時(shí),要分清極性,因?yàn)閿?shù)碼管的極性不同,其段選碼也不同,而段選碼也決定了其顯示的字符。</p><p> 表-2 七段LED數(shù)碼管段選碼</p><p&
30、gt;<b> 數(shù)碼管的顯示方式</b></p><p> 數(shù)碼管的顯示方式可分為兩種,即靜態(tài)顯示方式和動(dòng)態(tài)顯示方式,下面分別加以介紹。</p><p><b> ?。?)靜態(tài)顯示方式</b></p><p> LED顯示器工作在靜態(tài)顯示方式下,共陰極點(diǎn)或共陽極點(diǎn)連接在一起接地或+5V;每位LED顯示塊的段選線(a~
31、dp)與一個(gè)8位并行口相連。</p><p> 靜態(tài)顯示有并行輸出和串行輸出兩種方式。下面給出并行輸出的一種電路連接,如圖-10所示</p><p> 圖-10 并行輸出靜態(tài)顯示電路</p><p> 該圖表示了一個(gè)三位靜態(tài)數(shù)碼管電路,每一位數(shù)碼管可獨(dú)立顯示,只要在該位的段選線上保持段選碼電平,該位就能保持相應(yīng)的顯示字符。由于每一位由一個(gè)8位輸出口控制段選碼,
32、故在同一時(shí)間內(nèi)每一位新字符可以各不相同。</p><p> ?。?)動(dòng)態(tài)顯示方式 </p><p> 將多個(gè)數(shù)碼管所有位的段選碼并聯(lián)在一起,由一個(gè)8位I/O口控制,而共陰極點(diǎn)或共陽極點(diǎn)分別由相應(yīng)的I/O口線控制。由于各位的段選線并聯(lián),段選碼的輸出對(duì)各位來說都是相同的。因此,同一時(shí)刻,如果各位位選線都處于選通狀態(tài)時(shí),8位LED數(shù)碼管將顯示相同的字符。若要各位LED數(shù)碼管能夠顯示出與本位相同
33、的顯示字符,就必須采用掃描顯示方式,即在某一時(shí)刻,只讓某一位的位選線處于選通狀態(tài),而其他各位的位選線處于關(guān)閉狀態(tài),同時(shí),段選線上輸出相應(yīng)位要顯示字符的字形碼,這樣同一時(shí)刻,8位LED數(shù)碼管中只有選通的那一位顯示出字符,而其他7位則是熄滅的。同樣,在下一時(shí)刻, 只讓第二位的位選線處于選通狀態(tài),而其他各位的位選線處于關(guān)閉狀態(tài),,同時(shí),在段選線上輸出相應(yīng)位將要顯示字符的字形碼,則同一時(shí)刻,只有選通位顯示出相應(yīng)的字符,而其他各位則是熄滅的。如此
34、循環(huán)下去,就可以使各位顯示出將要顯示的字符。雖然這些字符是在不同時(shí)刻出現(xiàn)的,而且同一時(shí)刻,只有一位顯示,其他各位熄滅,但由于人眼有視覺暫留現(xiàn)象,只要每位顯示間隔一般為1~4ms之間,則可造成多位同時(shí)亮的假象,達(dá)到同時(shí)顯示的目的。</p><p> 以上就是動(dòng)態(tài)顯示的工作原理,多位數(shù)碼管的構(gòu)成則是利用此原理,采用動(dòng)態(tài)掃描進(jìn)行顯示。下面開始介紹四位一體共陽數(shù)碼管,也是我組設(shè)計(jì)的萬年歷中用到的顯示器件,其引腳圖如圖-
35、11所示;</p><p> 圖-11四位一體共陽數(shù)碼管引腳圖</p><p> 圖中的G1、G2、G3、G4引腳為位選端,依次控制第一、第二、第三、第四個(gè)(從左到右)數(shù)碼管。設(shè)計(jì)中采用了兩個(gè)這種四位一體的數(shù)碼管,用來顯示時(shí)分秒(或年月日),用P0.0—P0.7作為數(shù)碼管的控制信號(hào)(段選信號(hào)),中間通過限流電阻連接,由于P0作為輸出,還應(yīng)該加上拉電阻;用P2.0—P2.7作為數(shù)碼管的位
36、選信號(hào), 外接三極管電路,具體連接參見附錄2中的原理圖部分。</p><p><b> 3、元件清單</b></p><p> 元器件名稱 數(shù)量</p><p> AT89C52………………………………………….……….1</p><p> 四位
37、一體共陽數(shù)碼管…………………………………….2</p><p> 蜂鳴器…………………………………………………….1</p><p> PNP型三極管9012………………………………………9</p><p> 電解電容10u……………………………………………..1</p><p> 瓷片電容30p……………………………………………..
38、2</p><p> 排阻10k………………………………………………..…1</p><p> 電阻470……………………………………………………9</p><p> 電阻10k……………………………………………………1</p><p> 電阻1k……………………………………………………..9</p><p>
39、 按鍵開關(guān)…………………………………………………...5</p><p> 晶振12MHz………………………………………………..1</p><p> ?。ㄈ┫到y(tǒng)軟件設(shè)計(jì) </p><p> 軟件設(shè)計(jì)是一個(gè)將需求轉(zhuǎn)變?yōu)檐浖愂龅倪^程,也是設(shè)計(jì)中的核心部分,程序設(shè)計(jì)的好壞直接決定了硬件電路的功能是否能夠?qū)崿F(xiàn)及其功能的差異。 </p><
40、p> 系統(tǒng)的軟件設(shè)計(jì)主要是通過編寫程序?qū)崿F(xiàn)的,此次設(shè)計(jì)中我們用的是C語言來編寫的程序。</p><p> C語言是源于編寫UNIX操作系統(tǒng)的一種語言,是一種結(jié)構(gòu)化程序設(shè)計(jì)語言,產(chǎn)生的代碼緊湊,可以深入到機(jī)器內(nèi)部編程,具備若干匯編語言所具有的特點(diǎn),又優(yōu)于匯編語言。51C程序結(jié)構(gòu)與一般C語言程序結(jié)構(gòu)并沒有本質(zhì)上的差別,也是只有一個(gè)主函數(shù)和若干函數(shù)組成。在51C的頭文件中有其庫函數(shù)的說明,可以通過includ
41、e預(yù)處理指令將頭文件包含在自己的文件中即可調(diào)用。每個(gè)函數(shù)的定義及調(diào)用規(guī)則基本上與一般的C一樣,實(shí)際上51C程序的設(shè)計(jì)過程也就是一系列函數(shù)的定義過程。盡管51C與一般C程序設(shè)計(jì)方法基本相同,但畢竟是針對(duì)單片機(jī)及其硬件系統(tǒng)所進(jìn)行的程序設(shè)計(jì),與常規(guī)意義上的C編程有所區(qū)別。在進(jìn)行程序設(shè)計(jì)時(shí),必需注意以下幾個(gè)問題。</p><p> 存儲(chǔ)區(qū)的定位及訪問。必須了解編譯器的數(shù)據(jù)類型以及與51單片機(jī)存儲(chǔ)器結(jié)構(gòu)的對(duì)應(yīng)關(guān)系,編譯器
42、定義的任何數(shù)據(jù)類型必須以一定的存儲(chǔ)類型方式定位在單片機(jī)的某一存儲(chǔ)區(qū)中,否則沒有任何實(shí)際意義。</p><p> 特殊功能寄存器的訪問。對(duì)于片內(nèi)特殊功能寄存器SFR 的訪問,編譯器都提供了專門的方法,這些方法與一般C語言是不兼容的,只適用于單片機(jī)C編程。</p><p> 并行接口的定義。51單片機(jī)有4個(gè)8位并行口,共32條I/O線,這是大家熟知的,這4 個(gè)口原則上都可以作為I/O使用,
43、只是在需要外部總線擴(kuò)展時(shí),才將P0用作數(shù)據(jù)低地址總線, P2用作高地址總線。除此之外,還可以在片外擴(kuò)展硬件I/O口。51單片機(jī)沒有專用的I/O指令,所有口地址與數(shù)據(jù)存儲(chǔ)器地址時(shí)是統(tǒng)一編址的。</p><p> 說明:具體的C源程序參見附錄1-源程序部分。</p><p> ?。ㄋ模┓抡媾c調(diào)試 </p><p> 我們將設(shè)計(jì)好的電路在Proteus編譯環(huán)境中進(jìn)行
44、仿真,并結(jié)合Keil軟件進(jìn)行聯(lián)調(diào),經(jīng)過多次修改與編譯程序最終得到了預(yù)期的結(jié)果,達(dá)到了預(yù)先的設(shè)計(jì)要求。</p><p> 在Proteus環(huán)境下啟動(dòng)仿真,得到如下的仿真效果圖:</p><p> Proteus仿真圖</p><p> 在我們的設(shè)計(jì)中,設(shè)置了一個(gè)切換按鍵K3,用于在時(shí)分秒和年月日界面間進(jìn)行切換,并設(shè)有調(diào)整按鍵K0、K1、K2,具體的按鍵功能參見前
45、面的“課程設(shè)計(jì)方案”部分中的“調(diào)整電路”。</p><p> 四、課程設(shè)計(jì)心得體會(huì)</p><p><b> 心得體會(huì)</b></p><p> 通過這次萬年歷的課程設(shè)計(jì),加深了我們對(duì)51單片機(jī)認(rèn)識(shí),對(duì)其基本結(jié)構(gòu)及工作原理有了進(jìn)一步的認(rèn)識(shí)。同時(shí),這次設(shè)計(jì)也是對(duì)所學(xué)知識(shí)的一次實(shí)際應(yīng)用,提高了我們的動(dòng)手能力,收獲頗多。</p>
46、<p> 在這次設(shè)計(jì)中,運(yùn)用到了許多以前學(xué)過的知識(shí),是對(duì)所學(xué)知識(shí)的一次靈活運(yùn)用。在程序設(shè)計(jì)之前,首先要對(duì)單片機(jī)的內(nèi)部結(jié)構(gòu)有一個(gè)系統(tǒng)的了解,這樣便于在設(shè)計(jì)中形成一個(gè)清晰的思路。在此次設(shè)計(jì)中,程序的設(shè)計(jì)部分是最為不易的,費(fèi)了我們不少心思,不過令我們感到欣慰的是,程序經(jīng)過反復(fù)的修改和調(diào)試,最終達(dá)到了預(yù)期的要求。對(duì)于軟件仿真,在繪圖時(shí),應(yīng)特別注意單片機(jī)端口和數(shù)碼管的段選、位選的連接,下載程序仿真演示時(shí)仔細(xì)觀察接線端口的電平變化,操作
47、各功能鍵,觀察功能鍵演示結(jié)果,并結(jié)合程序進(jìn)行適當(dāng)調(diào)整,以使仿真效果達(dá)到預(yù)期結(jié)果。對(duì)于實(shí)物焊接,由于之前進(jìn)行過不止一次的課程設(shè)計(jì),所以這部分相對(duì)較容易,但應(yīng)特別注意數(shù)碼管的引腳所對(duì)應(yīng)的段選、位選。課程設(shè)計(jì)過程中也難免的遇到了一些問題,但經(jīng)過我們不懈的努力,最終設(shè)計(jì)成功了我組的萬年歷,并達(dá)到了預(yù)期的目標(biāo)。</p><p> 總之,這次單片機(jī)課程設(shè)計(jì),讓我們認(rèn)識(shí)到了理論聯(lián)系實(shí)際的重要性, 在培養(yǎng)我們創(chuàng)新意識(shí)的同時(shí),也
48、提高了大家發(fā)現(xiàn)并解決問題的能力,這些都將成為我們今后學(xué)習(xí)和工作中的一筆寶貴財(cái)富。 </p><p><b> 附錄1</b></p><p><b> 源程序</b></p><p> #include<reg51.h>//頭文件命令</p><p> #define u
49、char unsigned char//宏定義</p><p> #define uint unsigned int //宏定義</p><p> sbit P1_3=P1^3;//定義P1_3</p><p> sbit K3=P1^4;//定義按鍵</p><p> sbit K0=P1^5;<
50、;/p><p> sbit K1=P1^6;</p><p> sbit K2=P1^7;</p><p> uchar Tab[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,</p><p> 0xf8,0x80,0x90}; // 定義數(shù)組Tab[],即共陽數(shù)碼管0~9的段選碼</p>
51、<p> uint pd[ ]={60,91,121,151,182,213,244,274,305,335,366}; //定義有關(guān)閏年天數(shù)的數(shù)組pd[]</p><p> uint pd0[ ]={0,31,60,91,121,151,182,213,244,274,305,335,366};</p><p> uchar int_time ,t,k,n; /
52、/定義中斷變量次數(shù)變量int_time 及變量t,k,n</p><p> uchar second,minute,hour; //定義秒、分、時(shí)變量</p><p> uchar date,month,year;//定義日、月、年變量</p><p> uint year0,day,maxday; //定義year0變量,天數(shù)變量day,最
53、大天數(shù)變量maxday</p><p> void delay(void) //定義延時(shí)函數(shù)delay ,延時(shí)約0.6ms</p><p><b> {</b></p><p> unsigned char j;</p><p> for(j=0;j<200;j++);</p>
54、<p><b> }</b></p><p> void delayms() //定義延時(shí)函數(shù)delayms,,用于按鍵消抖</p><p> {unsigned char i,j;</p><p> for(i=0;i<50;i++)</p><p> for(j=0;j<30;
55、j++);}</p><p> void DisplaySecond(unsigned char s) //定義秒顯示函數(shù),也用來顯示日</p><p><b> {</b></p><p> P2=0xfd; //顯示秒(或日)十位</p><p> P0=Tab[s/10];
56、 </p><p><b> delay();</b></p><p> P2=0xfe; //顯示秒(或日)個(gè)位</p><p> P0=Tab[s%10]; </p><p><b> delay();</b></p>
57、<p> P2=0xff; //關(guān)閉所有數(shù)碼管</p><p><b> }</b></p><p> void DisplayMinute(unsigned char m) //定義分顯示函數(shù),也用來顯示月</p><p><b> {</b></p><p
58、> P2=0xef; //顯示分(或月)十位</p><p> P0=Tab[m/10];</p><p><b> delay();</b></p><p> P2=0xf7; //顯示分(或月)個(gè)位</p><p> P0=Tab[m%10];</p><p&
59、gt;<b> delay();</b></p><p> P2=0xfb; //顯示分隔符</p><p> P0=0xbf; </p><p><b> delay();</b></p><p> P2=0xff; //關(guān)閉所有數(shù)碼管</p>
60、<p><b> }</b></p><p> void DisplayHour(unsigned char h)//定義小時(shí)顯示函數(shù),也用來顯示年</p><p><b> {</b></p><p> P2=0x7f; //顯示時(shí)(或年)十位</p>&l
61、t;p> P0=Tab[h/10]; </p><p><b> delay();</b></p><p> P2=0xbf; //顯示時(shí)(或年)個(gè)位</p><p> P0=Tab[h%10]; </p><p> delay(); </p>
62、<p> P2=0xdf; //顯示分隔符</p><p> P0=0xbf; </p><p><b> delay();</b></p><p> P2=0xff; //關(guān)閉所有數(shù)碼管</p><p><b> }<
63、/b></p><p> void Display(uchar sd, uchar mm, uchar hy)//定義顯示函數(shù)Display,顯示時(shí)分秒或年月日</p><p> { DisplaySecond(sd); </p><p><b> delay();</b></p><p>
64、 DisplayMinute(mm); </p><p><b> delay();</b></p><p> DisplayHour(hy); </p><p> delay(); }</p><p> void main(void) //主函數(shù)</p><p
65、><b> {</b></p><p> TMOD=0x01; //使用定時(shí)器T0,工作在方式1</p><p> EA=1; //開總中斷</p><p> ET0=1; //允許T0中斷</p><p&g
66、t; TH0=(65536-46083)/256; //定時(shí)器高八位賦初值</p><p> TL0=(65536-46083)%256; //定時(shí)器低八位賦初值</p><p> TR0=1; //啟動(dòng)定時(shí)器</p><p> int_time=0; //變量賦初值</p><p> se
67、cond=0; //顯示初始化</p><p> minute=58; </p><p><b> hour=19; </b></p><p> year0=2011;</p><p> day=321; </p><p><b> while(1
68、)</b></p><p> {if(n==2) ET0=0; //調(diào)整時(shí)關(guān)中斷</p><p> if(n>2) {ET0=1;n=0;} //調(diào)整后開中斷</p><p><b> if(K3==0)</b></p><p> {delayms(); //按鍵消抖</
69、p><p> if(K3==0) //確認(rèn)K3按下</p><p> k=!k; n++; //k取反,n加1</p><p> while(K3==0)Display(date, month, year);//K3按下時(shí)顯示年月日</p><p><b> } </b></p><
70、p> if(k==0) //k=0時(shí),即K3未按下 </p><p> { Display(second, minute, hour); //顯示時(shí)分秒</p><p> if((P1&0xe0)!=0xe0)//判斷K0、K1、K2中有無按鍵按下</p><p> {delayms();//按鍵消抖</p
71、><p> if((P1&0xe0)!=0xe0) //確認(rèn)按鍵按下</p><p><b> { </b></p><p> if(K0==0) //K0按下,用于調(diào)整小時(shí)</p><p><b> {hour++;</b></p><p> if(h
72、our==24) hour=0; </p><p> while(K0==0)</p><p> Display(second, minute, hour);</p><p><b> }</b></p><p> if(K1==0)//K1按下,用于調(diào)整分鐘</p><p> {
73、 minute++;</p><p> if(minute==60) minute=0; </p><p> while(K1==0)</p><p> Display(second, minute, hour);</p><p><b> }</b></p><p> if(K2=
74、=0)//K2按下,用于調(diào)整秒</p><p> { second++;</p><p> if(second==60) second=0; </p><p> while(K2==0)</p><p> Display(second, minute, hour);</p><p><b>
75、}</b></p><p><b> }</b></p><p><b> }}</b></p><p> else{ //k!=0,即K3按下</p><p> Display(date, month, year); //顯示年月日</p><
76、;p> if((P1&0xe0)!=0xe0)//判斷K0、K1、K2是否按下</p><p> {delayms();//軟件消抖</p><p> if((P1&0xe0)!=0xe0) //確認(rèn)按鍵按下</p><p><b> { </b></p><p> if(
77、K0==0) //K0按下,用于調(diào)整年</p><p><b> {year0++;</b></p><p> if(year0==9999) year0=0; </p><p> while(K0==0) </p><p> Display(date, month, year);</p>
78、<p><b> }</b></p><p> if(K1==0) //K1按下,用于調(diào)整月</p><p><b> {</b></p><p> day=day+pd0[month]- pd0[month-1]; </p><p> while(K1==0)<
79、;/p><p> Display(date, month, year);</p><p><b> }</b></p><p> if(K2==0)//K2按下,用于調(diào)整日</p><p><b> { day++;</b></p><p> while(K2=
80、=0)</p><p> Display(date, month, year);</p><p><b> }</b></p><p><b> }</b></p><p> }} </p><p><b> }</b></
81、p><p><b> }</b></p><p> void t0(void ) interrupt 1 using 1 //中斷函數(shù)</p><p><b> {</b></p><p> TH0=(65536-46083)/256; //定時(shí)器重新賦初值</p>
82、<p> TL0=(65536-46083)%256;</p><p> int_time++; //中斷次數(shù)加1</p><p> if(int_time==20) //如果中斷次數(shù)滿20次</p><p><b> {</b></p><p> int_time=0; //中斷變
83、量清零</p><p> second++; //秒變量加1</p><p><b> }</b></p><p> if(second==60) //秒變量計(jì)滿60</p><p><b> {</b></p><p> second=0; //秒
84、變量清零 </p><p> minute++; //分變量加1 </p><p><b> }</b></p><p> if(minute==60) //分變量計(jì)滿60</p><p><b> {</b></p><p> minute=0; //分變
85、量清零 </p><p> hour++; //小時(shí)變量加1 </p><p><b> }</b></p><p> if(hour==24) //小時(shí)變量計(jì)滿24</p><p><b> { </b></p><p> hour=0;//小時(shí)變量清
86、零</p><p> day++; //天變量加1 </p><p><b> }</b></p><p> if(minute==0&&second==0)P1_3=0;//整點(diǎn)報(bào)時(shí)</p><p> else P1_3=1;</p><p> if(day>
87、;=366+!t)day=date; //保證一年天數(shù)<=366 </p><p> if((year0%4==0&&year0%100!=0)||(year0%400==0)){maxday=366;t=0;} //判斷閏年</p><p> else {maxday=365;t=1;}</p>&
88、lt;p> if(0<day&&day<=31){month=1;date=day;} //年月日顯示的計(jì)算</p><p> if(31<day&&day<=pd[0]-t){month=2;date=day-31;}</p><p> if(pd[0]-t<day&&day<=pd[
89、1]-t){month=3;date=day-pd[0]+t;}</p><p> if(pd[1]-t<day&&day<=pd[2]-t){month=4;date=day-pd[1]+t;}</p><p> if(pd[2]-t<day&&day<=pd[3]-t){month=5;date=day-pd[2]+t;}&l
90、t;/p><p> if(pd[3]-t<day&&day<=pd[4]-t){month=6;date=day-pd[3]+t;}</p><p> if(pd[4]-t<day&&day<=pd[5]-t){month=7;date=day-pd[4]+t;}</p><p> if(pd[5]-t<
91、;day&&day<=pd[6]-t){month=8;date=day-pd[5]+t;}</p><p> if(pd[6]-t<day&&day<=pd[7]-t){month=9;date=day-pd[6]+t;}</p><p> if(pd[7]-t<day&&day<=pd[8]-t){mon
92、th=10;date=day-pd[7]+t;}</p><p> if(pd[8]-t<day&&day<=pd[9]-t){month=11;date=day-pd[8]+t;}</p><p> if(pd[9]-t<day&&day<=pd[10]-t){month=12;date=day-pd[9]+t;}</p&
93、gt;<p> if(day>=maxday+1){year++;day=1;}</p><p> year=year0%100; //year0求余,用于數(shù)碼管顯示</p><p><b> }</b></p><p><b> 附錄2</b></p><p>&
溫馨提示
- 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. 眾賞文庫僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)萬年歷課程設(shè)計(jì)
- 單片機(jī)萬年歷課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-萬年歷
- 萬年歷單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)—電子萬年歷
- 單片機(jī)萬年歷課程設(shè)計(jì)報(bào)告
- 單片機(jī)課程設(shè)計(jì)報(bào)告(萬年歷)
- 單片機(jī)課程設(shè)計(jì)-電子萬年歷
- 單片機(jī)萬年歷課程設(shè)計(jì) (2)
- 單片機(jī)課程設(shè)計(jì)-- 電子萬年歷
- 單片機(jī)課程設(shè)計(jì)—萬年歷[1]
- 單片機(jī)課程設(shè)計(jì)---萬年歷顯示設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子萬年歷設(shè)計(jì)
- 基于單片機(jī)的萬年歷課程設(shè)計(jì)
- 1602數(shù)字萬年歷單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--基于51單片機(jī)的萬年歷
- 課程設(shè)計(jì)--單片機(jī)簡(jiǎn)易萬年歷的設(shè)計(jì)
- 單片機(jī)電子萬年歷課程設(shè)計(jì)
- 單片機(jī)電子萬年歷課程設(shè)計(jì)
- 單片機(jī)電子萬年歷課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論