版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 陜西理工學院畢業(yè)設(shè)計畢業(yè)設(shè)計 題 目 用PG12864LCD設(shè)計的指針式電子鐘 學生姓名 王康康 學號 1110064047 所在院(系) 物理與電信工程學院 專業(yè)班級 電子信息科學與技術(shù)1102 指導(dǎo)教師 楊創(chuàng)華 完成地點 實驗樓1104教室 2015年5月目錄引言11 設(shè)計任務(wù)及方案論證11.1設(shè)計任務(wù)與要求11.2 總體方案論證與設(shè)計12系統(tǒng)硬件設(shè)置12.1 STC89C51單片機簡介12.2顯示模塊設(shè)計32.2.1 PG12864LCD的特性介紹42.2.2 LCD12864引腳介紹42.2.3 12864內(nèi)部功能器件及相關(guān)功能52.2.4 12864液晶與單片機接口電路62.3設(shè)置
2、模塊82.4 振蕩電路92.5 復(fù)位電路93系統(tǒng)軟件設(shè)計93.1總體軟件設(shè)計93.2 時鐘函數(shù)模塊103.3 指針時鐘設(shè)計113.3.1 實現(xiàn)功能113.3.2實現(xiàn)算法113.3.3 函數(shù)設(shè)計133.4 顯示函數(shù)模塊153.4.1實現(xiàn)功能173.4.2 函數(shù)設(shè)計173.5.1 功能183.5.2 函數(shù)183.6主函數(shù)模塊194.設(shè)計結(jié)果205.使用方法206.設(shè)計進度207.教學單位可以提供的條件20致謝21參考文獻21用PG12864LCD設(shè)計的指針式電子鐘王康康(陜西理工學院物理與電信工程學院電子信息科學與技術(shù)專業(yè)電信1102班,陜西漢中 723000)指導(dǎo)教師:楊創(chuàng)華 摘要本設(shè)計采用的是
3、STC89C51單片機,通過單片機內(nèi)部定時器定時實現(xiàn)時鐘定時計數(shù)功能,并以模擬時鐘的形式顯示在LCD_12864上。同時可通過三個按鍵可實現(xiàn)時間的調(diào)節(jié)。 關(guān)鍵詞時鐘 AT89C51單片機 LCD12864液晶By using the analog electronic clock design PG12864LCDWang kangkang (Grade11,Class2,Major Electronic Information Science and Technology,Physics Dept.,Shaanxi University of Technology,Hanzhong 7230
4、00,Shaanxi)Tutor:Yang chuanghua Abstract :This design uses STC89C51 microcontroller, through the MCU internal timer from time to time to achieve the clock timing and counting function and in the form of analog clock display on the LCD 12864. At the same time can be adjusted by the three keys to real
5、ize the time. Keywords: AT89C51microcontroller LCD12864 LCD clock引言如今二十一電子鐘、機械式手表等鐘表已經(jīng)普遍存在于市場,并且鐘表已經(jīng)成為人們生活中不可缺少的一部分。在生活中到處都能看到其身影。當穿行于馬路上時總會看到幾乎每個人手腕上戴著一塊手表。當大人家里做客時總能看到大廳里面掛著個鐘表。當打開手機時屏幕上依舊是鐘表的畫面。時間伴隨著我們鐘表也成為我們生活中必不可少的一大部分。當今市場有好多電子鐘,但大多數(shù)是純數(shù)字式的,指針式的電子鐘比較新穎,而且具有真實表盤式時鐘的效果。用PG12864LCD設(shè)計的模擬電子鐘采用PG1286
6、4LCD液晶屏,用來模擬表盤與時分秒指針指示當前時鐘,此模擬指針式電子鐘實現(xiàn)的功能為:在PG12864顯示屏上顯示圓形表盤與時分秒三個指針表示當前時刻;三個按鍵,K1鍵用來選擇工作模式;K2鍵用來選擇調(diào)整時分秒;K3鍵用來調(diào)節(jié)大小。1 設(shè)計任務(wù)及方案論證 1.1設(shè)計任務(wù)與要求利用單片機等器件做一個簡易的模擬指針式時鐘,硬件設(shè)計以單片機為主,主要包括顯示模塊、復(fù)位模塊、時鐘模塊。采用PG12864液晶屏作為顯示單元,液晶屏上顯示圓形表盤、時、分、秒指針,并且設(shè)置按鈕可以調(diào)節(jié)時間,軟件設(shè)計主要是通過單片機編程軟件Keil C51設(shè)計,模擬仿真是利用仿真軟件Proteus對所設(shè)計的硬件電路和程序進行
7、調(diào)試。 1.2 總體方案論證與設(shè)計在設(shè)計中要包含顯示模塊,控制器,設(shè)置模塊;方案一:利用基于MFC的Windows應(yīng)用程序在屏幕上顯示一個指針式時鐘,并可通過菜單選項對時間調(diào)節(jié),設(shè)計的時鐘畫面清晰,顯示準確,但缺點是時間必須與系統(tǒng)機器時間一樣,不可以隨意設(shè)置時間,另外此方案涉及微軟基礎(chǔ)類庫,對于不熟悉的我們難度較大。方案二:因此我們采用另一套方案,顯示模塊用LCD12864模塊,可以顯示系統(tǒng)時間;整個代碼實現(xiàn)主要由51單片機來實現(xiàn);設(shè)置模塊為按鍵處理可自行調(diào)節(jié)時間,整體流程以AT89C51單片機為控制核心,將得到的數(shù)據(jù)通過LCD12864模塊顯示出來,同時通過相應(yīng)的按鍵調(diào)整相應(yīng)的值,此方案具有
8、設(shè)計簡單,成本低廉,可執(zhí)行度高等優(yōu)點,因此采用本方案。圖2.1 STC89C51管腳圖2系統(tǒng)硬件設(shè)置 2.1 STC89C51單片機簡介 在設(shè)計中可用STC89C5代替AT89C51,此芯片具有速度更高,功能更全,壽命更長,價格更低等優(yōu)點;我們采用雙列直插40引腳的 STC89C51,它可以實現(xiàn)ISP在線編程功能,然而AT89C51則不可以,將AT89C51的程序通過軟件直接下載到STC89C51中后,就可以代替AT單片機直接工作,基本上都不需要做修改就可以正常工作了,STC公司推出的51系列單片機芯片是兼容其它51單片機的,而51單片機作為單片機界的應(yīng)用最廣泛芯片,幾乎每一個高等院校、普通學
9、校、網(wǎng)站、業(yè)余單片機培訓都是用51單片機作為基礎(chǔ)而學習的,正是因為如此可以利用的參考資料和例子也是最多的, 而且由于STC89C51自帶有EEPROM,其在程序中更是可以直接修改,斷電之后也不會丟失數(shù)據(jù)。STC89C51單片機管腳圖如圖2.1所示:STC89C51單片機的引腳介紹:-VCC:供電電壓-GND:接地 -P0口:P0口是一個8位雙向I/O口,當每個引腳第一次被寫1時,定義其為高阻態(tài)輸入,此外P0能夠用來作為外部程序數(shù)據(jù)存儲器,為此它可以被定義為數(shù)據(jù)/地址的第八位,在FIASH編程時,P0 口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此外
10、P0作為數(shù)據(jù)口時,需外接上拉電阻。-P1口:P1口緩沖器能接收輸出4TTL門電流,當P1口管腳寫入1后,由于P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,所以被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,正是由于內(nèi)部上拉的緣故,在FLASH編程和校驗時,P1口可以作為第八位地址接收;-P2口:P2口也是一個內(nèi)部具有上拉電阻的8位雙向I/O口,P2口緩沖器同樣可接收,輸出4個TTL門電流,當P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入,并因此在作為輸入時,P2口的管腳被外部拉低,將輸出電流,正是由于內(nèi)部上拉的緣故,P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)
11、存儲器進行存取時,P2口輸出地址的高八位,在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容,P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 -P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流,當P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入,作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣故。 此外P3口除了作為一般的I/O口外,更重要的用途是它還有復(fù)用功能,如下所示:§P3.0 RXD第二功能可作
12、為串行輸入口;§P3.1 TXD第二功能可作為串行輸出口;§P3.2 /INT0(外部中斷0);§P3.3 /INT1(外部中斷1);§P3.6/WR第二功能可作為外部數(shù)據(jù)寄存器寫選通;§P3.7/RD第二功能可作為外部數(shù)據(jù)寄存器讀選通;§P3口同時為閃爍編程和編程校驗接受一些控制信號;§RST:復(fù)位輸入,當振蕩器復(fù)位時,要保持RST腳兩個機器周期的高電平,當STC89C51通電,時鐘電路開始工作,在RESET引腳上出現(xiàn)24個時鐘周期以上的高電平,系統(tǒng)即初始復(fù)位;初始化后,程序計數(shù)器PC指向0000H,P0-P3輸出口全部為
13、高電平,指針堆棧寫入07H,其它專用的寄存器被寫“0”,RESET由高轉(zhuǎn)低時,單片機內(nèi)部即從0000H地址開始執(zhí)行,但是,初始復(fù)位不改變RAM(包括工作寄存器R0-R7)的狀態(tài)。 表2.1 8051的初始態(tài)表 特殊功能寄存器 初始態(tài) 特殊功能寄存器 初始態(tài) ACC 00H B 00H PSW 00H SP 07H DPH 00H TH0 00H DPL 00H TL0 00H IP xxx00000B TH1 00H IE 0xx00000B TL1 00H TMOD 00H TCON 00H SCON xxxxxxxxB SBUF 00H P0-P3 1111111B PCON 0xxxxx
14、xxB AALE/PROG:地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié),當訪問外部存儲器時,在FLASH編程期間,此引腳用于輸入編程脈沖;而在平常,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6,因此它可用作對外部輸出的脈沖或用于定時目的,然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖,如想禁止ALE的輸出可在SFR8EH地址上置0,此時ALE只有在執(zhí)行MOVX,MOVC指令時ALE才起作用;另外,該引腳被略微拉高,如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效1;-PSEN:外部程序存儲器的選通信號,在由外部程序存儲器取指期間,每個機器周期兩次/PSEN
15、有效,但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn); -EA/VPP:當/EA保持低電平時,則在此期間外部程序存儲器(0000H-FFFFH),不管是否有內(nèi)部程序存儲器,注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當/EA端保持高電平時,此間內(nèi)部程序存儲器,在FLASH編程期間,此引腳也用于施加12V編程電源(VPP); -XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入; -XTAL2:來自反向振蕩器的輸出;振蕩器特性:XTAL1和XTAL2分別為反向放大器的輸入和輸出,該
16、反向放大器可以配置為片內(nèi)振蕩器,石晶振蕩和陶瓷振蕩均可采用,如采用外部時鐘源驅(qū)動器件,XTAL2應(yīng)不接,有余輸入至內(nèi)部時鐘信號要通過一個二分頻觸發(fā)器,因此對外部時鐘信號的脈寬無任何要求,但必須保證脈沖的高低電平要求的寬度1。 2.2顯示模塊設(shè)計 本設(shè)計顯示模塊采用不帶字庫PGLCD12864。2.2.1 PG12864LCD的特性介紹 PG12864LCD是像素可尋址的圖形液晶顯示屏模塊,PG12864LCD特性如下: §工作電壓為+5V,可自帶驅(qū)動LCD所需的負電壓; §全屏幕點陣,點陣數(shù)為128列*64行,可顯示8行*4行個(16*16點陣)漢字,也可完成圖像,字符的顯
17、示3; §與CPU接口采用5條位控制總線和8位并行數(shù)據(jù)總線輸入輸出; §內(nèi)部有顯示數(shù)據(jù)鎖存器,自帶EL驅(qū)動; §簡單的操作指令; §數(shù)據(jù)口可以采用串行傳輸與并行傳輸2.2.2 LCD12864引腳介紹 表2.2 LCD12864引腳管腳號管腳名稱管腳功能描述1VSS接地2VDD接電壓3V0液晶顯示器驅(qū)動電壓4RSRS=“H”表示DB7-DB0為顯示數(shù)據(jù);RS=“L”表示DB7-DB0為顯示指令數(shù)據(jù)5R/WR/W=“H”,E=“H”數(shù)據(jù)被讀到DB7-DB0R/W=“L”,E=“HL”數(shù)據(jù)被寫到IR或DR6ER/W=“L”,E信號下降沿鎖存DB7DB0R/W
18、=“H”,E=“H”DDRAM數(shù)據(jù)讀到DB7DB07DB0數(shù)據(jù)線8DB1數(shù)據(jù)線9DB2數(shù)據(jù)線10DB3數(shù)據(jù)線11DB4數(shù)據(jù)線12DB5數(shù)據(jù)線13DB6數(shù)據(jù)線14DB7數(shù)據(jù)線15CS1H:選擇芯片(右半屏)信號16CS2H:選擇芯片(左半屏)信號17RET復(fù)位低電平有效18VOUT驅(qū)動負電壓19LED+背光電源20LED-背光接地 通過DB0- DB7數(shù)據(jù)線和AT89C51IO口連接,對應(yīng)的管腳必須有效,在顯示的時候,要通過列驅(qū)動和行驅(qū)動來控制液晶屏顯示,在驅(qū)動時,對應(yīng)的都有相應(yīng)的控制器來控制3,由于其顯示分為左半屏和右半屏,當CS0為1時,左半屏開顯示;CS1為1時,右半屏開顯示,12864管
19、腳功能如表2-2所示。2.2.3 12864內(nèi)部功能器件及相關(guān)功能§指令寄存器(IR)指令寄存器是用于寄存指令碼,與數(shù)據(jù)寄存器數(shù)據(jù)相對應(yīng);當D/I=0時,在E信號下降沿的作用下,指令碼寫入指令寄存器。§數(shù)據(jù)寄存器(DR)數(shù)據(jù)寄存器是用于寄存數(shù)據(jù)的,與指令寄存器寄存指令相對應(yīng),當D/I=1時,在下降沿作用下,圖形顯示數(shù)據(jù)寫入數(shù)據(jù)寄存器,或在E信號高電平作用下由數(shù)據(jù)寄存器讀到DB0-DB7數(shù)據(jù)總線,DR和DDRAM之間的數(shù)據(jù)傳輸是12864模塊內(nèi)部自動執(zhí)行的4。§忙標志(BF)BF標志提供內(nèi)部工作情況,BF=1表示模塊內(nèi)部操作在忙狀態(tài),此時模塊不接受外部指令和數(shù)據(jù);B
20、F=0時,模塊為準備狀態(tài),隨時可接受外部指令和數(shù)據(jù),利用STATUS READ指令,可以將BF讀到DB7總線,從而檢驗?zāi)K工作狀態(tài)。§顯示控制觸發(fā)器DFF 此觸發(fā)器是用于模塊屏幕顯示開和關(guān)狀態(tài)的控制,DFF=1為開顯示(DISPLAY OFF),DDRAM的內(nèi)容就顯示在屏幕上;DFF=0為關(guān)顯示(DISPLAY OFF),關(guān)閉屏幕,DDF的狀態(tài)是由指令DISPLAY ON/OFF和RST信號控制的。§XY地址計數(shù)器 XY地址計數(shù)器是一個9位計數(shù)器,高3位是X地址計數(shù)器,低6位為Y地址計數(shù)器,XY地址計數(shù)器實際上是作為DDRAM的地址指針,X地址計數(shù)器為D
21、DRAM的頁指針,Y地址計數(shù)器為DDRAM的列地址指針。X地址計數(shù)器是沒有記數(shù)功能的,只能用指令設(shè)置;Y地址計數(shù)器具有循環(huán)記數(shù)功能,當數(shù)據(jù)寫進去時,Y的地址數(shù)據(jù)就會自動加1,Y地址指針可以表示從0-63;§顯示數(shù)據(jù)RAM(DDRAM)DDRAM是存儲圖形顯示數(shù)據(jù)的。數(shù)據(jù)為1表示顯示選擇,數(shù)據(jù)為0表示顯示非選擇,DDRAM與地址和顯示位置的關(guān)系見DDRAM地址表。§Z地址計數(shù)器Z地址計數(shù)器可以循環(huán)記數(shù),共有六位,它是用于顯示行掃描,當完成一行掃描,這個計數(shù)器的內(nèi)容就會自動加1,并指向下一行數(shù)據(jù)掃描,當復(fù)位后Z地址計數(shù)器自動清0;Z地址計數(shù)器可以用DISPLAY START L
22、INE指令預(yù)置,所以,就由這條指令控制屏幕顯示的起始行,因為DDRAM共64行,因此可以循環(huán)滾動顯示64行5。各功能指令介紹如下顯示開/關(guān)指令 R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00000111111/0DB0為1時,LCD開顯示;DB0為0,關(guān)閉顯示。顯示起始行(ROW)設(shè)置指令R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00011顯示起始行(063)該指令設(shè)置了屏幕最上一行顯示RAM的行號,要想實現(xiàn)滾屏顯示的效果,可以改變顯示起始行設(shè)置指令R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00010111頁號
23、(07)4、列地址(Y Address)設(shè)置指令R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00001顯示列地址(063)顯示RAM的64行可按8行為一頁將其分為8頁;設(shè)置了頁地址和列地址,就唯一確定了顯示RAM中的一個單元,這樣CPU就可以用讀、寫指令讀出該單元中的內(nèi)容或向該單元寫進一個字節(jié)的數(shù)據(jù)。讀狀態(tài)指令R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB010BUSY0ON/OFFREST0000該指令用來查詢12864內(nèi)部控制器的狀態(tài),各參量含義如下:BUSY:1-內(nèi)部在工作,也就是忙狀態(tài);0-正常狀態(tài)ON/OFF:1-顯示關(guān)閉;0-顯示打
24、開RESET:1-復(fù)位狀態(tài);0-正常狀態(tài)在BUSY和RESET狀態(tài)時,除讀狀態(tài)指令外,其它指令均對12864模塊內(nèi)部無效5,除此之外在操作之前要查詢BUSY狀態(tài),以確定是否可以對12864模塊進行操作。寫數(shù)據(jù)指令R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB001寫顯示數(shù)據(jù)讀數(shù)據(jù)指令R/WRSDB7 DB6 DB5 DB4 DB3 DB2 DB1 DB011讀顯示數(shù)據(jù) 要提醒的是,每次進行讀數(shù)據(jù)之前,都要有一次空讀操作,緊接著才會讀出想要讀的單元中的數(shù)據(jù),而且每當完成一次讀、寫數(shù)據(jù)指令,內(nèi)部的列地址就會自動加1, 2.2.4 12864液晶與單片機接口電路 在
25、實際編程時,12864與單片機的連接有并行和串行兩種方式可以選擇,串行模式占用引腳較少(2個),速度較慢;并行模式占用引腳較多(11個),但傳輸速度較快,因為一次傳8位,速度自然就快,因此我們采用并行傳輸。12864的數(shù)據(jù)口DB0-DB7分別接單片機的P1.0-P1.7用來傳輸數(shù)據(jù);控制口RS、RW、EN分別接P3.2、P3.1、P3.0。 順便在此和大家分享一下調(diào)試中遇到的各種問題及如何應(yīng)對: 一:硬件問題1:這種情況是新手最常碰到的問題,碰到這種情況首先要確定你的接線沒有任何問題,如果是51單片機,用P0口一定要加10K的上拉電阻,不然程序正常了也顯示不出來。2: 另外要注意第三腳VO的連
26、接方式,這個是對比度電位引腳,實際中常采用10k的可變電阻滑動端連接VO腳,固定端的一段接VCC,另外一端應(yīng)根據(jù)實際硬件連接。如果用的是1602,另一端直接接到GND就可以了,但是對于12864就應(yīng)該看18腳的標記了,如果寫的是NC ,那么另一端直接接地,如果是VEE,那么就應(yīng)該接到18腳,因為這時的18腳是負壓輸出端。 根據(jù)這點確定你的對比對調(diào)節(jié)電路接法正確無誤。3:關(guān)于串并行選擇的問題。串并行選擇對于有字庫的12864適用(1602的四線驅(qū)動也可以叫做串行驅(qū)動),如果有PSB引腳,那么你的屏應(yīng)該可以支持串并行了。串并行的選擇決定于PSB引腳的電位,一般是低電平為串行模式,高電平為并行模式。
27、有些同志在使用的時候?qū)SB進行了電位定義但是沒有任何顯示,這是你應(yīng)該注意一下LCM板上焊點,尤其是和PSB引腳相連的那些起跳線作用的焊點。因為大多廠家在出廠的時候就預(yù)先設(shè)置為并行模式,也就是接到高電位上(VCC)。碰到這種情況把焊點跳線重新焊接一下,接到低電位上就可以了。模式選擇錯誤不顯示是小問題,由于屏電路的不同,可能你在驅(qū)動的時候損壞屏或者單片機,因為選擇不對,定義的電位相當于短路。二:軟件問題 軟件問題一般也就是定義的引腳不對,這種情況出現(xiàn)于真正的初學者,在copy別人的程序或者屏本身的模板程序沒有修改引腳的定義,這種情況比較簡單,只需要把引腳對應(yīng)的端口重新定義一下就可以了。三:顯示不
28、清楚A:屏上的VO引腳(3腳)電位不對如果你按照上面的說法接了對比度電路,這時你只需要調(diào)節(jié)電位器的旋鈕就可以了,最終可以得到你滿意的對比度,使顯示最清晰。一般這個腳的電壓是 - 6.2V左右,這個電壓的顯示效果是最好的。B:電源問題很多同學在現(xiàn)成的實驗板上做試驗,電源取自電腦USB口,這種情況容易出現(xiàn)顯示不清楚的情況,原因是供電電流不夠,因為電腦的口為500mA供電。碰到此類情況,用外接電源,肯定可以解決。所謂的網(wǎng)上的那些個底層驅(qū)動程序,個人覺得沒有必要,所謂知其然知其所以然,就是這個道理。 圖2-3 12864接口電路引腳號12864引腳STC89C51引腳7-14DB0-DB7P1.0-P
29、1.75WRP3.14RSP3.26CEP3.017RST地表2.3 12864引腳分配 2.3設(shè)置模塊設(shè)置模塊采用三個按鍵與單片機與GND連接按鍵與單片機的接口電路如圖2-4所示。圖2-4 按鍵電路 按鍵一端與GND連接,另一端與單片機GPIO口連接(相應(yīng)的引腳接到P3.0, P3.1. P3.3上),當I/O為低電平則按鍵按下;其中K1:模式選擇鍵(正常計時與調(diào)節(jié)時間模式)K2:時分秒選擇按鍵K3:調(diào)節(jié)時/分/秒大小。按鍵選用觸動開關(guān)。 2.4 振蕩電路圖2-5 振蕩電路振蕩電路選為內(nèi)部振蕩方式。由于所要設(shè)計的時間由內(nèi)部自帶的定時器中斷和軟件計數(shù)相結(jié)合產(chǎn)生的,故從計算方便以及系統(tǒng)的效率角度
30、出發(fā),設(shè)計選用12兆頻率的晶振,其電路如圖2-5所示。2.5 復(fù)位電路單片機采用高電平(I/O口為1時)復(fù)位。單片機選用12兆頻率晶振,起振為一毫秒,所以兩個機器周期的用時為兩微秒。單片機單次上電復(fù)位所需的最短延時應(yīng)該大于上電延時與單片機起振延時兩者之和。延遲一個時間還太小,不能夠促使單片機有一個較好的工作開始7。復(fù)位電路使單片機保持在復(fù)位狀態(tài)并且維持一個延時,這樣可以給電源電壓從上升到穩(wěn)定的一個等待時間;在電壓穩(wěn)定,再進行一個延時狀態(tài),給時鐘振蕩器由起振到穩(wěn)定的一個延時;在單片機開始進入運行狀態(tài)之前,至少推遲2個機器周期的延時間。當單片機RET端為高電平的時單片機復(fù)位,主要是復(fù)位電路由電阻、
31、電容晶振組成;電容充電的時RST端為高電平,此時單片機開始復(fù)位;當該電容電充滿,此時單片機完成復(fù)位。 初始化i<2i=0 i=0開中斷通過K2,K3調(diào)節(jié)時分秒否是是否圖3-1系統(tǒng)圖圖2-6 復(fù)位電路 3系統(tǒng)軟件設(shè)計 3.1總體軟件設(shè)計軟件設(shè)計是較難部分,利用keil軟件編寫程序,并生成Hex文件,下載到單片機。由于本程序涉及的模塊較多,所以編寫程序采用模塊化設(shè)計,C語言具有編寫靈活性好、移植方便、便于模塊化設(shè)計的優(yōu)點,所以采用如果時為12令是其為0 時加一分=60? 分加一秒=60?繼續(xù)執(zhí)行上面的步驟20次中斷到?jīng)]秒加一開相關(guān)中斷,裝初值開定時器,定時模式開始 中斷次數(shù)計數(shù)圖3-2 時鐘
32、框圖C語言給單片機編寫程序。框圖如圖3-1所示。其中K1:模式選擇鍵(正常計時與調(diào)節(jié)時間模式) K2:用于時/分/秒選擇按鍵K3:用于調(diào)節(jié)時/分/秒大小按鍵i:用于統(tǒng)計K1鍵按下的次數(shù)3.2 時鐘函數(shù)模塊時鐘定時由單片機內(nèi)部定時器中斷來完成。中斷50ms來一次,20次為一秒。因此20次中斷秒加一同時秒針轉(zhuǎn)過一格。同理秒滿60分加一同時分針轉(zhuǎn)一格。當分滿60時加一同時時針走一下6。時鐘部分如圖3-2所示。 3.3 指針時鐘設(shè)計 3.3.1 實現(xiàn)功能實現(xiàn)指針時鐘的動態(tài)顯示,并且具有可以在LCD_12864顯示器上畫點以、畫線以及畫圓的功能。 3.3.2實現(xiàn)算法LCD_12864模擬時鐘畫圖主要采用
33、Bresenham的算法。Bresenham算法是計算機圖形學領(lǐng)域使用最廣泛的直線掃描轉(zhuǎn)換方法。Bresenham算法,可以說是DDA算法的簡化,兩者大致的異同:DDA算法,是某一個長的方向,每一次變化一個單位或者一個單位像素,另外一個方向的變化量可以通過浮點運算和四舍五入計算得到。而Bresenham算法對于下一個點的坐標的取值,則是通過判斷一個反復(fù)迭代的誤差因數(shù)是否大于零,而在迭代的計算誤差因數(shù)的時候,只用到了整型數(shù)的加法和移位操作,計算量非常小,是最高效的單步畫線算法。由于Bresenham算法僅用到了整形數(shù)的加法和移位操作,大大減少了計算機運算量,便于在小型的計算機系統(tǒng)中(例如單片機系
34、統(tǒng)等)實現(xiàn)其功能。也就是這個原因,Bresenham算法的運用更為廣泛了。其原理是:通過各行、各列像素中心構(gòu)造一組虛擬網(wǎng)格線,按直線從起點到終點的順序計算直線各垂直網(wǎng)格線的交點,然后確定該列像素中與此交點最近的像素。該算法的優(yōu)點在于可以采用增量計算,使得對于每一列,只要檢查一個誤差項的符號,就可以確定該列所求的像素。1)畫直線LCD畫直線,也就是確定直線光柵化后的一系列坐標,在LCD點陣中顯示出來,也有人叫直線光柵化。實現(xiàn)這種光柵直線的算法有中點畫線法Bresenham算法是DDA算法畫線算法的一種改進算法。本質(zhì)上它也是采取了步進的思想。不過它比DDA算法作了優(yōu)化,避免了步進時浮點數(shù)運算,同時
35、為選取符合直線方程的點提供了一個好思路。首先通過直線的斜率確定了在x方向進行單位步進還是y方向進行單位步進:當斜率k的絕對值|k|<1時,在x方向進行單位步進;當斜率k的絕對值|k|>1時,在y方向進行單位步進。 下面以|k|<1時推導(dǎo)Bresenham算法的數(shù)學依據(jù):已知有一直線y = kx+b,|k|<1。我們通過斜率確定了x方向為單位步進。當x = Xm時,y = Ym。那么當x 執(zhí)行一個單位步進時(即x = Xm+1時),y等于Ym還是等于Ym+1更符合這個直線方程呢?單憑肉眼我們很難得出結(jié)論,最好的辦法當然是比較Ym和Ym+1和真實的方程的y值的差是多少(即Y
36、real = k*(Xm+1)+b),看看哪一個更靠近真實的方程的y值。我們設(shè) Dupper = Ym+1 - Yreal = Ym+1 - k*(Xm+1)+b); 表示Ym+1和方程真實值的差Ddown = Yreal - Ym = k*(Xm+1)+b)- Ym; 表示Ym和方程真實值的差那就是我們要比較Dupper和Ddown的大小。假設(shè)Diff = Dupper - Ddown = (Ym+1 - k*(Xm+1)+b) - (k*(Xm+1)+b)- Ym) 令X 為線段x方向的間距,Y 為線段y方向的間距。Pm = X* Diff = 2*X* Ym-2*Y*
37、 Xm-2*Y-X*(2b-1);那么Pm+1 = Pm+2*X*(Ym+1- Ym)-2*Y;其中Ym+1- Ym取0還是1,取決于Pm的符號。根據(jù)等式Diff = Dupper - Ddown = (Ym+1 - k*(Xm+1)+b) - (k*(Xm+1)+b)- Ym)以及k = Y/X,我們可以得出起始像素(x0,y0)的參數(shù)p0的值:P0 =X-2*Y;同理我們推出|k|>1的情況,Qm = 2*Xm*Y-2*Ym*X+(2b-2)*X+Y;Qm+1 = Qm+2*(Xm+1-Xm)*Y-2*X;其中Xm+1-Xm等于0還是1,取決于Qm的符號其中第一個參數(shù)Q0 = Y-2
38、*X; 明白了數(shù)學原理,我們很快能確定算法步驟:1. 輸入線段的起點和終點。2. 判斷線段的斜率是否存在(即起點和終點的x坐標是否相同),若相同,即斜率不存在,只需計算y方向的單位步進(Y+1次),x方向的坐標保持不變即可繪制直線。3. 計算線段的斜率k,分為下面幾種情況處理a. k等于0,即線段平行于x軸,即程序只需計算x方向的單位步進,y方向的值不變b. |k|等于1,即線段的x方向的單位步進和y方向的單位步進一樣,皆為1。直接循環(huán)X次計算x和y坐標。4. 根據(jù)輸入的起點和終點的x、y坐標值的大小決定x方向和y方向的單位步進是1還是-16. 畫出第一個點。7. 若|k| <
39、1,設(shè)m =0,計算P0,如果Pm>0,下一個要繪制的點為(Xm+單位步進,Ym),Pm+1 = Pm -2*Y;否則要繪制的點為(Xm+單位步進,Ym+單位步進)Pm+1 = Pm+2*X-2*Y;8. 重復(fù)執(zhí)行第七步X-1次;9. 若|k| <1,設(shè)m =0,計算Q0,如果Qm>0,下一個要繪制的點為(Xm,Ym+單位步進),Pm+1 = Pm -2*X;否則要繪制的點為(Xm+單位步進,Ym+單位步進)Pm+1 = Pm+2*Y-2*X;10. 重復(fù)執(zhí)行第9步Y(jié)-1次;2)畫圓Bresenham畫圓算法又稱中點畫圓算法,與Bresenham 直線算法一樣,其基本的方法是
40、利用判別變量來判斷選擇最近的像素點,判別變量的數(shù)值僅僅用一些加、減和移位運算就可以計算出來。為了簡便起見,考慮一個圓心在坐標原點的圓,而且只計算八分圓周上的點,其余圓周上的點利用對稱性就可得到。只需要知道了圓上的一個點的坐標 (x, y) ,利用八對稱性,我們馬上就能得到另外七個對稱點的坐標。將圓平均分為8個部分1.只要畫出1中1/8圓的圓周,剩下的就可以通過對稱關(guān)系畫出這個圓X變化從0->R那為什么不采用從-R->R呢,Y=+-sqrt(R2-x2);dy/dx=-x/(sqrt(R2-x2) =-x/y所以采用從-R到R,每次橫坐標增1,計算量大,而且在(x=+-R,y=0)處
41、,x的很小變化就引起了y的很大變化。 所以不是采用x從-R->R變化。而是采用1/8畫圓法。2.在2這1/8圓周上,x值單調(diào)增加,y值單調(diào)遞減,且fabs(dx/dy)=fabs(-x/y)<=1;所以圓周上相應(yīng)點的y值變化小于1,假設(shè)當前點為(x1,y1)這下個點為(x1+1,y1)或(x1+1,y1-1)d1=(x1+1)2+y12-R2;d2=R2-(x1+1)2-(y1-1)2;p=d1-d2 ,若p>0 選點(x1+1,y1-1)否則選點(x1+1,y1)接下來就是求p了,p=2(x1+1)2+2y12-2y1-2R2+1。P1=3-2R(坐標為x=0,y
42、=R)然后仿照線段算法得出p(i+1)=p(i)+4(Xi-Yi)+10(pi>0)否則P(i+1)=p(i)+4Xi+6這樣就可以成功畫出1/8圓弧了3.接下來的問題,是剩下的部分怎么處理存儲器將前1/8的坐標存儲起來,然后通過鏡像求出其他圓弧坐標,調(diào)整順序輸出,即可得到。 3.3.3 函數(shù)設(shè)計1:實現(xiàn)功能從指定坐標處繪制一個點或擦除一個點2:實現(xiàn)依據(jù)通過LCD_set_XY確定坐標,然后根據(jù)擦除還是繪制再確定點在坐標的位置,再判斷是擦除還是繪制,最后使用LCD_write_byte函數(shù)寫入數(shù)據(jù)。圖3.3為流程圖。定位XY坐標向LCD繪/擦出點開始結(jié)束 圖3-3 擦/繪點 確定線段兩端
43、點的坐標關(guān)系沿兩間的軌跡繪點或擦點開始結(jié)束圖3-4 繪直線框圖 2: void Line(uchar x1,uchar y1,uchar x2,uchar y2,bit Mode)第 13 頁 共 26 頁(1)實現(xiàn)功能在LCD_12864上繪制一條線段(2)實現(xiàn)依據(jù)利用兩點式(直線方程)在直線點的軌跡上繪制/擦除點以完成繪線。(3)具體流程圖如圖3-4所示。 3:void Clock_Plate()(1)實現(xiàn)功能繪制一個指針式模擬時鐘的圓盤。(2)實現(xiàn)依據(jù)利用圓的軌跡方程找到點的坐標,再根據(jù)點的坐標繪制圖形。(3) 流程圖圖3-5所示。確定圓心坐標及其半徑長度沿圓的軌跡進行繪點開始結(jié)束 圖3
44、-5 繪制指針圓盤框圖重繪秒針重繪分針開始結(jié)束重繪時針圖3-7 重新繪制指針判斷重新繪哪一條指針擦除指針上一秒狀態(tài)開始結(jié)束圖3-6 繪制指針框圖 圖3-8 隨時間繪制指針繪制時針表盤開始讀取時間根據(jù)時間繪制時分秒針結(jié)束4:void Repaint_A_Hand(uchar i)(1) 實現(xiàn)功能根據(jù)當前時間繪制對應(yīng)的指針,并擦除上次顯示的指針(2) 實現(xiàn)依據(jù)利用圓的弧度與時間的對應(yīng)關(guān)系,由于圓的弧度隨時間而變化,據(jù)此從圓心到圓弧對應(yīng)時間的位置畫出直線就是指針。(3) 繪制指針框圖如圖3-6所示。 5:void Display_HMS_Hand()第 15 頁 共 26 頁(1)實現(xiàn)功能重新繪制模
45、擬的秒針、分針、時針。 (2)實現(xiàn)依據(jù)調(diào)用Repaint_A_Hand函數(shù)設(shè)置當前參 數(shù),據(jù)此繪制當前時間對應(yīng)的指針。(3)重新繪制指針如圖3-7所示。第 1 頁 共 26 頁 6:void Display_ClockZhizhen()(1)實現(xiàn)功能讀取時間繪制指針時鐘到LCD_12864上 (2)實現(xiàn)依據(jù)讀取時間,由于指針隨時間而變化,繪制的模擬指針時鐘,另外判斷調(diào)節(jié)按鍵的鍵值是否為退出鍵的鍵值,若是則返回菜單界面。 (3)流程圖如圖3-8所示。 3.4 顯示函數(shù)模塊通過LCD_Check_Busy()檢測LCD是否忙碌,通過LCD_Write_Command向LCD發(fā)送寫命令,通過void
46、 LCD_Write_Data向lcd發(fā)送寫數(shù)據(jù)命令,通過LCD_Initialize初始化12864顯示屏。由于用的LCD_12864是自帶字庫的,故可以直接顯示字符和漢字,同時根據(jù)液晶顯示屏的要求對應(yīng)圓盤的大小都是可以規(guī)定的。1) lcd_12864寫命令函數(shù)void writecmd(uchar cmd)/ LCD_12864液晶寫命令 while(readstatus() & 0x80)!= 0x00); /LCD_12864液晶顯示讀狀態(tài) LCDDATA=0x00; RW=0; RS=0; EN=0; LCDDATA=cmd; delay(2); EN=1; delay(3)
47、; EN=0;2) lcd_12864寫數(shù)據(jù)函數(shù)void writedate(uchar date) /LCD_12864液晶寫數(shù)據(jù) while(readstatus() &0x80 )!=0x00); LCDDATA=0x00; RW=0; RS=1; EN=0; LCDDATA=date; delay(2); EN=1; delay(3); EN=0;3) LCD_12864液晶顯示讀狀態(tài)函數(shù)uchar readstatus()/LCD_12864液晶顯示讀狀態(tài) uchar i; LCDDATA=0xff; RW=1; RS=0; EN=0; delay(2); EN=1; del
48、ay(3); i=LCDDATA; delay(3); EN=0; return(i);4) LCD_12864液晶讀數(shù)據(jù)函數(shù)uchar readdate()/LCD_12864液晶讀數(shù)據(jù) uchar i; while(readstatus() &0x80 )!=0x00); RW=1; RS=1; EN=0; delay(2); EN=1; delay(3); i=LCDDATA; delay(3); EN=0; return i; 5) LCD_12864液晶初始化函數(shù)void LCD_init()/ LCD_12864液晶初始化 writecmd(0x30); delayms(1
49、); writecmd(0x30); delayms(1); writecmd(0x0c); delayms(1); writecmd(0x01); delayms(1); writecmd(0x06); delayms(1);3.4.1實現(xiàn)功能通過LCD_12864顯示指針式電子時鐘。3.4.2 函數(shù)設(shè)計1:uchar LCD_Write_Command_P2(uchar cmd,uchar para1,uchar para2)(1)實現(xiàn)功能寫雙參函數(shù)(2)實現(xiàn)依據(jù)狀態(tài)位char Status_BIT_01():用于判斷是讀/寫指令還是讀/寫數(shù)據(jù)2:uchar LCD_Write_Comma
50、nd_P1(uchar cmd,uchar para1)(1)實現(xiàn)功能寫單參數(shù)函數(shù)(2)實現(xiàn)依據(jù)通過態(tài)位char Status_BIT_01(),判斷是讀/寫指令還是讀/寫數(shù)據(jù)3:uchar LCD_Write_Command(uchar cmd)(1)實現(xiàn)功能寫無參數(shù)函數(shù)(2)實現(xiàn)依據(jù)狀態(tài)位char Status_BIT_01():用于判斷是讀/寫指令還是讀/寫數(shù)據(jù)4:uchar LCD_Write_Data(uchar dat)(1)實現(xiàn)功能寫數(shù)據(jù)(2)實現(xiàn)依據(jù)通過判斷狀態(tài)位char Status_BIT_03(),數(shù)據(jù)是否為自動寫狀態(tài)5:void Set_LCD_POS(uchar ro
51、w,uchar col)reentrant(1)實現(xiàn)功能設(shè)置當前顯示地址(2)實現(xiàn)依據(jù)通過調(diào)用寫雙參數(shù)函數(shù),使LCD完成準備工作。6:void cls()(1)實現(xiàn)功能清屏(2)實現(xiàn)依據(jù)先調(diào)用雙參數(shù)、無參數(shù)函數(shù)來配置地址指針,再判斷狀態(tài)位Status_BIT_3(),來判斷是否要進行寫數(shù)據(jù),然后調(diào)用寫數(shù)據(jù)(LCD_Write_Data())函數(shù),當向LCD寫好數(shù)據(jù),再調(diào)用無參函數(shù)來完成自動寫結(jié)束,最后在重置地址指針5。(3)流程圖,如圖3.9所示。設(shè)置正常顯示模式置ROM為0000將RAM中寫滿0X00開始結(jié)束圖3.9 設(shè)置當前地址7:char LCD_Initialise()(1)實現(xiàn)功能L
52、CD的初始化(2)實現(xiàn)依據(jù)通過雙參數(shù)LCD_Write_Command_P2來在LCD上顯示區(qū)首地址,文本區(qū)顯示區(qū)寬度,圖形顯示區(qū)首地址,圖形顯示區(qū)寬度,通過LCD_Write_Command_P1()(寫單參數(shù)函數(shù))及無參函數(shù)實現(xiàn)光標形狀,及顯示方式設(shè)置。3.5中斷服務(wù)函數(shù)模塊通過單片機內(nèi)部定時器定時50毫秒,中斷20次為一毫秒。此時秒針加1,當滿60,分加一;當分滿60時加一;由于采用12進制計時,故時滿12則清零。 3.5.1 功能 時分秒計時功能 3.5.2 函數(shù)void exter0() interrupt 1 /中斷服務(wù)函數(shù) TH0=(65536-50000)/256;/定時器裝載初值約為50ms TL0=(65536-50000)%256; tt+
溫馨提示
- 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教部編版道德與法治八年級下冊:8.1 《公平正義的價值》聽課評課記錄1
- 特許經(jīng)營備案合同(2篇)
- 生產(chǎn)線承包合同(2篇)
- 環(huán)保材料采購合同(2篇)
- 2022年新課標八年級上冊歷史第18課從九一八事變到西安事變聽課評課記錄
- 一年級古詩畫聽評課記錄
- 八年級下冊聽評課記錄
- 一年級下冊數(shù)學聽評課記錄《數(shù)花生》3 北師大版
- 冀教版數(shù)學九年級上冊28.3《圓心角和圓周角》聽評課記錄
- 人教版地理七年級下冊第七章《我們鄰近的國家和地區(qū)》復(fù)習聽課評課記錄
- 2025版茅臺酒出口業(yè)務(wù)代理及銷售合同模板4篇
- 2025年N1叉車司機考試試題(附答案)
- 2025年人教版數(shù)學五年級下冊教學計劃(含進度表)
- 《醫(yī)院財務(wù)分析報告》課件
- 2025年初級社會工作者綜合能力全國考試題庫(含答案)
- 復(fù)工復(fù)產(chǎn)安全培訓考試題
- 產(chǎn)品報價單(5篇)
- 中交與機械竣工區(qū)別
- 《醫(yī)院重點??平ㄔO(shè)專項資金管理辦法》
- 第三章:王實甫與《西廂記》PPT課件(完整版)
評論
0/150
提交評論