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

下載本文檔

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

文檔簡介

1、<p>  系統(tǒng)基本方案選擇和論證</p><p><b>  單片機芯片的選擇</b></p><p>  本設(shè)計采用AT89S51芯片作為硬件核心,該芯片采用Flash ROM,內(nèi)部具有4KB ROM存儲空間,相對于本設(shè)計而言程序空間完全夠用。能于3V的超低壓工作,而且與MCS-51系列單片機完全兼容,而且運用于電路設(shè)計中時具備ISP在線編程技術(shù),當(dāng)在對

2、電路進行調(diào)試時,由于程序的錯誤修改或?qū)Τ绦虻男略龉δ苄枰獰氤绦驎r,避免芯片的多次拔插對芯片造成的損壞。</p><p>  顯示模塊選擇方案和論證</p><p><b>  方案一:</b></p><p>  采用點陣式數(shù)碼管顯示,點陣式數(shù)碼管是由八行八列的發(fā)光二極管組成,對于顯示文字比較適合,如采用在顯示數(shù)字顯得太浪費,且價格也相對較高

3、,所以也不用此種作為顯示.</p><p><b>  方案二:</b></p><p>  采用LED數(shù)碼管動態(tài)掃描,LED數(shù)碼管價格雖適中,對于顯示數(shù)字也最合適,而且采用動態(tài)掃描法與單片機連接時,占用的單片機口線少。但是由于數(shù)碼管動態(tài)掃描需要借助74LS164移位寄存器進行移位,該芯片在電路調(diào)試時往往會有很多障礙,所以不采用LED數(shù)碼管作為顯示[2]。</p

4、><p><b>  方案三:</b></p><p>  采用LCD液晶顯示屏,液晶顯示屏的顯示功能強大,可顯示大量文字,圖形,顯示多樣,清晰可見[3],對于電子萬年歷而言,一個1602的液晶屏即可,價格也還能接受,需要的接口線較多,但會給調(diào)試帶來諸多方便,所以此設(shè)計中采用LCD1602液晶顯示屏作為顯示模塊.</p><p>  時鐘芯片的選擇

5、方案和論證</p><p><b>  方案一:</b></p><p>  直接采用單片機定時計數(shù)器提供秒信號,使用程序?qū)崿F(xiàn)年、月、日、星期、時、分、秒計數(shù)。采用此種方案雖然可以減少時鐘芯片的使用,節(jié)約成本,但是,實現(xiàn)的時間誤差較大。所以不采用此方案。</p><p><b>  方案二:</b></p>

6、<p>  采用DS1302時鐘芯片實現(xiàn)時鐘,DS130是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與D

7、S1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。主要特點是采用串行數(shù)據(jù)傳輸,可為掉電保護電源提供可編程的充電功能,并且可以關(guān)閉充電功能。采用普通32.768kHz晶振[4]。因此,本設(shè)計中采用DS1302提供時鐘。</p><p>  溫度傳感器的選擇方案與論證</p><p><b>  方案一:</b></p&

8、gt;<p>  使用熱敏電阻作為傳感器,用熱敏電阻與一個相應(yīng)阻值電阻相串聯(lián)分壓,利用熱敏電阻阻值隨溫度變化而變化的特性,采集這兩個電阻變化的分壓值,并進行A/D轉(zhuǎn)換。此設(shè)計方案需用A/D轉(zhuǎn)換電路,增加硬件成本而且熱敏電阻的感溫特性曲線并不是嚴(yán)格線性的,會產(chǎn)生較大的測量誤差[5]。</p><p><b>  方案二:</b></p><p>  采用數(shù)

9、字式溫度傳感器DS18B20,此類傳感器為數(shù)字式傳感器而且僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,易于與單片機連接,可以避免A/D模數(shù)轉(zhuǎn)換模塊,降低硬件成本,簡化系統(tǒng)電路[6]。另外,數(shù)字式溫度傳感器還具有測量精度高、測量范圍廣等優(yōu)點。因此,本設(shè)計DS18B20溫度傳感器作為溫度采集模塊。</p><p>  電路設(shè)計最終方案決定</p><p>  綜上各模塊的選擇方案與論證,確定最后的主要硬件資

10、源如下:采用AT89S51作為主控制系統(tǒng);DS1302提供時鐘;DS18B20作為數(shù)字式溫度傳感器;LCD1602液晶屏作為顯示。</p><p>  系統(tǒng)的硬件設(shè)計與實現(xiàn)</p><p><b>  電路設(shè)計框圖</b></p><p>  本系統(tǒng)的電路系統(tǒng)框圖如圖1所示。AT89S51單片機對DS1302和DS18B20寫入控制字并讀取相應(yīng)

11、的數(shù)據(jù),繼而控制LCM1602作出對應(yīng)的顯示。</p><p><b>  圖1 系統(tǒng)硬件框圖</b></p><p><b>  系統(tǒng)硬件概述</b></p><p>  本電路是由AT89S51單片機作為控制核心,能在3V超低壓工作,AT89S51是一個低功耗,高性能CMOS 8位單片機,片內(nèi)含4kBytes ISP(

12、In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,兼容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價比的解決方案;時鐘電路由DS1302提供,它是一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日

13、、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31*8的用于臨時性存放數(shù)據(jù)的RAM寄存器??僧a(chǎn)生年、月、日、周、時、分、秒,具有使用壽命長,精度高和低功耗等特點,同時具有掉電自動保存功能;溫度的采集由DS18B20完成,它具有獨特的單線接口方式,DS18B20在與微處理</p><

14、;p><b>  主要單元電路的設(shè)計</b></p><p>  AT89S52單片機主控制模塊的設(shè)計</p><p>  AT89S52是一個低功耗,高性能CMOS 8位單片機,片內(nèi)含4k Bytes ISP(In-system programmable)的可反復(fù)擦寫1000次的Flash只讀程序存儲器,器件采用ATMEL公司的高密度、非易失性存儲技術(shù)制造,兼

15、容標(biāo)準(zhǔn)MCS-51指令系統(tǒng)及80C51引腳結(jié)構(gòu),芯片內(nèi)集成了通用8位中央處理器和ISP Flash存儲單元,功能強大的微型計算機的AT89S51可為許多嵌入式控制應(yīng)用系統(tǒng)提供高性價比的解決方案。AT89S51具有如下特點:40個引腳,4kBytes Flash片內(nèi)程序存儲器,128Bytes的隨機存取數(shù)據(jù)存儲器(RAM),32個外部雙向輸入/輸出(I/O)口,5個中斷優(yōu)先級2層中斷嵌套中斷,2個16位可編程定時計數(shù)器,2個全雙工串行通信

16、口,看門狗(WDT)電路,片內(nèi)時鐘振蕩器。此外,AT89S51設(shè)計和配置了振蕩頻率可為0Hz并可通過軟件設(shè)置省電模式??臻e模式下,CPU暫停工作,而RAM定時計數(shù)器,串行口,外中斷系統(tǒng)可繼續(xù)工作,掉電模式凍結(jié)振蕩器而保存RAM的數(shù)據(jù),停止芯片其它功能直至外中斷激活或硬件復(fù)位。同時該芯片還具有PDIP、TQFP和PLCC</p><p>  P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)

17、P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當(dāng)FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高。</p><p>  P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流

18、,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。 </p><p>  P2口:P2口為一個內(nèi)部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當(dāng)P2口被寫“1”時,其管腳被內(nèi)部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內(nèi)部上拉的緣故。P2口當(dāng)用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高

19、八位。在給出地址“1”時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能寄存器的內(nèi)容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號。 </p><p>  P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1”后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流(ILL)這是由于上拉的緣

20、故。</p><p>  I/O口作為輸入口時有兩種工作方式,即所謂的讀端口與讀引腳。讀端口時實際上并不從外部讀入數(shù)據(jù),而是把端口鎖存器的內(nèi)容讀入到內(nèi)部總線,經(jīng)過某種運算或變換后再寫回到端口鎖存器。只有讀端口時才真正地把外部的數(shù)據(jù)讀入到內(nèi)部總線。輸入緩沖器CPU將根據(jù)不同的指令分別發(fā)出讀端口或讀引腳信號以完成不同的操作。這是由硬件自動完成的,不需要我們操心,1然后再實行讀引腳操作,否則就可能讀入出錯,如果不對端口

21、置1,端口鎖存器原來的狀態(tài)有可能為0Q端為0Q^為1加到場效應(yīng)管柵極的信號為1,該場效應(yīng)管就導(dǎo)通對地呈現(xiàn)低阻抗,此時即使引腳上輸入的信號為1,也會因端口的低阻抗而使信號變低使得外加的1信號讀入后不一定是1。若先執(zhí)行置1操作,則可以使場效應(yīng)管截止引腳信號直接加到三態(tài)緩沖器中實現(xiàn)正確的讀入,由于在輸入操作時還必須附加一個準(zhǔn)備動作,所以這類I/O口被稱為準(zhǔn)雙向口。89C51的P0/P1/P2/P3口作為輸入時都是準(zhǔn)雙向口。</p>

22、<p>  單片機的最小系統(tǒng)如圖2所示:18引腳和19引腳接時鐘電路,XTAL1接外部晶振和微調(diào)電容的一端,在片內(nèi)它是振蕩器倒相放大器的輸入,XTAL2接外部晶振和微調(diào)電容的另一端,在片內(nèi)它是振蕩器倒相放大器的輸出.第9引腳為復(fù)位輸入端,接上電容,電阻及開關(guān)后夠上電復(fù)位電路,20引腳為接地端,40引腳為電源端.單片機的最小系統(tǒng)如下圖所示:圖2中的晶振頻率為12MHz,復(fù)位方式為上電自動復(fù)位[8]-[9]。</p>

23、;<p><b>  單片機中斷系統(tǒng)</b></p><p>  在提及單片機的最小系統(tǒng)后,現(xiàn)對單片機的另一重要應(yīng)用系統(tǒng)即中斷系統(tǒng)做一個比較詳細的介紹。</p><p>  在CPU 與外設(shè)交換信息時,存在著一個快速CPU與慢速的外設(shè)之間的矛盾。為解決這個問題,發(fā)展了中斷的概念。單片機在某一時刻只能處理一個任務(wù),當(dāng)多個任務(wù)同時要求單片機處理時,這一要求應(yīng)

24、該怎么實現(xiàn)呢?通過中斷可以實現(xiàn)多個任務(wù)的資源共享。所謂的中斷就是,當(dāng)CPU正在處理某項事務(wù)的時候,如果外界或者內(nèi)部發(fā)生了緊急事件,要求CPU暫停正在處理工作而去處理這個緊急事件,待處理完后,再回到原來中斷的地方,繼續(xù)執(zhí)行原來被中斷的程序,這個過程稱作中斷。 </p><p>  從中斷的定義我們可以看到中斷應(yīng)具備中斷源、中斷響應(yīng)、中斷返回這樣三個要素。中斷源發(fā)出中斷請求,單片機對中斷請求進行響應(yīng),當(dāng)中斷響應(yīng)完成后

25、應(yīng)進行中斷返回,返回被中斷的地方繼續(xù)執(zhí)行原來被中斷的程序。MCS-51單片機的中斷源共有兩類,它們分別是:外部中斷和內(nèi)部中斷。外部中斷0(INT0)來自P3.2引腳,通過外部中斷0觸發(fā)方式控制位IT0(TCON.0),來決定中斷輸入信號是低電平有效還是負跳變有效。一旦輸入信號有效,便使IE0標(biāo)志置一,向CPU申請中斷;外部中斷1(INT1)來自P3.3引腳,通過外部中斷1觸發(fā)方式控制位IT1(TCON.2),來決定中斷輸入信號是低電平有

26、效還是負跳變有效。一旦輸入信號有效,便使IE0標(biāo)志置一,向CPU申請中斷。內(nèi)部中斷有三個:TF0,TF1,RI或TI。TF0(TCON.5),片內(nèi)定時/計數(shù)器T0溢出中斷請求標(biāo)志。當(dāng)定時/計數(shù)器T0發(fā)生溢出時,置位TF0,并向CPU申請中斷;TF1(TCON.7),片內(nèi)定時/計數(shù)器T1溢出中斷請求標(biāo)志。當(dāng)定時/計數(shù)器T1發(fā)生溢出時,置位TF1,并向CPU申請中斷;RI(SCON.0)或TI(SCON.1),串行口中斷請求</p&g

27、t;<p>  MCS-51單片機為用戶提供了四個專用寄存器,來控制單片機的中斷系統(tǒng)。定時器控制寄存器(TCON),該寄存器用于保存外部中斷請求以及定時器的計數(shù)溢出。進行字節(jié)操作時,寄存器地址為88H。按位操作時,各位的地址為88H~8FH,當(dāng)CPU采樣到INT0(或INT1)端出現(xiàn)有效中斷請求時,IE0(IE1)位由硬件置“1”。當(dāng)中斷響應(yīng)完成轉(zhuǎn)向中斷服務(wù)程序時,由硬件把IE0(或IE1)清零, 當(dāng)計數(shù)器產(chǎn)生計數(shù)溢出時,

28、相應(yīng)的溢出標(biāo)志位由硬件置“1”。當(dāng)轉(zhuǎn)向中斷服務(wù)時,再由硬件自動清“0”。計數(shù)溢出標(biāo)志位的使用有兩種情況:采用中斷方式時,作中斷請求標(biāo)志位來使用;采用查詢方式時,作查詢狀態(tài)位來使用;串行口控制寄存器(SCON),進行字節(jié)操作時,寄存器地址為98H。按位操作時,各位的地址為98H~9FH,當(dāng)發(fā)送完一幀串行數(shù)據(jù)后,由硬件置“1”;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清“0”,當(dāng)接收完一幀串行數(shù)據(jù)后,由硬件置“1”;在轉(zhuǎn)向中斷服務(wù)程序后,用軟件清“0”

29、。串行中斷請求由TI和RI的邏輯或得到。就是說,無論是發(fā)送標(biāo)志還是接收標(biāo)志,都會產(chǎn)生串行中斷請求;中斷允許控制寄存器(IE),進行字節(jié)操作時,寄存器地</p><p>  MCS-51單片機復(fù)位后(IE)=00H,因此中斷系統(tǒng)處于禁止?fàn)顟B(tài)。單片機在中斷響應(yīng)后不會自動關(guān)閉中斷。因此在轉(zhuǎn)中斷服務(wù)程序后,應(yīng)根據(jù)需要使用有關(guān)指令禁止中斷,即以軟件方式關(guān)閉中斷。中斷優(yōu)先級控制寄存器(IP)MCS-51單片機的中斷優(yōu)先級控制

30、比較簡單,因為系統(tǒng)只定義了高、低2個優(yōu)先級。高優(yōu)先級用“1”表示,低優(yōu)先級用“0”表示。各中斷源的優(yōu)先級由中斷優(yōu)先級寄存器(IP)進行設(shè)定。IP寄存器地址0B8H,位地址為0BFH~0B8H。</p><p><b>  時鐘電路模塊的設(shè)計</b></p><p>  DS1302 是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘芯片,它可以對年、月

31、、日、周、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力[11]。</p><p>  DS

32、1302的引腳排列,其中Vcc1為后備電源,VCC2為主電源。在主電源關(guān)閉的情況下,也能保持時鐘的連續(xù)運行。DS1302由Vcc1或Vcc2兩者中的較大者供電。當(dāng)Vcc2大于Vcc1+0.2V時,Vcc2給DS1302供電。當(dāng)Vcc2小于Vcc1時,DS1302由Vcc1供電。X1和X2是振蕩源,外接32.768kHz晶振。RST是復(fù)位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。RST輸入有兩種功能:首先,RST接通控制

33、邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。當(dāng)RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。上電運行時,在Vcc>2.0V之前,RST必須保持低電平。只有在SCLK為低電平時,才能將RST置為高電平。I/O為串行數(shù)據(jù)輸入輸出端(雙向),SCLK為時鐘輸入端。DS1302的控制字節(jié)的最高

34、有效位(位7)必須是邏輯1,如果它為0,則不能把數(shù)據(jù)寫入DS1302中,位6如果為0,則表示存取日歷時鐘數(shù)據(jù),為1表示存取</p><p>  圖3 DS1302與單片機的連接</p><p><b>  溫度采集模塊設(shè)計</b></p><p>  采用數(shù)字式溫度傳感器DS18B20,它是數(shù)字式溫度傳感器,具有測量精度高,電路連接簡單特點,此

35、類傳感器僅需要一條數(shù)據(jù)線進行數(shù)據(jù)傳輸,使用P0.7與DS18B20的I/O口連接加一個上拉電阻,Vcc接電源,Vss接地。獨特的一線接口,只需要一條口線通信多點能力,簡化了分布式溫度傳感應(yīng)用無需外部元件可用數(shù)據(jù)總線供電,電壓范圍為3.0V至5.5V無需備用電源 測量溫度范圍為-55度至+125度。-10度至+85度范圍內(nèi)精度為±0.5度溫度傳感器可編程的分辨率為9~12位[12]。DS18B20連線如圖4所示:</p&g

36、t;<p>  圖4 DS18B20管腳連線</p><p><b>  顯示模塊的設(shè)計</b></p><p>  如下圖5所示,采用LCM1602液晶顯示器,單片機P1口作為數(shù)據(jù)輸出口,RS,R\W,E分別通過10K的上拉電阻連接到單片機的P0.0,P0.1,P0.2。VDD接5V電源,VSS接地。VEE為液晶顯示器對比度調(diào)整端,接正電源時對比度最弱

37、,接地電源時對比度最高(對比度過高時會產(chǎn)生“鬼影”,使用時可以通過一個10K的電位器調(diào)整對比度)。RS為寄存器選擇,高電平1時選擇數(shù)據(jù)寄存器、低電平0時選擇指令寄存器。R/W為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。E(或EN)端為使能(enable)端,下降沿使能。DB0-DB7為雙向數(shù)據(jù)總線,同時最高位DB7也是忙信號檢測位。BLA、BLK分別為顯示器背光燈的正、負極[13]。</p><

38、p>  圖5 LCM1602與單片機的連接 </p><p><b>  系統(tǒng)仿真電路</b></p><p>  本次仿真使用軟件Protues7.0,該軟件元件庫豐富,元件封裝要求相對簡單且參數(shù)調(diào)整方便,除此之外,程序還可進行動態(tài)調(diào)試。系統(tǒng)仿真截圖如圖9所示:</p><p>  圖9 系統(tǒng)仿真電路圖</p><p

39、>  如圖,左上角為顯示模塊LCM1602,U1是時鐘芯片DS1302,U2是主控模塊AT89C51,U3為溫度傳感器DS18B20,右下角是鍵盤控制模塊。</p><p><b>  系統(tǒng)的軟件設(shè)計</b></p><p><b>  程序流程框圖</b></p><p>  圖10 主程序流程圖</p>

40、;<p>  主程序流程圖如上圖10所示。由于LCM1602,DS18B20,DS1302的數(shù)據(jù)讀取及指令寫入函數(shù)均已在各自的頭文件中完成,在主程序中只須引用即可。</p><p>  由于在硬件電路方面上設(shè)計了時間調(diào)整按鍵和開關(guān),因此應(yīng)有對應(yīng)的時間調(diào)整程序。時間調(diào)整程序的流程圖如圖11所示。</p><p>  圖11 時間調(diào)整程序流程圖</p><p&

41、gt;<b>  子程序</b></p><p>  由于本系統(tǒng)程序涉及的可編程器件有LCM1602,DS18B20以及DS1302,各芯片的控制字及數(shù)據(jù)讀寫如果混雜,將會使程序可讀性大大降低,因此采用子程序的方法進行調(diào)用并將其封裝于各自的頭文件中。詳盡的程序設(shè)計見附錄。</p><p><b>  系統(tǒng)測試</b></p><

42、;p><b>  硬件測試</b></p><p>  在Protues仿真結(jié)束后,于焊接板上完成了硬件組裝。在調(diào)試硬件時遇到過很多問題,但只要細心、認(rèn)真檢查這些問題都是可以避免的,主要問題及解決辦法現(xiàn)列如下:</p><p>  接通電源后LCM1602沒有正確的顯示。在不通電狀態(tài)下用萬用表檢測電路是否正常連接,在檢查回路時發(fā)現(xiàn)有的點之間看似連接,但由于虛焊導(dǎo)

43、致其并無電氣連接,只能對焊腳進行在加工直到解決問題。</p><p>  電路工作一段時間之后有的芯片發(fā)熱嚴(yán)重。經(jīng)查發(fā)現(xiàn)原來是有尖銳的管腳刺破鄰近的漆包線造成短路,斷掉該線并再次連接可解決問題。</p><p><b>  軟件測試</b></p><p>  由于本系統(tǒng)涉及到多個子程序,多個芯片的編程。首先必須對可編程芯片的控制字即其控制指令

44、要熟記于心。其次,芯片很多都有時鐘輸入端,需要晶振支持。對芯片的讀寫都需要在相應(yīng)的觸發(fā)沿到來時才能進行。由于DS18B20是串行通信數(shù)據(jù),只用一個口線傳輸,在處理采集的模擬信號時需要一定的時間,會對延時有較高要求。所以在調(diào)用溫度子程序時,先關(guān)閉定時器1中斷允許,在溫度子程序反回時再打開定時器1中斷允許。</p><p><b>  主程序:</b></p><p> 

45、 #include<reg52.h></p><p>  #include"lcd1602.h"</p><p>  #include"ds1302.h"</p><p>  #include"ds18b20.h"</p><p>  #define uint unsig

46、ned int</p><p>  #define uchar unsigned char</p><p>  uint b[6];</p><p>  //年、月、日、時、分、秒</p><p>  uchar code row1[]={"2009-01-01"};</p><p>  uchar

47、 code row2[]={"00:00:00"};</p><p>  uchar year1[12]={31,28,31,30,31,30,31,31,30,31,30,31};//平年</p><p>  uchar year2[12]={31,29,31,30,31,30,31,31,30,31,30,31};//潤年</p><p> 

48、 uchar j[6]={0x85,0x88,0x8b,0x84+0x40,0x87+0x40,0x8a+0x40};//LCD地址</p><p>  uchar i,k,jj=0,w,clock=0,bigclock=0,c=0,num;</p><p>  //i循環(huán)數(shù),k溫度緩存,jj地址位</p><p>  uint temp;</p>&

49、lt;p>  sbit b1=P3^0;//設(shè)置</p><p>  sbit b2=P3^1;//上調(diào)</p><p>  sbit b3=P3^2;//下調(diào)</p><p>  sbit b4=P3^3;//轉(zhuǎn)換</p><p>  sbit b5=P3^4;//鬧鐘</p><p>  sbit speak

50、er=P3^5;</p><p><b>  lcdscan()</b></p><p>  {for(i=0;i<6;i++)</p><p>  { lcdwrite(j[i]);</p><p>  lcdshuju(a[11-i*2]+0x30);</p><p>  lcdwr

51、ite(j[i]+0x01);</p><p>  lcdshuju(a[10-i*2]+0x30);</p><p><b>  }</b></p><p><b>  }</b></p><p>  void key()</p><p>  {if(b1==0)<

52、/p><p>  { dsaddshuju(0x80,(a[1]<<4)+a[0]+0x80);</p><p>  while(b1==0)</p><p><b>  {</b></p><p>  for(i=0;i<6;i++)</p><p>  {b[i]=a[11-

53、i*2+clock]*10+a[10-i*2+clock];}</p><p><b>  if(b4==0)</b></p><p>  { delay(3);</p><p><b>  jj++;</b></p><p><b>  if(jj==6)</b></

54、p><p><b>  {jj=0;}</b></p><p><b>  }</b></p><p><b>  if(b2==0)</b></p><p>  {delay(3);</p><p><b>  b[jj]++;</b&g

55、t;</p><p>  if(b[5]==60)b[5]=0;</p><p>  if(b[4]==60)b[4]=0;</p><p>  if(b[3]==24)b[3]=0;</p><p>  if((b[0]%4==0&&b[0]%100!=0)||b[0]%400==0){if(b[2]>year2[b[

56、1]-1])b[2]=1;}</p><p>  else {if(b[2]>year1[b[1]-1])b[2]=1;}</p><p>  if(b[1]==13)b[1]=1;</p><p>  if(b[0]==100)b[0]=0;</p><p><b>  }</b></p>&l

57、t;p><b>  if(b3==0)</b></p><p>  {delay(3);</p><p><b>  b[jj]--;</b></p><p>  if(b[5]==-1)b[5]=59;</p><p>  if(b[4]==-1)b[4]=59;</p>&

58、lt;p>  if(b[3]==-1)b[3]=23;</p><p>  if((b[0]%4==0&&b[0]%100!=0) || b[0]%400==0){if(b[2]<=0)b[2]=year2[b[1]-1];}</p><p>  else {if(b[2]<=0)b[2]=year1[b[1]-1];}</p><p&

59、gt;  if(b[1]==0)b[1]=12;</p><p>  if(b[0]==-1)b[0]=99;</p><p><b>  }</b></p><p>  for(i=0;i<6;i++)</p><p>  { a[11-i*2+clock]=b[i]/10;</p><p

60、>  a[10-i*2+clock]=b[i]%10;</p><p><b>  }</b></p><p>  lcdwrite(j[jj]);</p><p>  lcdshuju(0);</p><p>  lcdwrite(j[jj]+1);</p><p>  lcdshuju(

61、0);</p><p>  delay(200);</p><p>  lcdwrite(j[jj]);</p><p>  lcdshuju(a[11-2*jj+clock]+0x30);</p><p>  lcdwrite(j[jj]+1);</p><p>  lcdshuju(a[10-2*jj+clock]

62、+0x30);</p><p>  delay(200);</p><p><b>  if(b1==1)</b></p><p>  { dsaddshuju(0x80,(a[1]<<4)+a[0]);</p><p><b>  dson();}</b></p>

63、<p>  if(b5==0)clock=12;}}}</p><p>  void main()</p><p>  {speaker=0;</p><p><b>  lcdrw=0;</b></p><p><b>  dson();</b></p><p

64、><b>  lcdon();</b></p><p>  lcdwrite(0x83);</p><p>  for(i=0;i<10;i++)</p><p>  {lcdshuju(row1[i]);</p><p><b>  delay(1);</b></p>

65、<p><b>  }</b></p><p>  lcdwrite(0x84+0x40);</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  lcdshuju(row2[i]);</p><p>

66、;<b>  delay(1);</b></p><p><b>  }</b></p><p><b>  dsrst=0;</b></p><p><b>  dssclk=0;</b></p><p><b>  while(1)</

67、b></p><p>  {for(i=0;i<5;i++)</p><p>  {dsrst=1;</p><p>  dswrite(0x81+i*2);</p><p>  k=dsread();</p><p><b>  dsrst=0;</b></p>&l

68、t;p>  a[i*2]=k&0x0f;</p><p>  a[i*2+1]=(k>>4)&0x0f;</p><p><b>  }</b></p><p><b>  dsrst=1;</b></p><p>  dswrite(0x8d);</p

69、><p>  k=dsread();</p><p><b>  dsrst=0;</b></p><p>  a[10]=k&0x0f;</p><p>  a[11]=(k>>4)&0x0f;</p><p>  delay(100);</p><

70、;p>  lcdscan();</p><p><b>  key();</b></p><p><b>  if(b5==0)</b></p><p>  {for(i=0;i<12;i++)</p><p>  {if(a[i+12]==a[i])num++;}</p>

71、;<p>  if(num==12)bigclock=1;</p><p>  else num=0;</p><p>  lcdwrite(0x8e);</p><p>  lcdshuju('&');}</p><p><b>  else </b></p><

72、;p>  {lcdwrite(0x8e);</p><p>  lcdshuju(0x00);}</p><p>  if(bigclock==1)</p><p>  { speaker=1;</p><p><b>  c++;</b></p><p>  if(c==100){bi

73、gclock=0;speaker=0;}</p><p><b>  }</b></p><p>  temp=readtemperature();//temp是uint型的。不然會出現(xiàn)溫度到25后回00的現(xiàn)象??赡苁怯捎谑M制與十進制的差異。</p><p>  lcdwrite(0x8d+0x40);</p><p&g

74、t;  lcdshuju(temp/100+0x30);</p><p>  lcdwrite(0x8e+0x40);</p><p>  lcdshuju(temp/10%10+0x30);}}</p><p><b>  子程序:</b></p><p>  LCM1602頭文件:</p><p

75、>  #include<reg52.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit lcdrs=P0^0;</p><p>  sbit lcdrw=P0^1;</p><

76、;p>  sbit lcden=P0^2;</p><p>  void delay(uint z)</p><p><b>  {</b></p><p><b>  uint x,y;</b></p><p>  for(x=z;x>0;x--)</p><p&g

77、t;  for(y=110;y>0;y--);</p><p>  }//1毫秒左右延時</p><p>  //lcdwrite() LCD寫指令</p><p>  void lcdwrite(uchar write)</p><p><b>  {</b></p><p><b

78、>  lcdrs=0;</b></p><p><b>  P1=write;</b></p><p><b>  delay(1);</b></p><p><b>  lcden=1;</b></p><p><b>  delay(1);<

79、;/b></p><p><b>  lcden=0;</b></p><p><b>  }</b></p><p>  //lcdshuju() LCD寫數(shù)據(jù)</p><p>  void lcdshuju(uchar shuju)</p><p><b&g

80、t;  {</b></p><p><b>  lcdrs=1;</b></p><p><b>  P1=shuju;</b></p><p><b>  delay(1);</b></p><p><b>  lcden=1;</b><

81、;/p><p><b>  delay(1);</b></p><p><b>  lcden=0;</b></p><p><b>  }</b></p><p>  //lcdon() LCD顯示初始化</p><p>  void lcdon()&l

82、t;/p><p><b>  {</b></p><p><b>  lcden=0;</b></p><p>  lcdwrite(0x38);//顯示模式</p><p>  lcdwrite(0x0c);//開顯示,光標(biāo)不閃爍</p><p>  lcdwrite(0x06

83、);//光標(biāo)設(shè)置</p><p>  lcdwrite(0x01);</p><p><b>  }</b></p><p>  DS18B20頭文件:</p><p>  #include<reg52.h></p><p>  #define uint unsigned int<

84、;/p><p>  #define uchar unsigned char</p><p>  sbit dq=P0^3;</p><p>  void sdelay(unsigned int i)</p><p><b>  {</b></p><p>  while(i--);</p>

85、<p><b>  }</b></p><p>  ds18b20on(void)//ds18b20初始化</p><p><b>  {</b></p><p>  uchar x=0;</p><p><b>  dq=1; </b></p>

86、<p>  sdelay(8); </p><p><b>  dq=0; </b></p><p>  sdelay(80); </p><p><b>  dq=1; </b></p><p>  sdelay(14);</p><p>  sdel

87、ay(20);</p><p><b>  }</b></p><p><b>  //讀一個字節(jié)</b></p><p>  readds18b20(void)</p><p><b>  {</b></p><p>  uchar i=0,dat=0

88、;</p><p>  for(i=8;i>0;i--)</p><p><b>  {</b></p><p><b>  dq=0;</b></p><p><b>  dat>>=1;</b></p><p><b> 

89、 dq=1;</b></p><p><b>  if(dq)</b></p><p>  dat|=0x80;</p><p>  sdelay(4);</p><p><b>  }</b></p><p>  return(dat);</p>

90、<p><b>  }</b></p><p><b>  //寫一個字節(jié)</b></p><p>  writeds18b20(uchar dat)</p><p><b>  {</b></p><p>  uchar i=0;</p><p&

91、gt;  for(i=8;i>0;i--)</p><p><b>  {</b></p><p><b>  dq=0;</b></p><p>  dq=dat&0x01;</p><p>  sdelay(5);</p><p><b>  dq

92、=1;</b></p><p><b>  dat>>=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //讀取溫度</b></p><p

93、>  readtemperature(void)</p><p><b>  {</b></p><p>  uchar a=0,b=0;</p><p><b>  uint t=0;</b></p><p>  float tt=0;</p><p>  ds18b

94、20on();</p><p>  writeds18b20(0xCC);//跳過ROM</p><p>  writeds18b20(0x44);//開啟溫度轉(zhuǎn)換</p><p>  ds18b20on();</p><p>  writeds18b20(0xCC); </p><p>  writeds18b20(

95、0xBE);//讀暫存器</p><p>  a=readds18b20();</p><p>  b=readds18b20();</p><p><b>  t=b;</b></p><p><b>  t<<=8;</b></p><p><b>

96、  t=t|a;</b></p><p>  tt=t*0.0625; </p><p>  t= tt*10+0.5; </p><p>  return(t);</p><p><b>  }</b></p><p>  DS1302頭文件:</p&g

97、t;<p>  #include<reg52.h></p><p>  #define uint unsigned int</p><p>  #define uchar unsigned char</p><p>  sbit dsrst=P2^0;</p><p>  sbit dssclk=P2^1;</

98、p><p>  sbit dsio=P2^2;</p><p>  uint a[24]={0,0,0,0,0,0,1,0,1,0,9,0,0,0,0,0,0,0,1,0,1,0,9,0};</p><p>  //分別對應(yīng)秒秒分分時時日日月月年年</p><p>  //后12位為鬧鐘位,用于存儲鬧鐘數(shù)據(jù)</p><p>

99、;  //1302write DS1302寫數(shù)據(jù)</p><p>  void dswrite(uchar dswrite)</p><p><b>  {</b></p><p>  uchar i,temp;</p><p><b>  delay(1);</b></p>&l

100、t;p>  temp=dswrite;</p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  dsio=temp&0x01;</p><p><b>  delay(1);</b></p><p>

101、;<b>  dssclk=1;</b></p><p><b>  delay(1);</b></p><p><b>  dssclk=0;</b></p><p>  temp=temp>>1;</p><p><b>  }</b>&

102、lt;/p><p><b>  }</b></p><p>  //1302read Ds1302讀數(shù)據(jù)</p><p>  uchar dsread()</p><p><b>  {</b></p><p>  uchar i,temp;</p><p

103、><b>  delay(1);</b></p><p><b>  temp=0;</b></p><p>  for(i=0;i<8;i++)</p><p><b>  {</b></p><p>  temp=temp>>1;</p>

104、<p>  if(dsio==1)temp=temp+0x80;</p><p><b>  delay(1);</b></p><p><b>  dssclk=1;</b></p><p><b>  delay(1);</b></p><p><b&g

105、t;  dssclk=0;</b></p><p><b>  }</b></p><p>  return temp;</p><p><b>  }</b></p><p>  //1302addshuju DS1302向某地址寫入某數(shù)據(jù)</p><p>

106、  void dsaddshuju(uchar add,uchar dsshuju)</p><p><b>  {</b></p><p><b>  dsrst=0;</b></p><p><b>  dssclk=0;</b></p><p><b>  ds

107、rst=1;</b></p><p>  dswrite(add);// 地址,命令 </p><p>  dswrite(dsshuju);// 寫1Byte數(shù)據(jù)</p><p><b>  dssclk=1;</b></p><p><b>  dsrst=0;</b></p&

108、gt;<p><b>  dsio=0;</b></p><p><b>  }</b></p><p>  //1302on DS1302初始化</p><p>  void dson()</p><p>  {uchar i;</p><p>  dsa

溫馨提示

  • 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)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論