久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 7918|回復(fù): 2
收起左側(cè)

51單片機(jī)直流電壓源Proteus仿真電路程序設(shè)計(jì)

[復(fù)制鏈接]
ID:667152 發(fā)表于 2020-7-2 12:28 | 顯示全部樓層 |閱讀模式
整體電路
1.png

電源模塊
2.png
文件有仿真圖,程序和文檔

本設(shè)計(jì)以直流電壓源為核心,STC89C52單片機(jī)為主控制器,單片機(jī)系統(tǒng)是數(shù)控電源的核心。它通過軟件的運(yùn)行來控制整個(gè)儀器的工作,從而完成設(shè)定的功能。通過數(shù)字鍵盤來設(shè)置直流電源的輸出電壓,輸出電壓范圍為0V—9.9V,最大電流為1A,并可由液晶屏 LCD1602顯示實(shí)際輸出電壓值。本設(shè)計(jì)由單片機(jī)程 控輸出數(shù)字信號(hào),經(jīng)過 D/A轉(zhuǎn)換器(DAC0832 )輸出模擬量,同時(shí)輸出采用 ADC0832 對(duì)采樣的電壓、電流轉(zhuǎn)換為數(shù)字信號(hào),再經(jīng)過運(yùn)算放大器隔離放大,最后通過單片機(jī)實(shí)現(xiàn)閉環(huán)控制輸出各種設(shè)備所需要的電壓。實(shí)際測試結(jié)果表明,本系統(tǒng)實(shí)際應(yīng)用于需要高穩(wěn)定度小功率恒壓源的領(lǐng)域。

  數(shù)控直流電壓源是與普通直流電壓源相比,具有輸出電壓不連續(xù)變化的特點(diǎn)并且能由數(shù)碼管顯示,可以由“+”、“-”兩鍵分別控制輸出電壓步進(jìn)增減輸出電壓。本例設(shè)計(jì)的電壓源輸出電壓的范圍:0~+9.9V,步進(jìn)0.1V,紋波不大于10mV,除具有以上顯示控制功能外還能實(shí)現(xiàn)輸出電壓可預(yù)置在0~9.9V之間的任意一個(gè)值;用自動(dòng)掃描代替人工按鍵,實(shí)現(xiàn)輸出電壓變化(步進(jìn)0.1V不變),以及通過接入單穩(wěn)態(tài)電路,可以克服按鍵抖動(dòng)引起的誤動(dòng)作,運(yùn)用計(jì)數(shù)器的反饋清零接法,起到防止誤操作的作用。
(1)輸出電壓:范圍0~+9.9V,步進(jìn)0.1V,紋波不大于10mV;(2)輸出電流:500mA;(3)輸出電壓值由數(shù)碼管顯示;(4)由“+”、“-”兩鍵分別控制輸出電壓步進(jìn)增減;(5)為實(shí)現(xiàn)上述幾部件工作,自制一穩(wěn)壓直流電源,輸出±15V,+5V。


2.1 工作方案選擇和論證

根據(jù)對(duì)現(xiàn)狀的分析,以及選題的指導(dǎo),本課題的主要任務(wù)是220V的市電輸入到電路中,經(jīng)過變壓、橋堆整流、濾波電路;經(jīng)穩(wěn)壓調(diào)整模塊數(shù)據(jù)采集后輸出系統(tǒng)所需電壓,同時(shí)單片機(jī)通過軟件的運(yùn)行來控制整個(gè)儀器的工作,從而完成設(shè)定的功能。通過數(shù)字鍵盤來設(shè)置直流電源的輸出電壓,通過A/D轉(zhuǎn)換、并可由數(shù)碼管顯示實(shí)際輸出電壓值。

2.1.1 主控芯片分析選擇

芯片的控制模塊主要靠單片機(jī)來實(shí)現(xiàn),單片機(jī)有有多種型號(hào),比較常見的有兩種,分別是:52系列單片機(jī)和凌陽系列單片機(jī)。52系列單片機(jī)的優(yōu)勢是價(jià)格便宜,有較強(qiáng)的算術(shù)計(jì)算能力,而且邏輯控制算法的實(shí)現(xiàn)比較靈活,同時(shí)功耗較低、技術(shù)比較成熟,有很好的抗干擾性能。凌陽系列單片機(jī)可以看作是專業(yè)版的52系列單片機(jī),其可以實(shí)現(xiàn)更加復(fù)雜的邏輯控制,進(jìn)行了更高層次的聚合,體積進(jìn)一步減小,運(yùn)算速度進(jìn)一步提高,常用于大規(guī)模系統(tǒng)的控制,但價(jià)格比較昂貴。因?yàn)?2單片機(jī)價(jià)格低于凌陽系列,且本次設(shè)計(jì)需要的處理速度較低,出于經(jīng)濟(jì)和方便的角度考慮,方案1為最佳方案。

2.1.2控制方案比較

方案一:采用各類數(shù)字電路來組成鍵盤控制系統(tǒng),進(jìn)行信號(hào)處理,如選用CPLD等可編程邏輯器件。本方案電路復(fù)雜,靈活性不高,效率低,不利于系統(tǒng)的擴(kuò)展,對(duì)信號(hào)處理比較困難。


方案二:采用STC89C52單片機(jī)作為這個(gè)系統(tǒng)的控制單元,可以通過DAC0832的數(shù)據(jù)采樣和放大器的電壓調(diào)整可以改變系統(tǒng)輸出電壓的大小。 為了能夠使系統(tǒng)具備檢測實(shí)際輸出電壓值的大小,可以將輸出電壓經(jīng)過DAC0832進(jìn)行模數(shù)轉(zhuǎn)換,間接用單片機(jī)實(shí)時(shí)對(duì)電壓進(jìn)行采樣,然后進(jìn)行數(shù)據(jù)處理及送數(shù)碼管顯示。顯示的電壓值便是輸出的電壓大小。此系統(tǒng)比較靈活,采用軟件方法來解決數(shù)據(jù)的預(yù)置以及電壓的大小控制,使系統(tǒng)硬件更加簡潔,各類功能易于實(shí)現(xiàn),能很好地滿足題目的要求。比較以上兩種方案的優(yōu)缺點(diǎn),方案一中CPLD可編程邏輯器件控制電路內(nèi)部接口信號(hào)繁瑣,中間相互關(guān)聯(lián)多,抗干擾能力差;在方案二中采用單片機(jī)完成整個(gè)數(shù)控部分的功能,也便于系統(tǒng)功能的擴(kuò)展。

2.1.3 穩(wěn)壓輸出方案比較

方案一 采用線性調(diào)壓電源。以改變其基準(zhǔn)電壓的方式使輸出不僅增加/減少, 這樣不能不考慮整流濾波后的紋波對(duì)輸出的影響。

方案二 使用運(yùn)算放大器對(duì)電壓的比較放大由于運(yùn)算放大器具有很大的電源電壓抑制比,可以大大減小輸出端的紋波電壓。在方案一中輸出的電壓很難跟蹤電壓的快速變化,而方案二中的輸出電壓波形與DAC0832的輸出波形相同,不僅可以輸出直流電平,而且只要預(yù)先生成產(chǎn)生波形的量化數(shù)據(jù),便可以輸出多種波形,使系統(tǒng)產(chǎn)生的信號(hào)源有一定的驅(qū)動(dòng)能力。

2.1.4 顯示模塊的選擇

顯示模塊也有多種備選方案,最常用的有LED數(shù)碼管和LCD液晶顯示屏。兩種顯示方式各有優(yōu)缺點(diǎn),LED價(jià)格簡單、使用方便而且亮度較高,但能耗大;LCD功耗小、接口簡單、顯示清晰,但價(jià)格昂貴,使用復(fù)雜。結(jié)合對(duì)比權(quán)衡以及課題的具體需求,本文決定選用LED作為解決方案。


2.2 方案確立

220V 的市電輸入到電路中,經(jīng)過變壓、橋堆整流、濾波電路;經(jīng)穩(wěn)壓調(diào)整模塊數(shù)據(jù)采集后輸出系統(tǒng)所需電壓,同時(shí)單片機(jī)通過軟件的運(yùn)行來控 制整個(gè)儀器的工作,從而完成設(shè)定的功能。通過數(shù)字鍵盤來設(shè)置直流電源的輸出電壓,并可由 LED顯示實(shí)際輸出電壓值。 由單片機(jī)程 控輸出數(shù)字信號(hào),經(jīng)過 D/A 轉(zhuǎn)換器( DAC0832)輸出模擬量,再經(jīng)過運(yùn)算放大器隔離放大,最后輸出各種設(shè)備所需要的電壓。

2.3總體框圖

2.4 總電路圖
本章小結(jié)

本章主要介紹這次畢業(yè)設(shè)計(jì)的方案選擇,包括系統(tǒng)控制核心的選擇及確定以及顯示模塊的選擇及確定。在下一章節(jié)當(dāng)中,將對(duì)該課題中各單元電路的具體設(shè)計(jì)方案、元器件的選擇作進(jìn)一步。


第3章 控制電路設(shè)計(jì)3.1  STC89C52單片機(jī)簡介

控制部分是系統(tǒng)整機(jī)協(xié)調(diào)工作和智能化管理的核心部分,主要部分包括鍵盤和 STC89C52RC單片機(jī),而 STC89C52RC單片機(jī)實(shí)現(xiàn)控制功能是關(guān)鍵,采用單片機(jī)不但方便監(jiān)控,并且大大減少硬件設(shè)計(jì)。

3.1.1  STC89C52簡介

STC89C52為八位單片機(jī),程序存儲(chǔ)器為8K,外部可擴(kuò)展至64K,內(nèi)部RAM為512B,可擴(kuò)展至64K,正常工作電壓5V,支持最高時(shí)鐘頻率為80MHz,內(nèi)置看門狗電路,支持ISP/IAP。

3.1.2  STC89C52引腳說明

VCC(40引腳):電源電壓;VSS(20引腳):接地P0端口(P0.0~P0.7,39~32引腳):P0口是一個(gè)漏極開路的8位雙向I/O口。作為輸出端口,每個(gè)引腳能驅(qū)動(dòng)8個(gè)TTL負(fù)載,對(duì)端口P0寫入“1”時(shí),可以作為高阻抗輸入。在訪問外部程序和數(shù)據(jù)存儲(chǔ)器時(shí),P0口也可以提供低8位地址和8位數(shù)據(jù)的復(fù)用總線。此時(shí),P0口內(nèi)部上拉電阻有效。在Flash ROM編程時(shí),P0端口接收指令字節(jié);而在校驗(yàn)程序時(shí),則輸出指令字節(jié)。驗(yàn)證時(shí),要求外接上拉電阻。P1端口(P1.0~P1.7,1~8引腳):P1口是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O口。P1的輸出緩沖器可驅(qū)動(dòng)(吸收或者輸出電流方式)4個(gè)TTL輸入。對(duì)端口寫入1時(shí),通過內(nèi)部的上拉電阻把端口拉到高電位,這是可用作輸入口。P1口作輸入口使用時(shí),因?yàn)橛袃?nèi)部上拉電阻,那些被外部拉低的引腳會(huì)輸出一個(gè)電流。

此外,P1.0和P1.1還可以作為定時(shí)器/計(jì)數(shù)器2的外部技術(shù)輸入(P1.0/T2)和定時(shí)器/計(jì)數(shù)器2的觸發(fā)輸入(P1.1/T2EX)。在對(duì)Flash ROM編程和程序校驗(yàn)時(shí),P1接收低8位地址。P2端口(P2.0~P2.7,21~28引腳):P2口是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O端口。P2的輸出緩沖器可以驅(qū)動(dòng)(吸收或輸出電流方式)4個(gè)TTL輸入。對(duì)端口寫入1時(shí),通過內(nèi)部的上拉電阻把端口拉到高電平,這時(shí)可用作輸入口。P2作為輸入口使用時(shí),因?yàn)橛袃?nèi)部的上拉電阻,那些被外部信號(hào)拉低的引腳會(huì)輸出一個(gè)電流。在訪問外部程序存儲(chǔ)器和16位地址的外部數(shù)據(jù)存儲(chǔ)器(如執(zhí)行“MOVX@DPTR”指令)時(shí),P2送出高8位地址。在訪問8位地址的外部數(shù)據(jù)存儲(chǔ)器(如執(zhí)行“MOVX@R1”指令)時(shí),P2口引腳上的內(nèi)容(就是專用寄存器(SFR)區(qū)中的P2寄存器的內(nèi)容),在整個(gè)訪問期間不會(huì)改變。在對(duì)Flash ROM編程和程序校驗(yàn)期間,P2也接收高位地址和一些控制信號(hào)。P3端口(P3.0~P3.7,10~17引腳):P3是一個(gè)帶內(nèi)部上拉電阻的8位雙向I/O端口。P3的輸出緩沖器可驅(qū)動(dòng)(吸收或輸出電流方式)4個(gè)TTL輸入。對(duì)端口寫入1時(shí),通過內(nèi)部的上拉電阻把端口拉到高電位,這時(shí)可用作輸入口。P3做輸入口使用時(shí),因?yàn)橛袃?nèi)部的上拉電阻,那些被外部信號(hào)拉低的引腳會(huì)輸入一個(gè)電流。RST(9引腳):復(fù)位輸入。當(dāng)輸入連續(xù)兩個(gè)機(jī)器周期以上高電平時(shí)為有效,用來完成單片機(jī)單片機(jī)的復(fù)位初始化操作。看門狗計(jì)時(shí)完成后,RST引腳輸出96個(gè)晶振周期的高電平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能無效。DISRTO默認(rèn)狀態(tài)下,復(fù)位高電平有效。ALE(30引腳):地址鎖存控制信號(hào)(ALE)是訪問外部程序存儲(chǔ)器時(shí),鎖存低8位地址的輸出脈沖。在Flash編程時(shí),此引腳也用作編程輸入脈沖。XTAL1(19引腳):振蕩器反相放大器和內(nèi)部時(shí)鐘發(fā)生電路的輸入端。XTAL2(18引腳):振蕩器反相放大器的輸入端。

圖 3-1 STC89C52引腳圖

3.2 單片機(jī)的最小系統(tǒng)3.2.1 時(shí)鐘電路

STC89C52單片機(jī)的時(shí)鐘信號(hào)可以通過內(nèi)部時(shí)鐘方式和外部時(shí)鐘方式兩種方式產(chǎn)生。其中內(nèi)部時(shí)鐘方式如圖3-1所示。在圖中可以看出,內(nèi)部時(shí)鐘依賴于振蕩電路,當(dāng)XTAL1和XTAL2引腳外接上晶振時(shí),振蕩電路就會(huì)變成自激振蕩器,這樣內(nèi)部的時(shí)鐘

信號(hào)就會(huì)不斷的產(chǎn)生。圖中的兩個(gè)電容主要用來快速振蕩并維持頻率穩(wěn)定,電容值維持在5~30pF之間,典型狀況下為30pF。晶振的振蕩頻率需要控制在1.2~12MHz之間,一般取12MHz或6MHz。

圖3-2時(shí)鐘電路
3.2.2 復(fù)位電路

當(dāng)RST引腳上的高電平在兩個(gè)機(jī)器周期中連續(xù)出現(xiàn)時(shí),復(fù)位操作就會(huì)被觸發(fā)。若兩個(gè)周期以后電平的狀態(tài)還是高電平,那么復(fù)位操作就一直被執(zhí)行下去,直到電平狀態(tài)恢復(fù)到低電平為止。常見的復(fù)位電路實(shí)現(xiàn)方式有按鈕手動(dòng)復(fù)位和上電自動(dòng)復(fù)位兩種。最簡單的自動(dòng)復(fù)位依賴于復(fù)位電容的充放電,只要Vcc的上升時(shí)間在1ms之內(nèi),就可以實(shí)現(xiàn)自動(dòng)復(fù)位;手動(dòng)復(fù)位需要借助人工按按鈕的操作,有兩種比較常見的方式:脈沖和電容,其中電平復(fù)位依靠電源Vcc與RST端的連通來實(shí)現(xiàn),本文選用的就是手動(dòng)復(fù)位方式。圖3-4給出了手動(dòng)復(fù)位的電路圖,當(dāng)時(shí)鐘頻率的要求是11.0592MHZ時(shí),電容值取10uF,電阻值取10kΩ。

圖 3-3 按鈕復(fù)位電路

3.3 電源模塊

市電是交流電,其電壓雖然標(biāo)識(shí)的是220V,但實(shí)際上220V只是一個(gè)平均值,它存在著波動(dòng),因此當(dāng)需要比較穩(wěn)定的直流電壓時(shí),就需要整流濾波操作。整流濾波的操作有整流濾波電路來實(shí)現(xiàn)。本文選用的整流濾波電路是橋式的,因?yàn)闃蚴降膶?shí)現(xiàn)非常簡單,而且能夠達(dá)到本文的需求。橋式電路的結(jié)構(gòu)如圖4-1所示利用放大器產(chǎn)生所需的電源電壓以供集成芯片和單片機(jī)使用。如圖3-14所示為系統(tǒng)電源供電模塊圖。變壓器產(chǎn)生15V左右的交流電,電源的輸入端電源由15V變壓器的線圈提供,經(jīng)過整流橋D整流后經(jīng)電容C1濾成平穩(wěn)的12V作為Q1的輸入電源,輸出端經(jīng)過Q1濾波后就可得到平穩(wěn)的幅值為12V的直流電。產(chǎn)生的12V直流電壓給Q2的正電源端供電。Q2的輸入電源直接由U6產(chǎn)生的12V直流電提供,其輸出電壓也是通過電容C2進(jìn)行濾波。輸出的5V電壓作為單片機(jī)的供電電源

圖 3-4 電源電路
3.4  D/A轉(zhuǎn)換和顯示電路的設(shè)計(jì)

DAC0832是一種D/A轉(zhuǎn)換芯片,具有雙通道、8位分辨率的性能,由美國半導(dǎo)體公司生產(chǎn)。DAC0832因?yàn)槠湫詢r(jià)比高、兼容性強(qiáng)、體積小的優(yōu)勢,占據(jù)了很大的D/A轉(zhuǎn)換芯片市場份額,是很多單片機(jī)用戶的首選。學(xué)習(xí)并熟練使用DAC0832可使我們了解D/A轉(zhuǎn)換器的原理,并提高我們單片機(jī)技術(shù)的水平。芯片如下所示:

圖 3-5 D/A芯片

芯片接口說明如下所示:DO:信號(hào)輸出接口,主要用于D/A轉(zhuǎn)換的輸出;DI:信號(hào)輸入接口,主要用于命令的輸入;CLK:時(shí)鐘,頻率不超過600K赫茲;CH0:頻道0,可作為正負(fù)輸入端使用;CH1:頻道1,可作為正負(fù)輸入端使用;GND:接地Vcc(VREF):電源輸入?yún)⒖茧妷狠斎搿S_:片選,只有在低電平時(shí)才能發(fā)揮作用;DAC0832的工作原理:單片機(jī)與DAC0832之間通常需要用四根數(shù)據(jù)線相連,分別是CLK、CS、DO、DI。但考慮到DI和DI在實(shí)際的使用過程中,不會(huì)同時(shí)同時(shí)被占用,而且單片機(jī)接口通常也是雙向的,因此在實(shí)際的使用中DI和DO可以用一根數(shù)據(jù)線并聯(lián)連接。當(dāng)DAC0832的CS端的電平為高電平時(shí)DAC0832是無法工作的,此時(shí)DIDO端口以及CLK端口的電平不產(chǎn)生任何影響,因此可以任意選擇;當(dāng)DAC0832的CS端的電平為低電平時(shí),DAC0832芯片進(jìn)入工作狀態(tài),此時(shí)時(shí)鐘脈沖通過CLK端輸入,數(shù)據(jù)信號(hào)也通過DI端進(jìn)入,當(dāng)?shù)?個(gè)脈沖行將結(jié)束時(shí),DI端必須處于高電平狀態(tài),以便信號(hào)的啟動(dòng)。DI端使用2位的數(shù)據(jù)對(duì)通道功能的選擇進(jìn)行編碼,此步驟完成在第2、3個(gè)脈沖下沉之前。這兩位編碼可以組合出四種情

形如下:當(dāng)編碼為“11”時(shí),只有CH1通道起作用;當(dāng)編碼為“10”時(shí),進(jìn)隊(duì)CH0通道起作用;當(dāng)編碼為“01”時(shí),CH1被當(dāng)成正輸入端使用,而CH0責(zé)備當(dāng)成負(fù)輸入端使用;當(dāng)編碼為“00”時(shí),CH1被當(dāng)做負(fù)輸入端使用,而CH0則被當(dāng)作正輸入端使用。當(dāng)?shù)谌齻(gè)脈沖結(jié)束以后DI端的使命就完成了,DO端開始發(fā)揮作用,將轉(zhuǎn)換的數(shù)據(jù)讀取過來并進(jìn)行輸出。從第四個(gè)脈沖完成,一直到第十一個(gè)脈沖完成,DO端會(huì)按照從高到低的順序依次輸出一個(gè)字節(jié)的8位轉(zhuǎn)換結(jié)果,從第十一個(gè)脈沖下沉完成后,開始輸出下一個(gè)相反字節(jié),此時(shí)一直到第19個(gè)脈沖之間都不需做處理,直接輸出,這樣的過程就是一個(gè)完整的DA轉(zhuǎn)換過程。DA轉(zhuǎn)換完成以后,將CS端的電平調(diào)整到高電平,芯片停止工作,對(duì)轉(zhuǎn)換后的數(shù)據(jù)進(jìn)行處理。若要同時(shí)使用多個(gè)7段LED數(shù)碼管,就必須應(yīng)用掃描式的顯示。硬件電路方面,首先將每個(gè)7段LED數(shù)碼管的a,b,c,g都連接到一起,然后使用晶體管對(duì)他們的共同引腳進(jìn)行逐個(gè)驅(qū)動(dòng)。最后的顯示是通過將第一個(gè)7段LED數(shù)碼管需要顯示的數(shù)據(jù)發(fā)送到發(fā)送到a,b,c,g總線上,并把掃描信號(hào)發(fā)送到公共端來實(shí)現(xiàn)的。圖中LED1,LED2分別連接89C52的P2.0 ,P2.1 管腳,根據(jù)89C52的輸出信息來判斷驅(qū)動(dòng)哪一個(gè)數(shù)碼管,即哪一個(gè)數(shù)碼管亮,而A~G和DP連接89C52單片機(jī)的P0.0~P0.7管腳,根據(jù)89C52的輸出的數(shù)字信息從而判斷數(shù)碼管的哪一段亮,顯示出所輸出的電壓值。

3.5鍵盤控制子系統(tǒng)

鍵盤控制子系統(tǒng)如圖 3-6 所示。本設(shè)計(jì)中,采用獨(dú)立按鍵 K11-K44共16個(gè)對(duì)單片機(jī)核心芯片STC89C52進(jìn)行輸入控制。各按鍵分別一端接地,一端接單片機(jī)引腳。實(shí)現(xiàn)功能:按鍵 K11-K23為對(duì)應(yīng)的數(shù)字0-9,K14,K24分別是加減0.1,K34表示位選擇鍵(十位或各位),K33是確定鍵。選擇電壓后,按確定鍵,便可輸出所需的電壓。

圖 3-6鍵盤控制子系統(tǒng)

本章小結(jié)

本章內(nèi)容主要對(duì)各類硬件設(shè)計(jì)進(jìn)行了說明,包括單片機(jī)最小系統(tǒng)的設(shè)計(jì),時(shí)鐘電路的設(shè)計(jì),復(fù)位電路的設(shè)計(jì),電源模塊的設(shè)計(jì),顯示電路的設(shè)計(jì),。一一闡述了設(shè)計(jì)思路以及設(shè)計(jì)方法,在下一章,主要對(duì)系統(tǒng)的軟件部分的設(shè)計(jì)進(jìn)行詳細(xì)闡述。



第4章 軟件程序設(shè)計(jì)4.1 系統(tǒng)主程序設(shè)計(jì)流程及說明

首先對(duì)系統(tǒng)進(jìn)行初始化,讀取預(yù)存儲(chǔ)的電壓值,本次設(shè)計(jì)中預(yù)存儲(chǔ)電壓值為9.9V,并將其發(fā)送給 LED顯示電壓值;之后在判斷是否有鍵按下,當(dāng)有鍵盤有按鍵按下時(shí),接收來自鍵盤的電壓輸入值,并通過 D/A把輸入的數(shù)字量轉(zhuǎn)換成模擬電壓值,控制輸出電壓的大小。然后采樣輸出電壓的大小,并與輸入電壓值進(jìn)行比較放大,由電壓調(diào)整電路調(diào)整輸出電壓的大小,直到輸出電壓與輸入電壓相等。通過比較從LED顯示更新的電壓值。主程序流程圖如所示

圖 4-1主程序流程圖
4.2 數(shù)碼管顯示子程序流程圖

程序?qū)崿F(xiàn)的功能是將單片機(jī)從AD0832讀取的數(shù)字信號(hào)轉(zhuǎn)換為七段碼在LED上顯示出來。顯示方式采用的是動(dòng)態(tài)掃描的方式,先給位選信號(hào),再給段選信號(hào),然后延時(shí)一下。結(jié)束延時(shí)10ms顯示第四位送形第四位送位選給低復(fù)位沖4s<t<960us第三位送形第三位送位選給低延時(shí)10ms顯示第二位送形第二位送位選給低第一位送形第一位送位選給低延時(shí)10ms顯示。

圖 4-2數(shù)碼管顯示子程序流程圖
本章小結(jié)

本章主要系統(tǒng)的軟件進(jìn)行了分析和設(shè)計(jì),包括參數(shù)設(shè)置,軟件開發(fā)環(huán)境,程序初始化設(shè)計(jì),顯示模塊程序設(shè)計(jì)。繪制了各個(gè)程序的框圖。下一章將對(duì)系統(tǒng)的電路安裝與調(diào)試過程展開論述。

第5章 系統(tǒng)調(diào)試與測試結(jié)果
5.1 系統(tǒng)軟件調(diào)試

用電壓表在運(yùn)算放大器輸出端上測量電壓;將所得的結(jié)果與數(shù)字顯示值和LED顯示值進(jìn)行比對(duì),如果誤差超過了合理的范圍,那么就需要對(duì)軟件部分進(jìn)行調(diào)試。調(diào)試的重點(diǎn)應(yīng)該放在采樣模塊和D/A轉(zhuǎn)換模塊的代碼,使用軟件調(diào)試的常用方法,逐步排查,找到問題所在。

5.2 系統(tǒng)硬件調(diào)

系統(tǒng)可能出現(xiàn)的偏差有兩類,一是輸出的電壓不夠穩(wěn)定,有波動(dòng),二是數(shù)字的顯示與數(shù)碼管的顯示存在不一致。如果出現(xiàn)上面的兩類偏差,就需要對(duì)系統(tǒng)進(jìn)行硬件調(diào)試。硬件調(diào)試的方法是對(duì)系統(tǒng)進(jìn)行各類檢查,檢查主要從以下幾個(gè)方面進(jìn)行:(1)各部件是否都是完好無損的;(2)電阻的選擇是否科學(xué);(3)電壓的供應(yīng)是否正常。硬件調(diào)試是解決問題的有效手段。

本章小結(jié)

了解一個(gè)課題的內(nèi)容熟悉就需要對(duì)于電路的整機(jī)原理進(jìn)行學(xué)習(xí),所以本章對(duì)于整機(jī)原理進(jìn)行介紹。此外,又分別對(duì)于電路如何調(diào)試以及可能會(huì)出現(xiàn)的問題進(jìn)行了介紹。通過調(diào)試然后解決問題可以使此次設(shè)計(jì)能夠更好的達(dá)到預(yù)期的指標(biāo)。


單片機(jī)源程序如下:

  1. #include<reg51.h>
  2. #include
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar aa,bb,cc,dd,jj,ii,jjj,iii,key,j;
  6. uchar time1=0;
  7. sbit led1=P2^0;
  8. sbit led2=P2^1;
  9. sbit ce=P2^4;
  10. #define timer0_count 0xfc18//定時(shí)器初值,設(shè)置time0 1/1000秒中斷一次
  11. const seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//數(shù)碼管的顯示
  12. const seg_point[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小數(shù)點(diǎn)的數(shù)碼管顯示
  13. uchar scan1;//用來分別顯示2個(gè)數(shù)碼管
  14. uchar scan2;
  15. uchar counter[2]={0xf1,0xf2};
  16. uchar vout=0; //j_片選,vout_電壓輸出

  17. static void timer0_initialize(void)//timer0的初始化
  18. //定時(shí)器的初始化程序
  19. {
  20.         EA=0;        //中斷控制器IE--停止接受中斷
  21.                 TR0=0;        //停止計(jì)時(shí)
  22.                 TMOD=0x01;     //設(shè)置工作方式為1
  23.                 TL0=(timer0_count & 0x00ff);
  24.             TH0=(timer0_count>>8);  //設(shè)置time0 初值      
  25.                 PT0=1;    //設(shè)置timer0高優(yōu)先級(jí)
  26.                 ET0=1;          //允許timer0中斷
  27.                 TR0=1;           //開始計(jì)時(shí)
  28.                 EA=1;           //開所有中斷
  29. }

  30. void delay(uint t) //tms的延時(shí)
  31. {   
  32.         uchar i;
  33.         uint j;
  34.     for(j=0;j<t;j++)
  35.                 for(i=0;i<40;i++);
  36. }
  37. void shuc(void)
  38. {         
  39.          uchar nn;
  40.          vout=2*(scan2*10+scan1);//輸出的數(shù)字量
  41.         P1=vout;
  42.         for(nn=0;nn<250;nn++)
  43.                 ;
  44.                 nn=0;//輸出是存在D/A轉(zhuǎn)換時(shí)間差所以要延時(shí)

  45. }
  46. void shaom(void)
  47. {
  48.          P3=0x0f;//掃描是否有按鍵按下
  49.      if((P3&0x0f)!=0x0f)
  50.      dd=0;
  51.          else
  52.          dd=1;
  53. }
  54. void zdbj(void) //自動(dòng)步進(jìn)
  55. {
  56.         uchar rr;
  57.         jj=scan2;
  58.         ii=scan1;
  59.         shaom();
  60.         for(;jj<10;jj++)
  61.     {
  62.             for(;ii<10;ii++)
  63.                 {
  64.                          if(dd)
  65.                                  {
  66.                                          scan1=ii;
  67.                                          scan2=jj;
  68.                                         shuc();
  69.                                          for(rr=0;rr<250;rr++)
  70.                                         {
  71.                                                 shaom();
  72.                                                 if(dd)      
  73.                                                  delay(70);
  74.                                                 else
  75.                                                 break;
  76.                                         }
  77.                                          if(jj==9&&ii==9)
  78.                                          {
  79.                                                  ii=0;
  80.                                                  jj=0;
  81.                                          }

  82.                                  }
  83.                         else
  84.                          {
  85.                                  jj=10;
  86.                                  ii=10;
  87.                          }
  88.                 }
  89.                 ii=0;
  90.     }
  91.         jj=0;
  92.         shaom();
  93.         for(;dd==0;)
  94.         shaom();

  95. }

  96. void sjb(void)        //三角波
  97. {
  98.         uchar max;
  99.         max=vout;
  100.         shaom();
  101.         for(;dd;)
  102.          {
  103.                    for(iii=0;iii<=max;iii=iii+2)
  104.                    {
  105.                           P1=iii;
  106.                         shaom();
  107.                          delay(10);
  108.                            if(dd==0)
  109.                  break;
  110.                 }
  111.                 if(dd==0)
  112.             break;
  113.                 for(;iii>0;iii=iii-2)
  114.                 {
  115.                         P1=iii;
  116.                         shaom();
  117.                         delay(5);
  118.                         if(dd==0)
  119.                         break;
  120.                 }
  121.                 if(dd==0)
  122.             break;
  123.           }
  124.            P1=max;
  125.          shaom();
  126.          for(;dd==0;)
  127.         shaom();
  128. }
  129. unsigned char keyscan(void)  //鍵盤掃描函數(shù),使用行列反轉(zhuǎn)掃描法
  130. {
  131.          unsigned char cord_h,cord_l;//行列值中間變量
  132.         P3=0x0f;          //行線輸出全為0
  133.          cord_h=P3&0x0f;     //讀入列線值
  134.          if(cord_h!=0x0f)    //先檢測有無按鍵按下
  135.          {
  136.                   delay(70);        //去抖
  137.                   if((P3&0x0f)!=0x0f)
  138.                   {
  139.                     cord_h=P3&0x0f;  //讀入列線值
  140.                     P3=cord_h|0xf0;  //輸出當(dāng)前列線值
  141.                     cord_l=P3&0xf0;  //讀入行線值                                                                                                   ;;
  142.                         while((P3&0xf0)!=0xf0);//等待松開并輸出
  143.                          {
  144.                                  time1=time1+1;
  145.                             return(cord_h+cord_l);//鍵盤最后組合碼值
  146.                          }
  147.                   }
  148.          }return(0);     //返回該值
  149. }
  150. void timer0_isr(void) interrupt 1   //timer0中斷
  151. //用于LED數(shù)碼管的動(dòng)態(tài)顯示
  152. {

  153.          TR0=0;    //停止時(shí)鐘0
  154.         P2=counter[j];
  155.         switch(j)
  156.         {
  157.                  case 0:P0=seg[scan1];break;                                                                                
  158.                  case 1:P0=seg_point[scan2];break;
  159.                          default:break;        //j為其他情況是跳出循環(huán)
  160.         }
  161.         j++;
  162.         if(j==2)
  163.         j=0;
  164.     TL0=(timer0_count & 0x00ff);
  165.         TH0=(timer0_count>>8);  //設(shè)置time0 初值
  166.         TR0=1;         //開時(shí)鐘                                       
  167. }

  168. void main(void)
  169. {               
  170.         ce=0;
  171.         delay(5);   
  172.         scan1=(P3/2)%10;
  173.         scan2=P3/20;
  174.         ce=1;
  175.         delay(5);
  176.         shuc();

  177.         timer0_initialize();        //定時(shí)器初始化用于LED顯示
  178.     do
  179.    {   
  180.             key=keyscan();
  181.                 if(time1==1)
  182.                 switch( key)
  183.         {      

  184.                         case 0xee:aa=1;break;//1 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值
  185.                  case 0xed:aa=2;break;
  186.                  case 0xeb:aa=3;break;
  187.                  case 0xe7:aa=4;break;//4
  188.                  case 0xde:aa=5;break;//5
  189.                        case 0xdd:aa=6;break;//5
  190.                           case 0xdb:aa=7;break;//6
  191.                             case 0xd7:aa=8;break;//7
  192.                           case 0xbe:aa=9;break;//8
  193.                           case 0xbd:aa=0;break;//9
  194.                      case 0xbb:time1--;break;//確認(rèn)
  195.                            case 0xb7: //三角波
  196.                         {
  197.                         time1=0;
  198.                         sjb();
  199.                         }
  200.                         break;
  201.                            case 0x7e:                //加
  202.                     {
  203.                                 time1=0;
  204.                              scan1++;
  205.                         if(scan1==10)
  206.                                 {
  207.                                         scan1=0;
  208.                                     scan2++;
  209.                                         if(scan2==10)
  210.                                         scan2=0;
  211.                                 }
  212.                                 shuc();
  213.                         }break;//c
  214.                           case 0x7d:                //減
  215.                     {
  216.                                 time1=0;
  217.                         scan1--;                                   
  218.                                 if(scan1==-1)
  219.                                 {         
  220.                                         scan1=9;
  221.                                         scan2--;
  222.                                         if(scan2==-1)
  223.                                         scan2=9;
  224.                                 }
  225.                                 shuc();
  226.                         }break;
  227.                               case 0x7b:                //自動(dòng)步進(jìn)
  228.                         {
  229.                                 time1=0;
  230.                     zdbj();
  231.                         }break;//e
  232.                           case 0x77: time1--;break;      
  233.                   }

  234.                 if(time1==2)
  235.                 switch( key)
  236.                  {      

  237.                         case 0xee:bb=1;break;//0 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值
  238.                          case 0xed:bb=2;break;//1
  239.                           case 0xeb:bb=3;break;//2
  240.                      case 0xe7:bb=4;break;//3
  241.                      case 0xde:bb=5;break;//4
  242.                      case 0xdd:bb=6;break;//5
  243.                      case 0xdb:bb=7;break;//6
  244.                           case 0xd7:bb=8;break;//7
  245.                           case 0xbe:bb=9;break;//8
  246.                           case 0xbd:bb=0;break;//9
  247.                           case 0xbb:                //確認(rèn)
  248.                         {
  249.                              scan2=0;
  250.                              scan1=aa;
  251.                                    time1=0;
  252.                                  shuc();
  253.                         }break;
  254.                           case 0xb7://三角波
  255.                         {
  256.                         time1=0;
  257.                         sjb();
  258.                         }
  259.                         break;
  260.                           case 0x7e:                //加
  261.                         {
  262.                                 time1=0;
  263.                         scan1++;
  264.                         if(scan1==10)
  265.                                 {
  266.                                         scan1=0;
  267.                                     scan2++;
  268.                                         if(scan2==10)
  269.                                         scan2=0;
  270.                                 }
  271.                                 shuc();
  272.                         }break;//c
  273.                      case 0x7d:                //減  
  274.                         {
  275.                                 time1=0;
  276.                               scan1--;                                   
  277.                                 if(scan1==-1)
  278.                                 {                 
  279.                                         scan1=9;
  280.                                         scan2--;
  281.                                         if(scan2==-1)
  282.                                          scan2=9;
  283.                                 }
  284.                                 shuc();
  285.                         }break;
  286.                           case 0x7b:                //自動(dòng)步進(jìn)
  287.                     {
  288.                                 time1=0;
  289.             zdbj();
  290.                         }break;//e
  291.                           case 0x77: time1--;break;
  292.                  }
  293.                 ;
  294.                 if(time1>2)
  295.                  switch( key)
  296.                  {      

  297.                           case 0xee:time1--;break;//0 按下相應(yīng)的鍵顯示相對(duì)應(yīng)的碼值
  298.                           case 0xed:time1--;break;//1
  299.                           case 0xeb:time1--;break;//2
  300.                           case 0xe7:time1--;break;//3
  301.                           case 0xde:time1--;break;//4
  302.                           case 0xdd:time1--;break;//5
  303.                           case 0xdb:time1--;break;//6
  304.                           case 0xd7:time1--;break;//7
  305.                           case 0xbe:time1--;break;//8
  306.                           case 0xbd:time1--;break;//9
  307.                           case 0xbb:                //確認(rèn)               
  308.                         {  
  309.                                 time1=0;
  310.                             scan2=aa;
  311.                                   scan1=bb;
  312.                                   time1=0;
  313.                                 shuc();
  314.                         }break;
  315.                           case 0xb7://三角波
  316.                         {
  317.                         time1=0;
  318.                     sjb();
  319.                         }
  320.                         break;
  321.                           case 0x7e:                //加
  322.                     {
  323.                         scan1++;
  324.                         if(scan1==10)
  325.                                 {
  326.                                          scan1=0;
  327.                                     scan2++;
  328.                                         if(scan2==10)
  329.                                         scan2=0;
  330.                                 }
  331.                                 shuc();
  332.                         }break;//c
  333.                          case 0x7d:                //減
  334.                     {
  335.                             time1=0;
  336.                                 scan1--;                                   
  337.                                 if(scan1==-1)
  338.                                 {         
  339.                                         scan1=9;
  340.                                         scan2--;
  341.                                         if(scan2==-1)
  342.                                         scan2=9;
  343.                                 }
  344.                                 shuc();
  345.                         } break;
  346.                           case 0x7b:                //自動(dòng)步進(jìn)
  347.                     {
  348.                                 time1=0;
  349.                     zdbj();
  350.                         }break;//e
  351.                           case 0x77: time1--;break;
  352.             }        
  353.     }                     
  354.         while(1);
  355. }
復(fù)制代碼

51hei.png

全部資料51hei下載地址(仿真+hex):
數(shù)字.zip (1.11 MB, 下載次數(shù): 65)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1064325 發(fā)表于 2023-2-26 15:55 | 顯示全部樓層
為什么我按了按鍵沒反應(yīng)
回復(fù)

使用道具 舉報(bào)

ID:831073 發(fā)表于 2021-12-29 14:38 | 顯示全部樓層
請(qǐng)問一下點(diǎn)如果輸出電壓的范圍想改變到0-40V應(yīng)該怎么設(shè)置
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 色噜噜亚洲男人的天堂 | 午夜一区二区三区 | 亚洲高清中文字幕 | av在线视 | 麻豆av网 | 美女毛片 | 综合一区二区三区 | 亚洲一区在线播放 | 亚洲国产成人精 | 日韩一级黄色片 | 一级片在线观看 | 国产在线拍偷自揄拍视频 | 欧美日韩不卡在线 | 色必久久 | 91视频88av| 精品亚洲第一 | 国产福利视频导航 | 亚洲女人的天堂 | 成人免费视频在线观看 | 拍戏被cao翻了h承欢 | 亚洲精品久久久久中文字幕欢迎你 | 欧美视频 | 99久久久国产精品 | 婷婷色国产偷v国产偷v小说 | 国产 91 视频 | 一区二区三区视频在线观看 | 国产成人99久久亚洲综合精品 | 成人一级片在线观看 | 欧美视频在线看 | 久久高清免费视频 | 国产视频一区二区 | 亚洲在线日韩 | 国产精品69毛片高清亚洲 | 狠狠的操 | 人人九九精 | 国产精品毛片一区二区在线看 | 日韩综合在线 | 亚洲日本欧美日韩高观看 | 日韩欧美一级精品久久 | 日本激情视频中文字幕 | 亚洲福利av |