基于UCC3895與單片機(jī)的智能充電器的軟件設(shè)計_第1頁
基于UCC3895與單片機(jī)的智能充電器的軟件設(shè)計_第2頁
基于UCC3895與單片機(jī)的智能充電器的軟件設(shè)計_第3頁
基于UCC3895與單片機(jī)的智能充電器的軟件設(shè)計_第4頁
基于UCC3895與單片機(jī)的智能充電器的軟件設(shè)計_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

引言充電器通常指的是一種將交流電轉(zhuǎn)換為低壓直流電的設(shè)備。充電器在各個領(lǐng)域用途廣泛,特別是在生活領(lǐng)域被廣泛用于、相機(jī)等等常見電器。充電器是采用電力電子半導(dǎo)體器件,將電壓和頻率固定不變的交流電變換為直流電的一種靜止變流裝置。在以蓄電池為工作電源或備用電源的用電場合,充電器具有廣泛的應(yīng)用前景[1]。我國的電池產(chǎn)業(yè)雖然起步較晚,但開展很快,但當(dāng)前我國市場上的充電器普遍存在以下問題:不具備對智能電池的充電功能,擴(kuò)展性差;故障率高,而且維修困難,影響便攜式設(shè)備的正常工作;對同類電池充電缺乏自適應(yīng)性,充電控制策略落伍,導(dǎo)致了電池的壽命短、效率低和可維護(hù)性差;體積大,效率低,對電網(wǎng)污染大,不能滿足電磁兼容等要求;充電電流小,充電時間長[2]。本課題研究的是智能充電器,在原有充電器的根底上,加以改良,實(shí)現(xiàn)其智能化。做到自動斷電、充電完成報警提示。同時,采用專用的電池充電芯片實(shí)現(xiàn)對充電過程的控制。2智能充電器概述2.1UCC3895的控制原理UCC3895是TI公司生產(chǎn)的專用于PWM移相全橋DC/DC變換的新型控制芯片,可工作于電壓模式,也可工作于電流模式,并且可實(shí)現(xiàn)輸出脈沖占空比從0到100%相移控制,軟啟動和軟停止可按要求進(jìn)行調(diào)節(jié);內(nèi)置7MHz帶寬的誤差比擬放大器;具有完善的限流及過流保護(hù)、電源欠壓保護(hù),基準(zhǔn)欠壓保護(hù)、軟啟動和軟停止等功能[3]。在PWM型直流變換器中,功率開關(guān)管MOSFET在開通和關(guān)斷過程中,不僅承受一定的電壓,而且還承受一定的電流,因此,功率開關(guān)管在工作過程和開通、關(guān)斷過程中將產(chǎn)生導(dǎo)通損耗、開通損耗、關(guān)斷損耗和開關(guān)管結(jié)電容充放電損耗等。當(dāng)變換器的工作頻率升高時,開通損耗、關(guān)斷損耗和開關(guān)管結(jié)電容充放電損耗都將隨著開關(guān)頻率的升高而增加,從而使變換器的效率降低。開關(guān)管在電壓不為零的條件下開通,且在電流不為零的條件下關(guān)斷稱為硬開關(guān)。在開通和關(guān)斷過程中,變換器電路中的寄生電感和電容將產(chǎn)生很大的尖峰電壓和浪涌電流,還可能產(chǎn)生較強(qiáng)的電磁干擾。采用諧振變換器后,可利用LC諧振技術(shù)降低開關(guān)管開通和關(guān)斷過程中的di/dt和du/dt,在功率開關(guān)管開通時,使兩端電壓先下降到零,電流才開始上升〔零電壓開通〕,在功率開關(guān)管關(guān)斷時,使電流先下降到零,兩端電壓才開始上升〔零電流關(guān)斷〕,這樣可以使變換器的開關(guān)損耗大幅度減小,使開關(guān)頻率得以提高,從而使變換器中的變壓器和濾波元件的體積大大減小,這樣便可在保持變換器高效的前提下,大大提高變換器的功率密度[4]。單片機(jī)與UCC3895共同組成控制器局部,相對于僅使用單片機(jī)作為控制器的方式,具有響應(yīng)速度快,控制精度高,軟件設(shè)計簡單,運(yùn)行穩(wěn)定等優(yōu)點(diǎn)。2.2智能充電器的優(yōu)點(diǎn)可以給堿性電池充電;通過堿性電池的特性,胭脂出特殊控制器可以精確控制電流,活化堿性電池的化學(xué)成分,到達(dá)充電目的[5]。可以復(fù)活植物人電池;通過控制器自動識別到1V以下或內(nèi)阻不正常的壞電池,控制器自行調(diào)動充電資源,分配最適宜的微電流對已死掉的電池進(jìn)行激活修復(fù),電池修復(fù)好以后自動調(diào)整到達(dá)正常充電狀態(tài)。自動識別功能,通過IC微電腦識別不可充電池〔碳性,鋅錳電池〕短路電池和有缺陷的可充電池,有防止電池正負(fù)極反向短路保護(hù),屆時充電器不會充電,大大提供了使用平安利用涓流充電;通過只能技術(shù)切斷快速充電模式,單片機(jī)控制快速充電,連續(xù)充電過程,并自動轉(zhuǎn)換成涓流充電模式,確保電池完全充飽而不會過充,可以延長電池壽命。充電全程監(jiān)控;LCD顯示充電過程,直觀顯示電池狀態(tài)。充電保護(hù)措施完善;搞轉(zhuǎn)換效率、電芯只能保護(hù)、過壓保護(hù)、過流保護(hù)、過充保護(hù)、過溫保護(hù)、過時保護(hù)、短路保護(hù)、漏電保護(hù),確保充電平安放心。全電壓輸入;支持110V~240V充電,適應(yīng)全球的電壓[6]。3系統(tǒng)分析和總體設(shè)計3.1對智能充電器的要求本設(shè)計由電壓傳感器,單片機(jī),UCC3895,液晶顯示,鍵盤控制組成,傳感器將采集到的電壓和電流信息通過模數(shù)轉(zhuǎn)換交由單片機(jī)處理后,通過單片機(jī)控制UCC3895,再由UCC3895控制晶閘管的導(dǎo)通角從而控制充電器的輸出電壓,同時還可以手動設(shè)定充電模式,LCD顯示器可以實(shí)時顯示電池狀態(tài)。主要技術(shù)指標(biāo)充電電壓誤差:≤0.2V適用電壓:110V~240V短路保護(hù)以及故障顯示[7]4硬件的簡單介紹4.1AT89C51及特點(diǎn)概述AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器〔FPEROM—FalshProgrammableandErasableReadOnlyMemory〕的低電壓,高性能CMOS8位微處理器,俗稱單片機(jī),如圖2-1所示。AT89C2051是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲器的單片機(jī)。單片機(jī)的可擦除只讀存儲器可以反復(fù)擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術(shù)制造,與工業(yè)標(biāo)準(zhǔn)的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機(jī)為很多嵌入式控制系統(tǒng)提供了一種靈活性高且價廉的方案[8]。4.1.1主要特性〔1〕與MCS-51兼容〔2〕4K字節(jié)可編程閃爍存儲器〔3〕壽命:1000寫/擦循環(huán)〔4〕數(shù)據(jù)保存時間:10年〔5〕全靜態(tài)工作:0Hz-24Hz〔6〕三級程序存儲器鎖定〔7〕128*8位內(nèi)部RAM〔8〕32可編程I/O線〔9〕兩個16位定時器/計數(shù)器〔10〕5個中斷源〔11〕可編程串行通道〔12〕低功耗的閑置和掉電模式〔13〕片內(nèi)振蕩器和時鐘電路[9]4.1.2管腳說明VCC:供電電壓。GND:接地。P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當(dāng)P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當(dāng)FIASH進(jìn)行校驗(yàn)時,P0輸出原碼,此時P0外部必須被拉高[6]。P1口:P1口是一個內(nèi)部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內(nèi)部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內(nèi)部上拉的緣故。在FLASH編程和校驗(yàn)時,P1口作為第八位地址接收。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ù)存儲器進(jìn)行存取時,P2口輸出地址的高八位。在給出地址“1〞時,它利用內(nèi)部上拉優(yōu)勢,當(dāng)對外部八位地址數(shù)據(jù)存儲器進(jìn)行讀寫時,P2口輸出其特殊功能存放器的內(nèi)容。P2口在FLASH編程和校驗(yàn)時接收高八位地址信號和控制信號[10]。P3口:P3口管腳是8個帶內(nèi)部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當(dāng)P3口寫入“1〞后,它們被內(nèi)部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,P3口將輸出電流〔ILL〕這是由于上拉的緣故[11]。P3口也可作為AT89C51的一些特殊功能口,如下所示:口管腳備選功能P3.0RXD〔串行輸入口〕P3.1TXD〔串行輸出口〕P3.2/INT0〔外部中斷0〕P3.3/INT1〔外部中斷1〕P3.4T0〔記時器0外部輸入〕P3.5T1〔記時器1外部輸入〕P3.6/WR〔外部數(shù)據(jù)存儲器寫選通〕P3.7/RD〔外部數(shù)據(jù)存儲器讀選通〕P3口同時為閃爍編程和編程校驗(yàn)接收一些控制信號[12]。RST:復(fù)位輸入。當(dāng)振蕩器復(fù)位器件時,要保持RST腳兩個機(jī)器周期的高電平時間。ALE/PROG:當(dāng)訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當(dāng)用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機(jī)器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。/EA/VPP:當(dāng)/EA保持低電平時,那么在此期間外部程序存儲器〔0000H-FFFFH〕,不管是否有內(nèi)部程序存儲器。注意加密方式1時,/EA將內(nèi)部鎖定為RESET;當(dāng)/EA端保持高電平時,此間內(nèi)部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源〔VPP〕。XTAL1:反向振蕩放大器的輸入及內(nèi)部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出[13]。5軟件設(shè)計5.1軟件程序設(shè)計的語言選擇5.1.1匯編語言的簡介匯編語言的特點(diǎn)是用符號代替了機(jī)器指令代碼,而且助記符與指令代碼一一對應(yīng),根本保存了機(jī)器語言的靈活性。使用匯編語言能面向機(jī)器并較好地發(fā)揮機(jī)器的特性,得到質(zhì)量較高的程序。匯編語言中由于使用了助記符號,用匯編語言編制的程序輸入計算機(jī),計算機(jī)不能像用機(jī)器語言編寫的程序一樣直接識別和執(zhí)行,必須通過預(yù)先放入計算機(jī)的匯編程序的加工和翻譯,才能變成能夠被計算機(jī)識別和處理的二進(jìn)制代碼程序。用匯編語言等非機(jī)器語言書寫好的符號程序稱為源程序,運(yùn)行時匯編程序要將源程序翻譯成目標(biāo)程序。目標(biāo)程序是機(jī)器語言程序,它一經(jīng)被安置在內(nèi)存的預(yù)定位置上,就能被計算機(jī)的CPU處理和執(zhí)行[14]。5.1.2單片機(jī)C語言的簡介C語言是在70年代初問世的。一九七八年由美國電報公司貝爾實(shí)驗(yàn)室正式發(fā)表了C語言。同時由B.W.Kernighan和D.M.Ritchit合著了著名的“THECPROGRAMMINGLANGUAGE〞一書。在《K&R》中并沒有定義一個完整的標(biāo)準(zhǔn)C語言,后來由美國國家標(biāo)準(zhǔn)學(xué)會在此根底上制定了一個C語言標(biāo)準(zhǔn),稱之為ANSIC。作為一種結(jié)構(gòu)化的程序設(shè)計語言,C語言的特點(diǎn)就是可以使你盡量少地對硬件進(jìn)行操作,易于調(diào)試和維護(hù),具有很強(qiáng)的功能性、結(jié)構(gòu)性和可移植性,常常被優(yōu)選作為單片機(jī)系統(tǒng)的編程語言。用C編寫程序比匯編更符合人們的思考習(xí)慣,具有良好的程序結(jié)構(gòu),適用于模塊化程序設(shè)計,將功能模塊化,由不同的模塊完成不同的功能,這樣可使整個應(yīng)用系統(tǒng)程序結(jié)構(gòu)清晰,易于調(diào)試和維護(hù),還可增強(qiáng)可讀性和移植性。在絕大多數(shù)場合采用C語言編程即可完成預(yù)期的目的,但是對實(shí)時時鐘系統(tǒng)、要求執(zhí)行效率高的的系統(tǒng)就不適合采用C語言編程,對這些特殊情況進(jìn)行編程時要結(jié)合匯編語言。匯編語言具有直接和硬件打道、執(zhí)行代碼的效率高等特點(diǎn),可以做到C語言所不能做到的一些事情。這種混合編程的方法將C語言和匯編語言的優(yōu)點(diǎn)結(jié)合起來,已經(jīng)成為目前單片機(jī)開發(fā)最流行的編程方法。5.2軟件整體設(shè)計及各模塊設(shè)計繪制流程圖所謂流程圖,就是用各種符號、圖形、箭頭把程序的流向及過程用圖形表示出來。繪制流程圖是單片機(jī)程序編寫前最重要的工作,通常我們的程序就是根據(jù)流程圖的指向采用適當(dāng)?shù)闹噶顏砭帉懙?。本文的軟件程序模塊包括對鍵盤掃描單元程序、LCD顯示程序、溫度檢測程序、A/D電壓電流轉(zhuǎn)換的編寫來實(shí)現(xiàn)充電器的智能充電。5.2.1主程序模塊該軟件的目的是控制電池充電及維護(hù)終點(diǎn)及狀態(tài)顯示。當(dāng)電池放入該智能充電器時,我們可以人為選擇充電狀態(tài)與維護(hù)狀態(tài),然后讀入溫度傳感器環(huán)境溫度,決定電池充電或維護(hù)狀態(tài)的最終電壓。再由程序控制充電及維護(hù)I/O口電平的上下,選擇是對電池充電還是維護(hù)。在由ADC0832采樣的電壓判斷電池維護(hù)或充電的終止時刻,并由內(nèi)部程序計算出電池充電電流、充電電壓、電池內(nèi)阻等參數(shù)輸出給LCD1602,由其顯示電池狀態(tài)。用戶修改參數(shù)用戶修改參數(shù)裝在默認(rèn)參數(shù)開始?采樣電池電壓反接?判斷充電階段恒壓階段浮充階段恒流階段報警初始化修改默認(rèn)參數(shù)YNYYNN圖5.1主程序流程圖輸出恒定電流輸出恒定電流ALART=1?設(shè)定時間到?采集電池電壓>轉(zhuǎn)換電壓恒壓階段停止報警YYNNNY圖5.2恒流充電階段流程圖輸出恒定電壓輸出恒定電壓ALART=1?采集充電電流<轉(zhuǎn)換電流浮充電流設(shè)定時間到報警停止YYNNN圖5.3恒壓充電階段流程圖Y5.2.2溫度檢測模塊開始開始系統(tǒng)初始DS18B20溫度檢測輸入溫度范圍?鍵值處理設(shè)定溫度與當(dāng)前溫度比擬超過溫度范圍?進(jìn)行溫度控制NNYY圖5.4溫度檢測流程圖低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小〔1〕,用于產(chǎn)生固定頻率的脈沖信號送給減法計數(shù)器1,高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產(chǎn)生的信號作為減法計數(shù)器2的脈沖輸入,圖中還隱含著計數(shù)門,當(dāng)計數(shù)門翻開時,DS18B20就對低溫度系數(shù)振蕩器產(chǎn)生的時鐘脈沖后進(jìn)行計數(shù),進(jìn)而完成溫度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將-55℃所對應(yīng)的基數(shù)分別置入減法計數(shù)器1和溫度存放器中,減法計數(shù)器1和溫度存放器被預(yù)置在-55℃所對應(yīng)的一個基數(shù)值。減法計數(shù)器1對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行減法計數(shù),當(dāng)減法計數(shù)器1的預(yù)置值減到0時溫度存放器的值將加1,減法計數(shù)器1的預(yù)置將重新被裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產(chǎn)生的脈沖信號進(jìn)行計數(shù),如此循環(huán)直到減法計數(shù)器2計數(shù)到0時,停止溫度存放器值的累加,此時溫度存放器中的數(shù)值即為所測溫度#include"reg51.h"#include"d1820.h"intt;uintnum;uchardat;//讀寫數(shù)據(jù)變量uchara=0;ucharb=0;floattep=0;//讀一個溫度時的溫度轉(zhuǎn)換中間間uchardatatempbuf[4]=0;//溫度字型顯示中間變量voiddelay(uintnum)//延時{while(num--);}voidInit_DS18B20(void)//初始化{charx=0;DQ=1;delay(10);//稍作延時DQ=0;delay(80);//延時>480us540usDQ=1;//拉高總線15-60usdelay(20);x=DQ;//讀總線狀態(tài)為0復(fù)位成功,為1那么不成功delay(30);DQ=1;//釋放總線}ucharReadOneChar(void)//讀1820一個字節(jié){uchari;uchardat=0;for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;//給脈沖if(DQ){dat|=0x80;}//讀1///讀0右移處理delay(8);//15us內(nèi)讀完一個數(shù)}return(dat);}voidWriteOneChar(uchardat)//寫DS18B20{uchari=0;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;//寫所給數(shù)據(jù)最低位delay(10);///////////DQ=1;//給脈沖dat>>=1;}delay(8);}intReadOneTemperature(void)//讀取溫度值{Init_DS18B20();WriteOneChar(0xcc);//發(fā)跳過ROM命令WriteOneChar(0x44);//發(fā)讀開始轉(zhuǎn)換命令I(lǐng)nit_DS18B20();WriteOneChar(0xcc);//發(fā)跳過ROM命令WriteOneChar(0xbe);//讀存放器,共九字節(jié),前兩字節(jié)為轉(zhuǎn)換值a=ReadOneChar();//a存低字節(jié)b=ReadOneChar();//b存高字節(jié)t=b;t<<=8;//高字節(jié)轉(zhuǎn)換為10進(jìn)制t=t|a;tep=t*0.0625;//轉(zhuǎn)換精度為0.0625/LSBt=tep*10+0.5;//保存1位小數(shù)并四舍五入****后面除10復(fù)原正確溫度值〕return(t);}voidTemperaturepro(void)//溫度處理{inttemp;temp=ReadOneTemperature();tempbuf[3]=temp/1000;//百位tempbuf[2]=temp/100%10;//十位tempbuf[1]=temp%100/10;//個位tempbuf[0]=temp%10;//小數(shù)}5.2.3PWM控制模塊A/D采用外部中斷觸發(fā)的方式,當(dāng)數(shù)據(jù)到來的時候?qū)?shù)據(jù)讀入,根據(jù)不同的電壓值選擇不同方案,并且用定時器每500ms查詢1次,改變原來的方案。程序清單如下:功能:通過定時器定時從A/D上讀取數(shù)據(jù),根據(jù)不同的電壓選擇不同的控制充電方案,使用PWM控制輸出脈寬來控制電流。ORG0000HLJMPSTARTORG0003HLJMPEXTERN_INT;外中斷入口ORG000BHLJMPTIMER0_INT;定時器中斷入口;程序開始,初始化各個存放器以及標(biāo)志位START:MOVSP,#050H;設(shè)置堆棧MOVR0,#030H;設(shè)置A/D存儲單元初始地址MOVIE,#0FFH;翻開所有中斷MOVDPTR,#78FFH;采集通道首地址,只使用一路A/D就可以MOVR0,#40HMOV@R0,#00H;去除方案選擇位MOVR0,#40HMOV@R0,#00H;去除方案選擇觸發(fā)位MOVR1,#42HMOV@R0,#00H;去除定時器計數(shù)器LCALLTIMER1_INIT;進(jìn)入循環(huán),查詢標(biāo)志位,采取不同的方案LOOP:MOVR0,#30H;30H是A/D轉(zhuǎn)換的地址,將數(shù)據(jù)和幾個值進(jìn)行比擬;確定方案MOVA,@R0SUBBA,#30H;當(dāng)電壓很小的時候,采用第1種方案,向引腳PWM;發(fā)送占空比為10%的信號JCPROCESS_01MOVA,@R0SUBBA,@90HJCPROCESS_02;當(dāng)電壓較小的時候,采用第2種方案,向引腳PWM;發(fā)送占空比為20%的信號MOVA,@R0SUBBA,@90HJZPROCESS_03;當(dāng)電壓正好的時候,采用第3種方案,向引腳PWM;發(fā)送占空比為50%的信號MOVA,#04H;當(dāng)電壓超出的時候,采用第4種方案,向引腳PWM;發(fā)送占空比為0%的信號LJMPPROCESS_04CLEAR_FLAG:MOVR0,#40H;去除方案選擇位MOV@R0,#00HMOVR0,#41H;去除觸發(fā)位MOV@R0,#00HLJMPLOOPPROCESS_01:MOVR1,#040HMOV@R1,#01H;選擇方案1PROCESS_01_NEXT:SETBP2.0;將和PWM連接的管腳置高M(jìn)OVR1,#0F0HMOVR0,#00HPROCESS_01_01:DJNZR1,PROCESS_01_01DJNZR0,PROCESS_01_01;空跑16*256*2個周期CLRP2.0;將和PWM來連接的管腳置低MOVR1,#070HMOVR0,#00HPROCESS_01_02:DJNZR1,PROCESS_01_02DJNZR0,PROCESS_01_02;空跑16*256*2*9個周期MOVR1,#040H;當(dāng)方案改變標(biāo)志位到來的時候,去除標(biāo)志位并;且重新進(jìn)行判斷CJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_01_NEXTPROCESS_02:MOVR1,#040HMOV@R1,#02H;選擇方案2PROCESS_02_NEXT:SETBP2.0;將和PWM連接的管腳置高M(jìn)OVR1,#0E0HMOVR0,00HPROCESS_02_01:DJNZR1,PROCESS_02_01DJNZR0,PROCESS_02_01;空跑16*256*2個周期CLRP2.0;將和PWM連接的管腳置低MOVR1,#080HMOVR0,00HPROCESS_02_02:DJNZR1,PROCESS_02_02DJNZR0,PROCESS_02_02;;空跑16*256*2*8個周期MOVR1,#041H;當(dāng)方案改變標(biāo)志位到來的時候,去除標(biāo)志;位并且重新進(jìn)行判斷CJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_02_NEXRPROCESS_03:MOVR1,040HMOV@R1,#03H;選擇方案3PROCESS_03_NEXT:SETBP2.0;將和PWM連接的管腳置高M(jìn)OVR1,0B0HMOVR0,#00HPROCESS_03_01:DJNZR1,PROCESS_03_01DJNZR0,PROCESS_03_01;空跑16*256*2*2個周期CLRP2.0;將和PWM連接的管腳置低MOVR1,#0B0HMOVR0,00HPROCESS_03_02:DJNZR1,PROCESS_03_02DJNZR0,PROCESS_03_02;;空跑16*256*2*7個周期MOVR1,#041H;當(dāng)方案改變標(biāo)志位到來的時候,去除標(biāo)志;位并且重新進(jìn)行判斷CJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_03_NEXRPROCESS_04:CLRP2.0MOVR1,#040HMOV@R1,#04H;選擇方案4MOVR1,041HCJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_04TIMER1_INIT;ANLTMOD,0FH;設(shè)置定時器T1為方式2ORLTMOD,#10HMOVTOMD,#21H;定時器T0工作在方式1MOVPCON,#080HCLRTRT1;禁止定時器T1SETBEASETBET1SETBET0SETBPT0;定時器T0中斷優(yōu)于串口中斷CLRTF1MOVTL0,#00HMOVTH0,#01FH;定時器T0中斷發(fā)生時間為62.5msSETBTR0;使能定時器T0CLRTF0RET;進(jìn)入定時器中斷,每500ms設(shè)置1次標(biāo)志位TIMER0_INT:PUSHACC;累加器入棧PUSHPSW;程序狀態(tài)字入棧MOVPSW,#18H;切換存放器區(qū)域CLRTF0;去除定時器中斷TF0CLRTF0;禁止定時器中斷T0MOVTL0,#00HMOVTH0,#01FH;定時器T0中斷發(fā)生時間為6CLRTF0;去除溢出中斷位MOVR1,#42HINC@R1;增加計數(shù)器的值,到8為止,這樣到達(dá)500msCJNE@R1,#08H,TIMER0_READYMOV@R1,#00H;去除計時器的值MOVR1,#041H;設(shè)置標(biāo)志位,每500ms重新選擇方案MOV@R1,#01HTIMER0_READY:SETBTR0;使能定時器T0POPPSW;程序狀態(tài)字出棧POPACC;累加器出棧RETI;進(jìn)入外部中斷,每進(jìn)入一次讀取ADC的值EXTERN_INT:PUSHACC;累加器壓棧PUSHPSW;程序狀態(tài)字壓棧MOVPSW,010H;切換存放器區(qū)域MOVDPTR,#78FFH;A/D轉(zhuǎn)換器首地址MOVXA,@DPTR;讀入A/D的值MOVR1,030H;存儲A/D轉(zhuǎn)換器的數(shù)據(jù)的地址MOV@R1,A;將A/D的值讀入該地址POPPSW;程序狀態(tài)字出棧POPACC;累加器出棧RETIEND5.2.4鍵盤掃描模塊圖5.5是89C51單片機(jī)應(yīng)用系統(tǒng)的鍵輸入軟件框圖。對于任何一個單片機(jī)應(yīng)用系統(tǒng),鍵盤總要有其相應(yīng)的接口電路與CPU相連,通過軟件了解鍵盤的輸入信息。而CPU可以才用中斷方式或查詢方式來了解有無鍵輸入,并檢查是哪個鍵按下,將鍵號送入累加器ACC,然后通過散轉(zhuǎn)指令去執(zhí)行相應(yīng)的程序,以完成該鍵完成的功能,最后又返回到原始狀態(tài)。01#按鍵應(yīng)用程序01#按鍵應(yīng)用程序00#按鍵應(yīng)用程序鍵掃描有無鍵按下查鍵號JMP@A+DPTRNN#按鍵應(yīng)用程序NYA=00HA=01HA=NNH圖5.589C51單片機(jī)應(yīng)用系統(tǒng)鍵盤輸入軟件框圖對鍵盤掃描電路的掃描方式有行掃描法和線反轉(zhuǎn)法。確定矩陣式鍵盤上任何一個鍵被按下通常采用“行掃描法〞或者“行反轉(zhuǎn)法〞。行掃描法又稱為逐行〔或列〕掃描查詢法,它是一種最常用的多按鍵識別方法。在此次程序編寫中,本文采用行掃描法進(jìn)行對鍵盤掃描程序的編寫。如上圖,單片機(jī)的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源+5V,并把列線P1.0-P1.3設(shè)置為輸入線,行線P1.4-P1.7設(shè)置為輸出線。4根行線和4根列線形成16個相交點(diǎn)。檢測當(dāng)前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0〞,讀取P1.0-P1.3的狀態(tài),假設(shè)P1.0-P1.3為全“1〞,那么無鍵閉合,否那么有鍵閉合。去除鍵抖動。當(dāng)檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。在每組行輸出時讀取,假設(shè)全為“1〞,那么表示為“0〞這一行沒有鍵閉合,否那么有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉(zhuǎn)換成所定義的鍵值。為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。其流程圖如圖5.7。圖5.6矩陣式鍵盤的連接圖開始開始鍵盤初始化讀列是否有鍵按下延時去抖動讀列是否有鍵按下根據(jù)當(dāng)前狀態(tài)識別按鍵顯示鍵值NYNY圖5.7鍵盤掃描流程圖具體程序如下:/*************************鍵盤掃描子程序****************************/SCANKY:MOVR3,#0F7H;掃描初值〔P2.3=0〕MOVR2,#00H;R2為取鍵盤碼指針L2:MOVA,R3;開始掃描MOVP2,掃描值輸出至P2口MOVA,P2;讀入P2值,判斷是否有鍵按下MOVR4,A;存入P2值,以判斷是否放開按鍵SETBC;后用帶循環(huán)移位MOVR5,#04H;先掃描4列L3:RLCA;先從P2.3相接這一行P2.4-P2.7哪個鍵按下了JNCKEYIN;C=0那么有鍵按下,跳至KEYININCR2;C=1說明沒有鍵按下,取碼指針加1DJNZR5,L3;3列掃描完畢?MOVA,R3;掃描值載入SETBC;RRCA;掃描下一行MOVR3,A;存回掃描存放器JCL2;4行掃描完?沒有那么回L2繼續(xù)掃描RET;一遍掃描完返回KEYIN:MOVR7,#60H;30MS消抖動D2:MOVR6,#248DJNZR6,$DJNZR7,D2D3:MOVA,P2;讀入P2值,判斷換鍵是否松開XRLA,R4;與上次值XX比擬JZD3;ACC=0表示未放MOVA,R2;按鈕已松開,取碼指針載入MOVDPTR,#KEYSCAN_TABMOVCA,@A+DPTRSETBFLAG_KEY;鍵盤掃描一次有輸入標(biāo)志位置位MOVKEYBUFF,A;鍵盤碼放入鍵盤存儲器KEYBUFFRET鍵盤掃描碼KEYSCAN_TAB:DB01H,02H,03H,0CHDB04H,05H,06H,0DHDB07H,08H,09H,0DHDB0AH,00H,0BH,0FH5.2.5LCD顯示模塊如果說鍵盤構(gòu)成的是單片機(jī)的輸入系統(tǒng),那么液晶屏就是單片機(jī)的輸出系統(tǒng)。在單片機(jī)系統(tǒng)中,通常用LCD液晶顯示器來顯示各種數(shù)字或符號,由于它具〔1〕位數(shù)多,可顯示32位,32個數(shù)碼管體積相當(dāng)龐大了。〔2〕顯示內(nèi)容豐富,可顯示所有數(shù)字、字母、符號等192種ASCII碼對應(yīng)的字符?!?〕程序簡單,如果用數(shù)碼管動態(tài)顯示,會占用很多時間來刷新顯示,而1602自動完成此功能。因此使用非常廣泛。LCD1602液晶顯示模塊可以顯示兩行,每行16個字符,采用單+5V電源供電,外圍電路配置簡單,價格廉價,具有很高的性價比。.11602LCD功能介紹〔1〕1602采用標(biāo)準(zhǔn)的16腳接口,其中:第1腳:VSS為電源地第2腳:VDD接5V電源正極第3腳:V0為液晶顯示器比照度調(diào)整端,接正電源時比照度最弱,接地電源時比照度最高〔比照度過高時會產(chǎn)生“鬼影〞,使用時可以通過一個10K的電位器調(diào)整比照度〕。第4腳:RS為存放器選擇,高電平1時選擇數(shù)據(jù)存放器、低電平0時選擇指令存放器。第5腳:RW為讀寫信號線,高電平(1)時進(jìn)行讀操作,低電平(0)時進(jìn)行寫操作。第6腳:E(或EN)端為使能(enable)端。第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負(fù)極?!?〕、1602LCD的操作指令說明1602液晶模塊的讀寫操作、屏幕和光標(biāo)的操作都是通過指令編程來實(shí)現(xiàn)的。指令1:清顯示,指令碼,光標(biāo)復(fù)位到地址位置。指令3:光標(biāo)和顯示模式設(shè)置。其中:I/D:光標(biāo)移動方向,高電平右移,低電平左移;S:屏幕上所有文字是否左移或者右移,高電平。指令4:顯示開關(guān)控制。其中:D:控制整體顯示的開與關(guān),高電平表示開顯示,低電平表示關(guān)顯示;C:控制光標(biāo)的開與關(guān),高電平表示有光標(biāo),低電平表示無光標(biāo);B:控制光標(biāo)是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標(biāo)或顯示移位。其中:S/C:高電平時移動顯示的文字,低電平時移動光標(biāo)。指令6:功能設(shè)置命令。其中:DL:高電平時為4位總線,低電平時為8位總線;N:低電平時為單行顯示,高電平時雙行顯示;F:低電平時顯示5×7的點(diǎn)陣符,高電平時顯示5×10的點(diǎn)陣字符。指令7:字符發(fā)生器RAM地址設(shè)置。指令8:DDRAM地址設(shè)置。指令9:讀忙信號和光標(biāo)地址。其中:BF:讀忙標(biāo)志位,高電平表示忙、,此時模塊不能接收命令或者數(shù)據(jù)低電平表示不忙。指令2:光標(biāo)復(fù)位,光標(biāo)返回到地址00H。指令10:寫數(shù)據(jù)。指令11:讀數(shù)據(jù)。顯示子程序如下:Voiddisplay(){s=keyb(num);//顯示一位數(shù)disp[0]=s/100+‘0’;disp[1]=s/10%10+‘0’;disp[2]=s%10+‘0’;判斷是否有按鍵按下判斷是否有按鍵按下掃描、判行確定鍵值判第七位是否為0開始LCD1602初始化掃描按鍵延時消抖首行掃描字R3列掃描送P1鍵值入棧保護(hù)鍵值轉(zhuǎn)化為ASII碼,存入存放器判釋放鍵值LCD1602寫命令顯示延時結(jié)束圖5.8LCD顯示流程圖if(s<10){write_disp(0,0,disp[0]);//將數(shù)值轉(zhuǎn)換為ASCII碼顯示write_disp(0,1,0xa0);//顯示空白write_disp(0,2,0xa0);delay(1);}elseif(s>10&&s<100)//顯示兩位數(shù){For〔k=1;k<3;k++〕{Write_disp(0,k-1,disp[k]);Delay(1);}write_disp(0,2,0xa0);//顯示空白}else//顯示三位數(shù){for(k=0;k<3;k++){write_disp(0,k,disp[k]);delay(1);}}}5.2.5A/D電壓電流轉(zhuǎn)換模塊A/D的工作原理:初始化時將逐次逼近存放器各位清零;轉(zhuǎn)換開始時,先將逐次逼近存放器最高位置1,送入D/A轉(zhuǎn)換器,經(jīng)D/A轉(zhuǎn)換后生成的模擬量送入比擬器,稱為Vo,與送入比擬器的待轉(zhuǎn)換的模擬量Vi進(jìn)行比擬,假設(shè)Vo<Vi,該位1被保存,否那么被去除。然后再置逐次逼近存放器次高位為1,將存放器中新的數(shù)字量送D/A轉(zhuǎn)開始開始STARTEOCOE=1讀數(shù)OE=0結(jié)束圖5.9A/D轉(zhuǎn)換流程圖換器,輸出的Vo再與Vi比擬,假設(shè)Vo<Vi,該位1被保存,否那么被去除。重復(fù)此過程,直至逼近存放器最低位。轉(zhuǎn)換結(jié)束后,將逐次逼近存放器中的數(shù)字量送入緩沖存放器,得到數(shù)字量的輸出。逐次逼近的操作過程是在一個控制電路的控制下進(jìn)行的。EOC表示轉(zhuǎn)換結(jié)束信號,要是轉(zhuǎn)換結(jié)束,EOC等于一,沒有結(jié)束就是零。OE是輸出使能端,高電平輸出。然后A/D開始讀取轉(zhuǎn)換的電壓電流值,輸出讀取的電壓電流值。#include<reg52.h>//A/D轉(zhuǎn)換#include<intrins.h#defineByteunsignedchar#defineWordunsignedintsbitDisClk=P2^7;sbitDisDat=P2^6;sbitA1=P0^0;sbitB1=P0^1;sbitC1=P0^2;sbitD1=P0^3;/*-----------------------------------------------------------功能:ADC0809接口程序目標(biāo)芯片:AT89S52單片機(jī)占用資源:采集到的數(shù)字量接P1口、MCUADC0809變量名稱P3.7START/ALEADC_STP3.5EOCADC_EOCP3.6OEADC_OEALECLK〔經(jīng)二分頻〕無用戶接口函數(shù):ByteADC0809(void)-----------------------------------------------------------*/#defineAdcDataP1 //ADC輸出的數(shù)字量接單片機(jī)P1口#defineN10 //滑動平均濾波隊列長度ByteValueBuf[N]; //滑動平均濾波隊列ByteFilterCnt=0; //隊列指針sbitADC_ST=P3^7; //START&ALEsbitADC_EOC=P3^5; //EOCsbitADC_OE=P3^6; //OUTPUTENABLE--OEByteADC0809(void){Bytei;ADC_ST=1; //啟動ADC0809,鎖存轉(zhuǎn)換通道地址,開始轉(zhuǎn)換for(i=10;i>0;i--) ; //微秒級延時,保持高電平一段時間ADC_ST=0;while(!ADC_EOC) ; //等待ADC0809轉(zhuǎn)換結(jié)束ADC_OE=1; //使能ADC0809輸出i=AdcData; //MCU采集ADC0809的數(shù)字量ADC_OE=0; //關(guān)ADC0809輸出使能return(i); //返回采集到的數(shù)字量}BytePingFilter(void) //滑動平均值濾波//==========================================================================={intCount;intSum; ValueBuf[FilterCnt++]=ADC0809(); if(FilterCnt==N) { FilterCnt=0; } for(Count=0;Count<N;Count++) { Sum+=ValueBuf[Count]; } return(Byte)(Sum/N);6系統(tǒng)調(diào)試與改良6.1硬軟件結(jié)合進(jìn)行調(diào)試軟件的調(diào)試是整個設(shè)計之中的一個重要環(huán)節(jié),它既可以對硬件連接的正確與否性進(jìn)行檢測,也可以驗(yàn)證軟件的匹配性,所以調(diào)式的成功與否至關(guān)重要。但是由于條件有限,我和隊友不可能進(jìn)行真實(shí)的仿真實(shí)驗(yàn)。假設(shè)開始我和本組隊友在進(jìn)行調(diào)式時受挫,實(shí)驗(yàn)用的放電放空的鎳鎘蓄電池在一段時間的充電之后始終沒有蓄積電量。于是我們就要展開分析,軟件這局部應(yīng)該是沒有什么問題的,因?yàn)槌绦蚴窍惹暗膶I(yè)科技人員經(jīng)過無數(shù)次實(shí)驗(yàn)驗(yàn)證的,所以目光要轉(zhuǎn)向硬件方面,首先啟動電路的電源,通盤檢測一下電路是否全部連接通,如果沒問題,接下來就檢查ADC變換是否進(jìn)行,這只需要用其它的軟件單獨(dú)測試AD0329轉(zhuǎn)換器是否完好,倘假設(shè)這沒問題就等ADC轉(zhuǎn)換結(jié)束之后,讀入了轉(zhuǎn)換數(shù)據(jù),在單片機(jī)仿真的幾組內(nèi)部信息顯示欄中查看CPU對程序的執(zhí)行情況,是否有采用定時查詢電壓的機(jī)制,定時器每500ms給出標(biāo)志位,查詢A/D上的電壓值,然后根據(jù)不同的電壓選擇不同的方案結(jié)論本次設(shè)計一開始,曾經(jīng)一度對課題有許多不清楚和不了解的地方,經(jīng)過近一周時間的課題分析,并與同組同學(xué)進(jìn)行討論,又在指導(dǎo)老師的講解下對課題有了初步了解,但是深入課題之后,發(fā)現(xiàn)由于間隔時間過長,許多過去課堂上學(xué)過的知識點(diǎn)都遺忘了,在進(jìn)行設(shè)計中的相關(guān)實(shí)驗(yàn)局部的操作時以及實(shí)驗(yàn)儀器的使用方法和考前須知都不很熟練,甚至有些遺忘,通過查閱相關(guān)資料,將一些根底知識進(jìn)行了回憶,但在實(shí)驗(yàn)過程中仍出現(xiàn)了一些書本中沒有講到的問題?;赨CC3895智能充電器的設(shè)計,我分別設(shè)計了PWM控制模塊,溫度檢測模塊,A/D電壓電流轉(zhuǎn)化模塊,LCD顯示模塊,鍵盤輸入模塊。讀充電器實(shí)現(xiàn)智能化控制,自動斷電、充電完成報警提示等。同時,充電的時間盡量縮短,實(shí)現(xiàn)短時充電。致謝本研究及論文是在我的指導(dǎo)老師的親切關(guān)心和悉心指導(dǎo)下完成的。他嚴(yán)肅的科學(xué)態(tài)度,嚴(yán)謹(jǐn)?shù)闹螌W(xué)精神,精益求精的工作作風(fēng),深深地感染和鼓勵著我。從

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論