基于單片機的時鐘設計方案吳懷志_第1頁
基于單片機的時鐘設計方案吳懷志_第2頁
基于單片機的時鐘設計方案吳懷志_第3頁
基于單片機的時鐘設計方案吳懷志_第4頁
基于單片機的時鐘設計方案吳懷志_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

YanChengInstituteofTechnologyYanChengInstituteofTechnology課程設計說明書課程名稱單片機應用設計設計題目基于單片機的時鐘設計專業(yè)M自動化101學生姓名吳懷志班級101學號1061417108完成日期201312/1/——2013/12/12鹽城工學院電氣學院鹽城工學院電氣學院課程設計任務書姓名:吳懷志院(系):電氣工程學院專業(yè):M自動化101班號:101任務起至日期2013年12月01日至201312年月12日課程設計題目:《基于單片機的時鐘設計》已知技術參數(shù)和設計要求:(1)AT89C51單片機(2)DS1302定時器(3)DS1232看門狗(4)LCD1602液晶顯示(5)電池供電(6)Altium軟件預期設計效果:設計一個基于單片機的電子時鐘,要求能夠實現(xiàn)時、分、秒.工作計劃安排:2013年12月1日-2日:收集和課程設計有關的資料,熟悉課題任務何要求2013年12月3日-4日:總體方案設計2013年12月5日—8日:硬件電路設計2013年12月9日—11日:軟件設計2013年12月12日:整理書寫設計說明書2013年12月13日:答辯同組設計者及分工:獨立完成!!!??!!成績評定:_____________指導教師簽字:______年月日摘要本文介紹了基于AT89C51單片機的多功能電子萬年歷的硬件結構和軟硬件設計方法。系統(tǒng)以AT89C51單片機為控制器,以串行時鐘日歷芯片DS1302記錄日歷和時間,它可以對年、月、日、時、分、秒進行計時,還具有閏年補償?shù)榷喾N功能。萬年歷采用直觀的數(shù)字顯示,可以在LED上同時顯示年、月、日、周日、時、分、秒,還具有時間校準等功能。此萬年歷具有讀取方便、顯示直觀、功能多樣、電路簡潔、成本低廉等諸多優(yōu)點,具有廣闊的市場前景。

關鍵字AT89C51;電子萬年歷;

DS1302目錄1電子鐘的工作原里....。...。。。...。。.。。...。....。..。.....。.。...。...。。..。。..。..。。..。。...。。。...。。。..。..。。..。...。.。..。....。。..。。.。.。.。。....。12系統(tǒng)硬件設計及電路元件...。。..。.....。...。.。.....。。...。。......。.....。.。.。.........。。。...。.....。.。.。。。.....。.。。。。。...。...........1AT89C51芯片。。。....。。............。....。。.。..。..。。..。.。.....。。。。。..。。。.。。........。.....。...。...。..。.。.。。。...。.。。...。.。...。.。.2DS1302芯片...。。.。...。。。.。.....。。..。。。.....。......。。。。..。......。。..。..。。。..。..。。.。。..。......。...。..。..。.。....。.。。.。...。.....3LCD1602?液晶顯示.。。....。..。.。.。.。.。...。..。.。..。。.。.....。..。。。。。.。...。....。..。..。。.。.。。...。。.。。..。..........。......。。.。....3系統(tǒng)軟件電路設計。。....。。....。..。.....。。......。.......。...。。.。。..。...。.。.。...。.。。..。..。..。.。。.........。。。.。.。.。。。....。.。........。..。.1系統(tǒng)流程圖及源代碼設計....。.。.。。....。.。。.。..。。...。.。。。...。.。..。。。..。..。..。。。........。.......。。。..。..。....。..。..。。....。1主程序流程圖設計...。。.。.。。..。。。。。......。.。。......。..。..。。.。...。.。..。。.。。。。。.。。。。。.....。.。。...。.。.....3子程序源代碼設計。.。.。...。.....。。..。....。.....。..。....。。.。。。...。。...。。.。.。.....。。.....。....。。。。....。.3設計原理圖.。.......。......。。.。。.。....。..。。。.....。。.。。。。...。.。...。。.。...。.....。..。.。....。.....。..........。.4心得體會。.。.。.....。.。.。.。。.。......。。。。。。.....。....。.。。......。.。。.....。.。..。.。...。....。..。......。...。..。。。.......。....。..。..。.。.。......。5參考文件.。。......。.。.。...。..。.....。。.。。...。..。.。..。.。。.。..。......。....。.....。。。...。....。..。。.....。.。...。.......。。。。.。.....。。。。。.。..。。6附件....。...。。...。。...。...。。..。..。。。..。...。。.。......。。..。.。.。..。.....。。。。。..。...。。.。。.。.。。..。。..。..。。。.....。。..。.。..。..。..。。............1程序代碼.。......。....。.。。.。......。...........。..。。。。.。。。......。。。.。.。。.。.....。。.。。。.。..。..。.。。。。.。....。.。。...。.。。。。。.。。。.....。....2程序原理圖。。....。。......。.。。.。...。。。.。.。.。..。....。。...。......。。。。.。............。.。。。..。.。.......。.。。...........。.......。。。......第1章電子時鐘的工作原理本次設計時鐘電路,使用了AT89C51單片機芯片控制電路,單片機控制電路簡單且省去了很多復雜的線路,使得電路簡明易懂,用C語言程序來控制整個時鐘的顯示,使得編程變得更容易,這樣通過五個模塊:芯片、顯示屏、看門狗、電源、時鐘即可滿足設計要求第1章電子時鐘的工作原理本次設計時鐘電路,使用了AT89C51單片機芯片控制電路,單片機控制電路簡單且省去了很多復雜的線路,使得電路簡明易懂,用C語言程序來控制整個時鐘的顯示,使得編程變得更容易,這樣通過五個模塊:芯片、顯示屏、看門狗、電源、時鐘即可滿足設計要求。此設計原理圖框圖如圖1-1所示,此電路包括以下五個部分:單片機、時鐘電路、看門狗、液晶屏、電源模塊、時鐘振蕩電路.AT89C51主控模塊AT89C51主控模塊DS1232時鐘電路時鐘振蕩模塊DS1302看門狗LCD1602顯示模塊電源模塊圖1—1主電路設計框圖本設計采用C語言程序設計,使單片機控制數(shù)碼管顯示年、月、日、時、分、秒,當秒計數(shù)滿60時就向分進位,分計數(shù)器計滿60后向時計數(shù)器進位,小時計數(shù)器按“23翻0”規(guī)律計數(shù).時、分、秒的計數(shù)結果經(jīng)過數(shù)據(jù)處理可直接送顯示器顯示。當計時發(fā)生誤差的時候可以用校時電路進行校正。設計采用的是時、分、秒顯示,單片機對數(shù)據(jù)進行處理同時在LCD上顯示。第2章系統(tǒng)硬件電路設計及元件2.1AT89C51芯片AT89C51是美國ATMEL公司生產(chǎn)的8位FlashROM單片機。其最突出的優(yōu)點是片內ROM為FlashROM,可擦寫1000次以上,應用并不復雜的通用ROM寫入器就能方便的擦寫,讀取也很方便,價格低廉,具有片程序ROM二級保密系統(tǒng)。因此可靈活應用于各種控制領域。AT89C51包含以下一些功能部件:(1)一個8位CPU;(2)一個片內振蕩器和時鐘電路;(3)4KBFlashROM;(4)128B內RAM;(5)可尋址64KB的外ROM和外RAM控制電路;(6)兩個16位定時/計數(shù)器;(7)21個特殊功能寄存器;(8)4個8位并行I/O口;(9)一個可編程全雙工串行口;(10)5個中斷源,可設置成2個優(yōu)先級。AT89C51單片機一般采用雙列直插DIP封裝,共40個引腳,圖2-1為其引腳排列圖。40個引腳大致可分為4類:電源、時鐘、控制各I/O引腳。圖2—1AT89C51引腳圖2.1.1電源電池供電2.1.2時鐘XTAL1、XTAL2—-晶體振蕩電路反相輸入端和輸出端。2。1.3控制線控制線共有4根,其中3根是復用線.所謂復用線是指具有兩種功能,正常使用時是一種功能,在某種條件下是另一種功能。源.2.2DS1302芯片DS1302是美國DALLAS公司推出的一種高性能、低功耗的實時時鐘日歷芯片,附加31字節(jié)靜態(tài)RAM,采用SPI三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。實時時鐘可提供秒、分、時、日、星期、月和年,一個月小于31天時可以自動調整,且具有閏年補償功能.工作電壓寬達2.5~5。5V。采用雙電源供電(主電源和備用電源),可設置備用電源充電方式,提供了對后備電源進行涓細電流充電的能力。有主電源和備份電源雙引腳,而且備份電源可由大容量電容(>1F)來替代。需要強調的是,DS1302需要使用32。768KHz的晶振。DS1302包含以下一些功能部件:(1)實時時鐘,可對秒、分、時、日、周、月以及帶閏年補償?shù)哪赀M行計數(shù);(2)用于高速數(shù)據(jù)暫存的31×8位RAM;(3)最少引腳的串行I/O;(4)2。5~5.5V電壓工作范圍;(5)2.5V時耗電小于300nA;(6)用于時鐘或RAM數(shù)據(jù)讀/寫的單字節(jié)或多字節(jié)(脈沖方式)數(shù)據(jù)傳送方式;(7)簡單的3線接口;(8)可選的慢速充電(至VCC1)的能力。2。2.1DS1302數(shù)據(jù)操作原理DS1302在任何數(shù)據(jù)傳送時必須先初始化,把RST腳置為高電平,然后把8位地址和命令字裝入移位寄存器,數(shù)據(jù)在SCLK的上升沿被輸入。無論是讀周期還是寫周期,開始8位指定40個寄存器中哪個被訪問到。在開始8個時鐘周期,把命令字節(jié)裝入移位寄存器之后,另外的時鐘周期在讀操作時輸出數(shù)據(jù),在寫操作時寫入數(shù)據(jù)。時鐘脈沖的個數(shù)在單字節(jié)方式下為8加8,在多字節(jié)方式下為8加字節(jié)數(shù),最大可達248字節(jié)數(shù).DS1302的內部結構圖如圖2-2所示。圖2-2DS1302內部結構圖2。2.2DS1302的引腳圖及功能DS1302的引腳圖如圖2-3所示。圖2-3DS1302引腳圖DS1302各引腳功能:SCLK:串行時鐘,輸入,控制數(shù)據(jù)的輸入與輸出;I/O:三線接口時的雙向數(shù)據(jù)線;CE:輸入信號,在讀、寫數(shù)據(jù)期間,必須為高。該引腳有兩個功能:第一,CE開始控制字訪問移位寄存器的控制邏輯;其次CE提供結束單字節(jié)或多字節(jié)數(shù)據(jù)傳輸?shù)姆椒?。引腳功能如表2-2所示:表2-2DS1302引腳功能說明引腳號名稱功能1VCC1備份電源輸入2X132.768KHz晶振輸入3X232.768KHz晶振輸出4GND地5RST控制移位寄存器/復位6I/O數(shù)據(jù)輸入/輸出7SCLK串行時鐘8VCC2主電源輸入2。2.3DS1302的寄存器1、DS1302有關日歷、時間的寄存器共有12個,其中有7個寄存器(讀時81h~8Dh,寫時80h~8Ch),存放的數(shù)據(jù)格式為BCD碼形式,如表2—3所示:表2-3DS1302的日歷、時鐘寄存器及其控制字寄存器名命令字取值范圍各位內容寫操作讀操作76543210秒寄存器80H81H00--59CH10SECSEC分寄存器82H83H00--59010MINMIN時寄存器84H85H01-12或00-2312/24010HRHR日寄存器86H87H01-28,29,30,310010DATEDATE月寄存器88H89H01-—1200010MMONTH周寄存器8AH8BH01--0700000DAY年寄存器8CH8DH00—-9910YEARYEAR控制8EH8FH-WP0000000秒寄存器(81h、80h)的位7定義為時鐘暫停標志(CH)。當該位置為1時,時鐘振蕩器停止,DS1302處于低功耗狀態(tài);當該位置為0時,時鐘開始運行。小時寄存器(85h、84h)的位7用于定義DS1302是運行于12小時模式還是24小時模式.當為高時,選擇12小時模式。在12小時模式時,位5是,當為1時,表示PM。在24小時模式時,位5是第二個10小時位??刂萍拇嫫鳎?Fh、8Eh)的位7是寫保護位(WP),其它7位均置為0。在任何的對時鐘和RAM的寫操作之前,WP位必須為0。當WP位為1時,寫保護位防止對任一寄存器的寫操作.2、DS1302的工作模式寄存器所謂突發(fā)模式是指一次傳送多個字節(jié)的時鐘信號和RAM數(shù)據(jù)。突發(fā)模式寄存器如表2-4所示:表2-4突發(fā)模式寄存器工作模式寄存器讀寄存器寫寄存器時鐘突發(fā)模式CLOCKBURSTBFHBEHRAM突發(fā)模式RAMBURSTFFHFEH3、DS1302還有涓流充電寄存器等。2。2。4DS1302的控制字DS1302的控制字如下表所示:表2—5控制字(即地址及命令字節(jié))765432101RAMA4A3A2A1A0RD控制字的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入到DS1302中。位6:如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1(A4~A0):指示操作單元的地址;位0(最低有效位):如為0,表示要進行寫操作,為1表示進行讀操作.控制字總是從最低位開始輸出。在控制字指令輸入后的下一個SCLK時鐘的上升沿時,數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從最低位(0位)開始。同樣,在緊跟8位的控制字指令后的下一個SCLK脈沖的下降沿,讀出DS1302的數(shù)據(jù),讀出的數(shù)據(jù)也是從最低位到最高位。2。2.5DS1302時序CE輸入驅動高啟動所有的數(shù)據(jù)傳輸。CE輸入有兩個功能.首先,CE打開控制邏輯,允許訪問的移位寄存器的地址/命令序列。其次,CE提供了一個終止單字節(jié)或多字節(jié)數(shù)據(jù)傳輸方法.一個時鐘周期是由一個下降沿之后的上升沿序列。對于數(shù)據(jù)傳輸而言,數(shù)據(jù)必須在有效的時鐘的上升沿輸入,在時鐘的下降沿輸出。如果CE為低,所有的I/O引腳變?yōu)楦咦杩範顟B(tài),數(shù)據(jù)傳輸終止。對于數(shù)據(jù)輸入:開始的8個SCLK周期,輸入寫命令字節(jié),數(shù)據(jù)字節(jié)在后8個SCLK周期的上升沿輸入。數(shù)據(jù)輸入位0開始。對于數(shù)據(jù)輸出:開始的8個SCLK周期,輸入一個讀命令字節(jié),數(shù)據(jù)字節(jié)在后8個SCLK周期的下降沿輸出。注意,第一個數(shù)據(jù)字節(jié)的第一個下降沿發(fā)生后,命令字的最后一位被寫入,命令字節(jié)的最后一位被寫入.當CE仍為高時。如果還有額外的SCLK周期,DS1302將重新發(fā)送數(shù)據(jù)字節(jié),這使DS1302具有連續(xù)突發(fā)讀取的能力.2.3LCD1602液晶顯示LCD1602是一種用5x7點陣圖形來顯示字符的液晶顯示器模塊,它顯示的容量為2行16個字共32個字符.它由若干個5×7或者5×11點陣字符位組成,每個點陣字符位都可以顯示一個字符.模塊采用數(shù)字式接口,能夠方便地與單片機等控制類芯片進行通信。由于其具有體積小、重量輕、顯示質量高、功耗低等諸多優(yōu)點而被廣泛用于智能化儀器儀表的顯示器件。2.3.1LCD1602引腳及功能LCD1602的引腳如圖2-7所示:圖2-7LCD1602引腳圖LCD1602引腳功能表如下表2-7所示:表2—7LCD1602引腳功能表編號符號引腳說明編號符號引腳說明1VSS電源地9D2數(shù)據(jù)2VDD電源正極10D3數(shù)據(jù)3VL液晶顯示偏壓11D4數(shù)據(jù)4RS數(shù)據(jù)/命令選擇12D5數(shù)據(jù)5R/W讀/寫選擇13D6數(shù)據(jù)6E使能信號14D7數(shù)據(jù)7D0數(shù)據(jù)15BLA背光源正極8D1數(shù)據(jù)16BLK背光源負極LCD1602液晶模塊內部的字符發(fā)生存儲器已經(jīng)存儲了160個不同的點陣字符圖形,這些字符圖有:阿拉伯數(shù)字、英文字母的大小寫、常用的符號、和日文假名等,每一個字符都有一個固定的代碼,比如大寫的英文字母“A”的代碼是01000001B(41H),顯示時模塊把地址41H中的點陣字符圖形顯示出來,我們就能看到字母“A”。

LCD1602液晶模塊內部的控制器共有11條控制指令,如表2-8所示:表2—8LCD1602控制命令表指令RSR/WD8D7D6D5D4D3D2D1清顯示0000000001光標返回000000001*置輸入模式00000001I/DS顯示開/關控制0000001DCB光標或字符移位000001S/CR/L**置功能00001DLNF**置字符發(fā)生存貯器地址0001字符發(fā)生存貯器地址置數(shù)據(jù)存貯器地址001顯示數(shù)據(jù)存貯器地址(ADD)讀忙標志或地址01BF計數(shù)器地址(AC)寫數(shù)到CGRAMD或DRAM10要寫的數(shù)從CGRAMD或DRAM讀數(shù)11讀出的數(shù)據(jù)它的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的(說明:1為高電平,0為低電平)。指令1:清顯示,指令碼01H,光標復位到地址00H位置.指令2:光標復位,光標返回到地址00H。指令3:光標和顯示模式設置I/D:光標移動方向,高電平右移,低電平左移。S:屏幕上所有文字是否左移或者右移。高電平表示有效,低電平則無效。指令4:顯示開關控制。D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示。C:控制光標的開與關,高電平表示有光標,低電平表示無光標。B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標或顯示移位S/C:高電平時移動顯示的文字,低電平時移動光標。指令6:功能設置命令DL:高電平時為4位總線,低電平時為8位總線。N:低電平時為單行顯示,高電平時雙行顯示。F:低電平時顯示5X7的點陣字符,高電平時顯示5x10的點陣字符(有些模塊是DL:高電平時為8位總線,低電平時為4位總線)。指令7:字符發(fā)生器RAM地址設置。指令8:DDRAM地址設置。指令9:讀出忙信號和光標地址.BF為忙標志位,高電平表示忙,此時模塊不能接收命令或者數(shù)據(jù),如果為低電平表示不忙,模塊就能接收相應的命令或者數(shù)據(jù)。指令10:寫數(shù)據(jù).指令11:讀數(shù)據(jù)。液晶顯示模塊是一個慢顯示器件,所以在執(zhí)行每條指令之前一定要確認模塊的忙標志位是不是為低電平,是低電平則表示不忙,否則此指令失效.要顯示字符時要先輸入顯示字符地址,也就是告訴模塊在哪里顯示字符。表2—9為LCD1602的內部顯示地址。表2—9LCD1602的內部顯示地址123·····141516第一行80H81H82H·····8DH8EH8FH第二行0C0H0C1H0C2H·····0CDH0CEH0CFH系統(tǒng)軟件電路設計3.1系統(tǒng)流程圖及源代碼設計3。1.1主程序流程圖設計液晶屏通信引腳定義液晶屏通信引腳定義DS1302通信引腳定義數(shù)據(jù)設定引腳定義開始引腳定義地址定義程序開始初始化液晶屏讀取DS1302程序數(shù)據(jù)分離送顯示緩存日歷顯示子程序數(shù)據(jù)存儲地址顯示數(shù)據(jù)緩沖地址初始化液晶屏幕顯示初始畫面清液晶屏幕顯示空白讀DS1302程序分離數(shù)據(jù)子程序寫指令到液晶屏讀數(shù)據(jù)到液晶屏圖3—1主程序流程圖圖3—1主程序流程圖YYYYYYYNNNNNNNNY3.1。2子程序流程圖設計YYYYYYYNNNNNNNNYDS1302定時器中斷子程序流程圖開始開始給定時器再次賦值判斷是否計滿18次秒加1,判斷是否等于60分加1,秒置0,判斷分是否等于60時加1,分置0,判斷時是否等于24日加1,時置0,判斷該年是否為閏年判斷日是否到月底月加1,日置1,判斷月是否等于12年加1,月置1,判斷年是否為100執(zhí)行年、月、日、時、分、秒的顯示結束圖3—2DS1302中斷流程圖程序主要實現(xiàn)對DS1302寫保護、充電,對年、月、日、時、分、秒等寄存器的讀寫操作。在讀寫操作子程序中都執(zhí)行了關中斷指令,因為在串行通信時對時序要求比較高,而且在此是用I/O口軟件模擬串行時鐘脈沖,所以在通信過程中最好保證傳輸?shù)倪B續(xù)性,不要允許中斷,如圖3-2所示。LCD1602流程圖程序主要實現(xiàn)對信息的顯示,包括年、月、日、時、分、秒等信息,在這里要注意它的讀寫控制指令。其流程圖如圖3—3所示。開始RW和E都置零開始RW和E都置零設置點陣8位數(shù)據(jù)接口,兩行顯示開顯示,不顯示光標地址指針加一,畫面不一定刷新,全部清零給地址,從第一行開始寫顯示第一行數(shù)據(jù)給第二行地址,顯示第二行數(shù)據(jù)結束圖3—3LCD1602初始化流程圖3.1。3子程序源代碼設計詳見附錄一3.1.3設計原理圖詳見附錄二四心得體會

通過這次對《基于單片機的電子時鐘設計》的設計與制作過程,加強了我們動手、思考和解決問題的能力。

在設計過程中我們利用Altium軟件進行原理圖及PCB圖的繪制,最后再利仿真軟件進行檢查,看程序是否能顯示其功能。在設計過程中讓我進一步深刻的學習各種軟件的利用以及各種軟件給我們帶來的便利。

該數(shù)字鐘通過單片機AT89C51做CPU進行總的控制,基于時鐘芯片DS1302產(chǎn)生時間,利用LCD1602進行液晶顯示的一個簡易的數(shù)字鐘。LCD1602能夠對年、月、日、周、日、時、分、秒進行計時及顯示。通過設計后能夠熟練的掌握時鐘芯片DS1302、LCD1602、AT89C51的的各個引腳及功能,并能夠掌握和運用這幾個芯片。

通過這次課程設計使我懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,難免會遇到過各種各樣的問題,同時在設計的過程中發(fā)現(xiàn)了自己的不足之處,對以前所學過的知識理解得不夠深刻,掌握得不夠牢固。

這次課程設計終于順利完成了,在設計中遇到了很多專業(yè)知識問題,最后在老師的辛勤指導下,終于游逆而解。同時,在老師的身上我們學也到很多實用的知識,在次我們表示感謝!同時,對給過我?guī)椭乃型瑢W和各位指導老師再次表示忠心的感謝五參考文獻

[1]張義和.例說51單片機[M].北京:人民郵電出版社,2010年

[2]

閻石編著

數(shù)字電子技術基礎

(第五版)

北京高等教育出版社]

2006.1~550

[3]

蔡明文

馮先成主編

單片機課程設計

華中科技大學出版社

2007。3

[4]陳明螢

編著

8051單片機課程設計實訓教材

清華大學出版社

2004

[5]

康華光

編著

模擬電子技術基礎(第五版)

高等教育出版社

2006

[6

]黃智偉

編著

全國大學生電子設計競賽電路(第一版)航空航天大學出版社

2006.36[7]李可為。數(shù)字鐘電路及應用[M].電子工業(yè)出版社,1996.[8]夏繼強,沈德金.單片機實驗與實踐教程(二)[M]北航出版社,2001.[9]張紅潤,藍清華。單片機應用技術教程[M]清華大學出版社,1997.。[10]周立功。單片機實驗與實踐[M]北京航空航天大學出版社,2004.[11]李朝青.單片機原理及接口技術[M].北京航空航天大學出版社,1994。附錄一/*****************************************************程序名稱:基于單片機和時鐘芯片DS1302的電子時鐘程序功能:時鐘芯片采用DS1302???顯示采用液晶屏LCD1602***************************************************/#include〈reg51。h>//包含單片機寄存器的頭文件#include<intrins.h>//包含_nop_()函數(shù)定義的頭文件#defineucharunsignedchar#defineuintunsignedint/***********************************************************************以下是DS1302芯片的操作程序************************************************************************/ucharcodedigit[10]={”0123456789"};//定義字符數(shù)組顯示數(shù)字sbitDATA=P1^1;//位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P1。1引腳sbitRST=P1^2;//位定義1302芯片的接口,復位端口定義在P1.1引腳sbitSCLK=P1^0;//位定義1302芯片的接口,時鐘輸出端口定義在P1.1引腳/*****************************************************函數(shù)功能:延時若干微秒入口參數(shù):n***************************************************/voiddelaynus(ucharn){uchari;for(i=0;i<n;i++);}/*****************************************************函數(shù)功能:向1302寫一個字節(jié)數(shù)據(jù)入口參數(shù):x***************************************************/voidWrite1302(uchardat){uchari;SCLK=0;? //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準備delaynus(2); ?//稍微等待,使硬件做好準備for(i=0;i<8;i++) //連續(xù)寫8個二進制位數(shù)據(jù){?DATA=dat&0x01;?//取出dat(yī)的第0位數(shù)據(jù)寫入1302 delaynus(2);//稍微等待,使硬件做好準備??SCLK=1;//上升沿寫入數(shù)據(jù) ?delaynus(2);?//稍微等待,使硬件做好準備? SCLK=0;?//重新拉低SCLK,形成脈沖??dat>>=1; //將dat(yī)的各數(shù)據(jù)位右移1位,準備寫入下一個數(shù)據(jù)位 }?}/*****************************************************函數(shù)功能:根據(jù)命令字,向1302寫一個字節(jié)數(shù)據(jù)入口參數(shù):Cmd,儲存命令字;dat,儲存待寫的數(shù)據(jù)***************************************************/voidWriteSet1302(ucharCmd,uchardat){RST=0;//禁止數(shù)據(jù)傳遞SCLK=0;//確保寫數(shù)居前SCLK被拉低?RST=1;//啟動數(shù)據(jù)傳輸?delaynus(2);//稍微等待,使硬件做好準備 Write1302(Cmd);//寫入命令字?Write1302(dat);//寫數(shù)據(jù)?SCLK=1;//將時鐘電平置于已知狀態(tài)?RST=0;//禁止數(shù)據(jù)傳遞}/*****************************************************函數(shù)功能:從1302讀一個字節(jié)數(shù)據(jù)入口參數(shù):x***************************************************/ucharRead1302(void){ uchari,dat; delaynus(2);//稍微等待,使硬件做好準備?for(i=0;i〈8;i++)//連續(xù)讀8個二進制位數(shù)據(jù)?{??dat>>=1;//將dat(yī)的各數(shù)據(jù)位右移1位,因為先讀出的是字節(jié)的最低位??if(DATA==1)//如果讀出的數(shù)據(jù)是1??dat|=0x80;//將1取出,寫在dat的最高位? SCLK=1;//將SCLK置于高電平,為下降沿讀出??delaynus(2);//稍微等待 ?SCLK=0;//拉低SCLK,形成脈沖下降沿 ?delaynus(2);//稍微等待?}? returndat;//將讀出的數(shù)據(jù)返回}/*****************************************************函數(shù)功能:根據(jù)命令字,從1302讀取一個字節(jié)數(shù)據(jù)入口參數(shù):Cmd***************************************************/ucharReadSet1302(ucharCmd){uchardat;RST=0;//拉低RSTSCLK=0;//確保寫數(shù)居前SCLK被拉低RST=1;//啟動數(shù)據(jù)傳輸Write1302(Cmd);//寫入命令字dat(yī)=Read1302();//讀出數(shù)據(jù)SCLK=1;//將時鐘電平置于已知狀態(tài)RST=0;//禁止數(shù)據(jù)傳遞returndat;//將讀出的數(shù)據(jù)返回}/*****************************************************函數(shù)功能:1302進行初始化設置***************************************************/voidInit_DS1302(void){?WriteSet1302(0x8E,0x00);//根據(jù)寫狀態(tài)寄存器命令字,寫入不保護指令WriteSet1302(0x80,((0/10)<<4|(0%10)));//根據(jù)寫秒寄存器命令字,寫入秒的初始值????? ????//'/'除法運算,取整;’%’取模運算,取余 ? ??? ????//數(shù)據(jù)前四位為十位,后四位為個位,詳見寄存器表?WriteSet1302(0x82,((0/10)〈<4|(0%10)));//根據(jù)寫分寄存器命令字,寫入分的初始值?WriteSet1302(0x84,((12/10)〈<4|(12%10)));//根據(jù)寫小時寄存器命令字,寫入小時的初始值?WriteSet1302(0x86,((01/10)<〈4|(01%10)));//根據(jù)寫日寄存器命令字,寫入日的初始值?WriteSet1302(0x88,((06/10)〈〈4|(06%10)));//根據(jù)寫月寄存器命令字,寫入月的初始值 WriteSet1302(0x8c,((10/10)<<4|(10%10)));//根據(jù)寫小時寄存器命令字,寫入小時的初始值}/*******************************************************************************以下是對液晶模塊的操作程序*******************************************************************************/sbitRS=P2^0;//寄存器選擇位,將RS位定義為P2.0引腳sbitRW=P2^1;//讀寫選擇位,將RW位定義為P2。1引腳sbitE=P2^2;//使能信號位,將E位定義為P2.2引腳sbitBF=P0^7;//忙碌標志位,,將BF位定義為P0.7引腳/*****************************************************函數(shù)功能:延時1ms(3j+2)*i=(3×33+2)×10=1010(微秒),可以認為是1毫秒***************************************************/voiddelay1ms(){unsignedchari,j;??for(i=0;i<10;i++)?for(j=0;j〈33;j++) ;? }/*****************************************************函數(shù)功能:延時若干毫秒入口參數(shù):n***************************************************/voiddelaynms(unsignedcharn){unsignedchari; for(i=0;i<n;i++) delay1ms();}/*****************************************************函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)返回值:result。result=1,忙碌;result=0,不忙***************************************************/bitBusyTest(void){bitresult;?RS=0;//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài)RW=1;E=1;//E=1,才允許讀寫_nop_();//空操作_nop_();_nop_();_nop_();//空操作四個機器周期,給硬件反應時間 result=BF;//將忙碌標志電平賦給resultE=0;//將E恢復低電平returnresult;}/*****************************************************函數(shù)功能:將模式設置指令或顯示地址寫入液晶模塊入口參數(shù):dictate***************************************************/voidWriteInstruction(uchardictate){while(BusyTest()==1);//如果忙就等待?RS=0;//根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令?RW=0;?E=0;//E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,//就是讓E從0到1發(fā)生正跳變,所以應先置"0"?_nop_();?_nop_();//空操作兩個機器周期,給硬件反應時間?P0=dictate;//將數(shù)據(jù)送入P0口,即寫入指令或地址?_nop_();?_nop_();?_nop_();?_nop_();//空操作四個機器周期,給硬件反應時間 E=1;//E置高電平?_nop_(); _nop_();?_nop_();?_nop_();//空操作四個機器周期,給硬件反應時間?E=0;//當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令}/*****************************************************函數(shù)功能:指定字符顯示的實際地址入口參數(shù):x***************************************************/voidWriteAddress(ucharx){WriteInstruction(x|0x80);//顯示位置的確定方法規(guī)定為"80H+地址碼x"}/*****************************************************函數(shù)功能:將數(shù)據(jù)(字符的標準ASCII碼)寫入液晶模塊入口參數(shù):y(為字符常量)***************************************************/voidWriteData(uchary){while(BusyTest()==1); RS=1;//RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)?RW=0;?E=0;//E置低電平(根據(jù)表8-6,寫指令時,E為高脈沖,//就是讓E從0到1發(fā)生正跳變,所以應先置"0"?P0=y;//將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊?_nop_(); _nop_();?_nop_();_nop_();//空操作四個機器周期,給硬件反應時間?E=1;//E置高電平 _nop_(); _nop_();?_nop_();?_nop_();//空操作四個機器周期,給硬件反應時間?E=0;//當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令}/*****************************************************函數(shù)功能:對LCD的顯示模式進行初始化設置***************************************************/voidLcdInitiate(void){delaynms(15);//延時15ms,首次寫指令時應給LCD一段較長的反應時間WriteInstruction(0x38);//顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口?delaynms(5);//延時5ms,給硬件一點反應時間WriteInstruction(0x38);?delaynms(5);//延時5ms,給硬件一點反應時間 WriteInstruction(0x38);//連續(xù)三次,確保初始化成功?delaynms(5);//延時5ms,給硬件一點反應時間?WriteInstruction(0x0c);//顯示模式設置:顯示開,無光標,光標不閃爍 delaynms(5);//延時5ms,給硬件一點反應時間 WriteInstruction(0x06);//顯示模式設置:光標右移,字符不移?delaynms(5);//延時5ms,給硬件一點反應時間?WriteInstruction(0x01);//清屏幕指令,將以前的顯示內容清除?delaynms(5);//延時5ms,給硬件一點反應時間}/**************************************************************以下是1302數(shù)據(jù)的顯示程序**************************************************************//*****************************************************函數(shù)功能:顯示秒入口參數(shù):x***************************************************/voidDisplaySecond(ucharx){uchari,j;??//j,k,l分別儲存溫度的百位、十位和個位 i=x/10; ? //取十位?j=x%10; ?? //取個位?WriteAddress(0x49);?//寫顯示地址,將在第2行第7列開始顯示?WriteData(digit[i]);//將百位數(shù)字的字符常量寫入LCD?WriteDat(yī)a(digit[j]);//將十位數(shù)字的字符常量寫入LCD?delaynms(50);?//延時1ms給硬件一點反應時間}/*****************************************************函數(shù)功能:顯示分鐘入口參數(shù):x***************************************************/voidDisplayMinute(ucharx){?uchari,j;? ?//j,k,l分別儲存溫度的百位、十位和個位?i=x/10; ??? //取十位 j=x%10;?????//取個位 WriteAddress(0x46); //寫顯示地址,將在第2行第7列開始顯示?WriteData(digit[i]);?//將百位數(shù)字的字符常量寫入LCD?WriteData(digit[j]); //將十位數(shù)字的字符常量寫入LCD delaynms(50);?//延時1ms給硬件一點反應時間}/*****************************************************函數(shù)功能:顯示小時入口參數(shù):x***************************************************/voidDisplayHour(unsignedcharx){?uchari,j;???//j,k,l分別儲存溫度的百位、十位和個位?i=x/10; ? ??//取十位 j=x%10;???? //取個位?WriteAddress(0x43);?//寫顯示地址,將在第2行第7列開始顯示 WriteData(digit[i]);//將百位數(shù)字的字符常量寫入LCD?WriteDat(yī)a(digit[j]);//將十位數(shù)字的字符常量寫入LCD delaynms(50); //延時1ms給硬件一點反應時間}/*****************************************************函數(shù)功能:顯示日入口參數(shù):x***************************************************/voidDisplayDay(ucharx){ uchari,j;??//j,k,l分別儲存溫度的百位、十位和個位?i=x/10;??? //取十位 j=x%10;??? //取個位?WriteAddress(0x0c);//寫顯示地址,將在第2行第7列開始顯示?WriteData(digit[i]);//將百位數(shù)字的字符常量寫入LCD?WriteData(digit[j]);//將十位數(shù)字的字符常量寫入LCD?delaynms(50);//延時1ms給硬件一點反應時間}/*****************************************************函數(shù)功能:顯示月入口參數(shù):x***************************************************/voidDisplayMonth(ucharx){ uchari,j;???//j,k,l分別儲存溫度的百位、十位和個位?i=x/10;?? ??//取十位?j=x%10;?????//取個位?WriteAddress(0x09);?//寫顯示地址,將在第2行第7列開始顯示?WriteData(digit[i]);//將百位數(shù)字的字符常量寫入LCD?WriteData(digit[j]);//將十位數(shù)字的字符常量寫入LCD?delaynms(50);//延時1ms給硬件一點反應時間}/*****************************************************函數(shù)功能:顯示年入口參數(shù):x***************************************************/voidDisplayYear(ucharx){?uchari,j;???//j,k,l分別儲存溫度的百位、十位和個位?i=x/10; ??? //取十位?j=x%10;?????//取個位?WriteAddress(0x06);//寫顯示地址,將在第2行第7列

溫馨提示

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

評論

0/150

提交評論