版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 本科畢業(yè)論文</b></p><p> 基于STC89C52單片機的智能紅外遙控系統(tǒng)</p><p> 所在學(xué)院信息科學(xué)技術(shù)學(xué)院</p><p> 專業(yè)名稱自動化</p><p> 申請學(xué)士學(xué)位所屬學(xué)科工 學(xué)</p>
2、<p> 年 級 </p><p> 學(xué)生姓名、學(xué)號 </p><p> 指導(dǎo)教師姓名、職稱************</p><p> 完成日期二〇一三年五月</p><p><b> 摘 要</b><
3、/p><p> 隨著科技的發(fā)展,特別是微電子技術(shù)的發(fā)展,單片機的應(yīng)用已經(jīng)深入到生活的各個領(lǐng)域。本文以STCC89C52為控制芯片,DS1302為時鐘芯片,DS18B20為溫度傳感器,HS0038紅外一體接收頭作為紅外接收器,以此接收并處理遙控器按鍵信號并用來矯正時鐘時間。同時,該項目還加入了定時和設(shè)定溫度上下限的功能,當(dāng)達(dá)到預(yù)設(shè)時間時執(zhí)行開關(guān)燈命令,當(dāng)溫度低于溫度下限或高于溫度上限時執(zhí)行開空調(diào)命令,開關(guān)器件為兩個大
4、功率電磁繼電器。整個項目的所有數(shù)據(jù)顯示于LCD12864液晶,形成一個良好的用戶界面。硬件電路圖和PCB用Protel99SE繪制,軟件開發(fā)環(huán)境為KeilV3,項目實物為萬用板焊接電路,經(jīng)調(diào)試各項功能均已正常實現(xiàn)。</p><p> 關(guān)鍵詞:紅外遙控,單片機,DS1302,DS18B20,LCD12864</p><p><b> ABSTRACT</b><
5、/p><p> With the development of science and technology, especially the development of microelectronics technology, SCM applications have been deeply into all areas of life. Taking STCC89C52 as control chip, fo
6、r DS1302 clock chip, DS18B20 as temperature collector, HS0038 infrared receiving head as integrated infrared receiver, signal receiving and processing the remote control buttons, in order to correct the clock time. At th
7、e same time, the project also joined the function of timing, and setting temper</p><p> Key words:infrared remote control, microcontroller, DS1302, DS18B20, LCD12864目 錄</p><p><b> 第1章 緒
8、論1</b></p><p> 第2章 單片機介紹1</p><p> 2.1 單片機簡介及歷史1</p><p> 2.2 單片機應(yīng)用發(fā)展趨勢2</p><p> 第3章 硬件設(shè)計2</p><p> 3.1 STC89C52單片機介紹2</p><p>
9、3.1.1 STC89C52引腳簡介2</p><p> 3.1.2 STC89C52RC主要功能特點4</p><p> 3.2 DS18B20溫度傳感器介紹5</p><p> 3.2.1 DS18B20引腳及特點5</p><p> 3.2.2 DS18B20內(nèi)部結(jié)構(gòu)及寄存器介紹7</p><p&g
10、t; 3.3 DS1302時鐘芯片介紹9</p><p> 3.3.1 DS1302引腳及內(nèi)部寄存器簡介9</p><p> 3.3.2 DS1302讀寫時序10</p><p> 3.4 HS0038紅外一體接收器介紹11</p><p> 3.4.1 HS0038特點介紹11</p><p>
11、 3.4.2 HS0038電路及應(yīng)用11</p><p> 3.5 LCD12864液晶介紹12</p><p> 3.5.1 LCD12864性能概述及引腳功能12</p><p> 3.5.2 LCD12864讀寫時序及用戶指令集13</p><p> 3.6 其他硬件電路14</p><p>
12、 3.6.1 STC89C52RC最小系統(tǒng)的設(shè)計14</p><p> 3.6.2 系統(tǒng)電源電路的設(shè)計15</p><p> 第4章 軟件開發(fā)平臺及軟件15</p><p> 4.1 開發(fā)環(huán)境介紹及程序總體結(jié)構(gòu)15</p><p> 4.1.1 開發(fā)環(huán)境介紹15</p><p> 4.1.2 程序總
13、體結(jié)構(gòu)15</p><p> 4.2 DS18B20溫度程序模塊16</p><p> 4.2.1 DS18B20操作流程16</p><p> 4.2.2 DS18B20部分程序代碼17</p><p> 4.3 DS1302時間程序模塊20</p><p> 4.3.1 DS1302總體操作及基
14、本讀寫功能函數(shù)20</p><p> 4.3.2 讀取時間數(shù)據(jù)并轉(zhuǎn)化成字符串23</p><p> 4.4 LCD12864液晶驅(qū)動程序24</p><p> 4.4.1 LCD12864初始化24</p><p> 4.4.2 寫數(shù)據(jù)到LCD12864功能函數(shù)25</p><p> 4.5 HS0
15、038紅外解碼程序模塊26</p><p> 4.5.1 紅外遙控器編碼介紹26</p><p> 4.5.2 紅外解碼程序流程及重要代碼分析27</p><p> 4.6 定時定溫功能的程序?qū)崿F(xiàn)29</p><p> 第5章 系統(tǒng)調(diào)試及項目總結(jié)33</p><p> 5.1 系統(tǒng)調(diào)試33<
16、/p><p> 5.1.1 最小系統(tǒng)調(diào)試33</p><p> 5.1.2 其他各模塊調(diào)試過程33</p><p><b> 5.2 總結(jié)34</b></p><p><b> 參考文獻(xiàn)36</b></p><p><b> 致 謝37</b&
17、gt;</p><p><b> 附 錄38</b></p><p> 附錄1 整體電路原理圖38</p><p> 附錄2 PCB版圖38</p><p> 附錄3 Protel99SE生成的效果圖39</p><p><b> 緒 論</b></p
18、><p> 20世紀(jì)以來,電子技術(shù)發(fā)展迅速,特別是近幾年來,現(xiàn)代電子產(chǎn)品以及各種消費電子產(chǎn)品已經(jīng)滲透到了生活各方面,電子技術(shù)的發(fā)展推動力社會發(fā)展科技進(jìn)步并且提高了人們的生活水平。以單片機為核心的多功能系統(tǒng)正在飛快的改變著人們的生活,特別是一些家用智能產(chǎn)品,不但方便了人們的生活,更加豐富了人們的生活方式。以本文中的家用智能紅外遙控系統(tǒng)為例,該項目除了具有一般的日歷功能外,還增加了溫度檢測功能,但其能成為“智能”之處并
19、不在于此,而是他可以通過遙控按鍵設(shè)定時間值和溫度值,接著程序就會按照這些數(shù)值自動的控制繼電器,從而達(dá)到了定時開關(guān)燈,定溫開關(guān)空調(diào)的目的。</p><p> 在享受越來越智能化的電子產(chǎn)品的時候,我們還要再次感謝電子技術(shù)的發(fā),集成化的功能模塊已使編程和硬件設(shè)計變得非常方便。以溫度采集模塊為例,經(jīng)典的溫度采集系統(tǒng)由模擬量溫度傳感器、經(jīng)過A/D轉(zhuǎn)換和各種單片機電路組成。由于溫度傳感器輸出模擬量那么信號需要經(jīng)過A/D轉(zhuǎn)換
20、,轉(zhuǎn)換為數(shù)字量后才能與單片機等數(shù)字接口進(jìn)行通信,從而使電路變得比較復(fù)雜,提高了成本。而DS18B20集成了模數(shù)轉(zhuǎn)換功能,通過封裝只留出一個數(shù)據(jù)接口,這樣就可以直接輸出數(shù)字量,從而單片機連接變得非常簡單,提高了靈活度,降低了成本增加了應(yīng)用價值。另外HS0038紅外一體接受頭,更是能把紅外信號直接轉(zhuǎn)變?yōu)殡妷盒盘?,省去了大量的外圍電路,方便了程序編寫?lt;/p><p><b> 單片機介紹</b>
21、;</p><p><b> 單片機簡介及歷史</b></p><p> 單片機是一種超大規(guī)模集成電路芯片,把CPU,RAM存儲器、ROM存儲器、中斷系統(tǒng),多種I/O口、定時器/計時器等(還可以集成液晶控制器,SIP模塊,IIC模塊),集成到一塊硅片電路板上構(gòu)成的一個完善的微型計算機系統(tǒng)。</p><p> 單片機最早出現(xiàn)于1971年,大
22、致經(jīng)歷了SCM、MCU、SoC三個階段,早期的單片機是8位或4位的。其中影響最大的的是INTEL的8031,此后在此基礎(chǔ)上上研制出了MCS51系列單片機系統(tǒng)。由于其良好的性能和較高的性價比,該型號的單片機當(dāng)今仍在廣泛使用。隨著工程項目復(fù)雜度的提高和對控制精確度要求的提高,16位單片機隨之出現(xiàn),但是16位單片機和51系列相比性價比優(yōu)勢不大,所以應(yīng)用不太廣泛。90年代以來隨著消費電子產(chǎn)品需求增大,單片機技術(shù)乘勢發(fā)展。隨著ARM系列的廣泛使用
23、,32位單片機快速替代了16位單片機引領(lǐng)高端產(chǎn)品。</p><p><b> 單片機應(yīng)用發(fā)展趨勢</b></p><p> 當(dāng)今世界的單片機領(lǐng)域可以說是百花齊放,世界各大芯片商先后都退出了自己的8位,16位,32位單片機。有的于主流兼容有的則獨樹一幟,他們各具特色相互補充??傮w看來,單片機發(fā)展的趨勢大致有以下方面:</p><p> 高低
24、搭配,分工明確。高端單片機低端單片機并行于世,各自發(fā)揮各自的功能,特別是在工業(yè)控制方面,各有各自的側(cè)重點,如有的側(cè)重運算速度有的則強調(diào)豐富的外設(shè)接口。</p><p> 低功耗。最初基于MCS-51的8013功耗達(dá)到630mW,而現(xiàn)在流行的單片機都在100mW上下。隨著CMOS和CHMOS工藝的應(yīng)用,單片機會變得速度更高功耗更低。</p><p> 體積更小?,F(xiàn)代的電子產(chǎn)品大都要求體積
25、小更便攜。這就要求在最求高速低功耗的同時還要注重減小體積,很多單片機廠商在封裝上下起了功夫,其中表面封裝(SMD)得到了普遍認(rèn)可。使得單片機邁向微型化。</p><p><b> 硬件設(shè)計</b></p><p> STC89C52單片機介紹</p><p> STC89C52引腳簡介</p><p> STC8
26、9C52管腳如圖1所示。</p><p> 圖 1 STC89C52管腳圖</p><p> 圖 2 STC89C52實物圖</p><p><b> 電源引腳(2根)</b></p><p> GND(20腳):接地線;VCC(40腳):接+5V電源</p><p> 外接晶振引腳(2
27、根)</p><p> XTAL0(18腳):蕩電路的輸入端;XTAL1(19腳):振蕩電路的輸出端</p><p><b> 控制引腳(4根)</b></p><p> ALE/PROG(30腳):地址鎖存允許信號;EA/VPP(31腳):片內(nèi)外程序存儲器選擇,低電平讀取外部存儲器指令,高電平讀片內(nèi)程序指令;RST/VPP(9腳):復(fù)位
28、引腳2個機器周期以上的高電平單片機復(fù)位;PSEN(29腳):外部存儲器讀選通信號</p><p><b> I/O口(32根)</b></p><p> 該單片機有4組(P0、P1、P2、P3)I/O口,每組8位,共32根引腳。</p><p> P0口(39腳~32腳)是一個具有8位漏極開路的雙向I/O口。當(dāng)輸出口使用時,每位能驅(qū)動8路
29、TTL電平。</p><p> P1口(1腳~8腳)是一個8 位雙向I/O 口且具有上拉電阻。可以用來驅(qū)動TLL邏輯電平。</p><p> P2口(21腳~28腳)是一個8 位雙向I/O 口且具有內(nèi)部上拉電阻,P2 口可以用來驅(qū)動 TTL 邏輯電平。</p><p> P3口(10腳~17腳)是8位準(zhǔn)雙向I/O口,同時P3口具有復(fù)用功能,P3.0 串行輸入(
30、RXD)、P3.1 串行輸出(TXD) 、P3.2 外部中斷0(INT0)、P3.3 外中斷1(INT1)、P3.4 定時/計數(shù)器0、P3.5 定時/計數(shù)器1、P3.6 外部數(shù)據(jù)存儲器寫選通、P3.7 外部數(shù)據(jù)存儲器讀選通</p><p> STC89C52RC主要功能特點</p><p> STC89C52是宏晶科技生產(chǎn)的一種高性價比低功耗的8位單片機,片內(nèi)集成8KFlash程序存儲
31、器,STC89C52使用經(jīng)典的MCS-51內(nèi)核,程序上完全兼容。但該單片機還是做了不少改進(jìn),縮短了指令執(zhí)行周期,增加了定時器2,增加了看門狗功能。在單芯片上,8位的CPU配合8K的程序存儲器,使得STC89C52能滿足基本的控制需要不需要再外擴存儲器。 以下是STC89C52的基本特點:</p><p> 相對于一個機器周期占12個機器周期的8051增加6時鐘/機器周期功能。</p><p&
32、gt; 工作電壓寬度在5.5V - 3.4V。</p><p> 工作頻率0 – 40 MHz最高可達(dá)到48MHz</p><p> 片內(nèi)集成8K字節(jié)的程序存儲器和512B的RAM</p><p> 通用I/O口(32個),復(fù)位后為P1~P4是準(zhǔn)雙向口并帶有弱上拉電阻,P0口是開漏輸出,作為地址線使用時不用接上拉電阻而作為普通I/O口使用時必須使用上拉電阻。
33、</p><p> 具有3個16位定時器/計數(shù)器,定時器0可以拆分成兩個8位使用</p><p> 具有四個外部中斷,可以設(shè)置成下降沿或低電平模式觸發(fā),掉電模式下外部中斷的低電平模式可以喚醒系統(tǒng)。</p><p> 具有一個通用同步串口,如有需要可以通過普通I/O口模擬串口進(jìn)行擴展。</p><p> 正常工作溫度范圍0 - 75℃,
34、 本項目為PDIP-40封裝。 </p><p> DS18B20溫度傳感器介紹</p><p> DS18B20引腳及特點</p><p> DS18B20的引腳及封裝如圖3所示:</p><p> 圖 3 DS18B20引腳及封裝</p><p> DS18B20的引腳:1.DQ 輸入/輸出端口;2.
35、GND 為電源地;3. VDD +5V(寄生電源模式下該位接地即可)</p><p> DS18B20 的主要特性:</p><p> DS18B20適應(yīng)的溫度范圍為3.0~5.5v,可以直接與3v或5v單片機相連,如果使用寄生電源模式兩個電源引腳可以直接接地,DS18B20與單片機連接只需要一根數(shù)據(jù)線,通過一定的時序操作可以實現(xiàn)讀和寫的雙向通信,另外DS18B20還有一大特色,一條數(shù)
36、據(jù)線可以連接多個傳感器 ,在不增加I/O口的情況下實現(xiàn)網(wǎng)多點測溫的需求,DS18B20 設(shè)計精巧實用方便,整個功能電路集成在只有三個引腳的芯片內(nèi),形如三家管 ,其溫度測量范圍-55℃~+125℃,溫度測量分辨率為 9~12 位出廠設(shè)置為12位精度,這樣在默認(rèn)設(shè)置下只要把測得并轉(zhuǎn)化后的溫度值乘以0.0625即可得實際溫度值。</p><p> DS18B20與單片機的連接有兩種方法,外部電源供電和寄生電源供電方式
37、,在實際使用時只需要在數(shù)據(jù)線上接上4.7kΩ的上拉電阻即可。本項目采用外部電源供電方式如圖4所示:</p><p> 圖 4 DS18B20外部供電電路圖</p><p> DS18B20內(nèi)部結(jié)構(gòu)及寄存器介紹</p><p> DS18B20的內(nèi)部結(jié)構(gòu)如圖5所示:</p><p> 圖 5 DS18B20內(nèi)部結(jié)構(gòu)圖</p>
38、<p> DS18B20的四大數(shù)據(jù)組成部分:</p><p> 光刻 ROM 中的 64 位序列號,用于實現(xiàn)一根總線上掛接多個 DS18B20 的目的。</p><p> 溫度靈敏原件,用于接收最初的溫度模擬量</p><p> 非易失性溫度報警觸發(fā)器(EEPROM)TH和TL??赏ㄟ^軟件寫入用戶報警上下限值。</p><p
39、> 配置寄存器,通過R0,R1位設(shè)置,溫度分辨率,出廠時R0=1,R1=1(即12位分辨率)具體設(shè)置方法如圖6所示:</p><p> 圖 6 分辨率設(shè)置寄存器</p><p> DS18B20高速暫存存儲器介紹:</p><p> 高速RAM由9個字節(jié)組成如表1所示:</p><p> 表1 DS18B20存儲器映像<
40、/p><p> 溫度轉(zhuǎn)換命令(44H)發(fā)出后在最長750ms的時間內(nèi),二進(jìn)制溫度值被存放于溫度高位和溫度低位(即高速RAM的第0和1字節(jié))。這時單片機按照低位在前,高位在后的方式讀取兩字節(jié)數(shù)據(jù),就可以通過一定的轉(zhuǎn)換規(guī)則得到十進(jìn)制溫度。在轉(zhuǎn)換時應(yīng)注意,當(dāng)S=0(正溫度)時,根據(jù)分辨率位數(shù)直接轉(zhuǎn)換為十進(jìn)制;當(dāng)S=1(負(fù)溫度)時,應(yīng)先將補碼取反加一,再進(jìn)行十進(jìn)制轉(zhuǎn)換。數(shù)據(jù)格式如圖7所示:</p><p
41、> 圖 7 溫度值格式圖</p><p> DS1302時鐘芯片介紹</p><p> DS1302引腳及內(nèi)部寄存器簡介</p><p> DS1302是美國達(dá)拉斯公司推出的一款功耗低功能全的實時時鐘芯片,RTC寄存器可提供年、月、日、時、分、秒、及周的時間值,另有31字節(jié)靜態(tài)RAM,采用串行三線接口與單片機進(jìn)行通信,突發(fā)方式下,可以一次性傳送多個字節(jié)
42、的數(shù)據(jù)或時鐘信號。工作電壓寬度2.5~5V ,用來保持片內(nèi)數(shù)據(jù)時功率控制在1毫瓦內(nèi)。具有備用電源引腳,也可以通過寄存器設(shè)置備用電源充電方式。DS1302的引腳如圖8所示:</p><p> 圖 8 DS1302引腳圖</p><p> 其中X1、X2外接32.768KHz晶振;GND接地;CE信號使能端,數(shù)據(jù)傳輸時必須保持高電平,;I/O 數(shù)據(jù)輸入/輸出引腳;SCLK串行時鐘,Vcc1
43、,Vcc2電源供電管腳。</p><p> DS1302關(guān)于時間和日期的寄存器如圖9所示,共有12個,編程時注意讀和寫的地址有所不同。</p><p> 圖 9 DS1302RTC寄存器</p><p> DS1302控制字,如表2-2所示:</p><p> 表2-2 DS1302控制字</p><p>
44、控制字從低位開始輸出,在下一個時鐘上升沿,寫入數(shù)據(jù),而在指令后的下一個時鐘下降沿,讀出數(shù)據(jù)。</p><p> DS1302讀寫時序</p><p> DS1302讀寫時序如圖10所示:</p><p> 圖 10 DS1302讀寫時序</p><p> CE高電平開啟數(shù)據(jù)傳送功能,數(shù)據(jù)傳輸時,數(shù)據(jù)在時鐘上升沿輸入,時鐘下降沿輸出。&
45、lt;/p><p> HS0038紅外一體接收器介紹</p><p> HS0038特點介紹</p><p> 紅外通信有紅外發(fā)射裝置和接收裝置組成,本項目紅外發(fā)射裝置為載波38KHz的普通紅外遙控器。HS0038能夠接受紅外信號,并能對信號放大,檢波,整形輸出單片機可以識別的TTL電平。單片機經(jīng)過一定的算法把接收到的數(shù)據(jù)進(jìn)行解碼。便可以得到遙控器鍵值。應(yīng)當(dāng)注意H
46、S0038輸出的數(shù)據(jù)正好和發(fā)射端的電平反向。</p><p> HS0038電路及應(yīng)用</p><p> HS0038引腳及封裝如圖11所示:</p><p> 圖 11 HS0038實物圖</p><p> 從左到右,引腳依次是:I/O數(shù)據(jù)端口、GND接地、VCC接+5V電源。</p><p> HS003
47、8在單片機系統(tǒng)中常用的電路如圖12所示</p><p> 圖 12 HS0038應(yīng)用電路圖</p><p> LCD12864液晶介紹</p><p> LCD12864性能概述及引腳功能</p><p> 本項目采用帶漢字字庫的液晶模塊,內(nèi)置8192個漢字128個字符還具有64*256的GDRAM可以用來繪制圖形。液晶正常工作的點壓
48、寬度為3.3~5V,顯示分辨率為128×64。應(yīng)用中可以通過寫入命令字來實現(xiàn)多種功能,如:開關(guān)光標(biāo),反白顯示,屏幕移位,睡眠 模式等。LCD12864具有20個引腳功能如表2所示:</p><p> 表 2 LCD12864引腳功能圖</p><p> 該液晶20個引腳與單片機的連接如圖13所示。</p><p> 圖 13 LCD12864與單片機
49、連接圖</p><p> 由于本項目采用8位并行數(shù)據(jù)傳輸方式,故其第15引腳PSB直接接高電平即可。</p><p> LCD12864讀寫時序及用戶指令集</p><p> 對LCD12864液晶的操作不外乎通過單片機不斷進(jìn)行讀寫,單片機寫數(shù)據(jù)到液晶模塊的時序圖如圖14所示</p><p> 圖 14 單片機寫數(shù)據(jù)到液晶模塊<
50、/p><p> 單片機讀取液晶模塊數(shù)據(jù)的時序圖如圖15所示。</p><p> 圖 15 單片機讀取液晶模塊數(shù)據(jù)</p><p> 由圖2-15可知寫數(shù)據(jù)或命令的操作大致如下,RS為高時寫數(shù)據(jù)RS為低時寫指令;RW引腳為低電平進(jìn)行寫操作;E引腳設(shè)置為高允許數(shù)據(jù)傳送,接著便把所傳數(shù)據(jù)放于數(shù)據(jù)引腳,E引腳再次拉低變完成了寫操作。</p><p>
51、; LCD12864有兩種指令集,基本指令集(RE=0)和擴充指令集(RE=1),寫指令時RS=0,RW=0。通過正確的時序?qū)懼噶羁梢栽O(shè)置LCD12864的很多功能,如寫入0x01指令即可清屏并把DDRAM地址計數(shù)器調(diào)整為“00H”,再如寫入指令“0xc”即可打開顯示關(guān)閉游標(biāo)。</p><p><b> 其他硬件電路</b></p><p> STC89C52R
52、C最小系統(tǒng)的設(shè)計</p><p> 本項目的單片機最小系統(tǒng)主要包括,STC89C52單片機,12M外接晶振,上電復(fù)位電路三個部分。</p><p> 最小系統(tǒng)晶振電路如圖16所示。</p><p><b> 圖 16 晶振電路</b></p><p> 晶振兩個引腳分別接與單片機的XTAL0和XTAL1引腳,電容
53、值的選擇范圍為5~30PF,電容對晶振頻率具有微調(diào)作用。</p><p> 最小系統(tǒng)復(fù)位電路如圖17所示。</p><p> 圖 17 上電復(fù)位電路</p><p> 單片機復(fù)位電路的設(shè)計必須能滿足上電震蕩穩(wěn)定后,保持至少兩個周期的高電平。本最小系統(tǒng)采用10uf的電容,經(jīng)驗證完全滿足要求。由于本電路上電即可以使單片機復(fù)位,又具有電源開關(guān),故省去了按鍵復(fù)位開關(guān)。
54、</p><p> 另外,由于本項目采用單片機內(nèi)部存儲器存儲程序,故單片機的第31引腳(EA)接高電平,用來訪問片內(nèi)程序。</p><p><b> 系統(tǒng)電源電路的設(shè)計</b></p><p> 由于所選用單片機為5V單片機,為得到較穩(wěn)定的5V電壓,本項目采用了L7805cv三端集成穩(wěn)壓管。輸出電壓4.75-5.25V,最大輸入電壓35v
55、,壓差3-5v時工作在理想狀態(tài)。輸出電流可達(dá)1.5A(需做好散熱),同時L7805cv內(nèi)部含有限流保護電路和過熱保護電路,防止負(fù)載過大溫度過高燒壞器件。本項目中L7805cv的應(yīng)用電路如圖18所示。</p><p> 圖 18 L7805cv穩(wěn)壓電路圖</p><p><b> 軟件開發(fā)平臺及軟件</b></p><p> 開發(fā)環(huán)境介紹及
56、程序總體結(jié)構(gòu)</p><p><b> 開發(fā)環(huán)境介紹</b></p><p> 本項目采用KEIL C51集成開發(fā)環(huán)境,它具有有好的界面,使用極為方便。支持匯編語言,C語言及其混合編程,能夠兼容絕大多數(shù)51系列單片機的程序設(shè)計和仿真。</p><p><b> 程序總體結(jié)構(gòu)</b></p><p&
57、gt; 由于整個系統(tǒng)涉及到的外設(shè)模塊較多,故采用了多文件模塊化編程,這樣大大提高了程序的可讀性,也為以后可能遇到的程序移植和升級提供了方便。整個項目的程序結(jié)構(gòu)如圖19所示。</p><p> 圖 19 程序結(jié)構(gòu)圖</p><p> 其中,main.c是項目主函數(shù)包含了各種外設(shè)的初始化及其功能函數(shù)的調(diào)用,DS18B20.c、IR.c、DS1302.c、LCD12864.c分別為溫度傳感
58、器、紅外接收器、時鐘芯片和液晶的驅(qū)動程序,SET.c是用來定時、定溫的功能模塊。</p><p> DS18B20溫度程序模塊</p><p> DS18B20操作流程</p><p> DS18B20操作流程如圖20所示。</p><p> 圖 20 DS18B20操作流程</p><p> DS18B20
59、部分程序代碼</p><p> /**********************************************************?</p><p> *DS18B20初始化</p><p> **********************************************************/</p><
60、;p> void DS18B20_Init()</p><p><b> {</b></p><p> DS1820_RSET();</p><p> DS1820_WData(0xCC); //跳過ROM</p><p> DS1820_WData(0x4E); //寫暫存器</p
61、><p> DS1820_RSET();</p><p><b> }</b></p><p> /**********************************************************</p><p><b> *DS1820復(fù)位</b></p>&
62、lt;p> **********************************************************/</p><p> bit DS1820_RSET()</p><p><b> {</b></p><p><b> uchar i;</b></p><p&
63、gt;<b> bit flag;</b></p><p> DS1820_bit=0;</p><p> for(i=230;i>0;i--); //延時480微秒,產(chǎn)生復(fù)位脈沖</p><p> DS1820_bit=1; //釋放總線</p><p> for(i=40;i&g
64、t;0;i--); //延時80微秒</p><p> flag=DS1820_bit; //得到引腳電平</p><p> for(i=200;i>0;i--); //延時400微秒等待總線恢復(fù)</p><p> return (flag); //如有需要測試flag==0,則器件正常</p><p&g
65、t;<b> }</b></p><p> /**********************************************************</p><p> *寫數(shù)據(jù)到DS1820</p><p> *********************************************************
66、*/</p><p> void DS1820_WData(uchar wData)</p><p><b> {</b></p><p> uchar i,j;</p><p> for(i=8;i>0;i--)</p><p><b> {</b><
67、/p><p> DS1820_bit=0; //低電平,產(chǎn)生寫信號</p><p> for(j=2;j>0;j--); //延時</p><p> DS1820_bit=wData&0x01; //發(fā)送1位</p><p> for(j=30;j>0;j--); //延時&
68、lt;/p><p> DS1820_bit=1; //釋放總線</p><p> wData>>=1; //右移一位寫下一位</p><p><b> }</b></p><p><b> }</b></p><p&g
69、t; /**********************************************************</p><p> *從DS1820中讀出數(shù)據(jù)</p><p> **********************************************************/</p><p> uchar DS1820_RDa
70、ta()</p><p><b> {</b></p><p> uchar i,j,Tmep;</p><p> for(i=8;i>0;i--)</p><p><b> {</b></p><p><b> Tmep>>=1;<
71、;/b></p><p> DS1820_bit=0; //低電平,產(chǎn)生讀信號</p><p> for(j=2;j>0;j--); //延時4us</p><p> DS1820_bit=1; //釋放總線,準(zhǔn)備讀數(shù)據(jù)</p><p> for(j=4;j>0;j--); /
72、/延時</p><p> if(DS1820_bit==1)</p><p> {Tmep|=0x80;}</p><p> for(j=30;j>0;j--); //延時</p><p> DS1820_bit=1; //拉高數(shù)據(jù)線,準(zhǔn)備讀下一位</p><p><b>
73、}</b></p><p> return(Tmep); //返回數(shù)據(jù)</p><p><b> }</b></p><p> /**********************************************************</p><p><b> /*
74、得到溫度值</b></p><p> **********************************************************/</p><p> void get_Wendu_data()</p><p><b> { </b></p><p> uchar temp_d
75、ata_2;</p><p> uint TempDec; //用來存放小數(shù)位</p><p><b> uchar i; </b></p><p> DS1820_RSET(); //復(fù)位</p><p> DS1820_WData(0xcc); //跳過ROM命令</p>
76、;<p> DS1820_WData(0x44); //溫度轉(zhuǎn)換命令</p><p> DS1820_RSET(); //復(fù)位,每次得到溫度值都要復(fù)位</p><p> DS1820_WData(0xcc); //跳過ROM命令</p><p> for(i=0;i<2;i++)</p><p&g
77、t;<b> {</b></p><p> Wendu_data[i]=DS1820_RData(); //讀共12位,分別存于兩個字節(jié) </p><p><b> }</b></p><p> DS1820_RSET(); //復(fù)位,結(jié)束時也要復(fù)位
78、 </p><p> temp_data=Wendu_data[1];</p><p> temp_data&=0xf0; //取高4位</p><p> if(temp_data==0xf0) //判斷是正溫度還是負(fù)溫度讀數(shù)</p><p> {
79、 </p><p> //負(fù)溫度求補,取反加1,判斷低8位是否有進(jìn)位</p><p> if(Wendu_data[0]==0)</p><p> { //有進(jìn)位,高8位取反加1</p><p> Wend
80、u_data[0]=~Wendu_data[0]+1;</p><p> Wendu_data[1]=~Wendu_data[1]+1;</p><p><b> }else</b></p><p> { //沒進(jìn)位,高8位不加1</p><p
81、> Wendu_data[0]=~Wendu_data[0]+1;</p><p> Wendu_data[1]=~Wendu_data[1];</p><p><b> }</b></p><p><b> }</b></p><p> temp_data=Wendu_data[1
82、]<<4; //取高字節(jié)低4位</p><p> temp_data_2=Wendu_data[0]>>4; //取低字節(jié)高4位</p><p> temp_data=temp_data|temp_data_2; //組合成一個八位數(shù)據(jù)</p><p> Wendu_ASCII[
83、0]=temp_data/100+0x30; //百位轉(zhuǎn)換為ASCII碼</p><p> Wendu_ASCII[1]=(temp_data%100)/10+0x30; //十位轉(zhuǎn)換為ASCII碼</p><p> Wendu_ASCII[2]=(temp_data%100)%10+0x30; //個位轉(zhuǎn)換為ASCII碼</p><p> W
84、endu_data[0]&=0x0f; //小數(shù)位轉(zhuǎn)換為ASCII碼</p><p> TempDec=Wendu_data[0]*625; //12位精度0.0625,擴大10000倍</p><p> Wendu_ASCII[3]=TempDec/1000+0x30; //十分位轉(zhuǎn)換為ASCII碼&
85、lt;/p><p> Wendu_ASCII[4]=(TempDec%1000)/100+0x30; //百分位轉(zhuǎn)換為ASCII碼</p><p><b> }</b></p><p> DS1302時間程序模塊</p><p> DS1302總體操作及基本讀寫功能函數(shù)</p><p>
86、DS1302總體操作如圖21所示。</p><p> 圖 21 DS1302操作總流程</p><p> DS1302讀寫操作流程如圖22所示。</p><p> 圖 22 DS1302讀寫操作流程</p><p><b> 具體代碼如下:</b></p><p> /*********
87、*************************************************</p><p> 通過時鐘寫入一字節(jié)數(shù)據(jù),在一個時鐘的上升沿數(shù)據(jù)被寫入</p><p> **********************************************************/</p><p> void DS1302_Write
88、Byte(unsigned char d) </p><p> { uchar i;</p><p><b> ACC = d; </b></p><p> SCLK=0; //初始時鐘線置為0</p><p> for(i=8; i>0; i--)</
89、p><p> {DS1302_IO = ACC0; </p><p> DS1302_CLK = 1; //制造上升沿 數(shù)據(jù)被傳輸</p><p> DS1302_CLK = 0; //再次拉低</p><p> ACC = ACC >> 1; </p><p><b&
90、gt; } </b></p><p><b> }</b></p><p> /**********************************************************</p><p> 通過時鐘讀取一字節(jié)數(shù)據(jù),在一個時鐘的下降沿DS1302數(shù)據(jù)被讀出</p><p>
91、**********************************************************/</p><p> unsigned char DS1302_ReadByte(void) </p><p> { uchar i; </p><p> for(i=8; i>0; i--)</p><p>
92、 { ACC = ACC >>1; </p><p> ACC7 = DS1302_IO;</p><p> DS1302_CLK = 1;</p><p> Delayus(1);</p><p> DS1302_CLK = 0; //制造下降沿</p><p><
93、b> } </b></p><p> return(ACC);</p><p><b> }</b></p><p> /**********************************************************</p><p> /向DS1302寫地址和數(shù)據(jù), Ad
94、dr地址,Dat數(shù)據(jù)</p><p> **********************************************************/</p><p> void Write1302_Cmd_Dat(unsigned char Addr, unsigned char Dat)</p><p> { DS1302_RST = 0;<
95、;/p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302_WriteByte(Addr); // 地址,命令 </p><p> DS1302_WriteByte(Dat); // 寫1Byte數(shù)據(jù)</p><p>
96、; DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p><b> } </b></p><p> /**********************************************************</p><p> /讀取DS1302某地址的數(shù)據(jù)
97、,</p><p> **********************************************************/</p><p> uchar Read1302(unsigned char Addr)</p><p> { uchar Dat;</p><p> DS1302_RST = 0;</
98、p><p> DS1302_CLK = 0;</p><p> DS1302_RST = 1;</p><p> DS1302_WriteByte(Addr|0x01); // 以寫數(shù)據(jù)時的地址為參考,讀時應(yīng)加1</p><p> Dat = DS1302_ReadByte(); // 讀取數(shù)據(jù)到變量Dat
99、</p><p> DS1302_CLK = 1;</p><p> DS1302_RST = 0;</p><p> return(Dat);</p><p><b> }</b></p><p> 讀取時間數(shù)據(jù)并轉(zhuǎn)化成字符串</p><p> 由于時間數(shù)據(jù)包
100、含年、月、日、時、分、秒、周,為了方便可以定義一個時間類型結(jié)構(gòu)體,把轉(zhuǎn)換前后的數(shù)據(jù)都作為這個結(jié)構(gòu)體的成員。</p><p> typedef struct </p><p> { unsigned char Week;</p><p> unsigned char Second;</p><p> unsigned char Ho
101、ur;</p><p> unsigned char Minute;</p><p> unsigned char Hour;</p><p> unsigned char Month;</p><p> unsigned char Day;</p><p> unsigned char Year;<
102、/p><p> unsigned char Str_Time[9];</p><p> unsigned char Str_Year[5];</p><p> unsigned char Str_Month[3];</p><p> unsigned char Str_Day[3];</p><p> }str
103、uct_TIM;</p><p> 然后,通過Read1302()函數(shù)讀取各個地址處的時間數(shù)據(jù)分別保存于Second、Minute等變量中并轉(zhuǎn)換成十進(jìn)制,如讀取并裝換秒值可以用以下兩個語句:</p><p> temp = Read1302(0x80);</p><p> //低四位是秒的個位,高三位是秒的十位(原來是BCD碼)</p><
104、p> Time->Second = ((temp &0x70)>>4)*10 + (temp &0x0F);</p><p> 接著就可以把數(shù)值轉(zhuǎn)換成字符串了,仍以秒值為例轉(zhuǎn)換語句如下:</p><p> Time->Str_Time[0] = Time->Second/10 + '0';//十位</p>
105、<p> Time->Str_Time[1] = Time->Second%10 + '0';//個位</p><p> 至此,所得數(shù)據(jù)便可以方便的顯示在液晶屏上了。</p><p> LCD12864液晶驅(qū)動程序</p><p> LCD12864初始化</p><p> LCD12864
106、初始化流程如圖23所示。</p><p> 圖 23 12864液晶初始化</p><p><b> 下面是初始化代碼:</b></p><p> void Init_12864() //LCD12864初始化</p><p> { delay(40)
107、; //大于40MS的延時程序</p><p> RES=0; //復(fù)位</p><p> delay(1); //延時</p><p> RES=1; //復(fù)位置高</p><p>
108、 Write12864_Cmd_Dat(0x30,0); //基本指令集</p><p> delay(100); //大于100uS的延時程序</p><p> Write12864_Cmd_Dat(0x30,0); //基本指令集</p><p> delay(37); //大于37
109、uS的延時程序</p><p> Write12864_Cmd_Dat(0x0C,0); //開顯示</p><p> delay(100); //大于100uS的延時程序</p><p> Write12864_Cmd_Dat(0x01,0); //清屏</p><p> delay(10);
110、 //大于10mS的延時程序</p><p> Write12864_Cmd_Dat(0x06,0); //光標(biāo)從右向左加1位移動</p><p> delay(100); //大于100uS的延時程序</p><p><b> }</b></p><
111、;p> 寫數(shù)據(jù)到LCD12864功能函數(shù)</p><p> //寫一字節(jié)數(shù)據(jù)或?qū)懨畹絃CD</p><p> void Write12864_Cmd_Dat(char data1,bit DI) //DI=0命令,DI=1數(shù)據(jù)</p><p><b> {</b></p><p><b>
112、WR=0;</b></p><p><b> RS=DI;</b></p><p><b> delay(1);</b></p><p><b> P0=data1;</b></p><p><b> E=1;</b></p>
113、;<p><b> delay(1);</b></p><p><b> E=0;</b></p><p><b> }</b></p><p> //從地址addr_12864開始,寫字符串到LCD </p><p> void writestring
114、(uchar addr_12864 ,uchar * str)</p><p><b> {</b></p><p> uchar i = 0;</p><p> Write12864_Cmd_Dat(addr_12864,0);</p><p> while(str[i] != '\0')<
115、;/p><p><b> {</b></p><p> Write12864_Cmd_Dat(str[i++],1); </p><p><b> }</b></p><p><b> }</b></p><p> //在地址addr,寫一個字符到
116、LCD</p><p> void writedat(uchar addr ,uchar dat)</p><p><b> {</b></p><p> Write12864_Cmd_Dat(addr,0);</p><p> Write12864_Cmd_Dat(dat,1);</p><
117、p><b> }</b></p><p> HS0038紅外解碼程序模塊</p><p><b> 紅外遙控器編碼介紹</b></p><p> 在進(jìn)行紅外解碼之前首先要對本項目采用的紅外遙控器編碼方式進(jìn)行簡要介紹。遙控器發(fā)送一組完整數(shù)據(jù)(見圖24),首先是9ms 高電平和4.5ms低電平組成的前導(dǎo)碼,緊接著
118、是8位地址碼及其反碼,最后便是8位操作碼及其反碼。具體的編碼方式為脈寬調(diào)制的串行碼,用0.56ms的高電平和0.56ms的低電平表示二進(jìn)制0,以0.56ms的高電平和1.68ms的低電平表示二進(jìn)制1,編碼形式如圖25所示。</p><p> 圖 24 遙控器發(fā)送一組完整數(shù)據(jù)</p><p> 圖 25 遙控器編碼的0和1</p><p> 紅外解碼程序流程及重
119、要代碼分析</p><p> 本項目中紅外遙控器作為控制單片機運行的按鍵,為了更好的實現(xiàn)按鍵功能紅外接收端接在了單片機的外部中斷0引腳,另外遙控器編碼采用脈寬調(diào)制方式,為了更精確的記錄脈寬時間需要啟用定時器功能,所以程序開始要進(jìn)行中斷和定時器的初始化。初始化代碼如下:</p><p> void Timer0init()</p><p><b> {
120、</b></p><p> TMOD=0x02; //定時器方式2 ,8位自動重裝</p><p><b> TH0=0x00;</b></p><p><b> TL0=0x00;</b></p><p> ET0=1; //定時器中斷允許</p><
121、;p><b> EA=1;</b></p><p> TR0=1; //開定時器</p><p><b> }</b></p><p> void Int0init()</p><p><b> {</b></p><p> IT
122、0=1; //下降沿觸發(fā)</p><p><b> EX0=1;</b></p><p> EA=1; //開總中斷</p><p><b> }</b></p><p> 中斷觸發(fā)方式采用下降沿觸發(fā),中斷程序只需要記錄兩個中斷之間時間值并保存,然后對相應(yīng)脈沖的時間值與標(biāo)準(zhǔn)的脈沖時間進(jìn)
123、行比較,這樣得出了是0還是1。由于中斷函數(shù)盡量要短,進(jìn)行解碼的工作盡量不要在中斷函數(shù)中進(jìn)行。下面是解碼函數(shù)和中斷函數(shù)。</p><p> /**********************************************************</p><p> 解碼函數(shù),按照脈寬調(diào)制標(biāo)準(zhǔn),1.12/0.256=4.375 此時間代表0值,</p><p
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- stc89c52單片機畢業(yè)論文
- 基于stc89c52單片機-紅外智能循跡小車
- 基于stc89c52單片機的智能循跡小車畢業(yè)論文
- 基于stc89c52單片機紅外測溫系統(tǒng)設(shè)計
- 基于單片機stc89c52的紅外線室內(nèi)防盜系統(tǒng)畢業(yè)論文
- STC89C52單片機.doc
- STC89C52單片機.doc
- STC89C52單片機.doc
- stc89c52單片機.pdf
- stc89c52單片機.pdf
- STC89C52單片機.doc
- stc89c52單片機.pdf
- STC89C52單片機.doc
- STC89C52單片機.doc
- STC89C52單片機.doc
- STC89C52單片機.doc
- STC89C52單片機.doc
- stc89c52單片機.pdf
- STC89C52單片機.doc
- stc89c52單片機.pdf
評論
0/150
提交評論