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

下載本文檔

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

文檔簡介

1、<p><b>  單片機設計報告</b></p><p>  摘要:本系統(tǒng)是由STC12C5A60S2為核心的溫度控制系統(tǒng),由PT100溫度傳感器讀取溫度,并以數(shù)字信號傳給單片機。此系統(tǒng)分硬件、軟件兩部分,硬件分: STC12C5A60S2單片機,數(shù)碼管顯示時間、溫度,按鍵調(diào)時、溫,PT100溫度傳感器,放大電路,DS1302時鐘電路,單片機通過對信號的相應的處理,從而實現(xiàn)時間顯

2、示與溫度的控制。軟件部分主要是主程序,子程序,還有用到中斷程序。</p><p>  關鍵詞:STC12C5A60S2芯片, PT100,DS1302。</p><p><b>  目錄</b></p><p><b>  摘要2</b></p><p><b>  1引言5<

3、/b></p><p>  2系統(tǒng)總體方案及硬件設計5</p><p>  2.1系統(tǒng)基本框圖5</p><p>  2.2硬件設計6</p><p>  3系統(tǒng)軟件設計16</p><p>  3.1主程序設計16</p><p>  3.2定時中斷程序設計16<

4、/p><p><b>  4安裝與調(diào)試17</b></p><p>  4.1安裝調(diào)試過程17</p><p>  4.2故障分析18</p><p><b>  5結(jié)論18</b></p><p>  6使用元器件清單19</p><p>&l

5、t;b>  7參考文獻19</b></p><p><b>  程序20</b></p><p><b>  引言</b></p><p>  傳感器是一種物理裝置或生物器官,能夠探測、感受外界的信號、物理條件(如光、熱、濕度)或化學組成(如煙霧),并將探知的信息傳遞給其他裝置或器官。</p&g

6、t;<p>  新技術革命的到來,世界開始進入信息時代。在利用信息的過程中,首先要解決的就是要獲取準確可靠的信息,而傳感器是獲取自然和生產(chǎn)領域中信息的主要途徑與手段。</p><p>  在現(xiàn)代工業(yè)生產(chǎn)尤其是自動化生產(chǎn)過程中,要用各種傳感器來監(jiān)視和控制生產(chǎn)過程中的各個參數(shù),使設備工作在正常狀態(tài)或最佳狀態(tài),并使產(chǎn)品達到最好的質(zhì)量。因此可以說,沒有眾多的優(yōu)良的傳感器,現(xiàn)代化生產(chǎn)也就失去了基礎。</

7、p><p>  傳感器早已滲透到諸如工業(yè)生產(chǎn)、宇宙開發(fā)、海洋探測、環(huán)境保護、資源調(diào)查、醫(yī)學診斷、生物工程、甚至文物保護等等極其之泛的領域。可以毫不夸張地說,從茫茫的太空,到浩瀚的海洋,以至各種復雜的工程系統(tǒng),幾乎每一個現(xiàn)代化項目,都離不開各種各樣的傳感器。</p><p>  本溫度控制系統(tǒng)是一個閉環(huán)反饋控制系統(tǒng),它用溫度傳感器將檢測到的溫度信號經(jīng)放大,送入單片機中進行數(shù)據(jù)處理并顯示當前溫度值

8、,用當前溫度值與設定溫度值進行比較PID。實現(xiàn)對PWM的控制從而改變加熱器的溫度。通過這種控制方式實現(xiàn)對溫度的控制。系統(tǒng)功能由硬件和軟件兩大部分協(xié)調(diào)完成,硬件部分主要完成主機電路、數(shù)據(jù)采集電路、按鍵設置、控制執(zhí)行等電路的設計。軟件程序編寫主要用來實現(xiàn)對溫度的檢測、標度轉(zhuǎn)換、數(shù)碼管顯示。</p><p>  2系統(tǒng)總體方案及硬件設計</p><p>  2.1系統(tǒng)基本框圖</p>

9、;<p><b>  硬件設計</b></p><p><b>  1、信號采集電路</b></p><p>  1)、選擇PT100溫度傳感器采集信號</p><p>  PT100是鉑熱電阻,它的阻值跟溫度的變化成正比。PT100的阻值與溫度變化關系為:當PT100溫度為0℃時它的阻值為100歐姆,在10

10、0℃時它的阻值約為138.5歐姆。它的工作原理:當PT100在0攝氏度的時候他的阻值為100歐姆,它的阻值會隨著溫度上升而成勻速增長的。溫度的測量方法多采用集成的半導體模擬溫度傳感器,傳感器輸出的電壓或電流與溫度在一定范圍呈線性關系。通過放大,采樣得到被測量。</p><p>  溫度在 10攝氏度到80攝氏度范圍內(nèi)可調(diào),通過單片機系統(tǒng)設計實現(xiàn)對溫度的顯示和控制功能。本溫度控制系統(tǒng)是一個閉環(huán)反饋調(diào)節(jié)系統(tǒng),由溫度傳

11、感器PT100對保溫箱溫度進行檢測,經(jīng)過調(diào)理電路得到合適的電壓信號。此電壓信號通過單片機得到相應的PWM,將所得的PWM值送給TIP127三極管進行控制電流從而加熱電阻的溫度也得到控制,并使單片機有相對應的信號輸出顯示。去調(diào)節(jié)PWM可使加熱電阻的功率的變化,從而實現(xiàn)對溫度的顯示和控制。</p><p><b>  2)、信號放大</b></p><p>  溫度傳感器

12、通過感應外界的溫度,使溫度傳感器對應的阻值變化,將此信號轉(zhuǎn)換為電壓變化;為了不受前后級的影響,經(jīng)運放(LM324)的一級跟隨;為了讓采集信號更精確,本電路采用了減法器,把變化的信號單獨取出;將這微小的信號進行放大;為了不受后級的影響,放大后再跟隨隔離一次供給單片機的P1.0口。用此電路需要注意,供給此電路的電壓一定要穩(wěn)定。</p><p><b>  如圖(1)所示:</b></p&g

13、t;<p><b>  圖(1)</b></p><p><b>  2、時間部分</b></p><p>  1)、S1302是美國DALLAS公司推出的一種高性能、低功耗、帶RAM的實時時鐘電路,它可以對年、月、日、周、日、時、分、秒進行計時,具有閏年補償功能,工作電壓為2.5V~5.5V。采用三線接口與CPU進行同步通信,并可

14、采用突發(fā)方式一次傳送多個字節(jié)的時鐘信號或RAM數(shù)據(jù)。DS1302內(nèi)部有一個31×8的用于臨時性存放數(shù)據(jù)的RAM寄存器。DS1302是DS1202的升級產(chǎn)品,與DS1202兼容,但增加了主電源/后背電源雙電源引腳,同時提供了對后背電源進行涓細電流充電的能力。主要特點是采輸用串行數(shù)據(jù)傳,可為掉電保護電源提供可編程的充電功能,并且可以關閉充電功能。采用普通32.768kHz晶振。通過DS1302電路使得有更精確的時間,在外加設置按鍵

15、,來調(diào)整時間。通過數(shù)碼管顯示。</p><p><b>  如圖(2)所示:</b></p><p><b>  圖(2)</b></p><p>  2)、執(zhí)行DS1302的流程圖</p><p><b>  3、單片機電路</b></p><p> 

16、 系統(tǒng)控制管理與數(shù)據(jù)處理采用60S2單片機來完成,硬件部分主要有單片機及外圍電路,包括晶振電路和復位電路。</p><p><b>  如圖(3)所示:</b></p><p><b>  圖(3)</b></p><p>  1)、60S2芯片結(jié)</p><p> ?。?)、P0口(P00—P07

17、)是一個8位三態(tài)雙向I/O口,在不訪問外部存儲器時,作通用I/O口使用,用于傳送CPU的輸入/輸出數(shù)據(jù),當訪問外部存儲器時,此口為地址總線低8位及數(shù)據(jù)總線分時復用口,可帶8個LS TTL負載。</p><p> ?。?)、P1口(P10—P17)是一個8位準雙向I/O口(作為輸入時,口鎖存器置1),帶有內(nèi)部上拉電阻,可帶4個 LS TTL負載。P1口可用來AD轉(zhuǎn)換。60S2系列帶A/D轉(zhuǎn)換的單片機的A/D轉(zhuǎn)換口在

18、P1(P1.7~P1.0),有8路10位高速A/D轉(zhuǎn)換器,速度可達到250KHz(25萬次/秒)。8路電壓輸入型A/D,除了可做溫度檢測外,還可做電池電壓檢測、按鍵掃描、頻譜檢測等。上電復位后P1口為弱上拉型I/O口,用戶可通過軟件設置將8路中的任何一路設置為A/D轉(zhuǎn)換,不需要作為A/D使用的口可繼續(xù)作為I/O口使用。</p><p> ?。?)、P2口(P20—P27)是一個8位準雙向I/O口 ,與地址線高8位

19、復用,可驅(qū)動4個 LS TTL負載。</p><p>  (4)、P3口(P30—P37)是一個8位準雙向I/O口,帶有內(nèi)部上拉電阻,可驅(qū)動4個 LS TTL負載。P3口為雙功能口,它的第一功能作為通用I/O口,第二功能做控制口,如下表: </p><p>  表P3口各個位的第二功能</p><p>  (5)、電源線:Vcc為+5V電源線,Vss為接地線。<

20、;/p><p><b> ?。?)、控制線:</b></p><p>  ALE/PROG~:地址鎖存允許/編程線。</p><p>  EA~/Vpp:允許訪問片外存儲器/編程電源線。</p><p>  Psen~:片外ROM選通線。</p><p>  RST/Vpd:復位/備用電源線。<

21、/p><p>  XTAL1和XTAL2:片內(nèi)振蕩電路輸入線。</p><p><b>  2)、復位電路:</b></p><p>  60S2是處于復位狀態(tài)。且當主電源Vcc發(fā)生故障而降低到規(guī)定低電平時,RST/Vpd線上的備用電源自動投入,以保證片內(nèi)RAM中信息不丟失。復位電路分為上電復位和手動按鈕復位兩種形式。RST/VPD端的高電平直接由

22、上電瞬間產(chǎn)生高電平則為上電復位;若通過按鈕產(chǎn)生高電平復位信號稱為手動按鈕復位本次實驗采取上電復位,電路如圖。</p><p><b>  3)、晶振電路:</b></p><p>  系統(tǒng)的時鐘電路設計采用的是內(nèi)部方式,既利用芯片內(nèi)部的震蕩電路。60S2單片機內(nèi)部有一個用于構(gòu)成震蕩器的高增益反相放大器。引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端。這個放大

23、器與作為反饋元件的片外晶體諧振器一起構(gòu)成一個自激振蕩器。外接晶體諧振器及電容構(gòu)成并聯(lián)諧振電路,接在放大器的反饋回路中。對外接電容的值雖然沒有嚴格的要求,但電容的大小會影響振蕩器頻率的高低、振蕩器的穩(wěn)定性、起振的快速性和溫度的穩(wěn)定性。在焊接電路板時,晶體振蕩器的電容應盡可能安裝得與單片機芯片靠近,以減少寄生電容,保證振蕩器穩(wěn)定和可靠地工作。如右圖。</p><p>  4、LED數(shù)碼管顯示電路 </p&

24、gt;<p>  1)、4位七段LED數(shù)碼管結(jié)構(gòu)如圖所示,其分為共陰極和共陽極,本次實驗采用共陽極的LED數(shù)碼管,即數(shù)碼管的a~g七個發(fā)光二極管加低電平(“0”)發(fā)亮,加低電平(“1”)發(fā)暗。</p><p><b>  如圖(4)所示:</b></p><p><b>  圖(4)</b></p><p>

25、  2)、四位LED數(shù)碼管顯示接口一般采用靜態(tài)驅(qū)動和動態(tài)掃描兩種驅(qū)動方式。靜態(tài)驅(qū)動工作原理是每一個LED顯示器用一個I/O端口驅(qū)動,亮度大,耗電也大,占用I/O端口多,顯示位數(shù)多時很少用;動態(tài)掃描驅(qū)動方式的工作原理是將多個顯示器的段碼同名端連在一起,位碼分別控制,利用眼睛的余輝暫留效應,分別進行顯示。只要保證一定的顯示頻率,看起來的效果和一直顯示是一樣的。在電路上用一個I/O端口驅(qū)動段碼,用另一個I/O端口實現(xiàn)控位,占用I/O端口少,耗

26、電也小,簡化拉電路,降低了成本,顯示位數(shù)多時常采用這種方式。本次實驗顯示位數(shù)為8位,較多,所以選用動態(tài)掃描驅(qū)動方式。</p><p>  3)、本次實驗中我們采用單片機P0口做數(shù)據(jù)口,P2口做選通口。由于P2口輸出的電平帶不動數(shù)碼管,因此將每個口通過一個三極管放大,再加到數(shù)碼管選通上去。應注意的是,經(jīng)過三極管的信號反向,極性改變了;另外為保護三極管,輸入必須接電阻限流防止三極管損壞。</p><

27、;p>  4)、七段LED數(shù)碼管與單片機的接口很簡單,只需將單片機的一個8位并行I/O口與數(shù)碼管的發(fā)光二極管的引腳相連即可。根據(jù)8位I/O口輸出的不同數(shù)據(jù),LED就可以顯示不同的數(shù)字或字符,這8位數(shù)據(jù)稱為顯示代碼。</p><p><b>  如圖(5)所示:</b></p><p><b>  圖(5)</b></p>&l

28、t;p><b>  5、加熱電路</b></p><p>  通過控制控制單片機,使P1.3口產(chǎn)生PWM,用PWM來控制三極管(PNP)的基極,讓三極管導通,使得功率電阻(10Ω)得到加熱。如右圖所示:</p><p>  6、PCA/PWM的應用</p><p>  STC12C5A60S2系列單片機集成了兩路可編程計數(shù)器陣列(PCA)

29、模塊,可用于軟件定時器、外部脈沖的捕捉、高速輸出以及脈寬調(diào)制(PWM)輸出。</p><p>  1)、PCA工作模式寄存器CMOD</p><p>  PCA工作模式寄存器的格式如下:</p><p>  CIDL:空閑模式下是否停止PCA計數(shù)的控制位。</p><p>  當CIDL=0時,空閑模式下PCA計數(shù)器繼續(xù)工作;</p&g

30、t;<p>  當CIDL=1時,空閑模式下PCA計數(shù)器停止工作。</p><p>  ECF:PCA計數(shù)溢出中斷使能位。</p><p>  當ECF=0時,禁止寄存器CCON中CF位的中斷;</p><p>  當ECF=1時,允許寄存器CCON中CF位的中斷。</p><p>  2)、PCA控制寄存器CCON</p

31、><p>  PCA控制寄存器的格式如下:</p><p>  3)、PCA模塊PWM寄存器PCA_PWM0和PCA_PWM1</p><p>  本系統(tǒng)開的是PCA_PWM0模式,PCA模塊0的PWM寄存器的格式如下:</p><p>  EPC0H:在PWM模式下,與CCAP0H組成9位數(shù)。</p><p>  EPC

32、0L:在PWM模式下,與CCAP0L組成9位數(shù)。</p><p>  4)、產(chǎn)生PWM的流程圖</p><p><b>  7、AD的轉(zhuǎn)換</b></p><p>  1)、AD轉(zhuǎn)換是采用60S2單片機內(nèi)部。60S2系列帶A/D轉(zhuǎn)換的單片機的A/D轉(zhuǎn)換口在P1(P1.7~P1.0),有8路10位高速A/D轉(zhuǎn)換器,速度可達到250KHz(25萬次

33、/秒)。8路電壓輸入型A/D,除了可做溫度檢測外,還可做電池電壓檢測、按鍵掃描、頻譜檢測等。上電復位后P1口為弱上拉型I/O口,用戶可通過軟件設置將8路中的任何一路設置為A/D轉(zhuǎn)換,不需要作為A/D使用的口可繼續(xù)作為I/O口使用。</p><p>  本系統(tǒng)開的是10位ADC,單片機內(nèi)部通過模擬多路開關,模擬量將通過ADC0~7的模擬量輸入送給比較器,將比較結(jié)果保存到逐?比較器,并通過逐?比較寄存器輸出轉(zhuǎn)換結(jié)果。

34、A/D轉(zhuǎn)換結(jié)束后,最終的轉(zhuǎn)換結(jié)果保存 到ADC轉(zhuǎn)換結(jié)果寄存器ADC_RES和ADC_RESL;同時,置位ADC控制寄存器ADC_CONTR中的A/D轉(zhuǎn) </p><p>  換結(jié)束標志位ADC_FLAG,以供程序查詢或發(fā)出中斷申請。模擬通道的選擇控制由ADC控制寄存器ADC_CONTR中的CHS2 ~ CHS0確定。ADC的轉(zhuǎn)換速度由ADC控制寄存器中的SPEED1和SPEED0確定。在使用ADC之前,應先給AD

35、C上電,也就是置位ADC控制寄存器中的ADC_POWER位。 </p><p>  即ADRJ=0時,如果?10位結(jié)果,則按下面公式計算: </p><p>  2)、AD轉(zhuǎn)換流程圖</p><p><b>  8、系統(tǒng)電路圖</b></p><p><b>  3

36、系統(tǒng)軟件設計</b></p><p>  整個軟件采用模塊化設計,由主程序、中斷子程序、顯示子程序、按鍵子程序、AD轉(zhuǎn)換子程序、產(chǎn)生PWM子程序、DS1302子程序等模塊程序組成。系統(tǒng)軟件主要完成顯示測量溫度、設置溫度、時間、日歷等功能,并對其可進行任意設置。中斷子程序是用定時中斷來產(chǎn)生一定頻率的對各個顯示進行延時。</p><p><b>  3.1主程序設計&l

37、t;/b></p><p>  主程序先對P0、P2兩組I/O口、以及中斷定時初值進行初始化,之后判斷有沒有按下按鍵進行切頁面。當有按下切換鍵時,其頁面會進行切換。其程序流程圖如圖(3—1)所示:</p><p><b>  圖(3—1)</b></p><p>  3.2定時中斷程序設計</p><p>  定時

38、中斷程序主要用于數(shù)碼管掃描時間、AD轉(zhuǎn)換時間等。該程序先定義兩個變量用于控制使能端的高低電平的時間,每次中斷進入后,兩個變量自動加1,當兩個變量分別滿足一定值的時候,改變使能端的值,使能端實現(xiàn)高低電平。其中定時中斷程序流程圖如圖(3—2):</p><p><b>  4安裝與調(diào)試</b></p><p><b>  4.1安裝調(diào)試過程</b>&

39、lt;/p><p><b>  4.1.1軟件調(diào)試</b></p><p>  軟件調(diào)試的過程主要是先分模塊測試再統(tǒng)一調(diào)試。利用Keil軟件和實物電路對模塊程序進行調(diào)試。先分別對各個程序進行編譯,如先測試時間顯示的子程序進行測試,看能否使單片機輸出正確的控制信號。在各個模塊都測試正常的情況下,將所有模塊程序集合成一個程序。</p><p><

40、b>  4.1.2硬件調(diào)試</b></p><p>  硬件電路可分為信號采集放大電路、單片機模塊、顯示電路、驅(qū)動加熱器電路,四個部分進行調(diào)試。</p><p>  信號采集放大電路:首先檢查電路板是否有線路短路或者斷路以及各個元器件是否正確安裝到電路板上。然后上電檢測放大后的信號是不是自己要的信號。</p><p>  單片機模塊:主要檢測復位電

41、路和時鐘電路。給單片機上電后,利用示波器檢測晶振是否起振,在起振后,測試復位電路是否能夠使單片機進行正常復位。</p><p>  顯示電路:用萬用表檢測驅(qū)動數(shù)碼管的三極管,給單片機上電,三極管的基極拉低,看三極管能否工作起來。再把數(shù)碼管的數(shù)據(jù)口拉低,看數(shù)碼管有否顯示。</p><p>  驅(qū)動加熱器電路:檢查一下是否有短路或斷路現(xiàn)象。</p><p><b&

42、gt;  4.2故障分析</b></p><p>  首先,我們對編好程序先進行軟件上的調(diào)試,在確認程序沒有錯誤后,我們通過軟件把程序下載到60S2芯片里,然后進行硬件上的調(diào)試。</p><p>  調(diào)試的過程中,需要認真觀察看那邊是否不足;在溫度的顯示頁面上,溫度在不斷的跳變,且跳變的范圍很大;對此對硬件調(diào)試,算出采集回來回來的放大的信號的公共公式;將算出的公式帶入到程序當去

43、。再一次的編譯下載。</p><p>  再次觀察現(xiàn)象,并對此判斷是否能正常工作。并對其他功能進行檢測,一模塊、一??斓墓收戏治觥?lt;/p><p>  最后,在把整體全部結(jié)合起來,調(diào)試,判斷調(diào)溫、調(diào)時功能能否實現(xiàn),能否正常顯示;切頁能否工作等,一一的式。</p><p>  最后,通過單步調(diào)試以及整體調(diào)試,使得設計溫控系統(tǒng)能夠達到基本要求,并且溫度跳變大大減小??傮w

44、來說,調(diào)試過程中碰到的問題很多,有顯示、以及設計的電路等問題,但都能及時的發(fā)現(xiàn)這些問題并且針對這些問題進行探討和修正。所以,此次課程設計對我在今后的學習具有深遠的影響。</p><p><b>  5結(jié)論</b></p><p>  本次設計在同學及老師的指導下,完成了課題的基本功能。此設計實現(xiàn)了利用單片機60S2為核心,信號采樣放大、顯示、驅(qū)動加熱器等電路,實現(xiàn)了時

45、間、日歷等正常工作功能,同時在對程序進一步整理修改之后,使溫度正常顯示,并能夠?qū)ζ溥M行設溫。</p><p>  在這次課程設計中,我從中學到很多,收獲很多。通過了這個課程設計,使我對單片機更加深一步了解不少,體會到60S2單片機的強大功能。整個設計從方案確定、查閱資料、電路原理圖的確定、制作電路板、程序設計以及電路的調(diào)試等步驟,每一個過程都讓我學了很多,讓我體會到完成每一項步驟都是需要自己認真全力的投入其中,這

46、樣才可以完成任務,時間才不會白花。</p><p>  雖然此次的設計已經(jīng)完成了很多功能,但是由于自己的知識有限,此次設計中也存在著一些很大的問題。例如,信號采集放大電路中的減法器的電路搭錯了,使得硬件電路都無法出來,花了我好長的一段時間在調(diào)整這個。以后需要切記此次的教訓,需細心才行。</p><p><b>  6使用元器件清單</b></p><

47、;p>  此次設計所示用的元器件如下表格所示:</p><p>  表格 9-1 元件使用清單</p><p><b>  7參考文獻</b></p><p>  [1]徐仁貴, 單片微型計算機應用技術[M] 機械工業(yè)出版社,2000</p><p>  [2]馬西秦, 自

48、動檢測技術[M] 機械工業(yè)出版社,2000</p><p>  [3]邵裕森, 過程控制及儀表[M] 上海交通大學出版社,2000</p><p>  [3]黃 堅, 自動控制原理及應用[M] 高等教育出版社,2000</p><p><b>  社,2008.</b&g

49、t;</p><p>  [4]宏晶科技的資料及程序</p><p>  [5]黃繼昌.電子元器件應用手冊[M].北京:人民郵電出版社,2007.</p><p>  [6]何立民.單片機應用系統(tǒng)設計.北京:北京航空航天大學出版社,1990.</p><p>  [7]王慶有,等.光電傳感器應用技術.機械工業(yè)出版社,2008.</p&g

50、t;<p>  [8]康華光,等.電子技術基礎[M].北京:高等教育出版社,1998.</p><p><b>  程序</b></p><p>  /*****************Copyright (c)******************</p><p>  /**********************主程序*****

51、*************/</p><p>  /**********************************************/</p><p>  #include "MiRts51.h"</p><p>  #include "Seg.h"</p><p>  #include &

52、quot;Key.h"</p><p>  #include "StcAD.h"</p><p>  #include "StcPWM.h"</p><p>  #include "DS1302.h"</p><p>  void Func_2ms()</p>

53、<p><b>  {</b></p><p>  Seg_Scan();</p><p><b>  }</b></p><p>  void Func_20ms()</p><p><b>  {</b></p><p>  Key_Pa

54、geAdd();</p><p>  Key_PageCut();</p><p>  Key_PageInto();</p><p>  Key_PageBack();</p><p>  Into_Done();</p><p>  Back_Done();</p><p><b>

55、;  }</b></p><p>  void Func_200ms()</p><p><b>  {</b></p><p>  AD_Result();</p><p>  PWM_Out();</p><p><b>  }</b></p>

56、<p>  void Func_400ms()</p><p><b>  {</b></p><p>  Add_Done();</p><p>  Cut_Done();</p><p>  Rd_Ds1302();</p><p>  Seg_Flick();</p>

57、<p><b>  }</b></p><p>  //-----------------------</p><p>  void Sys_Init()</p><p><b>  {</b></p><p>  MiRts51_Init();</p><p>

58、  StcAD_Init();</p><p>  Init_PWM();</p><p>  Ds1302_Init();</p><p><b>  }</b></p><p>  void main()</p><p><b>  {</b></p>&l

59、t;p>  Sys_Init();</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  MiRts51_Sys();</p><p><b>  }</b></p><p><b&

60、gt;  }</b></p><p>  /**************************/</p><p>  /**********子程序**********/</p><p>  /**************************/</p><p>  /**////////////////////////////

61、////////////////////</p><p><b>  定時中斷子程序</b></p><p>  ////////////////////////////////////////////////**/</p><p>  #include <REG51.H></p><p>  #define

62、 UnChar unsigned char</p><p>  #define TSys_Unit 2000</p><p>  #define Time0_TF0 1</p><p>  UnCharT2ms ,T20ms ,T200ms ;</p><p>  bitT2ms_Bit,T20ms_Bit,T200m

63、s_Bit,T400ms_Bit;</p><p>  void MiRts51_Init()</p><p><b>  {</b></p><p><b>  EA=1;</b></p><p><b>  ET0=1;</b></p><p>  

64、TMOD|=0X01;</p><p>  TH0=(65536-TSys_Unit)/256;</p><p>  TL0=(65536-TSys_Unit)%256;</p><p><b>  TR0=1;</b></p><p><b>  }</b></p><p>

65、;  void MiRts51_Clock() interrupt Time0_TF0</p><p><b>  {</b></p><p>  TH0=(65536-TSys_Unit)/256;</p><p>  TL0=(65536-TSys_Unit)%256;</p><p>  T2ms_Bit=1;&l

66、t;/p><p><b>  ++T2ms;</b></p><p>  if(T2ms>=10)</p><p><b>  {</b></p><p><b>  T2ms=0;</b></p><p>  T20ms_Bit=1;</p&g

67、t;<p><b>  ++T20ms;</b></p><p>  if(T20ms>=10)</p><p><b>  {</b></p><p><b>  T20ms=0;</b></p><p>  T200ms_Bit=1;</p>

68、<p><b>  ++T200ms;</b></p><p>  if(T200ms>=2)</p><p><b>  {</b></p><p><b>  T200ms=0;</b></p><p>  T400ms_Bit=1;</p>

69、<p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  extern void Func_2ms();</p>

70、<p>  extern void Func_20ms();</p><p>  extern void Func_200ms();</p><p>  extern void Func_400ms();</p><p>  void MiRts51_Sys()</p><p><b>  {</b></

71、p><p>  if(T2ms_Bit==1)</p><p><b>  {</b></p><p>  T2ms_Bit=0;</p><p>  Func_2ms();</p><p><b>  }</b></p><p>  if(T20ms_B

72、it==1)</p><p><b>  {</b></p><p>  T20ms_Bit=0;</p><p>  Func_20ms();</p><p><b>  }</b></p><p>  if(T200ms_Bit==1)</p><p&

73、gt;<b>  {</b></p><p>  T200ms_Bit=0;</p><p>  Func_200ms();</p><p><b>  }</b></p><p>  if(T400ms_Bit==1)</p><p><b>  {</b&

74、gt;</p><p>  T400ms_Bit=0;</p><p>  Func_400ms();</p><p><b>  }</b></p><p><b>  }</b></p><p>  /*************************/</p>

75、;<p>  //////////////顯示信號//////////////////</p><p>  /*************************/</p><p>  #include <REG51.h></p><p>  #define UnChar unsigned char</p><p> 

76、 #define UnInt unsigned int</p><p>  #define Data_Port P0</p><p>  #define Addr_Port P2</p><p>  UnChar idata Seg_Buf[8]; //idata:單片機間接訪問的片內(nèi)RAM區(qū),允許訪問全部片內(nèi)RAM </p><p> 

77、 UnChar Seg_Column=0;</p><p>  bit Seg_Bit;</p><p>  //extern的應用,例如:原定義:unsigned char idata abc; 引用:extern idata abc;</p><p>  extern char Page_Num;//“頁面顯示” 從外文件庫調(diào)用Page_N

78、um</p><p>  extern UnInt Last_Result;</p><p>  extern bit Flick_Bit;</p><p>  extern UnChar Into_Count; //計數(shù)按鍵按下的次數(shù)</p><p>  extern char Temp_Ten,Temp_One,Temp_Dot;&l

79、t;/p><p>  extern UnChar idata Real_Time[7];</p><p>  UnChar code Seg_Num[] ={~0x3f,~0x06,~0x5b,~0x4f,~0x66,~0x6d,~0x7d,~0x07,~0x7f,~0x6f,~0x40};</p><p>  //,~0x77,~0x7c,~0x39,~0x5e,~0

80、x79,~0x71};//a-f</p><p>  UnChar codeSeg_Sign[]={~0x40,~0x63,~0x39};// -, °, C </p><p>  UnChar code Seg_Addr[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};</p><p

81、>  void Scan_Clean() //賦初值函數(shù)</p><p><b>  {</b></p><p>  Data_Port=0xff;</p><p>  Addr_Port=0xff;</p><p><b>  }</b></p><p><

82、;b>  //執(zhí)行段選信號</b></p><p>  UnChar Scan_Data(UnChar Num_Show,UnChar Dot_Show)</p><p><b>  {</b></p><p>  bit Num_Bit,Dot_Bit;</p><p>  Num_Bit=(bit)

83、((Num_Show>>Seg_Column)&0x01);</p><p>  Dot_Bit=(bit)((Dot_Show>>Seg_Column)&0x01);</p><p>  if(Num_Bit==1&&Dot_Bit==0)</p><p><b>  {</b><

84、/p><p>  Data_Port=Seg_Buf[Seg_Column];</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  if(Num_Bit==1&&Dot_Bit==1)</p><p>

85、;<b>  {</b></p><p>  Data_Port=Seg_Buf[Seg_Column]&0x7f;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  if(Num_Bit==0&

86、&Dot_Bit==0)</p><p><b>  {</b></p><p>  Data_Port=~0x00;</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  if(Nu

87、m_Bit==0&&Dot_Bit==1)</p><p><b>  {</b></p><p>  Data_Port=~0x80;</p><p><b>  return 0;</b></p><p><b>  }</b></p><

88、;p><b>  return 0;</b></p><p><b>  }</b></p><p>  void Scan_Addr()</p><p><b>  {</b></p><p>  Addr_Port=Seg_Addr[Seg_Column];</

89、p><p>  ++Seg_Column;</p><p>  if(Seg_Column>=8)</p><p><b>  {</b></p><p>  Seg_Column=0;</p><p><b>  }</b></p><p><

90、;b>  }</b></p><p>  void Page0()</p><p><b>  {</b></p><p>  UnInt Temp_Tmp,Tmp_Use;</p><p>  Tmp_Use=(((3716+9*Last_Result)/21+9)/0.88-27.5)*1.17;

91、 //溫度采集計算公式</p><p>  //Tmp_Use=(10+(Last_Result-600)/42)*10;</p><p>  Temp_Tmp=Tmp_Use/100;</p><p>  Seg_Buf[0]=Seg_Num[Temp_Tmp];</p><p>  Temp_Tmp=Tmp_Use%100/10;&l

92、t;/p><p>  Seg_Buf[1]=Seg_Num[Temp_Tmp]&0x7f; //顯示小數(shù)點</p><p>  Temp_Tmp=Tmp_Use%10;</p><p>  Seg_Buf[2]=Seg_Num[Temp_Tmp];</p><p>  Seg_Buf[3]=Seg_Sign[1];

93、 //顯示溫度單位</p><p>  Seg_Buf[4]=Seg_Num[Temp_Ten];</p><p>  Seg_Buf[5]=Seg_Num[Temp_One]&0x7f; //溫度直接顯示</p><p>  Seg_Buf[6]=Seg_Num[Temp_Dot];</p><p>  S

94、eg_Buf[7]=Seg_Sign[1]; //顯示溫度單位</p><p><b>  }</b></p><p>  //-------------------------------------</p><p>  void Page1()//時分秒</p><p><b>  {</b>&

95、lt;/p><p>  UnChar Page1_Tmp;</p><p>  Page1_Tmp=Real_Time[2]%100/10;</p><p>  Seg_Buf[0]=Seg_Num[Page1_Tmp]; //顯示時的 十位</p><p>  Page1_Tmp=Real_Time[2]%10;</p><

96、p>  Seg_Buf[1]=Seg_Num[Page1_Tmp]; //顯示時的 個位</p><p>  Seg_Buf[2]=Seg_Sign[0];//顯示一干 </p><p>  Page1_Tmp=Real_Time[1]%100/10;</p><p>  Seg_Buf[3]=Seg_Num[Page1_Tmp];//顯示分的 十位 &

97、lt;/p><p>  Page1_Tmp=Real_Time[1]%10;</p><p>  Seg_Buf[4]=Seg_Num[Page1_Tmp];//顯示分的 個位 </p><p>  Seg_Buf[5]=Seg_Sign[0];//顯示一干</p><p>  Page1_Tmp=Real_Time[0]%100/10;

98、</p><p>  Seg_Buf[6]=Seg_Num[Page1_Tmp];//顯示秒的 十位</p><p>  Page1_Tmp=Real_Time[0]%10;</p><p>  Seg_Buf[7]=Seg_Num[Page1_Tmp];//顯示秒的 個位</p><p><b>  }</b>&l

99、t;/p><p>  void Page2()//年月日</p><p><b>  {</b></p><p>  UnChar Page2_Tmp;</p><p>  Seg_Buf[0]=Seg_Num[2]; //固定顯示值為2 千位</p><p>  Seg_Buf[1]=Se

100、g_Num[0]; //固定顯示值為0 百位</p><p>  Page2_Tmp=Real_Time[6]%100/10; </p><p>  Seg_Buf[2]=Seg_Num[Page2_Tmp]; //顯示十位</p><p>  Page2_Tmp=Real_Time[6]%10;</p><p>  Se

101、g_Buf[3]=Seg_Num[Page2_Tmp]&0x7f; //顯示個位</p><p>  Page2_Tmp=Real_Time[4]%100/10; </p><p>  Seg_Buf[4]=Seg_Num[Page2_Tmp]; //顯示十位月</p><p>  Page2_Tmp=Real_Time[4]%10;<

102、/p><p>  Seg_Buf[5]=Seg_Num[Page2_Tmp]&0x7f; //顯示個位月</p><p>  Page2_Tmp=Real_Time[3]%100/10;</p><p>  Seg_Buf[6]=Seg_Num[Page2_Tmp]; //顯示十位日</p><p>  Page2_Tmp=Re

103、al_Time[3]%10;</p><p>  Seg_Buf[7]=Seg_Num[Page2_Tmp]; //顯示個位日</p><p><b>  }</b></p><p>  void *Dir_Page[]={Page0,Page1,Page2};</p><p>  void Page_Turn

104、()</p><p><b>  {</b></p><p>  void (*Page_Tmp)();</p><p>  Page_Tmp=Dir_Page[Page_Num]; </p><p>  (*Page_Tmp)();</p><p><b>  }<

105、;/b></p><p>  void Seg_Scan()</p><p><b>  {</b></p><p>  Page_Turn(); </p><p>  Scan_Clean(); //調(diào)用賦初值函數(shù);</p><p>  if(Seg_Bit==0)<

106、;/p><p><b>  {</b></p><p>  Scan_Data(0xff,0x00);//送段選信號</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&

107、gt;</p><p>  if(Page_Num==0)</p><p><b>  {</b></p><p>  if(Into_Count==1)</p><p>  Scan_Data(0xef,0x20); //送段選信號</p><p>  if(Into_Count==2)<

108、/p><p>  Scan_Data(0xdf,0x20);//送段選信號</p><p>  if(Into_Count==0)</p><p>  Scan_Data(0xbf,0x20);//送段選信號</p><p><b>  }</b></p><p>  if(Page_Num==1)&

109、lt;/p><p><b>  {</b></p><p>  if(Into_Count==1)</p><p>  Scan_Data(0xfd,0x00);//送段選信號</p><p>  if(Into_Count==2)</p><p>  Scan_Data(0xef,0x00);//送

110、段選信號</p><p>  if(Into_Count==0)</p><p>  Scan_Data(0x7f,0x00);//送段選信號</p><p><b>  }</b></p><p>  if(Page_Num==2)</p><p><b>  {</b>&

111、lt;/p><p>  if(Into_Count==1) </p><p>  Scan_Data(0xf7,0x28);//送段選信號</p><p>  if(Into_Count==2)</p><p>  Scan_Data(0xdf,0x28);//送段選信號</p><p>  if(Into_Count==

112、0)</p><p>  Scan_Data(0x7f,0x28);//送段選信號</p><p><b>  }</b></p><p><b>  }</b></p><p>  Scan_Addr(); //掃描段選信號</p><p><b>  }<

113、/b></p><p>  void Seg_Flick()</p><p><b>  {</b></p><p>  if(Flick_Bit==0)</p><p><b>  {</b></p><p>  Seg_Bit=0;</p><p

114、>  Into_Count=0;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Seg_Bit=~Seg_Bit;</p><p><b>

115、;  }</b></p><p><b>  }</b></p><p>  /***************************/</p><p>  /////////////////按鍵子程序//////////////</p><p>  /***************************/

116、</p><p>  #include <REG51.H></p><p>  #include "DS1302.h"</p><p>  #define UnChar unsigned char</p><p>  // sbit 位變量名=字節(jié)地址^位位置</p><p>  sbi

117、t Key_Add=P1^4;</p><p>  sbit Key_Cut=P1^5;</p><p>  sbit Key_Into=P1^6;</p><p>  sbit Key_Back=P1^7;</p><p>  char Page_Num; //顯示頁面</p><p>  char Temp_T

118、en=1,Temp_One=0,Temp_Dot=0;</p><p>  UnChar Into_Count;</p><p>  //--定義值是一個二進制位,不是0就是1</p><p>  bit Add_Bit,Cut_Bit,Into_Bit,Back_Bit;</p><p>  bit Add_Later=0;</p&g

119、t;<p>  bit Cut_Later=0;</p><p>  bit Flick_Bit;</p><p>  extern char idata Real_Time[7];//例如:原定義:unsigned char idata abc; 引用:extern idata abc;</p><p>  extern UnChar code Ti

120、me_Wr[7];//秒,分,時,日,月,周,年</p><p>  UnChar PWM_OutDone;</p><p>  void Add_Done(); //添加完成函數(shù)</p><p>  void Page0_Add(); //在第一頁內(nèi)執(zhí)行函數(shù)</p><p>  void Page1_Add(); //在第二頁

121、內(nèi)執(zhí)行函數(shù)</p><p>  void Page2_Add();//在第三頁內(nèi)執(zhí)行函數(shù)</p><p>  void Cut_Done();</p><p>  void Page0_Cut();</p><p>  void Page1_Cut();</p><p>  void Page2_Cut();<

122、;/p><p>  void Into_Done();</p><p>  void Back_Done();</p><p>  UnChar Return_Temp();</p><p>  void Key_PageAdd()</p><p><b>  {</b></p><

123、;p>  static bit Key_Affirm,Add_Once; //默認值0</p><p>  /*static表示靜態(tài)的,當程序運行時這個變量就在內(nèi)存中開辟地址了.</p><p>  當這個變量在某函數(shù)內(nèi)定義時,不象自動變量那樣,當調(diào)用時就存在,</p><p>  退出函數(shù)時就消失。靜態(tài)局部變量始終存在著,也就是說它的生存期為整個源程序。

124、</p><p>  對基本類型的靜態(tài)局部變量若在說明時未賦以初值,則系統(tǒng)自動賦予0值。</p><p>  而對自動變量不賦初值,則其值是不定的,非靜態(tài)局部變量在函數(shù)關閉后重新打開時就會重置初始值,</p><p>  而靜態(tài)變量的值和函數(shù)本身的調(diào)用無關,始終存在.*/</p><p>  if(Key_Add==0)//按下 P

125、1.4 對應的按鍵</p><p><b>  {</b></p><p>  if(Key_Affirm==1)//確認 按鍵按下</p><p><b>  {</b></p><p>  Add_Bit=1;</p><p>  if(Add_Once==0)

126、</p><p><b>  {</b></p><p>  Add_Once=1; //添加一次</p><p>  Add_Done(); //添加完成</p><p>  Add_Later=1; //添加后 要至1</p><p><b>  }</b>

127、;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Key_Affirm=1; //等待按鍵按下</p><p><b>  }</b&

128、gt;</p><p><b>  }</b></p><p>  else//沒按下 P1.4 “切” 執(zhí)行這句</p><p><b>  {</b></p><p>  Key_Affirm=0;</p><p>  Add_Once=0;</p>

129、;<p>  Add_Bit=0;</p><p><b>  }</b></p><p><b>  }</b></p><p>  void Add_Done()</p><p><b>  {</b></p><p>  if(Add

130、_Bit==1&&Add_Later==0)</p><p><b>  {</b></p><p>  if(Flick_Bit==0)</p><p><b>  {</b></p><p>  ++Page_Num; //頁面自增</p><p>

溫馨提示

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

評論

0/150

提交評論