2023年全國(guó)碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩52頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、<p><b>  畢業(yè)設(shè)計(jì)</b></p><p>  課題名稱: 基于液晶顯示的智能萬年歷的設(shè)計(jì) </p><p>  設(shè)計(jì)時(shí)間: 2011 年09月—2011年12月 </p><p>  系 部:

2、 電子信息工程系 </p><p><b>  總目錄</b></p><p><b>  第一部分 任務(wù)書</b></p><p><b>  第二部分 開題報(bào)告</b></p><p>  第三部分 畢業(yè)設(shè)計(jì)正文<

3、;/p><p>  第 一 部 分</p><p><b>  任</b></p><p><b>  務(wù)</b></p><p><b>  書</b></p><p>  揚(yáng)州工業(yè)職業(yè)技術(shù)學(xué)院</p><p><b

4、>  畢業(yè)設(shè)計(jì)任務(wù)書</b></p><p>  第 二 部 分</p><p><b>  開</b></p><p><b>  題</b></p><p><b>  報(bào)</b></p><p><b>  告&

5、lt;/b></p><p>  揚(yáng)州工業(yè)職業(yè)技術(shù)學(xué)院 電子信息工程 系12屆</p><p>  畢業(yè)設(shè)計(jì)(論文)開題報(bào)告書(表1)</p><p>  第 三 部 分</p><p><b>  畢</b></p><p><b>  業(yè)</b></p&

6、gt;<p><b>  設(shè)</b></p><p><b>  計(jì)</b></p><p><b>  正</b></p><p><b>  文</b></p><p>  基于液晶顯示的智能萬年歷的設(shè)計(jì)</p><p

7、><b>  蔣冬冬 </b></p><p><b>  0901應(yīng)用電子</b></p><p>  [摘 要] 本設(shè)計(jì)以數(shù)字集成電路技術(shù)為基礎(chǔ),單片機(jī)技術(shù)為核心。軟件設(shè)計(jì)采用模塊化結(jié)構(gòu)、C語言編程。系統(tǒng)通過LCD1602顯示數(shù)據(jù),可以顯示年、月、日、時(shí)、分、秒、星期、溫度。硬件由主控器、時(shí)鐘電路、溫度檢測(cè)電路、顯示電路、按鍵電路、蜂

8、鳴器6個(gè)模塊組成。主控模塊用AT89C51、時(shí)鐘電路用時(shí)鐘芯片DS1302、顯示模塊用LCD1602、溫度檢測(cè)采用DS18B20溫度傳感器、按鍵電路用普通按鍵接上拉電阻完成。</p><p>  [關(guān)鍵詞] 單片機(jī)AT89C51 DS1302 DS18B20 液晶顯示 </p><p>  LCD-based design of intelligent calendar</p

9、><p>  Jiangdong Dong </p><p>  0901 Applied Electronics</p><p>  Abstract: The design of digital integrated circuit technology, chip technology as the core. Modular structure of softw

10、are design, C programming language. System through the LCD1602 display data, you can display year, month, day, hour, minute, second, week, temperature. Hardware by the master, the clock circuit, the temperature detection

11、 circuit, display circuit, key circuit, buzzer 6 modules. Control module with the AT89C51, clock circuit with a clock chip DS1302, display module with the LCD1602</p><p>  Key words: MCUAT89C51 DS1302 DS18

12、B20 LCDdisplay</p><p><b>  目 錄</b></p><p><b>  第一章 前言1</b></p><p>  1.1本課題研究的背景以及現(xiàn)實(shí)意義1</p><p>  1.2 本課題對(duì)于專業(yè)知識(shí)的綜合應(yīng)用情況1</p><p>  

13、第二章 智能萬年歷的工作概述以及原理分析2</p><p>  2.1智能萬年歷的工作概述2</p><p>  2.2各單元電路模塊介紹3</p><p>  2.2.1 單片機(jī)最小系統(tǒng)模塊3</p><p>  2.2.2 1602液晶顯示模塊3</p><p>  2.2.3 DS18B20溫度傳感器

14、???</p><p>  2.2.4 DS1302時(shí)間檢測(cè)模塊5</p><p>  2.2.5蜂鳴器模塊7</p><p>  2.2.6按鍵控制模塊7</p><p>  2.3 應(yīng)用Protel繪制系統(tǒng)總原理圖8</p><p>  2.3.1 Protel簡(jiǎn)介8</p><p&

15、gt;  2.3.2萬年歷電路總原理圖9</p><p>  第三章 應(yīng)用KEIL編程以及Proteus仿真10</p><p>  3.1 KEIL軟件的介紹10</p><p>  3.2 Proteus軟件的介紹10</p><p>  3.3 KEIL的模塊化編程10</p><p>  3.4 萬年

16、歷系統(tǒng)的軟件程序調(diào)試11</p><p>  3.5 液晶顯示程序及仿真13</p><p>  3.5.1 1602液晶顯示程序13</p><p>  3.5.2 液晶的仿真效果15</p><p>  3.6 溫度傳感器程序及仿真15</p><p>  3.6.1 溫度傳感器程序15</p&g

17、t;<p>  3.6.2溫度傳感器仿真18</p><p>  3.7 時(shí)鐘芯片程序及仿真19</p><p>  3.7.1時(shí)鐘芯片程序19</p><p>  3.7.2 時(shí)鐘芯片仿真25</p><p>  3.8 蜂鳴器程序及仿真26</p><p>  3.8.1蜂鳴器程序26&

18、lt;/p><p>  3.8.2蜂鳴器仿真26</p><p>  3.9 按鍵程序及仿真27</p><p>  3.9.1按鍵程序27</p><p>  3.9.2 按鍵仿真38</p><p>  3.10 主程序38</p><p>  3.11萬年歷系統(tǒng)總體仿真效果40&l

19、t;/p><p><b>  小 結(jié)42</b></p><p><b>  致 謝43</b></p><p><b>  參考文獻(xiàn)44</b></p><p><b>  第一章 前言</b></p><p>  1.1本

20、課題研究的背景以及現(xiàn)實(shí)意義</p><p>  隨著微電子技術(shù)和超大規(guī)模集成電路技術(shù)的不斷發(fā)展,家用電子產(chǎn)品不但種類日益豐富,而且變得更加經(jīng)濟(jì)實(shí)用,單片微型計(jì)算機(jī)體積小、性價(jià)比高、功能強(qiáng)、可靠性高等獨(dú)有的特點(diǎn),在各個(gè)領(lǐng)域得到了廣泛的應(yīng)用。電子萬年歷是一種應(yīng)用非常廣泛的日常計(jì)時(shí)工具,數(shù)字顯示的日歷鐘已經(jīng)越來越流行,特別是適合在家庭居室、辦公室、大廳、會(huì)議室、車站和廣場(chǎng)等使用。但通過我們對(duì)各種電子鐘表、歷的不斷觀察總

21、結(jié)發(fā)現(xiàn)目前市場(chǎng)的鐘、歷都存在一些不足之處,比如:時(shí)鐘不精確、產(chǎn)品成本太高、無環(huán)境溫度顯示等,這都給人們的使用帶來了某些不便。為此設(shè)計(jì)了一種功能全面、計(jì)時(shí)準(zhǔn)確、成本低廉的基于51單片機(jī)的萬年歷。</p><p>  1.2 本課題對(duì)于專業(yè)知識(shí)的綜合應(yīng)用情況</p><p>  由于學(xué)習(xí)的知識(shí)深度的限制以及實(shí)際情況的考慮,對(duì)于時(shí)間系統(tǒng)的電路設(shè)計(jì)采用了以Protel99se軟件進(jìn)行了電路原理圖設(shè)

22、計(jì)。電路上參考了揚(yáng)州工業(yè)職業(yè)設(shè)計(jì)的單片機(jī)開發(fā)板進(jìn)行設(shè)計(jì)。在設(shè)計(jì)中力求以最簡(jiǎn)單的電路來可靠完成時(shí)間系統(tǒng)的功能。在設(shè)計(jì)中嚴(yán)格按照工藝要求進(jìn)行元器件的布局以及布線等設(shè)計(jì),力求使得所設(shè)計(jì)的產(chǎn)品符合工藝化以及工程化的要求。在設(shè)計(jì)中綜合應(yīng)用了大學(xué)期間所學(xué)習(xí)的《模擬電子產(chǎn)品的安裝與測(cè)試》、《數(shù)字電子產(chǎn)品的安裝與測(cè)試》以及《電子產(chǎn)品的安裝與調(diào)試》等多門專業(yè)課程。本課題的選題難度適中,能夠?qū)?yīng)用電子技術(shù)專業(yè)學(xué)習(xí)的專業(yè)課程有較為全面的應(yīng)用與掌握,同時(shí)作為一

23、個(gè)綜合的應(yīng)用,也與自己的專業(yè)能力符合。</p><p>  第二章 智能萬年歷的工作概述以及原理分析</p><p>  2.1智能萬年歷的工作概述</p><p>  本設(shè)計(jì)是以AT89C51單片機(jī)為控制核心,具有在線編程功能,低功耗,能在3V超低壓工作;時(shí)鐘電路由DS1302提供,它是一種高性能、低功耗、帶RAM的實(shí)時(shí)時(shí)鐘電路,它可以對(duì)年、月、日、周日、時(shí)、分

24、、秒進(jìn)行計(jì)時(shí),具有閏年補(bǔ)償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進(jìn)行同步通信,并可采用突發(fā)方式一次傳送多個(gè)字節(jié)的時(shí)鐘信號(hào)或RAM數(shù)據(jù)。溫度檢測(cè)電路由DS18B20提供,當(dāng)溫度高于35度時(shí)會(huì)報(bào)警。顯示模塊由LCD1602提供,1602液晶模塊內(nèi)部的字符發(fā)生存儲(chǔ)器(CGROM)已經(jīng)存儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,這些字符有:阿拉伯?dāng)?shù)字、英文字母的大小寫、常用的符號(hào)。按鍵電路由普通的按鍵和上拉電阻組成。</p>

25、<p>  圖2-1 智能萬年歷的系統(tǒng)原理框圖</p><p>  2.2各單元電路模塊介紹</p><p>  2.2.1 單片機(jī)最小系統(tǒng)模塊</p><p>  利用單片機(jī)本身的資源外加時(shí)鐘電路、復(fù)位電路及電源電路可以構(gòu)成單片機(jī)的最小系統(tǒng)。在最小系統(tǒng)的基礎(chǔ)上連接需要的控制接口電路以及向程序存儲(chǔ)器中下載相應(yīng)的控制程序才能正常工作 。如下圖2-2 &l

26、t;/p><p>  圖2-2單片機(jī)最小系統(tǒng)模塊</p><p>  2.2.2 1602液晶顯示模塊</p><p>  液晶顯示器以其微功耗、體積小、顯示內(nèi)容豐富、超薄輕巧的諸多優(yōu)點(diǎn),在袖珍式儀表和低消耗應(yīng)用系統(tǒng)中得到越來越廣泛的應(yīng)用。LCD1602液晶模塊的容量為2行16個(gè)字,是一種5*7點(diǎn)陣圖形來顯示字符的液晶顯示器,LCD1602模塊內(nèi)部的字符發(fā)生存儲(chǔ)器已經(jīng)存

27、儲(chǔ)了160個(gè)不同的點(diǎn)陣字符圖形,每一個(gè)字符都有一個(gè)固定的代碼,如A的代碼是010000001B。其工作電壓是4.5V-5.5V,工作電流是2.0mA,模塊最佳工作電壓是5V。液晶電路如下圖2-3</p><p>  圖2-3液晶顯示模塊</p><p>  2.2.3 DS18B20溫度傳感器???lt;/p><p>  DS18B20數(shù)字溫度傳感器接線方便,封裝成后可

28、應(yīng)用于多種場(chǎng)合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號(hào)多種多樣,有LTM8877,LTM8874等等。主要根據(jù)應(yīng)用場(chǎng)合的不同而改變其外觀。封裝后的DS18B20可用于電纜溝測(cè)溫,高爐水循環(huán)測(cè)溫,鍋爐測(cè)溫,機(jī)房測(cè)溫,農(nóng)業(yè)大棚測(cè)溫,潔凈室測(cè)溫,彈藥庫測(cè)溫等各種非極限溫度場(chǎng)合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設(shè)備數(shù)字測(cè)溫和控制領(lǐng)域。</p><p>  圖 2-4 溫度傳感器DS1

29、8B20的外形圖</p><p>  DS18B20的主要特性如下:適應(yīng)電壓范圍更寬,電壓范圍:3.0~5.5V,在寄生電源方式下可由數(shù) 據(jù)線供電 。獨(dú)特的單線接口方式,DS18B20在與微處理器連接時(shí)僅需要一條口線即可實(shí)現(xiàn)微處理器與DS18B20的雙向通訊 ,DS18B20支持多點(diǎn)組網(wǎng)功能,多個(gè)DS18B20可以并聯(lián)在唯一的三線上,實(shí)現(xiàn)組網(wǎng)多點(diǎn)測(cè)溫 。DS18B20在使用中不需要任何外圍元件,全部傳感元件及轉(zhuǎn)換

30、電路集成在形如一只三極管的集成電路內(nèi),芯片的測(cè)溫范圍-55℃~+125℃,在-10~+85℃時(shí)精度為±0.5℃ 。在正常工作的時(shí)候,可編程的分辨率為9~12位,對(duì)應(yīng)的可分辨溫度分別為0.5℃、0.25℃、0.125℃和0.0625℃,可實(shí)現(xiàn)高精度測(cè)溫 。芯片具有較高的轉(zhuǎn)換速度,在9位分辨率時(shí)最多在 93.75ms內(nèi)把溫度轉(zhuǎn)換為數(shù)字,12位分辨率時(shí)最多在750ms內(nèi)把溫度值轉(zhuǎn)換為數(shù)字,速度更快 最重要的是,測(cè)量結(jié)果直接輸出數(shù)字溫

31、度信號(hào),以"一 線總線"串行傳送給CPU,同時(shí)可傳送CRC校驗(yàn)碼,具有極強(qiáng)的抗干擾糾錯(cuò)能力 當(dāng)電源極性接反時(shí),芯片不會(huì)因發(fā)熱而燒毀, 但不能正常工作。其結(jié)構(gòu)如下圖2-5</p><p>  圖2-5 DS18B20溫度傳感器模塊</p><p>  2.2.4 DS1302時(shí)間檢測(cè)模塊</p><p>  DS1302是DALLAS公司推出的涓流

32、充電時(shí)鐘芯片,內(nèi)含一個(gè)實(shí)時(shí)時(shí)鐘/日歷和31字節(jié)靜態(tài)RAM,可以通過串行接口與單片機(jī)進(jìn)行通信。實(shí)時(shí)時(shí)鐘/日歷電路提供秒、分、時(shí)、日、星期、月、年的信息,每個(gè)月的天數(shù)和閏年的天數(shù)可自動(dòng)調(diào)整,時(shí)鐘操作可通過AM/PM標(biāo)志位決定采用24或12小時(shí)時(shí)間格式。DS1302與單片機(jī)之間能簡(jiǎn)單地采用同步串行的方式進(jìn)行通信,僅需三根I/O線:復(fù)位(RST)、I/O數(shù)據(jù)線、串行時(shí)鐘(SCLK)。時(shí)鐘/RAM的讀/寫數(shù)據(jù)以一字節(jié)或多達(dá)31字節(jié)的字符組方式通信

33、。DS1302工作時(shí)功耗很低,保持?jǐn)?shù)據(jù)和時(shí)鐘信息時(shí),功耗小于1mW。引腳功能圖如圖2-7</p><p>  圖2-6 時(shí)鐘芯片外形 圖2-7 引腳功能圖</p><p>  DS1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時(shí)鐘的連續(xù)運(yùn)行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vc

34、c1+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輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時(shí),所有的數(shù)據(jù)傳送被初始化,允許對(duì)DS1302進(jìn)行操作。如果在傳送過程中

35、RST置為低電平,則會(huì)終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運(yùn)行時(shí),在Vcc≥2.5V之前,RST必須保持低電平。只有在SCLK為低電平時(shí),才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),后面有詳細(xì)說明。SCLK始終是輸入端。其原理圖如下圖2-8</p><p>  圖2-8 DS1302時(shí)間檢測(cè)模塊</p><p>  2.2.5蜂鳴器模塊</p><

36、;p>  在單片機(jī)應(yīng)用的設(shè)計(jì)上,很多方案都會(huì)用到蜂鳴器,大部分都是使用蜂鳴器來做提示或報(bào)警,比如按鍵按下、開始工作、工作結(jié)束或是故障等等。本設(shè)計(jì)中用于報(bào)警,當(dāng)溫度高于35度時(shí),發(fā)出聲音。由于蜂鳴器的工作電流一般比較大,以致于單片機(jī)的I/O 口是無法直接驅(qū)動(dòng)的,一般用三極管來驅(qū)動(dòng)它。如圖2-10</p><p><b>  圖2-9蜂鳴器外形</b></p><p&g

37、t;  圖2-10蜂鳴器模塊</p><p>  2.2.6按鍵控制模塊</p><p>  每一個(gè)按鍵的電路是獨(dú)立的,占用一條數(shù)據(jù)線,上拉電阻保證了按鍵斷開時(shí),I/O口線有確定的高電平。當(dāng)其中任意一鍵按下時(shí),它所對(duì)應(yīng)的數(shù)據(jù)線的電平就變成低電平,若無鍵閉合,則所有數(shù)據(jù)線都是高電平。這種鍵盤電路配置靈活,占用I/O口多,適合少量按鍵的情況,按下S2未設(shè)置時(shí)間,按下S3為加時(shí)間,按下S4為減時(shí)

38、間,按下S5為退出設(shè)置。如圖2-11</p><p>  圖2-11 按鍵模塊</p><p>  2.3 應(yīng)用Protel繪制系統(tǒng)總原理圖</p><p>  2.3.1 Protel簡(jiǎn)介</p><p>  Protel99SE是澳大利亞ProtelTechnology公司推出的一個(gè)全32位的電路板設(shè)計(jì)軟件。該軟件功能強(qiáng)大,人機(jī)界面友好,

39、易學(xué)易用,使用該軟件設(shè)計(jì)者可以容易設(shè)計(jì)電路原理圖、畫元件圖、設(shè)計(jì)電路板圖、畫元件封裝圖和電路仿真,是夜內(nèi)人士首選的電路板設(shè)計(jì)工具。使用電腦設(shè)計(jì)電路原理圖和電路板圖是把電子技術(shù)從理論運(yùn)用到實(shí)際的第一步。只有會(huì)設(shè)計(jì)電路原理圖和電路板圖才能進(jìn)行電子產(chǎn)品的研發(fā)與開發(fā)。本軟件就是從理論走向?qū)嶋H,掌握電子產(chǎn)品開發(fā)的基本技術(shù)。繪制電路原理圖的主要步驟有:進(jìn)入Protel 99SE環(huán)境;使用菜單File/New建立新設(shè)計(jì)數(shù)據(jù)庫文件;使用菜單File/N

40、ew在打開窗口選擇Schematic Document圖標(biāo),建立新原理圖文件;將原理圖打開;設(shè)置畫圖環(huán)境;添加元件庫;將所需元件從元件庫中取出來,放置在圖紙上,并且調(diào)整好位置;使用連線工具將元件連起來,設(shè)置元件屬性,對(duì)元件進(jìn)行編號(hào);進(jìn)行電氣規(guī)格檢查(ERC);建立網(wǎng)絡(luò)表,為制作電路板圖做準(zhǔn)備。繪制完成的電路原理圖,除了保證電路原理圖的正確性以外,同時(shí)要注意原理圖繪制中的工藝要求。原理圖的繪制首先注意的就是原理圖的標(biāo)題欄的設(shè)置</p

41、><p>  2.3.2萬年歷電路總原理圖</p><p>  單片機(jī)采用AT89C51芯片,通過該芯片連接各模塊電路,從而形成完整的萬年歷系統(tǒng),總原理圖如下圖2-12</p><p>  圖2-12萬年歷電路總原理圖</p><p>  第三章 應(yīng)用KEIL編程以及Proteus仿真</p><p>  3.1 KEIL

42、軟件的介紹</p><p>  KEIL C51是美國(guó)KEIL Software公司出品的51系列兼容單片機(jī)C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護(hù)性上有明顯的優(yōu)勢(shì),因而易學(xué)易用.KEIL C51軟件提供豐富的庫函數(shù)和功能強(qiáng)大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點(diǎn),只要看一下編譯后生成的匯編代碼,就能體會(huì)到KEIL C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯

43、編代碼很緊湊,容易理解。在開發(fā)大型軟件時(shí)更能體現(xiàn)高級(jí)語言的優(yōu)勢(shì)。. 通過一個(gè)集成開發(fā)環(huán)境(vision)將這些部分組合在一起。運(yùn)行KEIL軟件需要WIN98、NT、WIN2000、WINXP等操作系統(tǒng)。如果你使用C語言編程,那么KEIL幾乎就是你的不二之選,即使不使用C語言而僅用匯編語言編程,其方便易用的集成環(huán)境、強(qiáng)大的軟件仿真調(diào)試工具也會(huì)令你事半功倍。</p><p>  3.2 Proteus軟件的介紹<

44、;/p><p>  Protues軟件是英國(guó)Labcenter electronics公司出版的EDA工具軟件。它不僅具有其它EDA工具軟件的仿真功能,還能仿真單片機(jī)及外圍器件。它是目前最好的仿真單片機(jī)及外圍器件的工具。雖然目前國(guó)內(nèi)推廣剛起步,但已受到單片機(jī)愛好者、從事單片機(jī)教學(xué)的教師、致力于單片機(jī)開發(fā)應(yīng)用的科技工作者的青睞。Proteus是世界上著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機(jī)與外圍電路

45、協(xié)同仿真,一鍵切換到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。是目前世界上唯一將電路仿真軟件、PCB設(shè)計(jì)軟件和虛擬模型仿真軟件三合一的設(shè)計(jì)平臺(tái),其處理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,在編譯方面,它也支持IAR、keil和MPLAB等多種編譯。</p><p>  3.3 KEIL的模塊化編程</p>

46、<p>  在使用 KEIL 的時(shí)候,我們習(xí)慣上在一個(gè)C 的文件中把自己要寫的東西按照自己思路的順序進(jìn)行順序書寫。這樣是很普遍的寫法,當(dāng)程序比較短的時(shí)候比如幾十行或者一百多行,是沒有什么問題的。但是當(dāng)程序很長(zhǎng)的時(shí)候,比如你要用到 LCD 顯示數(shù)據(jù),就有幾個(gè) LCD 相關(guān)的函數(shù),然后你想在 LCD 上顯示溫度,那么就要有 DS18B20 相關(guān)的操作,這又有幾個(gè)相關(guān)的函數(shù), 如果你還想加上去 DS1302的時(shí)間顯示功能,那么又

47、要多很多函數(shù)。這樣的話一個(gè)程序下來幾百行是很正常的事情,對(duì)于自己寫的程序可能在自己的腦海中比較清晰,不會(huì)太亂,但是當(dāng)把自己寫的程序交給別人來看的時(shí)候,別人往往會(huì)看的云里霧里,經(jīng)常會(huì)看著看著就不知道你寫的是什么了。于是,我們就想到了用模塊化編程的方法,把一個(gè)大項(xiàng)目分割成若干個(gè)小項(xiàng)目,然后每一個(gè)小項(xiàng)目寫一個(gè).C文件,最后在一個(gè)主函數(shù)中把這些小程序組合在一起。這樣寫的好處是可讀性比較強(qiáng),以及可移植性比較好,可以方便以后的編程。</p&g

48、t;<p>  3.4 萬年歷系統(tǒng)的軟件程序調(diào)試</p><p>  1.單擊項(xiàng)目窗口中Target1前面“+”號(hào)展開目錄。在Source Group 1目錄上單擊鼠標(biāo)右鍵,選中彈出菜單項(xiàng)Add files to Group “Source Group 1”。最后在彈出的對(duì)話框中按文件類型找到要添加的源程序文件(例如text1.asm),點(diǎn)擊add將源程序文件添加到目錄。如圖3-1所示。</p

49、><p>  圖3-1 添加源程序后效果圖</p><p>  2.在添加源程序到項(xiàng)目后,在項(xiàng)目工作界面點(diǎn)擊Project菜單,在下拉菜單中選中Translate,將編譯當(dāng)前文件;選中Build target,將編譯當(dāng)前文件并生成應(yīng)用;選中Rebuild all target files,將重新編譯所有文件并生成應(yīng)用。若無錯(cuò)誤,如圖3-2所示。</p><p>  圖3

50、-2編譯后輸出效果圖</p><p>  3.通過如圖3-2所示的對(duì)話框,選擇剛才編譯生成的.HEX文件。如圖3-3所示。</p><p>  圖3-3 參數(shù)設(shè)置圖</p><p>  3.5 液晶顯示程序及仿真</p><p>  3.5.1 1602液晶顯示程序</p><p>  #include<reg5

51、1.h></p><p>  #include <LCD1602.H></p><p>  #include <intrins.h></p><p>  sbit LcdRs= P2^0;//定義端口</p><p>  sbit LcdRw= P2^1;</p><p>  

52、sbit LcdEn = P2^2;</p><p>  sfr DBPort = 0x80;</p><p>  unsigned char LCD_Wait(void)</p><p><b>  {</b></p><p><b>  LcdRs=0;</b></p>&

53、lt;p>  LcdRw=1;_nop_();</p><p>  LcdEn=1;_nop_();</p><p><b>  LcdEn=0;</b></p><p>  return DBPort;</p><p><b>  }</b></p><p>

54、  void LCD_Write(bit style, unsigned char input)</p><p><b>  {</b></p><p><b>  LcdEn=0;</b></p><p>  LcdRs=style;</p><p>  LcdRw=0;_nop_();<

55、;/p><p>  DBPort=input;_nop_();</p><p>  LcdEn=1;_nop_();</p><p>  LcdEn=0;_nop_();</p><p>  LCD_Wait();</p><p><b>  }</b></p><p&

56、gt;  void LCD_SetDisplay(unsigned char DisplayMode)</p><p><b>  {</b></p><p>  LCD_Write(LCD_COMMAND, 0x08|DisplayMode);</p><p><b>  }</b></p><p&

57、gt;  void LCD_SetInput(unsigned char InputMode)</p><p><b>  {</b></p><p>  LCD_Write(LCD_COMMAND, 0x04|InputMode);</p><p><b>  }</b></p><p>  vo

58、id LCD_Initial()</p><p><b>  {</b></p><p><b>  LcdEn=0;</b></p><p>  LCD_Write(LCD_COMMAND,0x38); </p><p>  LCD_Write(LCD_COMMAND,0x38

59、);</p><p>  LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); </p><p>  LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); </p><p>  LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); </p><p&g

60、t;<b>  }</b></p><p>  void GotoXY(unsigned char x, unsigned char y)</p><p><b>  {</b></p><p><b>  if(y==0)</b></p><p>  LCD_Write(LC

61、D_COMMAND,0x80|x);</p><p><b>  if(y==1)</b></p><p>  LCD_Write(LCD_COMMAND,0x80|(x-0x40));</p><p><b>  }</b></p><p>  void Print(unsigned char *

62、str)</p><p><b>  {</b></p><p>  while(*str!='\0')</p><p><b>  {</b></p><p>  LCD_Write(LCD_DATA,*str);</p><p><b>  st

63、r++;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  這是液晶的驅(qū)動(dòng)程序,在這個(gè)程序中根據(jù)數(shù)據(jù)手冊(cè)對(duì)該液晶進(jìn)行初始化,然后根據(jù)時(shí)序圖讀液晶的程序,以及寫液晶的程序。重要的就是要把握好延時(shí)的時(shí)間,對(duì)液晶的忙檢測(cè)可以延長(zhǎng)一點(diǎn)時(shí)間來解決。</p&

64、gt;<p>  3.5.2 液晶的仿真效果</p><p><b>  圖3-4 液晶顯示</b></p><p>  3.6 溫度傳感器程序及仿真</p><p>  3.6.1 溫度傳感器程序</p><p>  #include"ds18b20.h"</p><

65、;p>  #include"delay.h"</p><p>  #include<reg51.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit DQ = P1^0;

66、 </p><p>  int temp_value; </p><p>  unsigned char TempBuffer[5]; </p><p>  void delay_18B20(unsigned int i)</p><p><b>  {</b></p><p>

67、;  while(i--);</p><p><b>  }</b></p><p>  void Init_DS18B20(void) </p><p><b>  {</b></p><p>  unsigned char x=0;</p><p>  DQ = 1;

68、 </p><p>  delay_18B20(8); </p><p>  DQ = 0; //單片機(jī)將DQ拉低</p><p>  delay_18B20(80); //精確延時(shí) 大于 480us</p><p>  DQ = 1; //拉高總線</p><p>

69、;  delay_18B20(14);</p><p>  x=DQ; </p><p>  delay_18B20(20);</p><p><b>  }</b></p><p>  unsigned char ReadOneChar(void)</p><p><

70、;b>  {</b></p><p>  uchar i=0;</p><p>  uchar dat = 0;</p><p>  for (i=8;i>0;i--)</p><p><b>  {</b></p><p>  DQ = 0; // 給脈沖信號(hào)</p

71、><p><b>  dat>>=1;</b></p><p>  DQ = 1; // 給脈沖信號(hào)</p><p><b>  if(DQ)</b></p><p>  dat|=0x80;</p><p>  delay_18B20(4);</p>

72、<p><b>  }</b></p><p>  return(dat);</p><p><b>  }</b></p><p>  void WriteOneChar(uchar dat)</p><p><b>  {</b></p><p

73、>  unsigned char i=0;</p><p>  for (i=8; i>0; i--)</p><p><b>  {</b></p><p><b>  DQ = 0;</b></p><p>  DQ = dat&0x01;</p><p&

74、gt;  delay_18B20(5);</p><p><b>  DQ = 1;</b></p><p><b>  dat>>=1;</b></p><p><b>  }</b></p><p><b>  }</b></p>

75、;<p>  void ReadTemp(void)</p><p><b>  {</b></p><p>  unsigned char a=0;</p><p>  unsigned char b=0;</p><p>  unsigned char t=0;</p><p>

76、  Init_DS18B20(); </p><p>  WriteOneChar(0xCC); </p><p>  WriteOneChar(0x44); </p><p>  delay_18B20(100); </p><p>  Init_DS18B20();</p><p>  Wr

77、iteOneChar(0xCC); </p><p>  WriteOneChar(0xBE); </p><p>  delay_18B20(100);</p><p>  a=ReadOneChar(); //讀取溫度值低位</p><p>  b=ReadOneChar(); //讀取溫度值高位</p>

78、<p>  temp_value=b<<4;</p><p>  temp_value+=(a&0xf0)>>4; </p><p><b>  }</b></p><p>  void temp_to_str() //溫度數(shù)據(jù)轉(zhuǎn)換成液晶字符顯示</p>

79、<p><b>  {</b></p><p>  TempBuffer[0]=temp_value/10+'0'; //十位</p><p>  TempBuffer[1]=temp_value%10+'0'; //個(gè)位</p><p>  TempBuffer[2]=0xdf; //溫度符

80、號(hào)</p><p>  TempBuffer[3]='C';</p><p>  TempBuffer[4]='\0';</p><p><b>  }</b></p><p>  DS18B20溫度傳感器的驅(qū)動(dòng)程序是根據(jù)數(shù)據(jù)手冊(cè),先對(duì)傳感器進(jìn)行初始化。然后根據(jù)時(shí)序圖寫讀字節(jié)的程序和寫字節(jié)

81、的程序,最后把寫讀溫度的程序,把檢測(cè)到的溫度開始轉(zhuǎn)換為數(shù)字量,然后顯示在液晶上。</p><p>  3.6.2溫度傳感器仿真</p><p><b>  圖3-5 溫度顯示</b></p><p>  DS18B20檢測(cè)到的溫度實(shí)時(shí)體現(xiàn)到液晶上。</p><p>  3.7 時(shí)鐘芯片程序及仿真</p>&

82、lt;p>  3.7.1時(shí)鐘芯片程序</p><p>  #include"ds1302.h"</p><p>  #include"delay.h"</p><p>  #include<reg51.h></p><p>  sbit DS1302_CLK = P1^6;

83、 </p><p>  sbit DS1302_IO = P1^7; </p><p>  sbit DS1302_RST = P1^5; </p><p>  sbit ACC0 = ACC^0;</p><p>  sbit ACC7 = ACC^7;</p

84、><p>  unsigned char week_value[2];</p><p>  char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; , </p><p>  typedef struct __SYSTEMTIME__</p><p>&

85、lt;b>  {</b></p><p>  unsigned char Second;</p><p>  unsigned char Minute;</p><p>  unsigned char Hour;</p><p>  unsigned char Week;</p><p>  unsi

86、gned char Day;</p><p>  unsigned char Month;</p><p>  unsigned char Year;</p><p>  unsigned char DateString[11];</p><p>  unsigned char TimeString[9];</p><p

87、>  }SYSTEMTIME; </p><p>  SYSTEMTIME CurrentTime;</p><p>  #define AM(X)X</p><p>  #define PM(X)(X+12) </p><p>  #define DS1302_SECOND0x80

88、</p><p>  #define DS1302_MINUTE0x82</p><p>  #define DS1302_HOUR0x84 </p><p>  #define DS1302_WEEK0x8A</p><p>  #define DS1302_DAY0x86</p><p>  #def

89、ine DS1302_MONTH0x88</p><p>  #define DS1302_YEAR0x8C </p><p>  void DS1302InputByte(unsigned char d) </p><p><b>  { </b></p><p>  unsigned char i;<

90、/p><p><b>  ACC = d;</b></p><p>  for(i=8; i>0; i--)</p><p><b>  {</b></p><p>  DS1302_IO = ACC0; </p><p>  DS1302_CLK =

91、 1;</p><p>  DS1302_CLK = 0;</p><p>  ACC = ACC >> 1; </p><p><b>  } </b></p><p><b>  }</b></p><p>  unsigned char DS1302Outp

92、utByte(void) </p><p><b>  { </b></p><p>  unsigned char i;</p><p>  for(i=8; i>0; i--)</p><p><b>  {</b></p><p>  ACC = ACC >

93、;>1; </p><p>  ACC7 = DS1302_IO;</p><p>  DS1302_CLK = 1;</p><p>  DS1302_CLK = 0;</p><p><b>  } </b></p><p>  return(ACC); <

94、/p><p><b>  }</b></p><p>  void Write1302(unsigned char ucAddr, unsigned char ucDa) , </p><p><b>  {</b></p><p>  DS1302_RST = 0;</p><p

95、>  DS1302_CLK = 0;</p><p>  DS1302_RST = 1;</p><p>  DS1302InputByte(ucAddr); </p><p>  DS1302InputByte(ucDa); </p><p>  DS1302_CLK = 1;</p>&l

96、t;p>  DS1302_RST = 0;</p><p><b>  } </b></p><p>  unsigned char Read1302(unsigned char ucAddr) </p><p><b>  {</b></p><p>  unsigned char ucD

97、ata;</p><p>  DS1302_RST = 0;</p><p>  DS1302_CLK = 0;</p><p>  DS1302_RST = 1;</p><p>  DS1302InputByte(ucAddr|0x01); </p><p>  ucData = DS1302Outp

98、utByte(); </p><p>  DS1302_CLK = 1;</p><p>  DS1302_RST = 0;</p><p>  return(ucData);</p><p><b>  }</b></p><p>  void DS1302_GetTime(SYS

99、TEMTIME *Time) </p><p><b>  {</b></p><p>  unsigned char ReadValue;</p><p>  ReadValue = Read1302(DS1302_SECOND);</p><p>  Time->Second = ((ReadValue&a

100、mp;0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_MINUTE);</p><p>  Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p

101、>  ReadValue = Read1302(DS1302_HOUR);</p><p>  Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_DAY);</p><p>  Time

102、->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_WEEK);</p><p>  Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x

103、0F);</p><p>  ReadValue = Read1302(DS1302_MONTH);</p><p>  Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p>  ReadValue = Read1302(DS1302_YEAR);<

104、;/p><p>  Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);</p><p><b>  }</b></p><p>  void DateToStr(SYSTEMTIME *Time) </p><p>

105、  { if(hide_year<2) </p><p>  { </p><p>  Time->DateString[0] = '2';</p><p>  Time->DateString[1] = '0'; &

106、lt;/p><p>  Time->DateString[2] = Time->Year/10 + '0';</p><p>  Time->DateString[3] = Time->Year%10 + '0';</p><p><b>  }</b></p><p>

107、;<b>  else</b></p><p><b>  { </b></p><p>  Time->DateString[0] = ' ';</p><p>  Time->DateString[1] = ' '; </p><p>  Time

108、->DateString[2] = ' ';</p><p>  Time->DateString[3] = ' ';</p><p><b>  }</b></p><p>  Time->DateString[4] = '/';</p><p>  i

109、f(hide_month<2)</p><p><b>  {</b></p><p>  Time->DateString[5] = Time->Month/10 + '0';</p><p>  Time->DateString[6] = Time->Month%10 + '0'

110、;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Time->DateString[5] = ' ';</p><p>  Time

111、->DateString[6] = ' ';</p><p><b>  }</b></p><p>  Time->DateString[7] = '/';</p><p>  if(hide_day<2)</p><p><b>  {</b>&

112、lt;/p><p>  Time->DateString[8] = Time->Day/10 + '0';</p><p>  Time->DateString[9] = Time->Day%10 + '0';</p><p><b>  }</b></p><p>&

113、lt;b>  else</b></p><p><b>  {</b></p><p>  Time->DateString[8] = ' ';</p><p>  Time->DateString[9] = ' '; </p><p><b&g

114、t;  }</b></p><p>  if(hide_week<2)</p><p><b>  {</b></p><p>  week_value[0] = Time->Week%10 -1 + '0'; </p><p><b>  }</b><

115、;/p><p><b>  else</b></p><p><b>  {</b></p><p>  week_value[0] = ' ';</p><p><b>  }</b></p><p>  week_value[1] = &

116、#39;\0';</p><p>  Time->DateString[10] = '\0'; </p><p><b>  }</b></p><p>  void TimeToStr(SYSTEMTIME *Time) </p><p>  { if(hide_hour<

117、2)</p><p><b>  {</b></p><p>  Time->TimeString[0] = Time->Hour/10 + '0';</p><p>  Time->TimeString[1] = Time->Hour%10 + '0';</p><p

118、><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Time->TimeString[0] = ' ';</p><p>  Time->TimeString[1]

119、 = ' ';</p><p><b>  }</b></p><p>  Time->TimeString[2] = ':';</p><p>  if(hide_min<2)</p><p><b>  {</b></p><p&g

120、t;  Time->TimeString[3] = Time->Minute/10 + '0';</p><p>  Time->TimeString[4] = Time->Minute%10 + '0';</p><p><b>  }</b></p><p><b>  el

121、se</b></p><p><b>  {</b></p><p>  Time->TimeString[3] = ' ';</p><p>  Time->TimeString[4] = ' ';</p><p><b>  }</b>&l

122、t;/p><p>  Time->TimeString[5] = ':';</p><p>  if(hide_sec<2)</p><p><b>  {</b></p><p>  Time->TimeString[6] = Time->Second/10 + '0'

123、;;</p><p>  Time->TimeString[7] = Time->Second%10 + '0';</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></

124、p><p>  Time->TimeString[6] = ' ';</p><p>  Time->TimeString[7] = ' ';</p><p><b>  }</b></p><p>  Time->DateString[8] = '\0';&

125、lt;/p><p><b>  }</b></p><p>  void Initial_DS1302(void) </p><p><b>  { </b></p><p>  unsigned char Second=Read1302(DS1302_SECOND);</p>

126、<p>  if(Second&0x80) </p><p><b>  {</b></p><p>  Write1302(0x8e,0x00); //寫入允許</p><p>  Write1302(0x8c,0x07); //以下寫入初始化時(shí)間 </p><p>  Write130

127、2(0x88,0x07);</p><p>  Write1302(0x86,0x25);</p><p>  Write1302(0x8a,0x07);</p><p>  Write1302(0x84,0x23);</p><p>  Write1302(0x82,0x59);</p><p>  Write130

128、2(0x80,0x55);</p><p>  Write1302(0x8e,0x80); //禁止寫入</p><p><b>  }</b></p><p><b>  }</b></p><p>  DS1302時(shí)鐘芯片的驅(qū)動(dòng)程序要首先根據(jù)數(shù)據(jù)手冊(cè),先對(duì)芯片進(jìn)行初始化。然后根據(jù)時(shí)序圖寫讀字節(jié)的

129、程序和寫字節(jié)的程序,最后把寫讀時(shí)間的程序,把檢測(cè)到的時(shí)間開始轉(zhuǎn)換為數(shù)字量,然后顯示在液晶上。</p><p>  3.7.2 時(shí)鐘芯片仿真</p><p><b>  圖3-6 時(shí)間顯示</b></p><p>  DS1302檢測(cè)到的時(shí)間實(shí)時(shí)體現(xiàn)到液晶。</p><p>  3.8 蜂鳴器程序及仿真</p>

130、;<p>  3.8.1蜂鳴器程序</p><p>  #include <reg51.h></p><p>  extern unsigned char TempBuffer[5];</p><p>  sbit deng = P1^1;</p><p>  char SD=1;</p><p

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論