版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p><b> 課 程 設(shè) 計</b></p><p> 課程名稱_ 單片機原理與接口技術(shù) </p><p> 題目名稱 多功能數(shù)字時鐘 </p><p> 學(xué)生學(xué)院_ 材料與能源學(xué)院 </p><p> 專業(yè)班級_ 電子材料及元器
2、件方向</p><p> 學(xué) 號_ _ </p><p> 學(xué)生姓名_ ____________ </p><p> 指導(dǎo)教師_ </p><p> 2013 年 1 月 16 日</p><p><
3、;b> 一、課程設(shè)計的內(nèi)容</b></p><p> 用AT89C52單片機制作一個時鐘:</p><p> 1.設(shè)計并繪制硬件電路圖;</p><p> 2.布置元件并焊接好元器件;</p><p> 3.編寫程序并將調(diào)試好的程序固化到單片機中。</p><p> 4.增加溫度測試功能。
4、</p><p> 二、課程設(shè)計的要求與數(shù)據(jù)</p><p> 單片機采用STC89C52芯片,時鐘芯片采用DALLAS 公司的DS1302,即涓流充電時鐘芯片,它內(nèi)含有一個實時時鐘/日歷和31 字節(jié)靜態(tài)RAM,通過簡單的串行接口與單片機進行通信實時時鐘/日歷電路提供秒分時日日期月年的信息,每月的天數(shù)和閏年的天數(shù)可自動調(diào)整,時鐘操作可通過AM/PM 指示決定采用24 或12 小時格式,
5、DS1302 與單片機之間能簡單地采用同步串行的方式進行通信。同時用選DS18B20 傳感器將采集的室內(nèi)溫度顯示于LCD上。按此要求設(shè)計硬件和軟件以實現(xiàn)這些功能。</p><p> 三、課程設(shè)計應(yīng)完成的工作</p><p> 1. 完成下載線的制作,為程序下載到單片機芯片中做好準(zhǔn)備;</p><p> 2. 完成軟件、硬件的設(shè)計,并進行硬件的焊接制作,并將調(diào)試
6、成功的程序固化到單片機中,最后進行硬件與軟件的調(diào)試;</p><p> 3.撰寫設(shè)計說明書。</p><p> 四、課程設(shè)計進程安排</p><p><b> 摘要</b></p><p> 隨著時代的進步和發(fā)展,單片機技術(shù)已經(jīng)普及到我們生活,工作,科研,各個領(lǐng)域,已經(jīng)成為一種比較成熟的技術(shù),本文將介紹一種基于單
7、片機控制的液晶顯示溫度和時鐘設(shè)計,時間可由鍵盤調(diào)整。主要用到的芯片有單片機STC89C52.液晶1602LCM模塊.時鐘芯片DS1302.溫度傳感器DS18B20等。</p><p> 關(guān)鍵詞:單片機STC89C52,1602LCM模塊,DS1302.,DS18B20</p><p><b> 目錄</b></p><p> 1 系統(tǒng)需求
8、分析1</p><p> 1.1 電子時鐘研究的背景和意義1</p><p> 1.2 系統(tǒng)實用功能分析1</p><p> 2 設(shè)計要求與方案2</p><p> 2.1 設(shè)計要求2</p><p> 2.1.1 基本要求2</p><p> 2.1.2發(fā)揮部分2&
9、lt;/p><p> 2.2 系統(tǒng)基本方案選擇2</p><p> 2.2.1 芯片的選擇2</p><p> 2.2.2 顯示模塊選擇方案2</p><p> 2.2.3 時鐘信號的選擇方案3</p><p> 2.3 電路設(shè)計最終方案決定3</p><p> 3 系統(tǒng)的硬件
10、設(shè)計與實現(xiàn)3</p><p> 3.1 數(shù)字鐘電路設(shè)計框圖3</p><p> 3.2 系統(tǒng)硬件概述4</p><p> 3.3 硬件電路結(jié)構(gòu)的設(shè)計4</p><p> 3.3.1 單片機主控制模塊的設(shè)計4</p><p> 3.3.2 顯示模塊的設(shè)計4</p><p>
11、 3.3.3 LCD原理說明5</p><p> 3.3.4 開關(guān)模塊說明6</p><p> 4 系統(tǒng)的軟件設(shè)計7</p><p> 4.1 程序流程框圖7</p><p> 4.2 LCD的初始化與及顯示程序7</p><p><b> 5 系統(tǒng)調(diào)試9</b><
12、/p><p><b> 5.1軟件調(diào)試9</b></p><p><b> 5.2硬件調(diào)試9</b></p><p><b> 參考文獻10</b></p><p><b> 附錄11</b></p><p><b
13、> 1 系統(tǒng)需求分析</b></p><p> 1.1 電子時鐘研究的背景和意義</p><p> 20實際末,電子技術(shù)獲得了飛速的發(fā)展。再起推動下現(xiàn)代電子產(chǎn)品幾乎滲透到了社會的哥哥領(lǐng)域,有力的推動和提高的社會生產(chǎn)力的發(fā)展與信息化程度,同時也是現(xiàn)代電子產(chǎn)品性能進一步提升,產(chǎn)品的更新?lián)Q代節(jié)奏譜也越來越快。時間對人們來說是那么的寶貴,工作的忙碌性和繁雜容易使人們忘記當(dāng)
14、前的時間。然而遇到重大事情的時候,一旦忘記時間,就會給自己或者是他人造成很大的麻煩。平時我們要求上班準(zhǔn)時,約會或者召開會議必然要提及時間、火車要準(zhǔn)點到達,航班要準(zhǔn)時起飛,工業(yè)生產(chǎn)中,很多環(huán)節(jié)都需要時間來確定工序替換時刻。所以說能隨時準(zhǔn)確的指導(dǎo)時間并利用時間,是我們生活中必不可少的。</p><p> 想知道時間,手表當(dāng)然是很好的選擇,但是在忙碌當(dāng)中,我們還需要一個“助理”時不時的給我們體形式將,所以,計時器最好
15、能夠用有一個定時系統(tǒng),隨時提醒容易忘記時間的人。最早能夠定時、寶石的時鐘屬于機械式鐘表,但這種時鐘受到機械結(jié)構(gòu)、動力合體技的限制,在功能性能以及在造價上都沒有辦法與電子時鐘相比。</p><p> 電子時鐘是采用電子電路實現(xiàn)對時、分、秒進行數(shù)字顯示的即使裝置,廣泛應(yīng)用月個人家庭、車站、碼頭辦公室等公共場所,成為人們?nèi)粘I罨顒又胁豢缮俚谋仨毱?。由于?shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛使用,是的數(shù)字時鐘的精度
16、遠遠查過老師鐘表,鐘表的數(shù)字化跟人們生產(chǎn)生活帶來了極大的方便,而且大大的擴展了鐘表原先的時鐘功能。諸如整點提示、定時報警、定時廣播、自動啟閉路燈,定時開關(guān)烘箱、同多動力設(shè)備、甚至各種定時電氣的自動啟動等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此研究數(shù)字鐘及擴大其應(yīng)用,有著非常現(xiàn)實的意義。</p><p> 1.2 系統(tǒng)實用功能分析</p><p> 單片機模塊中最常見的是數(shù)字時鐘,數(shù)字
17、時鐘是一種用單片機原理實現(xiàn)時、分、秒計時的裝置,與機械式時鐘相比具有更高的準(zhǔn)確性和直觀性,且無機械裝置,具有更更長的使用壽命,因此得到了廣泛的使用。</p><p> 數(shù)字時鐘是采用單片機原理實現(xiàn)對.年、月、日、周、時、分、秒,數(shù)字顯示及到時提醒的計時裝置,廣泛用于個人家庭,車站, 碼頭辦公室等公共場所,成為人們?nèi)粘I钪胁豢缮俚谋匦杵?由于數(shù)字集成電路的發(fā)展和石英晶體振蕩器的廣泛應(yīng)用,使得數(shù)字鐘的精度,遠遠超
18、過老式鐘表, 鐘表的數(shù)字化給人們生產(chǎn)生活帶來了極大的方便,而且大大地擴展了鐘表原先的報時功能。諸如定時自動報警、按時自動打鈴、時間程序自動控制、定時廣播、自動起閉路燈、定時開關(guān)烘箱、通斷動力設(shè)備、甚至各種定時電氣的自動啟用等,所有這些,都是以鐘表數(shù)字化為基礎(chǔ)的。因此,研究數(shù)字時鐘及擴大其應(yīng)用,有著非常現(xiàn)實的意義。</p><p><b> 2 設(shè)計要求與方案</b></p>
19、<p><b> 2.1 設(shè)計要求</b></p><p> 2.1.1 基本要求</p><p> 1 設(shè)計能支持年月日星期時分秒的時鐘,時鐘要具有時間調(diào)整功能。</p><p><b> 2.1.2發(fā)揮部分</b></p><p> 1 鬧鐘時間精度。</p>
20、<p> 2 時鐘功耗小于0.5MA/5V。</p><p> 2.2 系統(tǒng)基本方案選擇</p><p> 本時鐘的設(shè)計具體有兩種方法。一是通過單純的數(shù)字電路來實現(xiàn);二是使用單片機來控制實現(xiàn)。本次設(shè)計選取了較為簡單的單片機控制;而選擇這一方法后還要進行各個芯片的選擇。以下是我在這次設(shè)計中所用的方案。</p><p> 2.2.1 芯片的選擇&
21、lt;/p><p> 采用AT89C52芯片,其為高性能CMOS 8位單片機,該芯片內(nèi)含有4k bytes的可反復(fù)擦寫的只讀程序存儲器(PEROM)、128 bytes的隨機存取數(shù)據(jù)存儲器(RAM)、 32位可編程I/O口線、2個16位定時/計數(shù)器、6個中斷源、可編程串行UART通道及低功耗空閑和掉電模式,其最大的優(yōu)勢就是AT89C52提供了8K字節(jié)可擦寫Flash閃速存儲器空間、8個中斷源、及256*8字節(jié)內(nèi)部存
22、儲器(RAM),解決了我們對可反復(fù)擦寫的Flash閃速存儲器空間大小與中斷源的不夠問題的擔(dān)心。</p><p> 2.2.2 顯示模塊選擇方案</p><p> 方案一:采用LED數(shù)碼管顯示,顯示較為清楚,但是由于設(shè)計要求時鐘功能比較重要,因此用如用LED進行顯示會使得硬件電路較為復(fù)雜,且在軟件實現(xiàn)上也較難,為實現(xiàn)功能帶來了一定的困難。</p><p> 方案
23、二:采用LCD,電路比較簡單,且在軟件設(shè)計上也相對簡單,具有低功耗功能,能夠滿足設(shè)計最優(yōu)的要求。因此,在設(shè)計中我采用的顯示模塊是LCD顯示。</p><p> 2.2.3 時鐘信號的選擇方案</p><p> 方案一:直接采用單片機定時計數(shù)器提供的秒信號,使用程序?qū)崿F(xiàn)年、月、日、周、時、分、秒計數(shù)。采用此種方案可減少芯片的使用,節(jié)約成本,實現(xiàn)的時間誤差較小,但程序設(shè)計較為復(fù)雜。<
24、/p><p> 方案二:采用DS1302時鐘芯片實現(xiàn)時鐘, DS1302芯片是一種高性能的時鐘芯片,可自動對秒、分、時、日、周、月、年以及閏年補償?shù)哪赀M行計數(shù),而且精度高,256位的RAM作為數(shù)據(jù)暫存區(qū),工作電壓2.5V~5.5V范圍內(nèi),2.5V時耗電小于300nA。且硬件電路連接較為簡單,程序設(shè)計容易實現(xiàn)。</p><p> 2.3 電路設(shè)計最終方案決定</p><p
25、> 綜上各方案所述,對此次數(shù)字時鐘的方案選定為: 采用AT89C52作為主控制系統(tǒng); 并由其定時計數(shù)器提供時鐘; LCD作為顯示電路,來實現(xiàn)功能。</p><p> 3 系統(tǒng)的硬件設(shè)計與實現(xiàn)</p><p> 3.1 數(shù)字鐘電路設(shè)計框圖</p><p> 圖3-1電路設(shè)計框圖</p><p> 3.2 系統(tǒng)硬件概述</p
26、><p> 該電路是由AT89C52單片機為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時鐘電路也由AT89C52單片機提供,減少芯片的使用,節(jié)約成本,它可以對年、月、日、周、日、時、分、秒進行計時,具有閏年補償功能。時間顯示部份采用液晶LM016L(LCD)。</p><p> 3.3 硬件電路結(jié)構(gòu)的設(shè)計</p><p> 3.3.1 單片機主控制模
27、塊的設(shè)計</p><p> 此次單片機數(shù)字時鐘的設(shè)計采用AT89C52為主控制芯片,并由其定時器提供時鐘,利用LCD進行時間按顯示。下圖為用Proteus軟件畫的原理圖:</p><p><b> 圖3-2仿真電路圖</b></p><p> 3.3.2 顯示模塊的設(shè)計</p><p> 如圖(3-4)所示,該設(shè)
28、計采用液晶顯示裝置即把時鐘信號以及溫度信號同時顯示在液晶顯示器上,不僅結(jié)構(gòu)簡單清新可見,而且省電也容易控制。數(shù)據(jù)的傳輸采用P0口進行控制, 其引腳VSS接地,VEE接VCC,RS和RW、E是顯示器的控制端分別由單片機的引腳P1.0、P1.1、P1.3進行控制。而VDD是作為液晶顯示器的灰度調(diào)節(jié)引腳,接一變阻器來改變其顯示的清晰度。</p><p> 圖3-3 LM016L液晶顯示器</p><
29、;p> 3.3.3 LCD原理說明</p><p> 在實際應(yīng)用中,用戶很少直接設(shè)計LCD顯示器驅(qū)動接口,一般是直接使用專用的LCD顯示驅(qū)動器和LCD顯示模塊。其中,LCD顯示模塊LCM(Liquid Crystal Display Module)是把LCD顯示器、背景光源、線路板和驅(qū)動集成電路等部件構(gòu)成一個整體,作為一個獨立的部件使用,具有功能較強、易于控制、接口簡單等
30、優(yōu)點,在單片機系統(tǒng)中應(yīng)用較多。其內(nèi)部結(jié)構(gòu)如圖2-8所示。LCD顯示模塊只留一個接口與外部通信。顯示模塊通過這個接口接收顯示命令和數(shù)據(jù),并按指令和數(shù)據(jù)的要求進行顯示。外部電路通過這個接口讀出顯示模塊的工作狀態(tài)和顯示數(shù)據(jù)。LCD顯示模塊一般帶有內(nèi)部顯示RAM和字符發(fā)生器,只要輸入ASCII碼就可以進行顯示。LCD顯示模塊按功能顯示可分為:LCD段式顯示模塊、LCD字符型顯示模塊、LCD圖形顯示塊三類。液晶顯示器因其功耗低、重量輕而成為便攜式
31、應(yīng)用中的主流顯示技術(shù)。這里所用的字符型液晶模塊是一種用5x7點陣圖形來顯示字符的液晶顯示器,根據(jù)顯示的容量可以分為1行16個字、2行16個字、2行20個字等等。液晶顯示有點振式和字符式兩種,在這里采用字符式液晶顯示器1602來實現(xiàn)顯示電路的</p><p> 圖3-4 LCD顯示電路</p><p> 由于1602液晶顯示器是本身帶有驅(qū)動模塊的液晶屏,它只有并口線和一些控制線,與單片機
32、的連接有兩種不同的方法,直接訪問方式和間接訪問方式。直接訪問方式就是微處理器把液晶顯示模塊當(dāng)作存儲器或I/O設(shè)備直接掛在總線上,模塊8位數(shù)據(jù)總線與微處理器的數(shù)據(jù)總線相連,用讀操作 或?qū)懖僮?#160;信號與地址信號共同產(chǎn)生控制信號。</p><p> 3.3.4 開關(guān)模塊說明</p><p> 校時電路主要靠鍵盤來控制。鍵盤是一組按鍵的集合。共有四個按鍵,分別是:改變時間、
33、增加、減少、清零。它是嵌入式計算機系統(tǒng)中不可缺少的外圍電路。是實現(xiàn)人機對話的紐帶,借助鍵盤可以向計算機輸入程序、置數(shù)、邏輯操作以及寫入程序和程序檢測等。</p><p><b> 4 系統(tǒng)的軟件設(shè)計</b></p><p> 4.1 程序流程框圖</p><p> 圖4-1 主程序流程</p><p> 4.2
34、LCD的初始化與及顯示程序</p><p> 1 LCD的初始化</p><p> void ini()/*LCD的初始化函數(shù)</p><p><b> {</b></p><p><b> rw=0;</b></p><p><b> en=0;<
35、;/b></p><p><b> P1=0xff;</b></p><p> writeCG();</p><p> write_order(0x38);/*端口寫入</p><p> write_order(0x0c); /*端口寫入</p><p> write_order(
36、0x06); /*端口寫入</p><p> write_order(0x01); /*端口寫入</p><p><b> }</b></p><p> 2 LCD的顯示程序</p><p> void open()/*定義一個LCD顯示函數(shù)</p><p><b> {&l
37、t;/b></p><p> uchar num; /*定義一個無符號的字符變量num</p><p> write_order(0x80+0x10); /*調(diào)用write_order函數(shù) </p><p> for(num=0;opens[num]!='\0';num++)/*循環(huán)打開</p><p><b
38、> {</b></p><p> write_date(opens[num]);</p><p> delay(20);</p><p><b> }</b></p><p> for(num=0;num<16;num++)/*對端口0x1c寫入</p><p>
39、<b> {</b></p><p> write_order(0x1c);</p><p> delay(200);</p><p><b> }</b></p><p> for(num=0;num<5;num++)/*對端口0x18寫入{</p><p&g
40、t; write_order(0x18);</p><p> delay(200);</p><p><b> }</b></p><p> for(num=0;num<4;num++)/*對端口0x18寫入</p><p><b> {</b></p><p&g
41、t; write_order(0x1c);</p><p> delay(200);</p><p><b> }</b></p><p> for(num=0;num<3;num++)/*對端口0x18寫入</p><p><b> {</b></p><p&g
42、t; write_order(0x18);</p><p> delay(200);</p><p><b> }</b></p><p> for(num=0;num<2;num++)/*對端口0x1c寫入</p><p><b> {</b></p><p&g
43、t; write_order(0x1c);</p><p> delay(200);</p><p><b> }</b></p><p> for(num=0;num<1;num++)/*對端口0x18寫入</p><p><b> {</b></p><p&g
44、t; write_order(0x18);</p><p> delay(100);</p><p><b> }</b></p><p> write_order(0x80+0x53);</p><p> for(num=0;opens1[num]!='\0';num++)/*循環(huán)延時寫入數(shù)據(jù)
45、</p><p> { write_date(opens1[num]); </p><p> delay(500);}</p><p><b> 5 系統(tǒng)調(diào)試</b></p><p><b> 5.1軟件調(diào)試</b></p><p> 打開程序調(diào)試軟件keil u
46、Vision2,在里面新建一個工程,命名為:數(shù)字時鐘.Uv2。接著新建文件,編寫相應(yīng)程序。編寫好的各個程序進行編譯與連接。但若是在該過程中,看見我們編好的程序有錯誤,那么就根據(jù)他相應(yīng)的提示來修改錯誤,直到該程序能夠正確編譯為止。</p><p> 能夠正常編譯的程序說明沒有什么問題了,此時我們在點擊相關(guān)欄目,讓它生成我們在硬件仿真時所需要的.HEX文件。到此步,我們的軟件調(diào)試就完成了。</p>&
47、lt;p><b> 5.2硬件調(diào)試</b></p><p> 打開Proteus 7 Professional軟件,按照方案所選的電路元件來設(shè)計整體電路,線把個芯片按一定的位置放好,然后對相應(yīng)的對象進行連接,連接時需仔細,以免調(diào)試時發(fā)生錯誤。做好之后把編程所生成的。HEX文件加載到AT89C52中,運行仿真軟件,查看運行效果。如果運行出錯那么就根據(jù)他相應(yīng)的提示來修改錯誤,直到仿真成
48、功為止。</p><p><b> 參考文獻</b></p><p> [1] 邊春遠、王志強,MCS-51單片機應(yīng)用開發(fā)實用子程序[M],人民郵電出版社.</p><p> [2] 馬忠梅主編,單片機的C語言應(yīng)用程序設(shè)計[M],北京航空航天大學(xué)出版社.</p><p> [3] 李朝青主編,單片機原理及接口技術(shù)
49、(第3版)[M], 北京航空航天大學(xué)出版社.</p><p> [4] 譚浩強,C語言程序設(shè)計(第四版)[M], 清華大學(xué)出版.</p><p> [5] 馬忠梅、張凱,單片機的C語言應(yīng)用程序設(shè)計[M],北京航空航天大學(xué)出版社.</p><p> [6] 廖先蕓,電子技術(shù)實踐與實訓(xùn)[M],高等教育出版社.</p><p><b&g
50、t; 附錄</b></p><p><b> 主程序:</b></p><p> #include<reg52.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p>&l
51、t;p> sbit lcdrs=P3^5;</p><p> sbit lcden=P3^4;</p><p> sbit dula=P2^6;</p><p> sbit wela=P2^7;</p><p> sbit s0 =P1^0;</p><p> sbit s1 =P1^1;<
52、/p><p> sbit s2 =P1^2;</p><p> sbit s3 =P1^3;</p><p> uchar code table1[]="2008-08-28 Wen";</p><p> uchar code table2[]="21:31:30";</p>&l
53、t;p> uchar num,t0;</p><p> char sec,minute,hour,day,week,month;</p><p> uint year;</p><p> void delay(uchar z)</p><p><b> {</b></p><p>
54、 uchar x,y;</p><p> for(x=z;x>0;x--)</p><p> for(y=110;y>0;y--); </p><p><b> }</b></p><p><b> //寫入指令子函數(shù)</b></p><p> voi
55、d write_order(uchar order)</p><p><b> {</b></p><p><b> lcdrs=0;</b></p><p><b> P0=order;</b></p><p><b> delay(2);</b>
56、;</p><p><b> lcden=1;</b></p><p><b> delay(2);</b></p><p><b> lcden=0;</b></p><p><b> }</b></p><p><
57、b> //寫入數(shù)據(jù)子函數(shù)</b></p><p> void write_data(uchar data1)</p><p><b> {</b></p><p><b> lcdrs=1;</b></p><p><b> P0=data1;</b>
58、;</p><p><b> delay(2);</b></p><p><b> lcden=1;</b></p><p><b> delay(2);</b></p><p><b> lcden=0;</b></p><p
59、><b> }</b></p><p><b> //初始化子函數(shù)</b></p><p> void init()</p><p><b> {</b></p><p><b> sec=0;</b></p><p&g
60、t;<b> minute=0;</b></p><p><b> hour=0;</b></p><p><b> week=0;</b></p><p><b> day=1;</b></p><p><b> month=1;&l
61、t;/b></p><p> year=2008;</p><p> TMOD=0x01;</p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p><b> EA=1;</b></p>
62、;<p><b> ET0=1;</b></p><p><b> TR0=1;</b></p><p><b> wela=0;</b></p><p><b> dula=0;</b></p><p><b> lcd
63、en=0;</b></p><p> write_order(0x38); //設(shè)置顯示模式</p><p> write_order(0x0c); //開顯示開光標(biāo),光標(biāo)閃爍</p><p> write_order(0x01); //顯示清屏</p><p> wr
64、ite_order(0x06); //光標(biāo)顯示效果</p><p> write_order(0x80); //定義第一行寫入數(shù)據(jù)的地址 </p><p> for(num=0;num<14;num++)</p><p><b> { </b></p><p> w
65、rite_data(table1[num]);</p><p><b> delay(2);</b></p><p><b> }</b></p><p> write_order(0x80+0x43); //定義第一行寫入數(shù)據(jù)的地址 </p><p> for(num=0;n
66、um<8;num++)</p><p><b> { </b></p><p> write_data(table2[num]);</p><p><b> delay(2);</b></p><p><b> }</b></p><
67、p><b> }</b></p><p> void change(uchar addr,uchar data1) //改變 時 分 秒 天 月 的子函數(shù) </p><p><b> {</b></p><p> uchar x,y;</p><p> x=data1/10;<
68、/p><p> y=data1%10;</p><p> write_order(0x80+addr);</p><p><b> delay(1);</b></p><p> write_data(0x30+x);</p><p><b> delay(1);</b>
69、</p><p> write_data(0x30+y);</p><p><b> delay(1);</b></p><p><b> }</b></p><p> void yearchange(uchar addr,uint year) //改變年的子函數(shù)</p>&l
70、t;p><b> {</b></p><p> uchar x,y,z,w;</p><p> x=year/1000;</p><p> y=year%1000/100;</p><p> z=year%100/10;</p><p> w=year%10;</p>
71、<p> write_order(0x80+addr);</p><p><b> delay(1);</b></p><p> write_data(0x30+x);</p><p><b> delay(1);</b></p><p> write_data(0x30+y
72、);</p><p><b> delay(1);</b></p><p> write_data(0x30+z);</p><p><b> delay(1);</b></p><p> write_data(0x30+w);</p><p><b>
73、delay(1);</b></p><p><b> }</b></p><p> void weekchange(uchar z) //改變周數(shù)的子函數(shù)</p><p><b> {</b></p><p><b> switch(z)</b
74、></p><p><b> {</b></p><p><b> case 0:</b></p><p><b> {</b></p><p> write_order(0x80+0x0b);</p><p><b> del
75、ay(1);</b></p><p> write_data('M');</p><p><b> delay(1);</b></p><p> write_data('o');</p><p><b> delay(1);</b></p&g
76、t;<p> write_data('n');</p><p> delay(1); </p><p><b> }</b></p><p><b> break;</b></p><p><b> case 1:</b></p&
77、gt;<p><b> {</b></p><p> write_order(0x80+0x0b);</p><p><b> delay(1);</b></p><p> write_data('T');</p><p><b> delay(1)
78、;</b></p><p> write_data('u');</p><p><b> delay(1);</b></p><p> write_data('e');</p><p> delay(1); </p><p><b>
79、 }</b></p><p><b> break;</b></p><p><b> case 2:</b></p><p><b> {</b></p><p> write_order(0x80+0x0b);</p><p>
80、<b> delay(1);</b></p><p> write_data('W');</p><p><b> delay(1);</b></p><p> write_data('e');</p><p><b> delay(1);<
81、/b></p><p> write_data('n');</p><p> delay(1); </p><p><b> }</b></p><p><b> break;</b></p><p><b> case 3:<
82、;/b></p><p><b> {</b></p><p> write_order(0x80+0x0b);</p><p><b> delay(1);</b></p><p> write_data('T');</p><p><b
83、> delay(1);</b></p><p> write_data('h');</p><p><b> delay(1);</b></p><p> write_data('u');</p><p> delay(1); </p><
84、p><b> }</b></p><p><b> break;</b></p><p><b> case 4:</b></p><p><b> {</b></p><p> write_order(0x80+0x0b);</p&
85、gt;<p><b> delay(1);</b></p><p> write_data('F');</p><p><b> delay(1);</b></p><p> write_data('r');</p><p><b>
86、 delay(1);</b></p><p> write_data('i');</p><p> delay(1); </p><p><b> }</b></p><p><b> break;</b></p><p><b&g
87、t; case 5:</b></p><p><b> {</b></p><p> write_order(0x80+0x0b);</p><p><b> delay(1);</b></p><p> write_data('S');</p>
88、<p><b> delay(1);</b></p><p> write_data('a');</p><p><b> delay(1);</b></p><p> write_data('t');</p><p> delay(1); &l
89、t;/p><p><b> }</b></p><p><b> break;</b></p><p><b> case 6:</b></p><p><b> {</b></p><p> write_order(0x80
90、+0x0b);</p><p><b> delay(1);</b></p><p> write_data('S');</p><p><b> delay(1);</b></p><p> write_data('u');</p><p
91、><b> delay(1);</b></p><p> write_data('n');</p><p> delay(1); </p><p><b> }</b></p><p><b> break;</b></p>&l
92、t;p> default:break;</p><p><b> }</b></p><p><b> }</b></p><p> void display()</p><p><b> {</b></p><p> if(t0==2
93、0) </p><p><b> {</b></p><p><b> t0=0;</b></p><p><b> sec++;</b></p><p> if(sec==60)</p><p><b> {</b>&l
94、t;/p><p><b> sec=0;</b></p><p><b> minute++;</b></p><p> if(minute==60)</p><p><b> {</b></p><p><b> minute=0;&l
95、t;/b></p><p><b> hour++;</b></p><p> if(hour==24)</p><p><b> { </b></p><p><b> hour=0;</b></p><p><b> d
96、ay++;</b></p><p><b> week++;</b></p><p> if(week==7)</p><p> { </p><p> week=0;
97、 </p><p><b> }</b></p><p> if(day==31)</p><p><b> {</b></p><p><b&g
98、t; day=1;</b></p><p><b> month++;</b></p><p> if(month==13)</p><p><b> {</b></p><p><b> month=1;</b></p><p>
99、<b> year++;</b></p><p> yearchange(0,year);</p><p><b> }</b></p><p> change(0x05,month);</p><p><b> }</b></p><p>
100、 change(0x08,day);</p><p> weekchange(week);</p><p><b> }</b></p><p> change(0x43,hour);</p><p><b> }</b></p><p> change(0x46,
101、minute);</p><p><b> }</b></p><p> change(0x49,sec); </p><p><b> } </b></p><p><b> }</b></p><p> //鍵盤掃描的子函數(shù),修改時間<
102、;/p><p> void keyscan()</p><p><b> {</b></p><p> uchar snum;</p><p><b> if(s0==0)</b></p><p><b> {</b></p><
103、;p><b> delay(5);</b></p><p><b> if(s0==0)</b></p><p><b> {</b></p><p> while(!s0);//松手檢測</p><p><b> snum++;</b>&
104、lt;/p><p><b> }</b></p><p> if(snum==1) //選定 秒</p><p><b> {</b></p><p><b> TR0=0;</b></p><p> write_order(0x80+0
105、x40+9);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==2) //選定 分</p><p><b> {</b></p><p> write_order(0x80+
106、0x40+6);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==3) //選定 時</p><p><b> {</b></p><p> write_order(0x
107、80+0x40+3);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==4) //選定 星期</p><p><b> {</b></p><p> write_orde
108、r(0x80+0x0b);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==5) //選定 天</p><p><b> {</b></p><p> write_ord
109、er(0x80+0x08);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==6) //選定 月</p><p><b> {</b></p><p> write_or
110、der(0x80+0x05);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==7) //選定 年</p><p><b> {</b></p><p> write_or
111、der(0x80);</p><p> write_order(0x0f); </p><p><b> }</b></p><p> if(snum==8) //恢復(fù) 計時</p><p><b> {</b></p><p><b> TR
112、0=1;</b></p><p> write_order(0x0c);</p><p><b> snum=0;</b></p><p><b> }</b></p><p><b> }</b></p><p> if(snum
113、!=0) //增加 時 分 秒 天 月 年</p><p><b> {</b></p><p><b> if(s1==0)</b></p><p><b> {</b></p><p><b> delay(5);</b></
114、p><p><b> if(s1==0)</b></p><p><b> {</b></p><p> while(!s1);</p><p> if(snum==1)</p><p><b> {</b></p><p>
115、;<b> sec++;</b></p><p> if(sec==60)</p><p><b> sec=0;</b></p><p> change(0x49,sec);</p><p> write_order(0x80+0x40+9); </p><p>
116、<b> }</b></p><p> if(snum==2)</p><p><b> {</b></p><p><b> minute++;</b></p><p> if(minute==60)</p><p><b> m
117、inute=0;</b></p><p> change(0x46,minute);</p><p> write_order(0x80+0x40+6);</p><p><b> }</b></p><p> if(snum==3)</p><p><b> {&
118、lt;/b></p><p><b> hour++;</b></p><p> if(hour==24)</p><p><b> hour=0;</b></p><p> change(0x43,hour);</p><p> write_order(0x
119、80+0x40+3);</p><p><b> }</b></p><p> if(snum==4)</p><p><b> {</b></p><p><b> week++;</b></p><p> if(week==7)</p
120、><p><b> week=0;</b></p><p> weekchange(week);</p><p> write_order(0x80+0x0b);</p><p><b> }</b></p><p> if(snum==5)</p>&l
121、t;p><b> {</b></p><p><b> day++;</b></p><p> if(day==31)</p><p><b> day=1;</b></p><p> change(0x08,day);</p><p>
122、 write_order(0x80+0x08);</p><p><b> }</b></p><p> if(snum==6)</p><p><b> {</b></p><p><b> month++;</b></p><p> if
123、(month==13)</p><p><b> month=1;</b></p><p> change(0x05,month);</p><p> write_order(0x80+0x05);</p><p><b> }</b></p><p> if(sn
124、um==7)</p><p><b> {</b></p><p><b> year++;</b></p><p> yearchange(0,year);</p><p> write_order(0x80);</p><p><b> }</b
125、></p><p><b> }</b></p><p><b> } </b></p><p><b> }</b></p><p> if(snum!=0) //減少 時 分 秒 天 月 年</p><p><b>
126、; {</b></p><p><b> if(s2==0)</b></p><p><b> {</b></p><p><b> delay(5);</b></p><p><b> if(s2==0)</b></p>
127、<p><b> {</b></p><p> while(!s2);</p><p> if(snum==1)</p><p><b> {</b></p><p><b> sec--;</b></p><p> if(se
128、c==-1)</p><p><b> sec=59;</b></p><p> change(0x49,sec);</p><p> write_order(0x80+0x40+9); </p><p><b> }</b></p><p> if(snum==2
129、)</p><p><b> {</b></p><p><b> minute--;</b></p><p> if(minute==-1)</p><p> minute=59;</p><p> change(0x46,minute);</p>
130、<p> write_order(0x80+0x40+6);</p><p><b> }</b></p><p> if(snum==3)</p><p><b> {</b></p><p><b> hour--;</b></p><
131、;p> if(hour==-1)</p><p><b> hour=23;</b></p><p> change(0x43,hour);</p><p> write_order(0x80+0x40+3);</p><p><b> }</b></p><p&
132、gt; if(snum==4)</p><p><b> {</b></p><p><b> week--;</b></p><p> if(week==-1)</p><p><b> week=6;</b></p><p> weekc
133、hange(week);</p><p> write_order(0x80+0x0b);</p><p><b> }</b></p><p> if(snum==5)</p><p><b> {</b></p><p><b> day--;<
134、/b></p><p> if(day==0)</p><p><b> day=30;</b></p><p> change(0x08,day);</p><p> write_order(0x80+0x08);</p><p><b> }</b><
135、;/p><p> if(snum==6)</p><p><b> {</b></p><p><b> month--;</b></p><p> if(month==0)</p><p><b> month=12;</b></p>
136、<p> change(0x05,month);</p><p> write_order(0x80+0x05);</p><p><b> }</b></p><p> if(snum==7)</p><p><b> {</b></p><p>&
137、lt;b> year--;</b></p><p> yearchange(0,year);</p><p> write_order(0x80);</p><p><b> }</b></p><p><b> }</b></p><p><
138、;b> } </b></p><p><b> }</b></p><p><b> if(s3==0)</b></p><p><b> {</b></p><p><b> delay(5);</b></p>
139、<p><b> if(s3==0)</b></p><p><b> {</b></p><p> while(!s3);</p><p><b> sec=0;</b></p><p><b> minute=0;</b></
140、p><p><b> hour=0;</b></p><p><b> week=0;</b></p><p><b> day=1;</b></p><p><b> month=1;</b></p><p> year=2
141、008;</p><p> change(0x49,sec);</p><p> change(0x46,minute);</p><p> change(0x43,hour);</p><p> weekchange(week);</p><p> change(0x08,day);</p>
142、<p> change(0x05,month);</p><p> yearchange(0,year);</p><p> write_order(0x0c);</p><p><b> }</b></p><p><b> }</b></p><p>
143、<b> } </b></p><p> void main()</p><p><b> {</b></p><p><b> init();</b></p><p><b> while(1)</b></p><p>
144、<b> {</b></p><p> keyscan(); </p><p> display();</p><p><b> } </b></p><p><b> } </b></p><p><b> //定時器0<
145、/b></p><p> void time0() interrupt 1</p><p><b> {</b></p><p> TH0=(65536-50000)/256;</p><p> TL0=(65536-50000)%256;</p><p><b> t0
146、++;</b></p><p><b> } </b></p><p><b> 心得體會:</b></p><p> 這次單片機綜合設(shè)計與實踐,讓我們都認識到單片機與C語言的深度。當(dāng)我們拿到設(shè)計任務(wù)書時,覺得用幾個按鍵來控制電子鐘的時、分是一個十分簡單的設(shè)計,但在我們著手設(shè)計時發(fā)現(xiàn)并不是那么容易的。在硬
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機課程設(shè)計-多功能時鐘
- 單片機課程設(shè)計---多功能時鐘
- 單片機數(shù)字時鐘課程設(shè)計--單片機多功能電子鐘設(shè)計
- 單片機課程設(shè)計---多功能時鐘設(shè)計
- 單片機課程設(shè)計---多功能時鐘設(shè)計
- 單片機課程設(shè)計--多功能電子時鐘
- 單片機課程設(shè)計---多功能電子時鐘設(shè)計
- 單片機課程設(shè)計---單片機數(shù)字時鐘
- 單片機課程設(shè)計--數(shù)字時鐘
- 單片機數(shù)字時鐘課程設(shè)計
- 單片機課程設(shè)計--數(shù)字時鐘
- 單片機課程設(shè)計(數(shù)字時鐘)
- 單片機課程設(shè)計報告---單片機數(shù)字時鐘
- 單片機課程設(shè)計---單片機數(shù)字時鐘.doc
- 單片機課程設(shè)計數(shù)字時鐘
- 單片機數(shù)字時鐘控制課程設(shè)計
- 單片機課程設(shè)計--基于單片機的數(shù)字時鐘設(shè)計
- 課程設(shè)計-單片機基于單片機的數(shù)字時鐘設(shè)計
- 單片機數(shù)字時鐘課程設(shè)計報告
- 單片機課程設(shè)計數(shù)字時鐘
評論
0/150
提交評論