標(biāo)題: 簡(jiǎn)易數(shù)控直流電源設(shè)計(jì)論文 [打印本頁(yè)]
作者: 15273299064 時(shí)間: 2017-6-19 15:07
標(biāo)題: 簡(jiǎn)易數(shù)控直流電源設(shè)計(jì)論文
簡(jiǎn)易數(shù)控直流電源設(shè)計(jì)
1 設(shè)計(jì)任務(wù)設(shè)計(jì)出有一定輸出電壓范圍和功能的數(shù)控電源。
2 設(shè)計(jì)要求
(1)輸出電壓:范圍0~+9.9V,步進(jìn)0.1V,紋波不大于10mV;
(2)輸出電壓值由LCD顯示;
(3)由“+”、“-”兩鍵分別控制輸出電壓步進(jìn)增減;
(4)輸出電壓可預(yù)置在0~9.9V之間的任意一個(gè)值;
(5)自制鍵盤(pán)設(shè)置電壓值。
3 設(shè)計(jì)原理與總體方案
3.1 總體設(shè)計(jì)方案
鑒于目前數(shù)控直流源一般采取運(yùn)放構(gòu)成的電流-電壓轉(zhuǎn)換電路與單片機(jī)結(jié)合,設(shè)計(jì)方案大多為開(kāi)環(huán)系統(tǒng),主控制器僅用于數(shù)字給定及顯示,沒(méi)有對(duì)輸出電流進(jìn)行檢測(cè)和控制。本文在傳統(tǒng)電路設(shè)計(jì)的基礎(chǔ)上,利用控制系統(tǒng)中反饋與控制原理,引入電流負(fù)反饋,在采樣電阻上獲取和電流成正比的采樣電壓,并接人運(yùn)算放大器的反向輸入端,實(shí)現(xiàn)負(fù)反饋,形成恒流輸出的閉環(huán)控制系統(tǒng);
軟件方面,將具有全局尋優(yōu)能力但收斂速度慢的遺傳算法和具有收斂速度快且局部尋優(yōu)能力強(qiáng)的直接搜索法結(jié)合在一起,設(shè)計(jì)基于遺傳算法和直接搜索策略的混合優(yōu)化算法,充分利用了遺傳算法的全局搜索能力并以此作為優(yōu)化過(guò)程的“粗調(diào)”,同時(shí)利用直接搜索法良好的局部搜索能力作為優(yōu)化過(guò)程的“微調(diào)”,集中了兩者的優(yōu)點(diǎn),而克服了兩者的弱點(diǎn),得到的目標(biāo)函數(shù)值較遺傳退火策略更優(yōu),而且一致性更好,用于PID參數(shù)整定是具有整定速度快,調(diào)節(jié)時(shí)間短,穩(wěn)態(tài)誤差小等優(yōu)點(diǎn)。同時(shí)結(jié)合PID算法,形成軟件閉環(huán),實(shí)現(xiàn)對(duì)輸出電流的精確控制。
系統(tǒng)工作原理如下:由鍵盤(pán)預(yù)置電壓值,輸入到單片機(jī);采樣電阻采集的電壓信號(hào)經(jīng)D/A轉(zhuǎn)換器送入單片機(jī),當(dāng)兩值之差絕對(duì)值為零或不大于設(shè)定值時(shí),不作任何調(diào)整;當(dāng)兩值之差大于設(shè)定值時(shí),運(yùn)用PID算法進(jìn)行調(diào)整,送人D/A轉(zhuǎn)換,調(diào)整輸出電壓,直到差值在允許的范圍內(nèi)。單片機(jī)控制液晶顯示電流的設(shè)定值、實(shí)際輸出值和電壓步進(jìn)值。
3.2 顯示模塊選擇
LCD(Liquid Crystal Display)顯示器是利用液晶顯示技術(shù)來(lái)進(jìn)行圖像表現(xiàn)的顯示裝置,從液晶顯示器的結(jié)構(gòu)來(lái)看,無(wú)論是筆記本電腦還是桌面系統(tǒng),采用的LCD顯示屏都是由不同部分組成的分層結(jié)構(gòu)。LCD顯示器按照控制方式不同可分為被動(dòng)矩陣式LCD及主動(dòng)矩陣式LCD兩種。
LCD由兩塊玻璃板構(gòu)成,厚約1mm,其間由包含有液晶材料的5μm均勻間隔隔開(kāi)。因?yàn)橐壕Р牧媳旧聿⒉话l(fā)光,所以在顯示屏兩邊都設(shè)有作為光源的燈管,而在液晶顯示屏背面有一塊背光板(或稱(chēng)勻光板)和反光膜,背光板是由熒光物質(zhì)組成的可以發(fā)射光線(xiàn),其作用主要是提供均勻的背景光源。
背光板發(fā)出的光線(xiàn)在穿過(guò)第一層偏振過(guò)濾層之后進(jìn)入包含成千上萬(wàn)液晶液滴的液晶層。液晶層中的液滴都被包含在細(xì)小的單元格結(jié)構(gòu)中,一個(gè)或多個(gè)單元格構(gòu)成屏幕上的一個(gè)像素。在玻璃板與液晶材料之間是透明的電極,電極分為行和列,在行與列的交叉點(diǎn)上,通過(guò)改變電壓而改變液晶的旋光狀態(tài),液晶材料的作用類(lèi)似于一個(gè)個(gè)小的光閥。在液晶材料周邊是控制電路部分和驅(qū)動(dòng)電路部分。當(dāng)LCD中的電極產(chǎn)生電場(chǎng)時(shí),液晶分子就會(huì)產(chǎn)生扭曲,從而將穿越其中的光線(xiàn)進(jìn)行有規(guī)則的折射,然后經(jīng)過(guò)第二層過(guò)濾層的過(guò)濾在屏幕上顯示出來(lái)。
3.3鍵盤(pán)選擇
鍵盤(pán)實(shí)際上是一組開(kāi)關(guān)的集合:當(dāng)開(kāi)關(guān)按下時(shí),兩根導(dǎo)線(xiàn)接通;當(dāng)開(kāi)關(guān)釋放時(shí),兩根導(dǎo)線(xiàn)斷開(kāi)。我們通過(guò)鍵盤(pán)的輸入設(shè)置預(yù)置值。
3.3.1高低電平翻轉(zhuǎn)矩陣鍵盤(pán)
矩陣鍵盤(pán)又稱(chēng)行列鍵盤(pán),它是用四條I/O線(xiàn)作為行線(xiàn),四條I/O線(xiàn)作為列線(xiàn)組成的鍵盤(pán)。在行線(xiàn)和列線(xiàn)的每個(gè)交叉點(diǎn)上設(shè)置一個(gè)按鍵。這樣鍵盤(pán)上按鍵的個(gè)數(shù)就為4*4個(gè)。這種行列式鍵盤(pán)結(jié)構(gòu)能有效地提高單片機(jī)系統(tǒng)中I/O口
最常見(jiàn)的鍵盤(pán)一般由16個(gè)按鍵組成,在單片機(jī)中正好可以用一個(gè)P口實(shí)現(xiàn)16個(gè)按鍵功能。當(dāng)無(wú)按鍵閉合時(shí),P3.0~P3.3與P3.4~P3.7之間開(kāi)路。當(dāng)有鍵閉合時(shí),與閉合鍵相連的兩條I/O口線(xiàn)之間短路。判斷有無(wú)按鍵按下的方法是:第一步,置列線(xiàn)P3.4~P3.7為輸入狀態(tài),從行線(xiàn)P3.0~P3.3輸出低電平,讀入列線(xiàn)數(shù)據(jù),若某一列線(xiàn)為低電平,則該列線(xiàn)上有鍵閉合。第二步,行線(xiàn)輪流輸出低電平,從列線(xiàn)P3.4~P3.7讀入數(shù)據(jù),若有某一列為低電平,則對(duì)應(yīng)行線(xiàn)上有鍵按下。綜合一二兩步的結(jié)果,可確定按鍵編號(hào)。但是鍵閉合一次只能進(jìn)行一次鍵功能操作,因此須等到按鍵釋放后,再進(jìn)行鍵功能操作,否則按一次鍵,有可能會(huì)連續(xù)多次進(jìn)行同樣的鍵操作。
識(shí)別按鍵的方法很多其中,最常見(jiàn)的方法是掃描法
按鍵按下時(shí),與此鍵相連的行線(xiàn)與列線(xiàn)導(dǎo)通,行線(xiàn)在無(wú)按鍵按下時(shí)處在高電平。如果所有的列線(xiàn)都處在高電平,則按鍵按下與否不會(huì)引起行線(xiàn)電平的變化,因此必須使所有列線(xiàn)處在電平。這樣,當(dāng)有按鍵按下時(shí),改鍵所在的行電平才回由高變低。才能判斷相應(yīng)的行有鍵按下。
3.3.2獨(dú)立按鍵式鍵盤(pán)
獨(dú)立按鍵式直接用I/O口線(xiàn)構(gòu)成的單個(gè)按鍵電路,其特點(diǎn)式每個(gè)按鍵單獨(dú)占用一根I/O口線(xiàn),每個(gè)按鍵的工作不會(huì)影響其他I/O口線(xiàn)的狀態(tài)。獨(dú)立按鍵的典型應(yīng)用如圖所示。獨(dú)立式按鍵電路配置靈活,軟件結(jié)構(gòu)簡(jiǎn)單,但每個(gè)按鍵必須占用一個(gè)I/O口線(xiàn),因此,在按鍵較多時(shí),I/O口線(xiàn)浪費(fèi)較大,不宜采用。
獨(dú)立按鍵的軟件常采用查詢(xún)式結(jié)構(gòu)。先逐位查詢(xún)沒(méi)跟I/O口線(xiàn)的輸入狀態(tài),如某一根I/O口線(xiàn)輸入為低電平,則可確認(rèn)該I/O口線(xiàn)所對(duì)應(yīng)的按鍵已按下,然后,再轉(zhuǎn)向該鍵的功能處理程序。
獨(dú)立按鍵數(shù)量少,可根據(jù)實(shí)際需要靈活編碼。矩陣鍵盤(pán),按鍵的位置由行號(hào)和列號(hào)唯一確定,因此可以分別對(duì)行號(hào)和列號(hào)進(jìn)行二進(jìn)制編碼,然后兩值合成一個(gè)字節(jié),高4位是行號(hào),低4位是列號(hào)。相比較而言高低電平反轉(zhuǎn)矩陣鍵盤(pán)占用的I/O接口少,實(shí)現(xiàn)的鍵數(shù)較多,比較符合我們的設(shè)計(jì)需求。
3.4主控芯片選擇
51系列是基本型,包括8051、8751、8031、8951.這四個(gè)機(jī)種區(qū)別,僅在于片內(nèi)程序儲(chǔ)存器。8051為4KBROM,8751為4KBEPROM,8031片內(nèi)無(wú)程序儲(chǔ)存器,8951為4KBEEPROM。其他性能結(jié)構(gòu)一樣,有片內(nèi)128B RAM,2個(gè)16位定時(shí)器/計(jì)數(shù)器,5個(gè)中斷源。其中,8031性?xún)r(jià)比較高,又易于開(kāi)發(fā),目前應(yīng)用面廣泛。
51系列單片機(jī)的特點(diǎn):8位cpu;片內(nèi)帶振蕩器,頻率范圍為1.2MHz~12MHz;片內(nèi)帶128B的數(shù)據(jù)存儲(chǔ)器;片內(nèi)帶4KB的程序存儲(chǔ)器;程序存儲(chǔ)器的尋址空間為64KB;片外數(shù)據(jù)存儲(chǔ)器的尋址空間為64KB;128個(gè)用戶(hù)位尋址空間;21個(gè)字節(jié)特殊功能寄存器;4個(gè)8位的I/O并行接口:P0、P1、P2、P3;兩個(gè)16位定時(shí)、計(jì)數(shù)器;兩個(gè)優(yōu)先級(jí)別的五個(gè)中斷源;一個(gè)全雙工的串行I/O接口,可多機(jī)通信;111條指令,包含乘法指令和除法指令;片內(nèi)采用單總線(xiàn)結(jié)構(gòu);有較強(qiáng)的位處理能力;采用單一+5V電源。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3001.tmp.png
圖1 MCS-51基本結(jié)構(gòu)圖
4 硬件電路設(shè)計(jì)
總體設(shè)計(jì)圖:
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3002.tmp.jpg
圖2 電路設(shè)計(jì)圖
4.1 DAC電路
一個(gè)8位D/A轉(zhuǎn)換器有8個(gè)輸入端(其中每個(gè)輸入端是8位二進(jìn)制數(shù)的一位),有一個(gè)模擬輸出端。輸入可有2^8=256個(gè)不同的二進(jìn)制組態(tài),輸出為256個(gè)電壓之一,即輸出電壓不是整個(gè)電壓范圍內(nèi)任意值,而只能是256個(gè)可能值。下圖是DAC0832的邏輯框圖和引腳排列。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3012.tmp.jpg
圖3 DAC0832的邏輯框圖和引腳排列
D0~D7:數(shù)字信號(hào)輸入端。
ILE:輸入寄存器允許,高電平有效。
CS:片選信號(hào),低電平有效。
XFER:傳送控制信號(hào),低電平有效。
WR1:寫(xiě)信號(hào)1,低電平有效。
WR2:寫(xiě)信號(hào)2,低電平有效。
IOUT1、IOUT2:DAC電流輸出端。
Rfb:是集成在片內(nèi)的外接運(yùn)放的反饋電阻。
Vref:基準(zhǔn)電壓(-10~10V)。
Vcc:是源電壓(+5~+15V)。
DAC0832輸出的是電流,所以須經(jīng)過(guò)一個(gè)外接的運(yùn)算放大器轉(zhuǎn)換成電壓。
AGND:模擬地 NGND:數(shù)字地,可與AGND接在一起使用。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3013.tmp.jpg
圖4 DAC電路
4.2矩陣鍵盤(pán)模塊
在鍵盤(pán)中按鍵數(shù)量較多時(shí),為了減少I/O口的占用,通常將按鍵排列成矩陣形式,如圖4所示。在矩陣式鍵盤(pán)中,每條水平線(xiàn)和垂直線(xiàn)在交叉處不直接連通,而是通過(guò)一個(gè)按鍵加以連接。這樣,一個(gè)端口(如P1口)就可以構(gòu)成4*4=16個(gè)按鍵,比之直接將端口線(xiàn)用于鍵盤(pán)多出了一倍,而且線(xiàn)數(shù)越多,區(qū)別越明顯,比如再多加一條線(xiàn)就可以構(gòu)成20鍵的鍵盤(pán),而直接用端口線(xiàn)則只能多出一鍵(9鍵)。由此可見(jiàn),在需要的鍵數(shù)比較多時(shí),采用矩陣法來(lái)做鍵盤(pán)是合理的。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3024.tmp.jpg
圖5 矩陣式鍵盤(pán)
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3035.tmp.jpg
圖6 鍵盤(pán)電路設(shè)計(jì)
4.3 顯示部分
1602液晶也叫1602字符型液晶,它由若干個(gè)5X7或者5X11等點(diǎn)陣字符位組成,每個(gè)點(diǎn)陣字符位都可以顯示一個(gè)字符,每位之間有一個(gè)點(diǎn)距的間隔,每行之間也有間隔,起到了字符間距和行間距的作用。1602LCD是指顯示的內(nèi)容為16X2,即可以顯示兩行,每行16個(gè)字符液晶模塊(顯示字符和數(shù)字)。
1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1引腳:GND為電源地;第2引腳:VCC接5V電源正極;第3引腳:V0為液晶顯示器對(duì)比度調(diào)整端;第4引腳:RS為寄存器選擇,高電平1時(shí)選擇數(shù)據(jù)寄存器、低電平0時(shí)選擇指令寄存器;第5引腳:RW為讀寫(xiě)信號(hào)線(xiàn),高電平(1)時(shí)進(jìn)行讀操作,低電平(0)時(shí)進(jìn)行寫(xiě)操作;第6引腳:E(或EN)端為使能端,高電平(1)時(shí)讀取信息,負(fù)跳變時(shí)執(zhí)行指令;第7~14引腳:D0~D7為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電源。第15引腳背光正極,第16引腳背光負(fù)極。
表1 液晶1602A各個(gè)管腳的介紹
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3045.tmp.jpg
圖7 LCD電路設(shè)計(jì)
4.4 自制電源模塊
自制電源輸出+12V、-12V及+5V的電壓
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3046.tmp.jpg
圖8 自制電源
4.5 主控芯片
AT89C51 提供以下標(biāo)準(zhǔn)功能:4k 字節(jié)Flash 閃速存儲(chǔ)器,128字節(jié)內(nèi)部RAM,32 個(gè)I/O 口線(xiàn),兩個(gè)16位定時(shí)/計(jì)數(shù)器,一個(gè)5向量?jī)杉?jí)中斷結(jié)構(gòu),一個(gè)全雙工串行通信口,片內(nèi)振蕩器及時(shí)鐘電路。同時(shí),AT89C51可降至0Hz的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式?臻e方式停止CPU的工作,但允許RAM,定時(shí)/計(jì)數(shù)器,串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存RAM中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個(gè)硬件復(fù)位。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3057.tmp.jpg
圖9 主控芯片電路
4.6 放大電路
放大電路是增加電信號(hào)幅度或功率的電子電路。應(yīng)用放大電路實(shí)現(xiàn)放大的裝置稱(chēng)為放大器。它的核心是電子有源器件,如電子管、晶體管等。為了實(shí)現(xiàn)放大,必須給放大器提供能量。常用的能源是直流電源,但有的放大器也利用高頻電源作為泵浦源。放大作用的實(shí)質(zhì)是把電源的能量轉(zhuǎn)移給輸出信號(hào)。
放大電路本身的特點(diǎn):
一、有靜態(tài)和動(dòng)態(tài)兩種工作狀態(tài),所以有時(shí)往往要畫(huà)出它的直流通路和交流通路才能進(jìn)行分析;
二、電路往往加有負(fù)反饋,這種反饋有時(shí)在本級(jí)內(nèi),有時(shí)是從后級(jí)反饋到前級(jí),所以在分析這一級(jí)時(shí)還要能"瞻前顧后"。在弄通每一級(jí)的原理之后就可以把整個(gè)電路串通起來(lái)進(jìn)行全面綜合。
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3058.tmp.jpg
圖10 放大電路
5 軟件設(shè)計(jì)流程
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3068.tmp.jpg
圖11 軟件設(shè)計(jì)流程圖
注:在穩(wěn)壓輸出端用萬(wàn)用表的電壓檔測(cè)輸出電壓,將會(huì)基本等于從鍵盤(pán)的輸入電壓。
6 仿真
6.1 仿真問(wèn)題及解決
(1)D/A轉(zhuǎn)換電路沒(méi)有正常工作;
問(wèn)題原因:D0-D7接口出現(xiàn)錯(cuò)誤。
(2)步進(jìn)0.1的程序出現(xiàn)問(wèn)題;
問(wèn)題原因:沒(méi)有寫(xiě)入浮點(diǎn)型函數(shù)。
6.2 仿真結(jié)果及分析
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps3069.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps307A.tmp.jpg
圖12 輸入3.2V電壓時(shí)的仿真輸出值
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps307B.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps308C.tmp.jpg
圖13 輸入5.9V電壓時(shí)的仿真輸出值
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps308D.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps309D.tmp.jpg
圖14 輸入6.3V電壓時(shí)的仿真輸出值
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps309E.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps309F.tmp.jpg
圖15 輸入8.3V電壓時(shí)的仿真輸出值
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps30B0.tmp.jpgfile:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps30B1.tmp.jpg
圖16 輸入9.1V電壓時(shí)的仿真輸出值
表2 測(cè)得的數(shù)據(jù)和從鍵盤(pán)輸入的數(shù)據(jù)
數(shù)據(jù)分析:
誤差不超過(guò)0.03
誤差分析:
(1)電路中元器件的影響
(2)外界對(duì)輸出電壓的干擾,導(dǎo)致輸出有誤差
參考文獻(xiàn)
[1]唐俊瞿,許雷,張群瞻.單片機(jī)原理與應(yīng)用[M].北京:冶金工業(yè)出版社,2003
[2]李廣弟,朱月秀,冷祖祁.單片機(jī)基礎(chǔ)[M].北京:北京航空航天大學(xué)出版社,2007
[3]李光飛.單片機(jī)課程設(shè)計(jì)實(shí)例指導(dǎo)[M].北京:北京航空航天大學(xué)出版社,2004.9
[4]張洪潤(rùn),蘭清華.單片機(jī)應(yīng)用技術(shù)教程[M].北京:清華大學(xué)出版社,1997.11
[5]李華.MCS—51系列單片機(jī)實(shí)用接口技術(shù)[M]..北京:北京航空航天大學(xué)出版社,1993
[6]李朝青.單片機(jī)原理及接口技術(shù)[M]..北京:北京航空航天大學(xué)出版社,1998
附錄
仿真圖
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wps30C2.tmp.jpg
源程序
#include<reg51.h> /*頭文件以及變量定義*/
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^4;
sbit rw=P2^5;
sbit ea=P2^6;
uchar num,i,key,j=0;
float a2;
uchar keyscan(void);
uchar code table[6]="Please";
uchar code table1[16]=" enter letter...";
uchar code table2[16]="0123456789abcde.";
float table3[6];
uchar code table4[8]="volt(v):";
uchar code table5[6]="error!";
uchar table6[6];
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay(5);
ea=1;
delay(5);
ea=0;
}
void write_date(uchar date)
{
rs=1;
rw=0;
P0=date;
delay(5);
ea=1;
delay(5);
ea=0;
}
void disvol()
{
write_com(0x80+0x40); //寫(xiě)電壓
for(num=0;num<8;num++)
{
write_date(table4[num]);
delay(10);
}
}
void init()
{
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<6;num++)
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40);
for(num=0;num<0x10;num++)
{
write_date(table1[num]);
delay(20);
}
}
void diserr()
{
write_com(0x80+0x40);
for(num=0;num<6;num++)
{
write_date(table5[num]);
delay(20);
}
delay(2000);
}
void he_zhi()
{
uint a1,a3,c11,c12;
float b1,b2,b3,b4,c1,c2,h;
if(table3[0]!='.') //整數(shù)加點(diǎn)
{
if(!table3[1])
{
if(j==1)
{
table3[1]='.';
}
}
if(!table3[2])
{
if(j==2)
{
table3[2]='.';
}
}
if(table3[1]=='.')
{
b1=table3[0];
b2=table3[2]/10;
b3=table3[3]/100;
h=b1+b2+b3;
a2=h*256/10;
a3=a2;
a1=a3+1;
c1=a2-a3;
c2=a1-a2;
c11=1000*c1;
c12=1000*c2;
if(c11>c12)
{
P1=a1;
}
else
{
P1=a3;
}
//光標(biāo)顯示位
if(j==1)
{
write_com(0x80+0x49);
}
if(j==3)
{
write_com(0x80+0x4b);
}
if(j==4)
{
write_com(0x80+0x4c);
}
}
else if(table3[2]=='.')
{
b1=table3[0]*10;
b2=table3[1];
b3=table3[3]/10;
b4=table3[4]/100;
h=b1+b2+b3+b4;
if(h<=10)
{
a2=h*256/10;
a3=a2;
a1=a3+1;
c1=a2-a3;
c2=a1-a2;
c11=1000*c1;
c12=1000*c2;
if(c11>c12)
{
P1=a1;
}
else
{
if(a3==256)
{
P1=255;
}
else
{
P1=a3;
}
}
if(j==2)
{
write_com(0x80+0x4a);
}
}
else
{
write_com(0x01);
diserr();
}
}
else
{
write_com(0x01);
diserr();
}
}
if(table3[0]=='.')
{
write_com(0x01);
diserr();
}
}
void qingchu(uchar p)
{
uchar z;
for(z=0;z<=5;z++)
{
table3[z]=p;
}
}
void jia(uchar dat) //步進(jìn)函數(shù)
{
switch(dat)
{
case 0: write_date(table2[1]);
break;
case 1: write_date(table2[2]);
break;
case 2: write_date(table2[3]);
break;
case 3: write_date(table2[4]);
break;
case 4: write_date(table2[5]);
break;
case 5: write_date(table2[6]);
break;
case 6: write_date(table2[7]);
break;
case 7: write_date(table2[8]);
break;
case 8: write_date(table2[9]);
break;
case 9: write_date(table2[0]);
break;
}
table3[2]++;
if(table3[2]==10)
table3[2]=0;
}
void jian(uchar dat)
{
switch(dat)
{
case 0: write_date(table2[9]);
break;
case 1: write_date(table2[0]);
break;
case 2: write_date(table2[1]);
break;
case 3: write_date(table2[2]);
break;
case 4: write_date(table2[3]);
break;
case 5: write_date(table2[4]);
break;
case 6: write_date(table2[5]);
break;
case 7: write_date(table2[6]);
break;
case 8: write_date(table2[7]);
break;
case 9: write_date(table2[8]);
break;
}
table3[2]--;
if(table3[2]==-1)
table3[2]=9;
}
void main()
{
init();
delay(4500);
write_com(0x01);
write_com(0x80+0x40);
write_com(0x0f);
disvol();
i=0x80+0x48;
while(1)
{
key=keyscan();
delay(100);
switch(key)
{
case 0xee:write_com(i);
write_date(table2[0]);table3[j]=0;j++; // table2[16]="0123456789abcde."
i++;
break;//0
case 0xde:write_com(i);
write_date(table2[1]);table3[j]=1;j++;
i++;
break;//1
case 0xbe:write_com(i);
write_date(table2[2]);table3[j]=2;j++;
i++;break;//2
case 0x7e:write_com(i);
write_date(table2[3]);table3[j]=3;j++;
i++;break;//3
case 0xed:write_com(i);
write_date(table2[4]);table3[j]=4;j++;
i++;break;//4
case 0xdd:write_com(i);
write_date(table2[5]);table3[j]=5;j++;
i++;break;//5
case 0xbd:write_com(i);
write_date(table2[6]);table3[j]=6;j++;
i++;break;//6
case 0x7d:write_com(i);
write_date(table2[7]);table3[j]=7;j++;
i++;break;//7
case 0xeb:write_com(i);
write_date(table2[8]);table3[j]=8;j++;
i++;break;//8
case 0xdb:write_com(i);
write_date(table2[9]);table3[j]=9;j++;
i++;break;//9
case 0xe7:write_com(i);
write_date(table2[15]);table3[j]='.';j++;
i++;break;
case 0xbb:write_com(0x80+0x48+2);
jia(table3[2]);
break;//加
case 0x7b:write_com(0x80+0x48+2);
jian(table3[2]);
break;//減
case 0xd7:he_zhi();
i=0x80+0x48;
j=0;
break;
case 0xb7:write_com(0x01);
qingchu(0);
j=0;
disvol();
write_com(0x80+0x48);
i=0x80+0x48;
break;
}
}
}
uchar keyscan(void)
{
uchar cord_h,cord_l;
P3=0x0f;
cord_h=P3&0x0f;
if(cord_h!=0x0f)
{
delay(100);
if(cord_h!=0x0f)
{
cord_h=P3&0x0f;
P3=cord_h|0xf0;
cord_l=P3&0xf0;
return(cord_h+cord_l);
}
}return(0xff);
}
作者: 312997508 時(shí)間: 2018-6-30 16:11
圖全掛了
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |