版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、<p> 基于at89s52單片機的數(shù)控穩(wěn)壓電源設(shè)計</p><p> 內(nèi)容摘要:該電源系統(tǒng)以AT89S52單片機為核心控制芯片,實現(xiàn)可預(yù)設(shè)電壓數(shù)控直流電源功能的方案。設(shè)計采用8位精度的DA轉(zhuǎn)換器DAC0808和LT082運算放大器構(gòu)成穩(wěn)壓源,實現(xiàn)了輸出電壓范圍為0V~+9.9V,電壓步進可調(diào)的數(shù)控穩(wěn)壓電源,具有較高的精度與穩(wěn)定性。另外該方案采用通過按鍵實現(xiàn)輸出電壓的方便設(shè)定,顯示部分采用數(shù)碼管來顯
2、示輸出電壓,通過數(shù)字電壓表顯示實際輸出電壓值。 </p><p> 關(guān)鍵詞:數(shù)控 AT89S52 DAC0808 穩(wěn)壓電源 </p><p><b> 1緒論</b></p><p> 電源技術(shù)尤其是數(shù)控電源技術(shù)是一門實踐性很強的工程技術(shù),服務(wù)于各行各業(yè)。電力電子技術(shù)是電能的最佳應(yīng)用技術(shù)之一。當(dāng)今電源技術(shù)融合了電氣、電子、系統(tǒng)集成、控
3、制理論、材料等諸多學(xué)科領(lǐng)域。隨著計算機和通訊技術(shù)發(fā)展而來的現(xiàn)代信息技術(shù)革命,給電力電子技術(shù)提供了廣闊的發(fā)展前景,同時也給電源提出了更高的要求。隨著數(shù)控電源在電子裝置中的普遍使用,普通電源在工作時產(chǎn)生的誤差,會影響整個系統(tǒng)的精確度。電源在使用時會造成很多不良后果,世界各國紛紛對電源產(chǎn)品提出了不同要求并制定了一系列的產(chǎn)品精度標(biāo)準(zhǔn)。只有滿足產(chǎn)品標(biāo)準(zhǔn),才能夠進入市場。隨著經(jīng)濟全球化的發(fā)展,滿足國際標(biāo)準(zhǔn)的產(chǎn)品才能獲得進出的通行證。數(shù)控電源是從80
4、年代才真正的發(fā)展起來的,期間系統(tǒng)的電力電子理論開始建立。這些理論為其后來的發(fā)展提供了一個良好的基礎(chǔ)。在以后的一段時間里,數(shù)控電源技術(shù)有了長足的發(fā)展。但其產(chǎn)品存在數(shù)控程度達不到要求、分辨率不高、功率密度比較低、可靠性較差的缺點。因此數(shù)控電源主要的發(fā)展方向,是針對上述缺點不斷加以改善。單片機技術(shù)及電壓轉(zhuǎn)換模塊的出現(xiàn)為精確數(shù)控電源的發(fā)展提供了有利的條件。新的變換技術(shù)和控制理論的不斷發(fā)展,各種類型專用集成電路、數(shù)字</p><
5、;p> 數(shù)字化智能電源模塊是針對傳統(tǒng)智能電源模塊的不足提出的,數(shù)字化能夠減少生產(chǎn)過程中的不確定因素和人為參與的環(huán)節(jié)數(shù),有效地解決電源模塊中諸如可靠性、智能化和產(chǎn)品一致性等工程問題,極大地提高生產(chǎn)效率和產(chǎn)品的可維護性。</p><p> 電源采用數(shù)字控制,具有以下明顯優(yōu)點:</p><p> ?。?)易于采用先進的控制方法和智能控制策略,使電源模塊的智能化程度更高,性能更完美;&l
6、t;/p><p> ?。?)控制靈活,系統(tǒng)升級方便,甚至可以在線修改控制算法,而不必改動硬件線路;</p><p> (3)控制系統(tǒng)的可靠性提高,易于標(biāo)準(zhǔn)化,可以針對不同的系統(tǒng)(或不同型號的產(chǎn)品),采用統(tǒng)一的控制板,而只是對控制軟件做一些調(diào)整即可;</p><p> ?。?)系統(tǒng)的一致性好,成本低,生產(chǎn)制造方便。由于控制軟件不像模擬器件那樣存在差異,所以,其一致性很好
7、。由于采用軟件控制,控制板的體積將大大減小,生產(chǎn)成本下降。</p><p><b> 2 系統(tǒng)設(shè)計</b></p><h3> 2.1 設(shè)計任務(wù)與要求</h2><h4> 2.1.1 設(shè)計任務(wù)</h2><p> ?。?)設(shè)計一臺微機控制的數(shù)控直流電壓源,為電子設(shè)備供電;</p><p>
8、 (2)在設(shè)計過程中,選擇1~2個單元電路使用仿真軟件(例如Proteus等)進行仿真調(diào)試;</p><p> (3)用計算機繪制所有的電路圖。</p><h4> 2.1.2 設(shè)計要求</h2><p> ?。?)輸出電壓范圍0-9.9v,步進值可調(diào);</p><p> ?。?)電壓調(diào)整率Sv<0.1%V;</p>
9、<p> ?。?)用數(shù)字顯示輸出電壓。 </p><h3> 2.2 方案的選擇與論證</h2><h4> 2.2.1 總體設(shè)計方案</h2><p> 方案一:采用各類數(shù)字電路來組成鍵盤控制系統(tǒng),進行信號處理,如選用CPLD等可編程邏輯器件。本方案電路復(fù)雜,靈活性不高,效率低,不利于系統(tǒng)的擴展,對信號處理比較困難。</p><
10、;p> 方案二:采用51系列單片機作為整機的控制單元,通過改變輸入數(shù)字量來改變輸出電壓值,從而使輸出功率管的基極電壓發(fā)生變化,間接地改變輸出電壓的大小。</p><p> 本設(shè)計采用第二種方案。為了能夠使系統(tǒng)具備檢測實際輸出電壓值的大小,利用51系列單片機為主控制器,通過鍵盤來設(shè)置直流電源的輸出電流,設(shè)置步進等級可調(diào),并可由數(shù)碼管顯示預(yù)設(shè)電壓值,數(shù)字電壓表顯示實際輸出電壓。從數(shù)字電壓表中讀出實際電壓值,
11、可直觀的看出實際電壓與預(yù)設(shè)電壓是否有偏差,并通過鍵盤更改。通過軟件利用單片機程控輸出數(shù)字信號,經(jīng)過D/A轉(zhuǎn)換器(DA0808)輸出模擬量,再經(jīng)過運算放大器隔離放大,控制輸出功率管的基極,隨著功率管基極電電流的變化而輸出不同的電壓。</p><h4> 2.2.2 顯示部分</h2><p> 采用了鍵盤/顯示器接口控制器。不僅簡化接口引線,而且減小了軟件對鍵盤/顯示器的查詢時間,提高了
12、CPU的利用率。采用三位半的數(shù)字電壓表直接對輸出電壓采樣并顯示輸出實際電壓值,一旦系統(tǒng)工作異常,出現(xiàn)預(yù)制值與輸出值偏差過大,用戶可以根據(jù)該信息予以處理。</p><p><b> 3 系統(tǒng)硬件設(shè)計</b></p><p> 本系統(tǒng)由控制器模塊、按鍵模塊、LED顯示模塊和D/A轉(zhuǎn)換模塊4個模塊組成,系統(tǒng)硬件組成框圖如圖1所示。系統(tǒng)總體電路原理圖如圖2所示。</
13、p><p><b> 圖1系統(tǒng)組成框圖</b></p><p> 圖2 系統(tǒng)電路原理圖</p><p><b> 3.1 控制器模塊</b></p><p> 本系統(tǒng)控制器芯片采用AT89S52單片機,其管腳圖如圖3所示。</p><p> 圖3 AT89S52管腳圖&
14、lt;/p><p> AT89S52是一種低功耗、高性能CMOS8位微控制器,具有 8K 在系統(tǒng)可編程Flash存儲器。使用Atmel公司高密度非易失性存儲器技術(shù)制造,與工業(yè)80C51 產(chǎn)品指令和引腳完全兼容。片上Flash允許程序存儲器在系統(tǒng)可編程,亦適于常規(guī)編程器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得AT89S52為眾多嵌入式控制應(yīng)用系統(tǒng)提供高靈活、有效的解決方案。AT89S52的
15、主要特性是:與MCS-51單片機產(chǎn)品兼容;8K字節(jié)在系統(tǒng)可編程Flash存儲器;1000次擦寫周期;三級加密程序存儲器;32個可編程I/O口線;三個16位定時器/計數(shù)器;8個中斷源;全雙工UAR串行通道;低功耗空閑和掉電模式;掉電后中斷可喚醒;有看門狗定時器;雙數(shù)據(jù)指針。AT89S52具有以下標(biāo)準(zhǔn)功能:8k字節(jié)Flash,256字節(jié)RAM,32位I/O口線,看門狗定時器,2個數(shù)據(jù)指針,三個16位定時器/計數(shù)器,一個6向量2級中斷結(jié)構(gòu),全
16、雙工串行口,片內(nèi)晶振及時鐘電路。另外,AT89S52 可降至0Hz靜態(tài)邏輯操作,支持2種軟件可選擇節(jié)電模式??臻e模式下,CPU停止工作,允許RAM、定時器/計數(shù)器、</p><p><b> 3.2 按鍵模塊</b></p><p> 采用3x4鍵盤與單片機的P1口相連,連接電路如圖4所示。*設(shè)為復(fù)位鍵,按下時,數(shù)碼管熄滅,電壓輸出為0。#設(shè)為確定鍵,按下時數(shù)碼管
17、顯示預(yù)設(shè)電壓值,數(shù)字電壓表顯示實際電壓值。 </p><p><b> 圖4 按鍵電路</b></p><h3> 3.3 D/A轉(zhuǎn)換模塊</h2><p> D/A轉(zhuǎn)換模塊如圖5所示,由數(shù)模轉(zhuǎn)換器DAC0808和運放TL082構(gòu)成。DAC0808芯片是一個8位D/A轉(zhuǎn)換器,有8個數(shù)碼輸入端,1個模擬輸出端,能將控制電路輸出的8位二進制數(shù)
18、字量轉(zhuǎn)換成模擬量的輸出。P2口與DAC0808的輸入端相連,通過D/A轉(zhuǎn)換電路將輸入的數(shù)字量轉(zhuǎn)為模擬量,通過TL082運算放大器輸出實際的電壓,從數(shù)字電壓表讀出。</p><p> 圖5 D/A轉(zhuǎn)換電路圖</p><p> DAC0808引腳圖如圖6所示。DAC0808各引腳功能如表1所示。</p><p> 圖6 DAC0808引腳圖</p>
19、<p> DAC0808的COMP引腳的作用為通過調(diào)節(jié)外接電阻,以達到改善放大器的性能和輸出電壓。運放輸出電壓為</p><p><b> (1)</b></p><p> 式中,VREF為外接參考電壓,D7~DO為8位輸入數(shù)字量。當(dāng)輸入數(shù)字量在00000000~11111111之間變化時,其對應(yīng)的輸出模擬電壓U1在0~-VREF之間,電壓分辨率為:△
20、V=5V/(28-1)=19.6mV。</p><p> 表1 DAC0808的引腳功能</p><p> TL082是一通用的J-FET雙運用算放大器,其引腳圖如圖7所示,其中2、3管腳分別為正反向輸入,對應(yīng)的6、5管腳為正反向輸出,8、4為正負電源。TL0832特點有:較低輸入偏置電壓和偏移電流;輸出沒有短路保護;輸入級具有較高的輸入阻抗;內(nèi)建頻率被子償電路;較高的壓擺率;最大工作
21、電壓18V。</p><p> 圖7 TLO82管腳圖</p><h3> 3.4數(shù)碼管顯示模塊</h2><p> 數(shù)碼顯示模塊電路如圖8所示。顯示部分選用的是7seg-mpx2-cc兩片7段共陰數(shù)碼管。單片機的P00~P07分別接數(shù)碼管的A~DP口,P20、P21分別接數(shù)碼管1、2接口,分別控制第一片和第二片的暗亮。外加上拉電阻加強驅(qū)動能力,使數(shù)碼管更亮。
22、</p><p> 圖8 數(shù)碼管顯示電路</p><p><b> 3.5硬件元件清單</b></p><p> 系統(tǒng)元器件清單見表2。</p><p> 表2 系統(tǒng)元器件清單</p><p><b> 4軟件設(shè)計與仿真</b></p><p&g
23、t; 本系統(tǒng)程序包括主程序、鍵盤掃描子程序、發(fā)送鍵碼子程序、發(fā)送數(shù)據(jù)子程序、接收命令子程序等。主程序用于系統(tǒng)初始化,子程序調(diào)度等。鍵盤掃描子程序用于掃描鍵盤狀態(tài),將被按鍵的位置號存入緩沖器中。發(fā)送鍵碼子程序用于將緩沖區(qū)鍵的接通碼或斷開碼發(fā)送給單片機接口。發(fā)送數(shù)據(jù)子程序用于將數(shù)據(jù)發(fā)給單片機接口。接收命令子程序用于接收單片機接口發(fā)來的鍵盤命令。</p><p><b> 4.1主程序設(shè)計</b&g
24、t;</p><p> 主程序通過鍵盤掃描子程序進行各行掃描是否有按鍵,消抖及重鍵處理:通過軟件上延時程序來消除抖動;采用后按鍵優(yōu)先處理,即多鍵同時按下時,只重復(fù)發(fā)送最后按下鍵的掃描碼。主程序流程圖如圖9所示。</p><p><b> 圖9 主程序流程圖</b></p><p> 4.2 仿真軟件簡介</p><p&
25、gt; Proteus是英國Labcenter公司開發(fā)的電路分析與實物仿真軟件。它運行于Windows操作系統(tǒng)上,可以仿真、分析(SPICE)各種模擬器件和集成電路,該軟件的特點是:</p><p> ?。?)實現(xiàn)了單片機仿真和SPICE電路仿真相結(jié)合。具有模擬電路仿真、數(shù)字電路仿真、單片機及其外圍電路組成的系統(tǒng)的仿真、RS232動態(tài)仿真、I2C調(diào)試器、SPI調(diào)試器、鍵盤和LCD系統(tǒng)仿真的功能;有各種虛擬儀器,
26、如示波器、邏輯分析儀、信號發(fā)生器等。</p><p> ?。?)支持主流單片機系統(tǒng)的仿真。目前支持的單片機類型有:ARM7(LPC21xx)、 8051/52系列、AVR系列、PIC10/12/16/18系列、HC11系列以及多種外圍芯片。</p><p> ?。?)提供軟件調(diào)試功能。在硬件仿真系統(tǒng)中具有全速、單步、設(shè)置斷點等調(diào)試功能,同時可以觀察各個變量、寄存器等的當(dāng)前狀態(tài),因此在該軟件
27、仿真系統(tǒng)中,也必須具有這些功能;同時支持第三方的軟件編譯和調(diào)試環(huán)境,如Keil C51 uVision2、MPLAB等軟件。</p><p> ?。?)具有強大的原理圖繪制功能。</p><p> 總之,該軟件是一款集單片機和SPICE分析于一身的仿真軟件,功能極其強大。</p><p> Proteus7.5是目前最好的模擬單片機外圍器件的工具,可以仿真51系
28、列、AVR、PIC等常用的MCU及其外圍電路(如LCD、RAM、ROM、鍵盤、馬達、LED、AD/DA、部分SPI器件、部分IIC器件等)。</p><p> 軟件編譯采用KEIL C51軟件,Keil C51是美國Keil Software公司出品的51系列兼容單片機C語言軟件開發(fā)系統(tǒng),與匯編相比,C語言在功能上、結(jié)構(gòu)性、可讀性、可維護性上有明顯的優(yōu)勢,因而易學(xué)易用。用過匯編語言后再使用C來開發(fā),體會更加深刻
29、。</p><p> Keil C51軟件提供豐富的庫函數(shù)和功能強大的集成開發(fā)調(diào)試工具,全Windows界面。另外重要的一點,只要看一下編譯后生成的匯編代碼,就能體會到Keil C51生成的目標(biāo)代碼效率非常之高,多數(shù)語句生成的匯編代碼很緊湊,容易理解。在開發(fā)大型軟件時更能體現(xiàn)高級語言的優(yōu)勢。</p><p><b> 4.3 仿真結(jié)果 </b></p>
30、<p> 先按復(fù)位鍵,系統(tǒng)初始化,再輸入數(shù)字12(預(yù)設(shè)電壓值為1.2V),按下#鍵(確定鍵),則數(shù)碼管顯示12,數(shù)字電壓表顯示實際輸出電壓值。圖10、11分別為數(shù)碼管和電壓顯示仿真,其中圖10中數(shù)碼管顯示1.2V,圖11中數(shù)字電壓表顯示1.21V。</p><p> 圖10 預(yù)設(shè)電壓(1.2V)數(shù)碼管顯示仿真圖</p><p> 圖11預(yù)設(shè)電壓(1.2V)數(shù)字電壓表顯示
31、仿真圖</p><p> 若需要重新設(shè)定,則按下*號鍵(復(fù)位鍵)。此時數(shù)碼管熄滅,數(shù)字電壓表讀數(shù)為0。此時可重新設(shè)定。仿真結(jié)果如圖12、13所示。</p><p> 圖12 重設(shè)定數(shù)碼管顯示仿真圖</p><p> 圖13 重設(shè)定數(shù)字電壓表顯示仿真圖</p><p><b> 4.4 系統(tǒng)調(diào)試</b></p
32、><p> 在調(diào)試過程中主要是對程序的修改,特別是延時子程序。開始延時較短時,當(dāng)按下數(shù)字鍵時,兩個數(shù)碼管同時顯示按下的數(shù)字。如果延時較長則數(shù)字會緩慢的顯示出來。通過修改程序,將延時調(diào)到適中,系統(tǒng)正常工作。</p><p><b> 4.5 誤差分析</b></p><p> 設(shè)定預(yù)設(shè)值后,讀取數(shù)字電壓表電壓值,共記錄10組數(shù)據(jù)如表3所示。通過
33、預(yù)設(shè)值和實際值的比較進行誤差分析。</p><p> 表3 預(yù)設(shè)值和實際值的比較(單位:V)</p><p> 誤差平均值=(0.8%+0.6%+0.9%+0.6%+0.7%+0.7%+0.9%+</p><p> 1.2%+0.7%)</p><p> 從數(shù)據(jù)中可看出0.78%<<1%,誤差較小。</p>
34、<p> 產(chǎn)生誤差的因素主要有一下幾點:</p><p> ?。?)在參數(shù)選擇的時候沒有完全匹配;</p><p> ?。?)數(shù)字電壓表只能讀出3位有效數(shù)字;</p><p> ?。?)基準(zhǔn)電壓設(shè)定不適中;</p><p> (4)轉(zhuǎn)換位數(shù)不高。附錄:程序清單</p><p> #define_PWL
35、OCK_H // 防止PWLock.h被重復(fù)引用</p><p> #define_PWLOCK_H</p><p> #include <reg52.h></p><p> #include <absacc.h></p><p> #include <stdio.h></p>
36、<p> #include <math.h></p><p> #define uchar unsigned char</p><p> #define uint unsigned int</p><p><b> uchar px;</b></p><p><b> uint
37、 a;</b></p><p><b> uint b;</b></p><p> uint c; //為0XFF</p><p><b> uint i;</b></p><p> uchar digbit;
38、 // 字位</p><p> uchar dy;</p><p> uchar wordbuf[2];// 字型碼緩沖區(qū)</p><p> uchar count;// 位計數(shù)</p><p> uchar pwbuf[2];// 輸入數(shù)字存儲區(qū)</p><p
39、> bit enterflag;// 確認鍵按下與否標(biāo)志</p><p><b> bit lh;</b></p><p> bit pwflag;// 密碼正確與否標(biāo)志</p><p> bit showflag;// 數(shù)碼管顯示與否標(biāo)志</p><p> sbit P2
40、0=P2^0;</p><p> sbit P21=P2^1;</p><p> void display(void);// 顯示函數(shù)</p><p><b> #endif</b></p><p> //#include "PWLock.h"</p><p>
41、 /* 鍵消抖延時函數(shù) */</p><p> void delay(void)</p><p><b> {</b></p><p><b> uint i;</b></p><p> for (i=12000;i>0;i--);</p><p> }
42、 /* 鍵掃描函數(shù) */</p><p> uchar keyscan(void)</p><p><b> {</b></p><p> uchar scancode,tmpcode;</p><p> P1 = 0xf0; //
43、發(fā)全0行掃描碼</p><p> if ((P1&0xf0)!=0xf0)// 若有鍵按下</p><p><b> {</b></p><p> delay();// 延時去抖動</p><p> if ((P1&0xf0)!=0xf0)// 延時后再判斷一次,去
44、除抖動影響</p><p><b> { </b></p><p> scancode = 0xfe;</p><p> while((scancode&0x10)!=0)// 逐行掃描</p><p><b> {</b></p><p> P1 =
45、 scancode;// 輸出行掃描碼</p><p> if ((P1&0xf0)!=0xf0)// 本行有鍵按下</p><p><b> {</b></p><p> tmpcode = (P1&0xf0)|0x0f;</p><p> /* 返回特征字節(jié)碼,為1的位即對應(yīng)于行和
46、列 */</p><p> return((~scancode)+(~tmpcode));</p><p><b> }</b></p><p> else scancode = (scancode<<1)|0x01;//行掃描碼左移一位</p><p><b> }</b>&l
47、t;/p><p><b> }</b></p><p><b> }</b></p><p> return(0);// 無鍵按下,返回值為0 </p><p><b> }</b></p><p> /* 定時器0中斷服務(wù)子程序,2
48、ms定時動態(tài)掃描顯示 */</p><p> void time0_int(void) interrupt 1 </p><p><b> {</b></p><p> /* 重置2ms定時 */</p><p> TH0 = -2000/256;</p><p> TL0 = -200
49、0%256;</p><p> px++; //片選</p><p> if (showflag==1)</p><p> display();// 調(diào)用顯示函數(shù)</p><p><b> }</b></p><p> /* 根據(jù)共陰極字型編碼表
50、獲取0~9,A~B字型代碼 */</p><p> uchar getcode(uchar i)</p><p><b> {</b></p><p><b> uchar p;</b></p><p> switch (i)</p><p><b> {
51、</b></p><p> case 0: p=0x3f;break;/* 0 */</p><p> case 1: p=0x06;break;/* 1 */</p><p> case 2: p=0x5B;break;/* 2 */</p><p> case 3: p=0x4F;br
52、eak;/* 3 */</p><p> case 4: p=0x66;break;/* 4 */</p><p> case 5: p=0x6D;break;/* 5 */</p><p> case 6: p=0x7D;break;/* 6 */</p><p> case 7: p=0x07
53、;break;/* 7 */</p><p> case 8: p=0x7F;break;/* 8 */</p><p> case 9: p=0x67;break;/* 9 */</p><p> default: break;</p><p><b> }</b>
54、</p><p> return(p);</p><p><b> }</b></p><p> void Display(void) //LED數(shù)值顯示</p><p><b> { </b></p><p> switch (px%2)</p>
55、<p><b> {</b></p><p> case 0:P20 = 1;P21 = 0; P0 = getcode(wordbuf[0]);break;</p><p> case 1:P21 = 1;P20 = 0; P0 = getcode(wordbuf[1]);break;</p><p> default:
56、 return;</p><p><b> }</b></p><p><b> }</b></p><p> /* 顯示函數(shù) */</p><p> /*void display(void)</p><p><b> {</b></p&
57、gt;<p><b> uchar i;</b></p><p> switch (digbit)</p><p><b> {</b></p><p> case 1:i=0;break;</p><p> case 2:i=1;break;</p>
58、<p> default: break;</p><p><b> }</b></p><p> P2 = 0x0;// 關(guān)閉顯示</p><p><b> //P20=0;</b></p><p><b> //P21=0;</b>&l
59、t;/p><p> P0 = getcode(wordbuf[i]);// 送字型碼</p><p> P2=digbit; // 送字位碼</p><p><b> digbit=1;</b></p><p> if(digbit==1)</p><p
60、><b> {</b></p><p><b> digbit=2;</b></p><p> P20 = 1;</p><p><b> P21 = 0;</b></p><p><b> }</b></p>&l
61、t;p><b> digbit=2;</b></p><p><b> P21 = 1;</b></p><p><b> P20 = 0;</b></p><p> if (digbit<0x02)// 共2位</p><p> digbit =
62、 digbit*2;// 左移一位</p><p><b> else</b></p><p> digbit = 0x01;</p><p><b> }</b></p><p><b> /* 主程序 */</b></p><p>
63、void main()</p><p><b> {</b></p><p> uchar j,key;</p><p> uint temp;</p><p><b> P20 = 1;</b></p><p> P21 = 1;// 關(guān)閉數(shù)碼管顯示
64、</p><p> TMOD = 0x11;// T0,T1工作方式1</p><p> TH0 = 2000/256; /* 2ms 定時設(shè)置 */</p><p> TL0 = 2000%256;</p><p> /* 啟動計數(shù)器0,關(guān)閉計數(shù)器1 */</p><p><b> T
65、R0 = 1;</b></p><p><b> ET0 = 1;</b></p><p><b> TR1 = 0;</b></p><p><b> ET1 = 1;</b></p><p><b> EA = 1;</b><
66、/p><p> count = 0;// 初始計數(shù)器設(shè)為0</p><p> enterflag = 0;// 沒有按下確認鍵</p><p><b> lh = 0;</b></p><p> pwflag = 0;// 標(biāo)志先置為0</p><p> d
67、igbit = 0x01;// 從第一位數(shù)碼管開始動態(tài)掃描</p><p> /* 剛加電時,不顯示*/</p><p> for (j=0;j<2;j++)</p><p> wordbuf[j] = 17;</p><p> showflag = 1;// 打開數(shù)碼管顯</p><p>
68、;<b> while(1)</b></p><p><b> {</b></p><p> key = keyscan();// 調(diào)用鍵盤掃描函數(shù)</p><p> switch(key)</p><p><b> {</b></p><
69、;p> case 0x11:// 1行1列,數(shù)字1</p><p> if (count<2)</p><p><b> {</b></p><p> wordbuf[count] = 1;// 對應(yīng)位上顯示“1”</p><p> pwbuf[count] = 1;</p>
70、;<p> if(count==0)</p><p><b> {a=1;</b></p><p><b> }</b></p><p> if(count==1)</p><p><b> {b=1;</b></p><p>&
71、lt;b> }</b></p><p><b> count++;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case 0x21:// 1行2列,數(shù)字3</p>
72、;<p> if (count<2)</p><p><b> {</b></p><p> wordbuf[count] = 2;// 對應(yīng)位上顯示“2"</p><p> pwbuf[count] = 2;</p><p> if(count==0)</p>&
73、lt;p><b> {a=2;</b></p><p><b> }</b></p><p> if(count==1)</p><p><b> {b=2;</b></p><p><b> }</b></p><p
74、><b> count++;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case 0x41:// 1行3列,數(shù)字3</p><p> if (count<2)</p
75、><p><b> {</b></p><p> wordbuf[count] = 3;// 對應(yīng)位上顯示“3"</p><p> pwbuf[count] = 3;</p><p> if(count==0)</p><p><b> {a=3;</b>&
76、lt;/p><p><b> }</b></p><p> if(count==1)</p><p><b> {b=3;</b></p><p><b> }</b></p><p><b> count++;</b><
77、;/p><p><b> }</b></p><p><b> break;</b></p><p> case 0x12:// 2行1列,數(shù)字4</p><p> if (count<2)</p><p><b> {</b><
78、/p><p> wordbuf[count] = 4;// 對應(yīng)位上顯示“4"</p><p> pwbuf[count] = 4;</p><p> if(count==0)</p><p><b> {a=4;</b></p><p><b> }</b&g
79、t;</p><p> if(count==1)</p><p><b> {b=4;</b></p><p><b> }</b></p><p><b> count++;</b></p><p><b> }</b>
80、</p><p><b> break;</b></p><p> case 0x22:// 2行2列,數(shù)字5</p><p> if (count<2)</p><p><b> {</b></p><p> wordbuf[count] = 5
81、;// 對應(yīng)位上顯示“5"</p><p> pwbuf[count] = 5;</p><p> if(count==0)</p><p><b> {a=5;</b></p><p><b> }</b></p><p> if(count==1)&
82、lt;/p><p><b> {b=5;</b></p><p><b> }</b></p><p><b> count++;</b></p><p><b> }</b></p><p><b> break;
83、</b></p><p> case 0x42:// 2行3列,數(shù)字6</p><p> if (count<2)</p><p><b> {</b></p><p> wordbuf[count] = 6;// 對應(yīng)位上顯示“6"</p><p&g
84、t; pwbuf[count] = 6;</p><p> if(count==0)</p><p><b> {a=6;</b></p><p><b> }</b></p><p> if(count==1)</p><p><b> {b=6;&
85、lt;/b></p><p><b> }</b></p><p><b> count++;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case
86、 0x14:// 3行1列,數(shù)字7</p><p> if (count<2)</p><p><b> {</b></p><p> wordbuf[count] = 7;// 對應(yīng)位上顯示“7"</p><p> pwbuf[count] = 7;</p><p&g
87、t; if(count==0)</p><p><b> {a=7;</b></p><p><b> }</b></p><p> if(count==1)</p><p><b> {b=7;</b></p><p><b>
88、}</b></p><p><b> count++;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case 0x24:// 3行2列,數(shù)字8</p><p&
89、gt; if (count<2)</p><p><b> {</b></p><p> wordbuf[count] = 8;// 對應(yīng)位上顯示“8"</p><p> pwbuf[count] = 8;</p><p> if(count==0)</p><p>&
90、lt;b> {a=8;</b></p><p><b> }</b></p><p> if(count==1)</p><p><b> {b=8;</b></p><p><b> }</b></p><p><b&
91、gt; count++;</b></p><p><b> }</b></p><p><b> break;</b></p><p> case 0x44:// 3行3列,數(shù)字9</p><p> if (count<2)</p><p&
92、gt;<b> {</b></p><p> wordbuf[count] = 9;// 對應(yīng)位上顯示“9"</p><p> pwbuf[count] = 9;</p><p> if(count==0)</p><p><b> {a=9;</b></p>&
93、lt;p><b> }</b></p><p> if(count==1)</p><p><b> {b=9;</b></p><p><b> }</b></p><p><b> count++;</b></p>&l
94、t;p><b> }</b></p><p><b> break;</b></p><p> case 0x18:// 4行1列,數(shù)字*</p><p> count = 0;</p><p><b> P3=0;</b></p><
95、;p> px=0;// 顯示清零</p><p> for (j=0;j<2;j++)</p><p><b> {</b></p><p> wordbuf[j] = 17;// 數(shù)碼管不顯示</p><p> pwbuf[j] = 0;// 用FFFFFF清除已經(jīng)輸入的密碼<
96、;/p><p><b> }</b></p><p><b> break;</b></p><p> case 0x28: // 4行2列,數(shù)字0</p><p> if (count<2)</p><p><b> {&
97、lt;/b></p><p> wordbuf[count] = 0;// 對應(yīng)位上顯示“0"</p><p> pwbuf[count] = 0;</p><p> if(count==0)</p><p><b> {a=0;</b></p><p><b>
98、; }</b></p><p> if(count==1)</p><p><b> {b=0;</b></p><p><b> }</b></p><p><b> count++;</b></p><p><b>
99、 }</b></p><p><b> break;</b></p><p> case 0x48:// 4行3列,數(shù)字#</p><p> enterflag = 1;// 確認鍵按下</p><p> if (count==2) </p><p>
100、 // 只有輸入2個數(shù)后按確認鍵才有效輸出</p><p> pwflag = 1; </p><p><b> break;</b></p><p> default:break;</p><p><b> }</b></p><p> if (ente
101、rflag==1)// 如果按下確認鍵</p><p><b> {</b></p><p> enterflag = 0; // 標(biāo)志位置回0</p><p> count = 0; // 計數(shù)器清零</p><p> c=0xff/12;<
102、;/p><p> if (pwflag==1)</p><p><b> {</b></p><p> P3=a*c+b*c/12+12*c/1000;</p><p> temp=a*c+b*c/12+12*c/1000;</p><p> if(temp>=0xff)<
103、/p><p><b> {</b></p><p><b> P3=0xff;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b>&l
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于at89s52單片機的數(shù)控穩(wěn)壓電源設(shè)計畢業(yè)論文
- 基于at89s52+單片機控制的直流穩(wěn)壓電源畢業(yè)論文
- 《基于stc89c52rc單片機的數(shù)控直流穩(wěn)壓電源設(shè)計》
- 畢業(yè)設(shè)計論文_基于at89c51單片機數(shù)控直流穩(wěn)壓電源設(shè)計
- 畢業(yè)設(shè)計論文—基于51單片機的數(shù)控直流穩(wěn)壓電源
- 基于單片機的直流穩(wěn)壓電源設(shè)計
- 【設(shè)計】基于單片機的可控穩(wěn)壓電源設(shè)計
- 基于51單片機,開關(guān)穩(wěn)壓電源設(shè)計
- 數(shù)控直流穩(wěn)壓電源單片機課程設(shè)計
- 基于at89s52單片機的直流數(shù)控恒流源設(shè)計畢業(yè)論文
- 基于單片機的開關(guān)穩(wěn)壓電源的設(shè)計
- 單片機外文翻譯---at89s52單片機
- 單片機外文翻譯--at89s52單片機
- 基于單片機的智能穩(wěn)壓電源.pdf
- at89s52單片機外文翻譯
- at89s52單片機外文翻譯
- 畢業(yè)設(shè)計---基于at89s52單片機的直流數(shù)控恒流源設(shè)計
- 單片機基于at89s52單片機的遙控器設(shè)計畢業(yè)論文
- 基于at89s52單片機溫度采集設(shè)計畢業(yè)論文
- 基于單片機控制的智能穩(wěn)壓電源設(shè)計---畢業(yè)論文
評論
0/150
提交評論