版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 目錄</b></p><p> 1.題目設(shè)計(jì)要求1</p><p> 2.開發(fā)平臺(tái)簡介1</p><p> 3.系統(tǒng)硬件設(shè)計(jì)2</p><p> 3.1 設(shè)計(jì)原理2</p><p> 3.2 器件的功能與作用2</p><p
2、> 3.2.1 MCS51單片機(jī)AT89C512</p><p> 3.2.2復(fù)位電路3</p><p> 3.2.3晶振電路4</p><p> 3.2.4 DS1302時(shí)鐘模塊4</p><p> 3.2.5 引腳功能及結(jié)構(gòu)4</p><p> 3.2.6 DS1302的控制字節(jié)5&
3、lt;/p><p> 3.2.7 數(shù)據(jù)輸入輸出(I/O)5</p><p> 3.2.8 DS1302的寄存器6</p><p> 3.2.9 液晶顯示LCD16026</p><p> 3.2.10 串行時(shí)鐘日歷片DS13028</p><p> 4.系統(tǒng)軟件設(shè)計(jì)10</p><
4、;p> 4.1 程序流程10</p><p> 4.2 程序代碼11</p><p> 5.系統(tǒng)仿真調(diào)試20</p><p> 5.1 仿真原理圖設(shè)計(jì)20</p><p> 5.2 仿真運(yùn)行過程21</p><p> 5.3 仿真運(yùn)行結(jié)果22</p><p&
5、gt;<b> 6.總結(jié)22</b></p><p><b> 7.參考文獻(xiàn)23</b></p><p><b> 1.題目設(shè)計(jì)要求</b></p><p> 通過串行日歷時(shí)鐘芯片DS1302生成當(dāng)前日期和是時(shí)間,通過IO口傳輸?shù)紸T89c52芯片中,然后再將AT89c52接收到的數(shù)據(jù)輸出
6、到LCD上。要求LCD上顯示的日期和時(shí)間與當(dāng)前系統(tǒng)時(shí)間保持一致。</p><p><b> 2.開發(fā)平臺(tái)簡介</b></p><p> 2.1系統(tǒng)仿真平臺(tái)Proteus</p><p> Proteus軟件是由英國Labcenter Electronics公司開發(fā)的EDA工具軟件,已有近20年的歷史,在全球得到了廣泛應(yīng)用。Proteus軟
7、件的功能強(qiáng)大,它集電路設(shè)計(jì)、制版及仿真等多種功能于一身,不僅能夠?qū)﹄姽?、電子技術(shù)學(xué)科涉及的電路進(jìn)行設(shè)計(jì),還能夠?qū)ξ⑻幚砥鬟M(jìn)行設(shè)計(jì)和仿真,并且功能齊全,界面多彩。和我們手頭其他的電路設(shè)計(jì)仿真軟件,他最大的不同即它的功能不是單一的。另外,它獨(dú)特的單片機(jī)仿真功能是任何其他仿真軟件都不具備的。</p><p> 2.2軟件開發(fā)平臺(tái)Keil C</p><p> Keil C51是美國Keil
8、Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢,因而易學(xué)易用。Keil提供了包括C編譯器、宏匯編、連接器、庫管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(uVision)將這些部分組合在一起。Keil C51生成的目標(biāo)代碼效率之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語言的優(yōu)勢。</p&g
9、t;<p><b> 3.系統(tǒng)硬件設(shè)計(jì)</b></p><p><b> 3.1 設(shè)計(jì)原理</b></p><p> 圖3.1 電路原理圖</p><p> 3.2 器件的功能與作用</p><p> 3.2.1 MCS51單片機(jī)AT89C51</p>
10、<p> AT89C51是一種帶4K字節(jié)FLASH存儲(chǔ)器( FPEROM—Flash Programmable and Erasable Read Only Memory)的低電壓、高性能CMOS 8位微處理器,俗稱單片機(jī)。AT89C2051是一種帶2K字節(jié)閃存可編程可擦除只讀存儲(chǔ)器的單片機(jī)。單片機(jī)的可擦除只讀存儲(chǔ)器可以反復(fù)擦除1000次。該器件采用ATMEL高密度非易失存儲(chǔ)器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集
11、和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲(chǔ)器組合在單個(gè)芯片中,ATMEL的AT89C51是一種高效微控制器。AT89C51單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價(jià)廉的方案。</p><p> AT89S51系列單片機(jī)中有PDIP,PLCC,TQFP多種封裝形式。本設(shè)計(jì)采用的是PDIP封裝40管腳的單片機(jī)。</p><p> 圖3.2 主控制模塊AT89C52</p
12、><p><b> 3.2.2復(fù)位電路</b></p><p> 復(fù)位是單片機(jī)的初始化操作。單片機(jī)啟運(yùn)運(yùn)行時(shí),都需要先復(fù)位,其作用是使CPU和系統(tǒng)中其他部件處于一個(gè)確定的初始狀態(tài),并從這個(gè)狀態(tài)開始工作。因而,復(fù)位是一個(gè)很重要的操作方式。但單片機(jī)本身是不能自動(dòng)進(jìn)行復(fù)位的,必須配合相應(yīng)的外部電路才能實(shí)現(xiàn)。</p><p> 復(fù)位電路的基本功能是:
13、系統(tǒng)上電時(shí)提供復(fù)位信號(hào),直至系統(tǒng)電源穩(wěn)定后,撤銷復(fù)位信號(hào)。為可靠起見,電源穩(wěn)定后還要經(jīng)一定的延時(shí)才撤銷復(fù)位信號(hào),以防電源開 關(guān)或電源插頭分-合過程中引起的抖動(dòng)而影響復(fù)位。</p><p><b> 圖3.3 復(fù)位電路</b></p><p><b> 3.2.3晶振電路</b></p><p><b> 圖
14、3.4 晶振電路</b></p><p> 晶體振蕩器電路給數(shù)字鐘提供一個(gè)頻率穩(wěn)定準(zhǔn)確的32768Hz的方波信號(hào),可保證數(shù)字鐘的走時(shí)準(zhǔn)確及穩(wěn)定。</p><p> 3.2.4 DS1302時(shí)鐘模塊</p><p> DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分、秒進(jìn)行計(jì)時(shí),具
15、有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。DS1302內(nèi)部有一個(gè)31×8的用于臨時(shí)性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級(jí)產(chǎn)品,與DS1202兼容,但增加了主電源/后備電源雙電源引腳,同時(shí)提供了對(duì)后備電源進(jìn)行涓細(xì)電流充電的能力。 </p><p> 3.2.5 引腳功能及結(jié)構(gòu)</p&g
16、t;<p> DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時(shí),Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時(shí),DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動(dòng)置高電平來啟動(dòng)所有的數(shù)據(jù)傳送。RST輸
17、入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。
18、SCLK為時(shí)鐘輸入端。 </p><p> 下圖為DS1302的引腳功能圖: </p><p> 圖3.5 DS1302封裝圖</p><p> 3.2.6 DS1302的控制字節(jié)</p><p> DS1302 的控制字節(jié)如下圖所示??刂谱止?jié)的最高有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果為0,
19、則表示存取日歷時(shí)鐘數(shù)據(jù),為1表示存取RAM數(shù)據(jù);位5至位1指示操作單元的地址;最低有效位(位0)如為0表示要進(jìn)行寫操作,為1表示進(jìn)行讀操作,控制字節(jié)總是從最低位開始輸出。 </p><p> 3.2.7 數(shù)據(jù)輸入輸出(I/O)</p><p> 在控制指令字輸入后的下一個(gè)SCLK時(shí)鐘的上升沿時(shí),數(shù)據(jù)被寫入DS1302,數(shù)據(jù)輸入從低位即位0開始。同樣,在緊跟8位的控制指令字后的下一個(gè)SC
20、LK脈沖的下降沿讀出DS1302的數(shù)據(jù),讀出數(shù)據(jù)時(shí)從低位0位到高位7。</p><p> 圖3.6 DS1302的寄存器</p><p> 3.2.8 DS1302的寄存器</p><p> DS1302有12個(gè)寄存器,其中有7個(gè)寄存器與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)位為BCD碼形式,其日歷、時(shí)間寄存器及其控制字見表1。此外,DS1302 還有年份寄存器、控制寄存
21、器、充電寄存器、時(shí)鐘突發(fā)寄存器及與RAM相關(guān)的寄存器等。時(shí)鐘突發(fā)寄存器可一次性順序讀寫除充電寄存器外的所有寄存器內(nèi)容。 DS1302與RAM相關(guān)的寄存器分為兩類:一類是單個(gè)RAM單元,共31個(gè),每個(gè)單元組態(tài)為一個(gè)8位的字節(jié),其命令控制字為C0H~FDH,其中奇數(shù)為讀操作,偶數(shù)為寫操作;另一類為突發(fā)方式下的RAM寄存器,此方式下可一次性讀寫所有的RAM的31個(gè)字節(jié),命令控制字為FEH(寫)、FFH(讀)。</p><p
22、> 圖3.7 DS1302的寄存器</p><p> 3.2.9 液晶顯示LCD1602</p><p> 1602液晶也叫1602字符型液晶,它是一種專門用來顯示字母、數(shù)字、符號(hào)等的點(diǎn)陣型液晶模塊。它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用,正因?yàn)槿绱怂运荒芎芎?/p>
23、地顯示圖形(用自定義CGRAM,顯示效果也不好)。 </p><p> 1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。目前市面上字符液晶絕大多數(shù)是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780寫的控制程序可以很方便地應(yīng)用于市面上大部分的字符型液晶。 </p><p><b> 管腳功能</b
24、></p><p> 圖3.8 LCD1602引腳圖</p><p> RT-1602采用表中的16 腳接口:</p><p> 第一腳:Vss,電源地。</p><p> 第二腳:VDD,+5V電源。</p><p> 第三腳:VL,液晶顯示偏壓信號(hào)。</p><p> 第四
25、腳:RS,數(shù)據(jù)/命令選擇端,高電平時(shí)選擇數(shù)據(jù)寄存器,低電平時(shí)選擇指令寄存器。</p><p> 第五腳:R/W,讀/寫選擇端。</p><p> 第六腳:E,使能端,當(dāng)E端由高電平跳變成低電平時(shí),液晶模塊執(zhí)行命令。</p><p> 第七~14腳:D0~D7,為8位雙向數(shù)據(jù)線。</p><p> 第15腳:BLA,背光源正極。<
26、/p><p> 第16腳:BLK,背光源負(fù)極。</p><p><b> 圖3.9 模塊顯示</b></p><p> 3.2.10 串行時(shí)鐘日歷片DS1302</p><p> 系統(tǒng)的組成與工作原理:</p><p> 系統(tǒng)由單片機(jī)AT89C52,串行日歷時(shí)鐘片DS1302,液晶顯示模組
27、LCD1602。</p><p> DS1302的CLOCK與AT89C52的P1.6相連,RST與P1.5相連,IO與P1.7相連。</p><p> LCD1602的D0~D7與AT89C51的P0.0~P.7相連,并接上拉電阻,RS與P2.0相連,RW與P2.1相連,E與P2.2相連。</p><p> DS1302是DALLAS公司拖出的涓流充電時(shí)鐘芯
28、片,內(nèi)含有一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31個(gè)季節(jié)靜態(tài)RAM,通過簡單地串行接口與單片機(jī)進(jìn)行通信,實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、日期、月、年的信息,每月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整,時(shí)鐘操作可通過AM/PM指示決定采用24小時(shí)或12小時(shí)格式,DS1302與單片機(jī)之間能簡單地采用同步串行方式進(jìn)行通信,僅需用到RES復(fù)位、I/O數(shù)據(jù)線、SCLK串行時(shí)鐘3個(gè)口線。對(duì)時(shí)鐘、RAM的讀/寫,可以改用單字節(jié)方式或多達(dá)31個(gè)字節(jié)的字符組方式。DS130
29、2工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息是功率小于1mW。DS1302廣泛應(yīng)用于電話傳真、便攜式儀器及電池供電的儀器儀表等產(chǎn)品領(lǐng)域中。</p><p> RT-1602 字符型液晶模塊是以兩行16個(gè)子的5*7點(diǎn)陣吐信來顯示字符的液晶顯示器。</p><p> DS1302有8個(gè)引腳:</p><p> X1、X2:32.768kHz晶振介入引腳。</p>
30、;<p><b> GND:地。</b></p><p> RST:復(fù)位引腳,低電平有效。</p><p> I/O:數(shù)據(jù)輸入/輸出引腳,具有三態(tài)功能。</p><p> SCLK:串行時(shí)鐘輸入引腳。</p><p> Vcc1:工作電源引腳。</p><p> Vcc2
31、:備用電源引腳。</p><p> DS1302有一個(gè)控制寄存器,12個(gè)日歷,時(shí)鐘寄存器和31個(gè)RAM。</p><p><b> 控制寄存器</b></p><p> 控制寄存器用于存放DS1302的控制命令字,DS1302的RST引腳回到高電平后寫入的第一個(gè)字就為控制命令。它用于對(duì)DS1302讀寫過程進(jìn)行控制,它的格式如下:</
32、p><p> 表3.1 控制寄存器的格式</p><p> D7 D6 D5 D4 D3 D2 D1 D0</p><p><b> 各項(xiàng)功能說明如下。</b></p><p><b> D7:固定為
33、1</b></p><p> D6:RAM/CK位,片內(nèi)RAM或日歷、時(shí)鐘寄存器選擇位,當(dāng)RAM/CK=1時(shí),對(duì)片內(nèi)RAM進(jìn)行讀寫,當(dāng)RAM/CK=0時(shí),對(duì)日歷、時(shí)鐘寄存器進(jìn)行讀寫。</p><p> D5~D1:地址位,用于選擇進(jìn)行讀寫的日歷、時(shí)鐘寄存器或片內(nèi)RAM。對(duì)日歷、時(shí)鐘寄存器或片內(nèi)RAM的選擇。</p><p> D0:讀寫位,當(dāng)RD/
34、W=1時(shí),對(duì)日歷、時(shí)鐘寄存器或片內(nèi)RAM進(jìn)行讀操作,當(dāng)RD/W=0時(shí),對(duì)日歷、時(shí)鐘寄存器或片內(nèi)RAM進(jìn)行寫操作。</p><p><b> 日歷、時(shí)鐘寄存器</b></p><p> DS1302共有12個(gè)寄存器,其中有7個(gè)與日歷、時(shí)鐘相關(guān),存放的數(shù)據(jù)為BCD碼形式。日歷、時(shí)鐘寄存器的格式。</p><p><b> 說明:&l
35、t;/b></p><p> 數(shù)據(jù)都以BCD碼形式表示。</p><p> 小時(shí)寄存器的D7位為12小時(shí)制/24小時(shí)制的選擇位,當(dāng)為1時(shí)選擇12小時(shí)制,當(dāng)為0時(shí)選24小時(shí)制。當(dāng)12小時(shí)制時(shí),D5位為1是上午,D5位為0是下午,D4位小時(shí)的十位。當(dāng)24小時(shí)制時(shí),D5、D4位為小時(shí)的十位。</p><p> 秒寄存器中的CH位為時(shí)鐘暫停位,當(dāng)為1時(shí),時(shí)鐘暫停
36、,為0時(shí),時(shí)鐘開始啟動(dòng)。</p><p> 寫保護(hù)寄存器中的WP為寫保護(hù)位,WP=1時(shí),寫保護(hù),當(dāng)WP=0時(shí),未寫保護(hù),當(dāng)對(duì)日歷、時(shí)鐘寄存器或片內(nèi)RAM進(jìn)行寫時(shí),WP應(yīng)清零,當(dāng)對(duì)日歷、時(shí)鐘寄存器或片內(nèi)RAM進(jìn)行讀時(shí),WP一般置1.</p><p> 慢充電寄存器的TCS位為控制慢充電的選擇,當(dāng)它為1010時(shí)才能是慢充電工作。DS為二極管選擇位。DS為01選擇一個(gè)二極管,DS為10選擇兩
37、個(gè)二極管,DS為11或00充電器被禁止,與TCS無關(guān)。RS用于選擇連接在Vcc2與Vcc1之間的電阻,RS為00,充電器被禁止,與TCS無關(guān)。</p><p><b> 4.系統(tǒng)軟件設(shè)計(jì)</b></p><p><b> 4.1 程序流程</b></p><p> 圖4.1 程序流程圖</p>&l
38、t;p><b> 4.2 程序代碼</b></p><p> #include<reg51.h> //包含單片機(jī)寄存器的頭文件</p><p> #include<intrins.h> //包含_nop_()函數(shù)定義的頭文件</p><p> /******************************
39、*****************************************</p><p> 以下是DS1302芯片的操作程序</p><p> ************************************************************************/</p><p> unsigned char code di
40、git[10]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字</p><p> sbit DATA=P1^7; //位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P1.7引腳</p><p> sbit RST=P1^5; //位定義1302芯片的接口,復(fù)位端口定義在P1.5引腳</p><p> sbit SCLK=P1^6; /
41、/位定義1302芯片的接口,時(shí)鐘輸出端口定義在P1.6引腳</p><p> /*****************************************************</p><p> 函數(shù)功能:延時(shí)若干微秒</p><p><b> 入口參數(shù):n</b></p><p> *********
42、******************************************/ </p><p> void delaynus(unsigned char n)</p><p><b> {</b></p><p> unsigned char i;</p><p> for(i=0;i<n;i++
43、);</p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:向1302寫一個(gè)字節(jié)數(shù)據(jù)</p><p><b> 入口參數(shù):x</b></p>
44、<p> ***************************************************/ </p><p> void Write1302(unsigned char dat)</p><p><b> {</b></p><p> unsigned char i; </p><
45、;p> SCLK=0; //拉低SCLK,為脈沖上升沿寫入數(shù)據(jù)做好準(zhǔn)備</p><p> delaynus(2); //稍微等待,使硬件做好準(zhǔn)備</p><p> for(i=0;i<8;i++) //連續(xù)寫8個(gè)二進(jìn)制位數(shù)據(jù)</p><p><b> {</b></p><p> DATA=dat&
46、amp;0x01; //取出dat的第0位數(shù)據(jù)寫入1302</p><p> delaynus(2); //稍微等待,使硬件做好準(zhǔn)備</p><p> SCLK=1; //上升沿寫入數(shù)據(jù)</p><p> delaynus(2); //稍微等待,使硬件做好準(zhǔn)備</p><p> SCLK=0; //重新拉低SCLK,形成脈沖</
47、p><p> dat>>=1; //將dat的各數(shù)據(jù)位右移1位,準(zhǔn)備寫入下一個(gè)數(shù)據(jù)位</p><p><b> }</b></p><p><b> }</b></p><p> /***************************************************
48、**</p><p> 函數(shù)功能:根據(jù)命令字,向1302寫一個(gè)字節(jié)數(shù)據(jù)</p><p> 入口參數(shù):Cmd,儲(chǔ)存命令字;dat,儲(chǔ)存待寫的數(shù)據(jù)</p><p> ***************************************************/ </p><p> void WriteSet1302(unsign
49、ed char Cmd,unsigned char dat)</p><p><b> {</b></p><p> RST=0; //禁止數(shù)據(jù)傳遞</p><p> SCLK=0; //確保寫數(shù)居前SCLK被拉低</p><p> RST=1; //啟動(dòng)數(shù)據(jù)傳輸</p><p> de
50、laynus(2); //稍微等待,使硬件做好準(zhǔn)備</p><p> Write1302(Cmd); //寫入命令字</p><p> Write1302(dat); //寫數(shù)據(jù)</p><p> SCLK=1; //將時(shí)鐘電平置于已知狀態(tài)</p><p> RST=0; //禁止數(shù)據(jù)傳遞</p><p>&l
51、t;b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:從1302讀一個(gè)字節(jié)數(shù)據(jù)</p><p><b> 入口參數(shù):x</b></p><p> ************
52、***************************************/ </p><p> unsigned char Read1302(void)</p><p><b> {</b></p><p> unsigned char i,dat;</p><p> delaynus(2); //稍微等待
53、,使硬件做好準(zhǔn)備</p><p> for(i=0;i<8;i++) //連續(xù)讀8個(gè)二進(jìn)制位數(shù)據(jù)</p><p><b> {</b></p><p> dat>>=1; //將dat的各數(shù)據(jù)位右移1位,因?yàn)橄茸x出的是字節(jié)的最低位</p><p> if(DATA==1) //如果讀出的數(shù)據(jù)是1
54、</p><p> dat|=0x80; //將1取出,寫在dat的最高位</p><p> SCLK=1; //將SCLK置于高電平,為下降沿讀出</p><p> delaynus(2); //稍微等待</p><p> SCLK=0; //拉低SCLK,形成脈沖下降沿</p><p> delaynus
55、(2); //稍微等待</p><p><b> } </b></p><p> return dat; //將讀出的數(shù)據(jù)返回</p><p><b> } </b></p><p> /****************************************************
56、*</p><p> 函數(shù)功能:根據(jù)命令字,從1302讀取一個(gè)字節(jié)數(shù)據(jù)</p><p><b> 入口參數(shù):Cmd</b></p><p> ***************************************************/ </p><p> unsigned char ReadSet13
57、02(unsigned char Cmd)</p><p><b> {</b></p><p> unsigned char dat;</p><p> RST=0; //拉低RST</p><p> SCLK=0; //確保寫數(shù)居前SCLK被拉低</p><p> RST=1; //
58、啟動(dòng)數(shù)據(jù)傳輸</p><p> Write1302(Cmd); //寫入命令字</p><p> dat=Read1302(); //讀出數(shù)據(jù)</p><p> SCLK=1; //將時(shí)鐘電平置于已知狀態(tài)</p><p> RST=0; //禁止數(shù)據(jù)傳遞</p><p> return dat; //將讀出的
59、數(shù)據(jù)返回</p><p><b> }</b></p><p> /*******************************************************************************</p><p> 以下是對(duì)液晶模塊的操作程序</p><p> ***********
60、********************************************************************/</p><p> sbit RS=P2^0; //寄存器選擇位,將RS位定義為P2.0引腳</p><p> sbit RW=P2^1; //讀寫選擇位,將RW位定義為P2.1引腳</p><p> sbit E=P2^2
61、; //使能信號(hào)位,將E位定義為P2.2引腳</p><p> sbit BF=P0^7; //忙碌標(biāo)志位,,將BF位定義為P0.7引腳</p><p> /*****************************************************</p><p> 函數(shù)功能:延時(shí)1ms</p><p> (3j+2)
62、*i=(3×33+2)×10=1010(微秒),可以認(rèn)為是1毫秒</p><p> ***************************************************/</p><p> void delay1ms()</p><p><b> {</b></p><p>
63、 unsigned char i,j; </p><p> for(i=0;i<10;i++)</p><p> for(j=0;j<33;j++)</p><p><b> ; </b></p><p><b> }</b></p><p> /***
64、**************************************************</p><p> 函數(shù)功能:延時(shí)若干毫秒</p><p><b> 入口參數(shù):n</b></p><p> ***************************************************/</p>&
65、lt;p> void delaynms(unsigned char n)</p><p><b> {</b></p><p> unsigned char i;</p><p> for(i=0;i<n;i++)</p><p> delay1ms();</p><p>&
66、lt;b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:判斷液晶模塊的忙碌狀態(tài)</p><p> 返回值:result。result=1,忙碌;result=0,不忙</p><p> ***
67、************************************************/</p><p> bit BusyTest(void)</p><p><b> {</b></p><p> bit result;</p><p> RS=0; //根據(jù)規(guī)定,RS為低電平,RW為高電平時(shí),可以
68、讀狀態(tài)</p><p><b> RW=1;</b></p><p> E=1; //E=1,才允許讀寫</p><p> _nop_(); //空操作</p><p><b> _nop_();</b></p><p><b> _nop_(); <
69、;/b></p><p> _nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間 </p><p> result=BF; //將忙碌標(biāo)志電平賦給result</p><p> E=0; //將E恢復(fù)低電平</p><p> return result;</p><p><b> }<
70、;/b></p><p> /*****************************************************</p><p> 函數(shù)功能:將模式設(shè)置指令或顯示地址寫入液晶模塊</p><p> 入口參數(shù):dictate</p><p> ********************************
71、*******************/</p><p> void WriteInstruction (unsigned char dictate)</p><p><b> { </b></p><p> while(BusyTest()==1); //如果忙就等待</p><p> RS=0; //根據(jù)規(guī)定
72、,RS和R/W同時(shí)為低電平時(shí),可以寫入指令</p><p><b> RW=0; </b></p><p> E=0; //E置低電平</p><p> // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"</p><p><b> _nop_();</b></p&g
73、t;<p> _nop_(); //空操作兩個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間</p><p> P0=dictate; //將數(shù)據(jù)送入P0口,即寫入指令或地址</p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p>&l
74、t;b> _nop_();</b></p><p> _nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間</p><p> E=1; //E置高電平</p><p><b> _nop_();</b></p><p><b> _nop_();</b></p&
75、gt;<p><b> _nop_();</b></p><p> _nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間</p><p> E=0; //當(dāng)E由高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令</p><p><b> }</b></p><p> /*****
76、************************************************</p><p> 函數(shù)功能:指定字符顯示的實(shí)際地址</p><p><b> 入口參數(shù):x</b></p><p> ***************************************************/</p>
77、<p> void WriteAddress(unsigned char x)</p><p><b> {</b></p><p> WriteInstruction(x|0x80); //顯示位置的確定方法規(guī)定為"80H+地址碼x"</p><p><b> }</b><
78、/p><p> /*****************************************************</p><p> 函數(shù)功能:將數(shù)據(jù)(字符的標(biāo)準(zhǔn)ASCII碼)寫入液晶模塊</p><p> 入口參數(shù):y(為字符常量)</p><p> **************************************
79、*************/</p><p> void WriteData(unsigned char y)</p><p><b> {</b></p><p> while(BusyTest()==1); </p><p> RS=1; //RS為高電平,RW為低電平時(shí),可以寫入數(shù)據(jù)</p>
80、<p><b> RW=0;</b></p><p><b> E=0; </b></p><p> // 就是讓E從0到1發(fā)生正跳變,所以應(yīng)先置"0"</p><p> P0=y; //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊</p><p><b>
81、 _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p> _nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間</p><p> E=1; //E置高電平</p>&l
82、t;p><b> _nop_();</b></p><p><b> _nop_();</b></p><p><b> _nop_();</b></p><p> _nop_(); //空操作四個(gè)機(jī)器周期,給硬件反應(yīng)時(shí)間</p><p> E=0; //當(dāng)E由
83、高電平跳變成低電平時(shí),液晶模塊開始執(zhí)行命令</p><p><b> }</b></p><p> /*****************************************************</p><p> 函數(shù)功能:對(duì)LCD的顯示模式進(jìn)行初始化設(shè)置</p><p> ************
84、***************************************/</p><p> void LcdInitiate(void)</p><p><b> {</b></p><p> delaynms(15); //延時(shí)15ms,首次寫指令時(shí)應(yīng)給LCD一段較長的反應(yīng)時(shí)間</p><p> Wri
85、teInstruction(0x38); //顯示模式設(shè)置:16×2顯示,5×7點(diǎn)陣,8位數(shù)據(jù)接口</p><p> delaynms(5); //延時(shí)5ms ,給硬件一點(diǎn)反應(yīng)時(shí)間</p><p> WriteInstruction(0x38);</p><p> delaynms(5); //延時(shí)5ms ,給硬件一點(diǎn)反應(yīng)時(shí)間</p&
86、gt;<p> WriteInstruction(0x38); //連續(xù)三次,確保初始化成功</p><p> delaynms(5); //延時(shí)5ms ,給硬件一點(diǎn)反應(yīng)時(shí)間</p><p> WriteInstruction(0x0c); //顯示模式設(shè)置:顯示開,無光標(biāo),光標(biāo)不閃爍</p><p> delaynms(5); //延時(shí)5ms
87、 ,給硬件一點(diǎn)反應(yīng)時(shí)間</p><p> WriteInstruction(0x06); //顯示模式設(shè)置:光標(biāo)右移,字符不移</p><p> delaynms(5); //延時(shí)5ms ,給硬件一點(diǎn)反應(yīng)時(shí)間</p><p> WriteInstruction(0x01); //清屏幕指令,將以前的顯示內(nèi)容清除</p><p> de
88、laynms(5); //延時(shí)5ms ,給硬件一點(diǎn)反應(yīng)時(shí)間</p><p><b> } </b></p><p> /**************************************************************</p><p> 以下是1302數(shù)據(jù)的顯示程序</p><p> *
89、*************************************************************/</p><p> void Display(unsigned char x,unsigned char y)</p><p><b> {</b></p><p> unsigned char i,j; </
90、p><p><b> i=x/10;</b></p><p><b> j=x%10; </b></p><p> WriteAddress(y); </p><p> WriteData(digit[i]); </p><p> WriteData(digit[j])
91、; </p><p> delaynms(50); //延時(shí)1ms給硬件一點(diǎn)反應(yīng)時(shí)間 </p><p><b> }</b></p><p> /*****************************************************</p><p><b> 函數(shù)功能:主函數(shù)<
92、/b></p><p> ***************************************************/ </p><p> void main(void)</p><p><b> {</b></p><p> unsigned char second,minute,hour,d
93、ay,month,year; //分別儲(chǔ)存秒、分、小時(shí),日,月,年</p><p> unsigned char ReadValue; //儲(chǔ)存從1302讀取的數(shù)據(jù)</p><p> LcdInitiate(); //將液晶初始化</p><p> WriteAddress(0x00); //寫Date的顯示地址,將在第1行第1列開始顯示</p>
94、<p> WriteData('D'); //將字符常量寫入LCD</p><p> WriteAddress(0x01);</p><p> WriteData('a'); //將字符常量寫入LCD</p><p> WriteAddress(0x02);</p><p> WriteD
95、ata('t'); //將字符常量寫入LCD</p><p> WriteAddress(0x03);</p><p> WriteData('e'); //將字符常量寫入LCD</p><p> WriteAddress(0x04);</p><p> WriteData(':');
96、//將字符常量寫入LCD</p><p> WriteAddress(0x08); //寫年月分隔符的顯示地址, 顯示在第1行第9列</p><p> WriteData('-'); //將字符常量寫入LCD</p><p> WriteAddress(0x0b); //寫月日分隔符的顯示地址, 顯示在第1行第12列</p>&l
97、t;p> WriteData('-'); //將字符常量寫入LCD</p><p> WriteAddress(0x40);</p><p> WriteData('T');</p><p> WriteAddress(0x41);</p><p> WriteData('i')
98、;</p><p> WriteAddress(0x42);</p><p> WriteData('m');</p><p> WriteAddress(0x43);</p><p> WriteData('e');</p><p> WriteAddress(0x44);&
99、lt;/p><p> WriteData(':');</p><p> WriteAddress(0x48); </p><p> WriteData(':'); //將字符常量寫入LCD</p><p> WriteAddress(0x4b); </p><p> WriteDa
100、ta(':'); //將字符常量寫入LCD </p><p><b> while(1)</b></p><p><b> {</b></p><p> ReadValue = ReadSet1302(0x81); //從秒寄存器讀數(shù)據(jù)</p><p> second=((R
101、eadValue&0x70)>>4)*10 + (ReadValue&0x0F);//將讀出數(shù)據(jù)轉(zhuǎn)化</p><p> Display(second,0x4c); //顯示秒</p><p> ReadValue = ReadSet1302(0x83); //從分寄存器讀</p><p> minute=((ReadValue&am
102、p;0x70)>>4)*10 + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化</p><p> Display(minute,0x49); //顯示分</p><p> ReadValue = ReadSet1302(0x85); //從小時(shí)寄存器讀</p><p> hour=((ReadValue&0x70)>
103、>4)*10 + (ReadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化</p><p> Display(hour,0x46); //顯示小時(shí)</p><p> ReadValue = ReadSet1302(0x87); //從分寄存器讀</p><p> day=((ReadValue&0x70)>>4)*10 + (R
104、eadValue&0x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化</p><p> Display(day,0x0c); //顯示日</p><p> ReadValue = ReadSet1302(0x89); //從分寄存器讀</p><p> month=((ReadValue&0x70)>>4)*10 + (ReadValue&0
105、x0F); //將讀出數(shù)據(jù)轉(zhuǎn)化</p><p> Display(month,0x09); //顯示月</p><p> ReadValue = ReadSet1302(0x8d); //從分寄存器讀</p><p> year=((ReadValue&0xf0)>>4)*10 + (ReadValue&0x0F); //將讀出數(shù)據(jù)
106、轉(zhuǎn)化</p><p> Display(year,0x06); //顯示年</p><p><b> } </b></p><p><b> }</b></p><p><b> 5.系統(tǒng)仿真調(diào)試</b></p><p> 5.1 仿真原
107、理圖設(shè)計(jì)</p><p> 圖5.1 仿真原理圖</p><p> 5.2 仿真工具欄</p><p> 圖5.2仿真控制按鈕</p><p><b> 功能:1. 運(yùn)行</b></p><p><b> 2. 單步運(yùn)行</b></p><p
108、><b> 3. 暫停</b></p><p><b> 4. 停止</b></p><p> 5.2 仿真運(yùn)行過程</p><p> 在Keil下,將所編制的C語言程序編譯后,生成9.HEX文件;再在PROTEUS環(huán)境下,將.HEX文件加到編制的仿真原理圖中進(jìn)行仿真調(diào)試,從而生成正確的日期和時(shí)間,該日期和
109、時(shí)間與當(dāng)前系統(tǒng)的日期和時(shí)間相符。</p><p> 5.3 仿真運(yùn)行結(jié)果</p><p> 圖5.3 仿真運(yùn)行結(jié)果圖</p><p><b> 6.總結(jié)</b></p><p> 單片機(jī)作為我們主要的專業(yè)課程之一,我覺得單片機(jī)課程設(shè)計(jì)很有必要,而且很有意義?;仡櫰鸫舜螁纹瑱C(jī)課程設(shè)計(jì),至今我仍感慨頗多,的確,
110、從選題到定稿,從理論到實(shí)踐,在幾天里,可以說得是苦多于甜,但是可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過的知識(shí),而且學(xué)到了很多在書本上所沒有學(xué)到過的知識(shí)。通過這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。在設(shè)計(jì)的過程中遇到問題,可以說得是困難重重,這畢竟第一次做的,難免會(huì)遇到過
111、各種各樣的問題,同時(shí)在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過的知識(shí)理解得不夠深刻,掌握得不夠牢固。</p><p> 在這次課程設(shè)計(jì)中,運(yùn)用到了很多以前的專業(yè)知識(shí),雖然過去從未獨(dú)立應(yīng)用過它們,但在學(xué)習(xí)的過程中帶著問題去學(xué)我發(fā)現(xiàn)效率很高,這是我做這次課程設(shè)計(jì)的一大收獲。另外,要做好一個(gè)課程設(shè)計(jì),就必須做到:在設(shè)計(jì)程序之前,對(duì)所用單片機(jī)的內(nèi)部結(jié)構(gòu)有一個(gè)系統(tǒng)的了解,知道該單片機(jī)內(nèi)有哪些資源;要有一個(gè)清晰的思路
112、和一個(gè)完整的的軟件流程圖;在設(shè)計(jì)程序時(shí),不能妄想一次就將整個(gè)程序設(shè)計(jì)好,反復(fù)修改、不斷改進(jìn)是程序設(shè)計(jì)的必經(jīng)之路;要養(yǎng)成注釋程序的好習(xí)慣,一個(gè)程序的完美與否不僅僅是實(shí)現(xiàn)功能,而應(yīng)該讓人一看就能明白你的思路,這樣也為資料的保存和交流提供了方便;在設(shè)計(jì)課程過程中遇到問題是很正常德,但我們應(yīng)該將每次遇到的問題記錄下來,并分析清楚,以免下次再碰到同樣的問題的課程設(shè)計(jì)結(jié)束了,但是從中學(xué)到的知識(shí)會(huì)讓我受益終身。發(fā)現(xiàn)、提出、分析、解決問題和實(shí)踐能力的提
113、高都會(huì)受益于我在以后的學(xué)習(xí)、工作和生活中。設(shè)計(jì)過程,好比是我們?nèi)祟惓砷L的歷程,常有一些不如意,但畢竟這是第一次做,難免會(huì)遇到各種各樣的問題。在設(shè)計(jì)的過程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過的知識(shí)理解得不夠深刻,掌握得不夠牢固,不能靈活運(yùn)用。</p><p> 通過這次設(shè)計(jì),我懂得了學(xué)習(xí)的重要性,了解到理論知識(shí)與實(shí)踐相結(jié)合的重要意義,學(xué)會(huì)了堅(jiān)持、耐心和努力,這將為自己今后的學(xué)習(xí)和工作做出了最好的榜樣。另外,要非常
114、感謝我的指導(dǎo)老師,是她指引我克服一個(gè)由一個(gè)的困難,讓我學(xué)會(huì)對(duì)困難無所畏懼,以及對(duì)問題的一些很重要的思考方法。并且讓我學(xué)會(huì)對(duì)困難無所畏懼,以及對(duì)問題的一些很重要的思考方法。</p><p><b> 7.參考文獻(xiàn)</b></p><p> [1]謝維成著《單片機(jī)原理與應(yīng)用及C51程序設(shè)計(jì)》,清華大學(xué)出版社,2009</p><p> [2]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 用lcd顯示實(shí)時(shí)日歷時(shí)鐘單片機(jī)課程設(shè)計(jì)
- 用lcd顯示實(shí)時(shí)日歷時(shí)鐘單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)--時(shí)鐘及液晶顯示器設(shè)計(jì)
- 單片機(jī)日歷時(shí)鐘開發(fā)
- 單片機(jī)課程設(shè)計(jì)--點(diǎn)陣顯示器報(bào)告
- 單片機(jī)課程設(shè)計(jì)--漢字液晶顯示器顯示
- 單片機(jī)課程設(shè)計(jì)-單片機(jī)課程設(shè)計(jì)---電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)--led數(shù)字顯示電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)-字符液晶顯示器設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告(時(shí)鐘、日歷)-基于單片機(jī)的電子鐘設(shè)計(jì)
- 單片機(jī)電子鐘畢業(yè)設(shè)計(jì)---基于單片機(jī)的時(shí)鐘顯示器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)--基于單片機(jī)的時(shí)鐘顯示器設(shè)計(jì)
- 畢業(yè)設(shè)計(jì)---基于單片機(jī)的時(shí)鐘顯示器設(shè)計(jì)
- 基于單片機(jī)的時(shí)鐘顯示器畢業(yè)設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)——電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)——電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)--單片機(jī)模擬電子時(shí)鐘設(shè)計(jì)
- 電子時(shí)鐘單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---電子時(shí)鐘
- 單片機(jī)課程設(shè)計(jì)--電子時(shí)鐘
評(píng)論
0/150
提交評(píng)論