版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
引言充電器通常指的是一種將交流電轉換為低壓直流電的設備。充電器在各個領域用途廣泛,特別是在生活領域被廣泛用于、相機等等常見電器。充電器是采用電力電子半導體器件,將電壓和頻率固定不變的交流電變換為直流電的一種靜止變流裝置。在以蓄電池為工作電源或備用電源的用電場合,充電器具有廣泛的應用前景[1]。我國的電池產業(yè)雖然起步較晚,但開展很快,但當前我國市場上的充電器普遍存在以下問題:不具備對智能電池的充電功能,擴展性差;故障率高,而且維修困難,影響便攜式設備的正常工作;對同類電池充電缺乏自適應性,充電控制策略落伍,導致了電池的壽命短、效率低和可維護性差;體積大,效率低,對電網(wǎng)污染大,不能滿足電磁兼容等要求;充電電流小,充電時間長[2]。本課題研究的是智能充電器,在原有充電器的根底上,加以改良,實現(xiàn)其智能化。做到自動斷電、充電完成報警提示。同時,采用專用的電池充電芯片實現(xiàn)對充電過程的控制。2智能充電器概述2.1UCC3895的控制原理UCC3895是TI公司生產的專用于PWM移相全橋DC/DC變換的新型控制芯片,可工作于電壓模式,也可工作于電流模式,并且可實現(xiàn)輸出脈沖占空比從0到100%相移控制,軟啟動和軟停止可按要求進行調節(jié);內置7MHz帶寬的誤差比擬放大器;具有完善的限流及過流保護、電源欠壓保護,基準欠壓保護、軟啟動和軟停止等功能[3]。在PWM型直流變換器中,功率開關管MOSFET在開通和關斷過程中,不僅承受一定的電壓,而且還承受一定的電流,因此,功率開關管在工作過程和開通、關斷過程中將產生導通損耗、開通損耗、關斷損耗和開關管結電容充放電損耗等。當變換器的工作頻率升高時,開通損耗、關斷損耗和開關管結電容充放電損耗都將隨著開關頻率的升高而增加,從而使變換器的效率降低。開關管在電壓不為零的條件下開通,且在電流不為零的條件下關斷稱為硬開關。在開通和關斷過程中,變換器電路中的寄生電感和電容將產生很大的尖峰電壓和浪涌電流,還可能產生較強的電磁干擾。采用諧振變換器后,可利用LC諧振技術降低開關管開通和關斷過程中的di/dt和du/dt,在功率開關管開通時,使兩端電壓先下降到零,電流才開始上升〔零電壓開通〕,在功率開關管關斷時,使電流先下降到零,兩端電壓才開始上升〔零電流關斷〕,這樣可以使變換器的開關損耗大幅度減小,使開關頻率得以提高,從而使變換器中的變壓器和濾波元件的體積大大減小,這樣便可在保持變換器高效的前提下,大大提高變換器的功率密度[4]。單片機與UCC3895共同組成控制器局部,相對于僅使用單片機作為控制器的方式,具有響應速度快,控制精度高,軟件設計簡單,運行穩(wěn)定等優(yōu)點。2.2智能充電器的優(yōu)點可以給堿性電池充電;通過堿性電池的特性,胭脂出特殊控制器可以精確控制電流,活化堿性電池的化學成分,到達充電目的[5]??梢詮突钪参锶穗姵兀煌ㄟ^控制器自動識別到1V以下或內阻不正常的壞電池,控制器自行調動充電資源,分配最適宜的微電流對已死掉的電池進行激活修復,電池修復好以后自動調整到達正常充電狀態(tài)。自動識別功能,通過IC微電腦識別不可充電池〔碳性,鋅錳電池〕短路電池和有缺陷的可充電池,有防止電池正負極反向短路保護,屆時充電器不會充電,大大提供了使用平安利用涓流充電;通過只能技術切斷快速充電模式,單片機控制快速充電,連續(xù)充電過程,并自動轉換成涓流充電模式,確保電池完全充飽而不會過充,可以延長電池壽命。充電全程監(jiān)控;LCD顯示充電過程,直觀顯示電池狀態(tài)。充電保護措施完善;搞轉換效率、電芯只能保護、過壓保護、過流保護、過充保護、過溫保護、過時保護、短路保護、漏電保護,確保充電平安放心。全電壓輸入;支持110V~240V充電,適應全球的電壓[6]。3系統(tǒng)分析和總體設計3.1對智能充電器的要求本設計由電壓傳感器,單片機,UCC3895,液晶顯示,鍵盤控制組成,傳感器將采集到的電壓和電流信息通過模數(shù)轉換交由單片機處理后,通過單片機控制UCC3895,再由UCC3895控制晶閘管的導通角從而控制充電器的輸出電壓,同時還可以手動設定充電模式,LCD顯示器可以實時顯示電池狀態(tài)。主要技術指標充電電壓誤差:≤0.2V適用電壓:110V~240V短路保護以及故障顯示[7]4硬件的簡單介紹4.1AT89C51及特點概述AT89C51是一種帶4K字節(jié)閃爍可編程可擦除只讀存儲器〔FPEROM—FalshProgrammableandErasableReadOnlyMemory〕的低電壓,高性能CMOS8位微處理器,俗稱單片機,如圖2-1所示。AT89C2051是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲器的單片機。單片機的可擦除只讀存儲器可以反復擦除100次。該器件采用ATMEL高密度非易失存儲器制造技術制造,與工業(yè)標準的MCS-51指令集和輸出管腳相兼容。由于將多功能8位CPU和閃爍存儲器組合在單個芯片中,ATMEL的AT89C51是一種高效微控制器,AT89C2051是它的一種精簡版本。AT89C單片機為很多嵌入式控制系統(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位內部RAM〔8〕32可編程I/O線〔9〕兩個16位定時器/計數(shù)器〔10〕5個中斷源〔11〕可編程串行通道〔12〕低功耗的閑置和掉電模式〔13〕片內振蕩器和時鐘電路[9]4.1.2管腳說明VCC:供電電壓。GND:接地。P0口:P0口為一個8位漏級開路雙向I/O口,每腳可吸收8TTL門電流。當P1口的管腳第一次寫1時,被定義為高阻輸入。P0能夠用于外部程序數(shù)據(jù)存儲器,它可以被定義為數(shù)據(jù)/地址的第八位。在FIASH編程時,P0口作為原碼輸入口,當FIASH進行校驗時,P0輸出原碼,此時P0外部必須被拉高[6]。P1口:P1口是一個內部提供上拉電阻的8位雙向I/O口,P1口緩沖器能接收輸出4TTL門電流。P1口管腳寫入1后,被內部上拉為高,可用作輸入,P1口被外部下拉為低電平時,將輸出電流,這是由于內部上拉的緣故。在FLASH編程和校驗時,P1口作為第八位地址接收。P2口:P2口為一個內部上拉電阻的8位雙向I/O口,P2口緩沖器可接收,輸出4個TTL門電流,當P2口被寫“1〞時,其管腳被內部上拉電阻拉高,且作為輸入。并因此作為輸入時,P2口的管腳被外部拉低,將輸出電流。這是由于內部上拉的緣故。P2口當用于外部程序存儲器或16位地址外部數(shù)據(jù)存儲器進行存取時,P2口輸出地址的高八位。在給出地址“1〞時,它利用內部上拉優(yōu)勢,當對外部八位地址數(shù)據(jù)存儲器進行讀寫時,P2口輸出其特殊功能存放器的內容。P2口在FLASH編程和校驗時接收高八位地址信號和控制信號[10]。P3口:P3口管腳是8個帶內部上拉電阻的雙向I/O口,可接收輸出4個TTL門電流。當P3口寫入“1〞后,它們被內部上拉為高電平,并用作輸入。作為輸入,由于外部下拉為低電平,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口同時為閃爍編程和編程校驗接收一些控制信號[12]。RST:復位輸入。當振蕩器復位器件時,要保持RST腳兩個機器周期的高電平時間。ALE/PROG:當訪問外部存儲器時,地址鎖存允許的輸出電平用于鎖存地址的地位字節(jié)。在FLASH編程期間,此引腳用于輸入編程脈沖。在平時,ALE端以不變的頻率周期輸出正脈沖信號,此頻率為振蕩器頻率的1/6。因此它可用作對外部輸出的脈沖或用于定時目的。然而要注意的是:每當用作外部數(shù)據(jù)存儲器時,將跳過一個ALE脈沖。如想禁止ALE的輸出可在SFR8EH地址上置0。此時,ALE只有在執(zhí)行MOVX,MOVC指令是ALE才起作用。另外,該引腳被略微拉高。如果微處理器在外部執(zhí)行狀態(tài)ALE禁止,置位無效。/PSEN:外部程序存儲器的選通信號。在由外部程序存儲器取指期間,每個機器周期兩次/PSEN有效。但在訪問外部數(shù)據(jù)存儲器時,這兩次有效的/PSEN信號將不出現(xiàn)。/EA/VPP:當/EA保持低電平時,那么在此期間外部程序存儲器〔0000H-FFFFH〕,不管是否有內部程序存儲器。注意加密方式1時,/EA將內部鎖定為RESET;當/EA端保持高電平時,此間內部程序存儲器。在FLASH編程期間,此引腳也用于施加12V編程電源〔VPP〕。XTAL1:反向振蕩放大器的輸入及內部時鐘工作電路的輸入。XTAL2:來自反向振蕩器的輸出[13]。5軟件設計5.1軟件程序設計的語言選擇5.1.1匯編語言的簡介匯編語言的特點是用符號代替了機器指令代碼,而且助記符與指令代碼一一對應,根本保存了機器語言的靈活性。使用匯編語言能面向機器并較好地發(fā)揮機器的特性,得到質量較高的程序。匯編語言中由于使用了助記符號,用匯編語言編制的程序輸入計算機,計算機不能像用機器語言編寫的程序一樣直接識別和執(zhí)行,必須通過預先放入計算機的匯編程序的加工和翻譯,才能變成能夠被計算機識別和處理的二進制代碼程序。用匯編語言等非機器語言書寫好的符號程序稱為源程序,運行時匯編程序要將源程序翻譯成目標程序。目標程序是機器語言程序,它一經被安置在內存的預定位置上,就能被計算機的CPU處理和執(zhí)行[14]。5.1.2單片機C語言的簡介C語言是在70年代初問世的。一九七八年由美國電報公司貝爾實驗室正式發(fā)表了C語言。同時由B.W.Kernighan和D.M.Ritchit合著了著名的“THECPROGRAMMINGLANGUAGE〞一書。在《K&R》中并沒有定義一個完整的標準C語言,后來由美國國家標準學會在此根底上制定了一個C語言標準,稱之為ANSIC。作為一種結構化的程序設計語言,C語言的特點就是可以使你盡量少地對硬件進行操作,易于調試和維護,具有很強的功能性、結構性和可移植性,常常被優(yōu)選作為單片機系統(tǒng)的編程語言。用C編寫程序比匯編更符合人們的思考習慣,具有良好的程序結構,適用于模塊化程序設計,將功能模塊化,由不同的模塊完成不同的功能,這樣可使整個應用系統(tǒng)程序結構清晰,易于調試和維護,還可增強可讀性和移植性。在絕大多數(shù)場合采用C語言編程即可完成預期的目的,但是對實時時鐘系統(tǒng)、要求執(zhí)行效率高的的系統(tǒng)就不適合采用C語言編程,對這些特殊情況進行編程時要結合匯編語言。匯編語言具有直接和硬件打道、執(zhí)行代碼的效率高等特點,可以做到C語言所不能做到的一些事情。這種混合編程的方法將C語言和匯編語言的優(yōu)點結合起來,已經成為目前單片機開發(fā)最流行的編程方法。5.2軟件整體設計及各模塊設計繪制流程圖所謂流程圖,就是用各種符號、圖形、箭頭把程序的流向及過程用圖形表示出來。繪制流程圖是單片機程序編寫前最重要的工作,通常我們的程序就是根據(jù)流程圖的指向采用適當?shù)闹噶顏砭帉懙摹1疚牡能浖绦蚰K包括對鍵盤掃描單元程序、LCD顯示程序、溫度檢測程序、A/D電壓電流轉換的編寫來實現(xiàn)充電器的智能充電。5.2.1主程序模塊該軟件的目的是控制電池充電及維護終點及狀態(tài)顯示。當電池放入該智能充電器時,我們可以人為選擇充電狀態(tài)與維護狀態(tài),然后讀入溫度傳感器環(huán)境溫度,決定電池充電或維護狀態(tài)的最終電壓。再由程序控制充電及維護I/O口電平的上下,選擇是對電池充電還是維護。在由ADC0832采樣的電壓判斷電池維護或充電的終止時刻,并由內部程序計算出電池充電電流、充電電壓、電池內阻等參數(shù)輸出給LCD1602,由其顯示電池狀態(tài)。用戶修改參數(shù)用戶修改參數(shù)裝在默認參數(shù)開始?采樣電池電壓反接?判斷充電階段恒壓階段浮充階段恒流階段報警初始化修改默認參數(shù)YNYYNN圖5.1主程序流程圖輸出恒定電流輸出恒定電流ALART=1?設定時間到?采集電池電壓>轉換電壓恒壓階段停止報警YYNNNY圖5.2恒流充電階段流程圖輸出恒定電壓輸出恒定電壓ALART=1?采集充電電流<轉換電流浮充電流設定時間到報警停止YYNNN圖5.3恒壓充電階段流程圖Y5.2.2溫度檢測模塊開始開始系統(tǒng)初始DS18B20溫度檢測輸入溫度范圍?鍵值處理設定溫度與當前溫度比擬超過溫度范圍?進行溫度控制NNYY圖5.4溫度檢測流程圖低溫度系數(shù)晶振的振蕩頻率受溫度的影響很小〔1〕,用于產生固定頻率的脈沖信號送給減法計數(shù)器1,高溫度系數(shù)晶振隨溫度變化其震蕩頻率明顯改變,所產生的信號作為減法計數(shù)器2的脈沖輸入,圖中還隱含著計數(shù)門,當計數(shù)門翻開時,DS18B20就對低溫度系數(shù)振蕩器產生的時鐘脈沖后進行計數(shù),進而完成溫度測量。計數(shù)門的開啟時間由高溫度系數(shù)振蕩器來決定,每次測量前,首先將-55℃所對應的基數(shù)分別置入減法計數(shù)器1和溫度存放器中,減法計數(shù)器1和溫度存放器被預置在-55℃所對應的一個基數(shù)值。減法計數(shù)器1對低溫度系數(shù)晶振產生的脈沖信號進行減法計數(shù),當減法計數(shù)器1的預置值減到0時溫度存放器的值將加1,減法計數(shù)器1的預置將重新被裝入,減法計數(shù)器1重新開始對低溫度系數(shù)晶振產生的脈沖信號進行計數(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;//讀一個溫度時的溫度轉換中間間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復位成功,為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內讀完一個數(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ā)讀開始轉換命令Init_DS18B20();WriteOneChar(0xcc);//發(fā)跳過ROM命令WriteOneChar(0xbe);//讀存放器,共九字節(jié),前兩字節(jié)為轉換值a=ReadOneChar();//a存低字節(jié)b=ReadOneChar();//b存高字節(jié)t=b;t<<=8;//高字節(jié)轉換為10進制t=t|a;tep=t*0.0625;//轉換精度為0.0625/LSBt=tep*10+0.5;//保存1位小數(shù)并四舍五入****后面除10復原正確溫度值〕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ā)的方式,當數(shù)據(jù)到來的時候將數(shù)據(jù)讀入,根據(jù)不同的電壓值選擇不同方案,并且用定時器每500ms查詢1次,改變原來的方案。程序清單如下:功能:通過定時器定時從A/D上讀取數(shù)據(jù),根據(jù)不同的電壓選擇不同的控制充電方案,使用PWM控制輸出脈寬來控制電流。ORG0000HLJMPSTARTORG0003HLJMPEXTERN_INT;外中斷入口ORG000BHLJMPTIMER0_INT;定時器中斷入口;程序開始,初始化各個存放器以及標志位START:MOVSP,#050H;設置堆棧MOVR0,#030H;設置A/D存儲單元初始地址MOVIE,#0FFH;翻開所有中斷MOVDPTR,#78FFH;采集通道首地址,只使用一路A/D就可以MOVR0,#40HMOV@R0,#00H;去除方案選擇位MOVR0,#40HMOV@R0,#00H;去除方案選擇觸發(fā)位MOVR1,#42HMOV@R0,#00H;去除定時器計數(shù)器LCALLTIMER1_INIT;進入循環(huán),查詢標志位,采取不同的方案LOOP:MOVR0,#30H;30H是A/D轉換的地址,將數(shù)據(jù)和幾個值進行比擬;確定方案MOVA,@R0SUBBA,#30H;當電壓很小的時候,采用第1種方案,向引腳PWM;發(fā)送占空比為10%的信號JCPROCESS_01MOVA,@R0SUBBA,@90HJCPROCESS_02;當電壓較小的時候,采用第2種方案,向引腳PWM;發(fā)送占空比為20%的信號MOVA,@R0SUBBA,@90HJZPROCESS_03;當電壓正好的時候,采用第3種方案,向引腳PWM;發(fā)送占空比為50%的信號MOVA,#04H;當電壓超出的時候,采用第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連接的管腳置高MOVR1,#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;當方案改變標志位到來的時候,去除標志位并;且重新進行判斷CJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_01_NEXTPROCESS_02:MOVR1,#040HMOV@R1,#02H;選擇方案2PROCESS_02_NEXT:SETBP2.0;將和PWM連接的管腳置高MOVR1,#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;當方案改變標志位到來的時候,去除標志;位并且重新進行判斷CJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_02_NEXRPROCESS_03:MOVR1,040HMOV@R1,#03H;選擇方案3PROCESS_03_NEXT:SETBP2.0;將和PWM連接的管腳置高MOVR1,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;當方案改變標志位到來的時候,去除標志;位并且重新進行判斷CJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_03_NEXRPROCESS_04:CLRP2.0MOVR1,#040HMOV@R1,#04H;選擇方案4MOVR1,041HCJNE@R1,#00H,CLEAR_FLAGSJMPPROCESS_04TIMER1_INIT;ANLTMOD,0FH;設置定時器T1為方式2ORLTMOD,#10HMOVTOMD,#21H;定時器T0工作在方式1MOVPCON,#080HCLRTRT1;禁止定時器T1SETBEASETBET1SETBET0SETBPT0;定時器T0中斷優(yōu)于串口中斷CLRTF1MOVTL0,#00HMOVTH0,#01FH;定時器T0中斷發(fā)生時間為62.5msSETBTR0;使能定時器T0CLRTF0RET;進入定時器中斷,每500ms設置1次標志位TIMER0_INT:PUSHACC;累加器入棧PUSHPSW;程序狀態(tài)字入棧MOVPSW,#18H;切換存放器區(qū)域CLRTF0;去除定時器中斷TF0CLRTF0;禁止定時器中斷T0MOVTL0,#00HMOVTH0,#01FH;定時器T0中斷發(fā)生時間為6CLRTF0;去除溢出中斷位MOVR1,#42HINC@R1;增加計數(shù)器的值,到8為止,這樣到達500msCJNE@R1,#08H,TIMER0_READYMOV@R1,#00H;去除計時器的值MOVR1,#041H;設置標志位,每500ms重新選擇方案MOV@R1,#01HTIMER0_READY:SETBTR0;使能定時器T0POPPSW;程序狀態(tài)字出棧POPACC;累加器出棧RETI;進入外部中斷,每進入一次讀取ADC的值EXTERN_INT:PUSHACC;累加器壓棧PUSHPSW;程序狀態(tài)字壓棧MOVPSW,010H;切換存放器區(qū)域MOVDPTR,#78FFH;A/D轉換器首地址MOVXA,@DPTR;讀入A/D的值MOVR1,030H;存儲A/D轉換器的數(shù)據(jù)的地址MOV@R1,A;將A/D的值讀入該地址POPPSW;程序狀態(tài)字出棧POPACC;累加器出棧RETIEND5.2.4鍵盤掃描模塊圖5.5是89C51單片機應用系統(tǒng)的鍵輸入軟件框圖。對于任何一個單片機應用系統(tǒng),鍵盤總要有其相應的接口電路與CPU相連,通過軟件了解鍵盤的輸入信息。而CPU可以才用中斷方式或查詢方式來了解有無鍵輸入,并檢查是哪個鍵按下,將鍵號送入累加器ACC,然后通過散轉指令去執(zhí)行相應的程序,以完成該鍵完成的功能,最后又返回到原始狀態(tài)。01#按鍵應用程序01#按鍵應用程序00#按鍵應用程序鍵掃描有無鍵按下查鍵號JMP@A+DPTRNN#按鍵應用程序NYA=00HA=01HA=NNH圖5.589C51單片機應用系統(tǒng)鍵盤輸入軟件框圖對鍵盤掃描電路的掃描方式有行掃描法和線反轉法。確定矩陣式鍵盤上任何一個鍵被按下通常采用“行掃描法〞或者“行反轉法〞。行掃描法又稱為逐行〔或列〕掃描查詢法,它是一種最常用的多按鍵識別方法。在此次程序編寫中,本文采用行掃描法進行對鍵盤掃描程序的編寫。如上圖,單片機的P1口用作鍵盤I/O口,鍵盤的列線接到P1口的低4位,鍵盤的行線接到P1口的高4位。列線P1.0-P1.3分別接有4個上拉電阻到正電源+5V,并把列線P1.0-P1.3設置為輸入線,行線P1.4-P1.7設置為輸出線。4根行線和4根列線形成16個相交點。檢測當前是否有鍵被按下。檢測的方法是P1.4-P1.7輸出全“0〞,讀取P1.0-P1.3的狀態(tài),假設P1.0-P1.3為全“1〞,那么無鍵閉合,否那么有鍵閉合。去除鍵抖動。當檢測到有鍵按下后,延時一段時間再做下一步的檢測判斷。在每組行輸出時讀取,假設全為“1〞,那么表示為“0〞這一行沒有鍵閉合,否那么有鍵閉合。由此得到閉合鍵的行值和列值,然后可采用計算法或查表法將閉合鍵的行值和列值轉換成所定義的鍵值。為了保證鍵每閉合一次CPU僅作一次處理,必須卻除鍵釋放時的抖動。其流程圖如圖5.7。圖5.6矩陣式鍵盤的連接圖開始開始鍵盤初始化讀列是否有鍵按下延時去抖動讀列是否有鍵按下根據(jù)當前狀態(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;鍵盤掃描一次有輸入標志位置位MOVKEYBUFF,A;鍵盤碼放入鍵盤存儲器KEYBUFFRET鍵盤掃描碼KEYSCAN_TAB:DB01H,02H,03H,0CHDB04H,05H,06H,0DHDB07H,08H,09H,0DHDB0AH,00H,0BH,0FH5.2.5LCD顯示模塊如果說鍵盤構成的是單片機的輸入系統(tǒng),那么液晶屏就是單片機的輸出系統(tǒng)。在單片機系統(tǒng)中,通常用LCD液晶顯示器來顯示各種數(shù)字或符號,由于它具〔1〕位數(shù)多,可顯示32位,32個數(shù)碼管體積相當龐大了?!?〕顯示內容豐富,可顯示所有數(shù)字、字母、符號等192種ASCII碼對應的字符。〔3〕程序簡單,如果用數(shù)碼管動態(tài)顯示,會占用很多時間來刷新顯示,而1602自動完成此功能。因此使用非常廣泛。LCD1602液晶顯示模塊可以顯示兩行,每行16個字符,采用單+5V電源供電,外圍電路配置簡單,價格廉價,具有很高的性價比。.11602LCD功能介紹〔1〕1602采用標準的16腳接口,其中:第1腳:VSS為電源地第2腳:VDD接5V電源正極第3腳:V0為液晶顯示器比照度調整端,接正電源時比照度最弱,接地電源時比照度最高〔比照度過高時會產生“鬼影〞,使用時可以通過一個10K的電位器調整比照度〕。第4腳:RS為存放器選擇,高電平1時選擇數(shù)據(jù)存放器、低電平0時選擇指令存放器。第5腳:RW為讀寫信號線,高電平(1)時進行讀操作,低電平(0)時進行寫操作。第6腳:E(或EN)端為使能(enable)端。第7~14腳:D0~D7為8位雙向數(shù)據(jù)端。第15~16腳:空腳或背燈電源。15腳背光正極,16腳背光負極。〔2〕、1602LCD的操作指令說明1602液晶模塊的讀寫操作、屏幕和光標的操作都是通過指令編程來實現(xiàn)的。指令1:清顯示,指令碼,光標復位到地址位置。指令3:光標和顯示模式設置。其中:I/D:光標移動方向,高電平右移,低電平左移;S:屏幕上所有文字是否左移或者右移,高電平。指令4:顯示開關控制。其中:D:控制整體顯示的開與關,高電平表示開顯示,低電平表示關顯示;C:控制光標的開與關,高電平表示有光標,低電平表示無光標;B:控制光標是否閃爍,高電平閃爍,低電平不閃爍。指令5:光標或顯示移位。其中:S/C:高電平時移動顯示的文字,低電平時移動光標。指令6:功能設置命令。其中:DL:高電平時為4位總線,低電平時為8位總線;N:低電平時為單行顯示,高電平時雙行顯示;F:低電平時顯示5×7的點陣符,高電平時顯示5×10的點陣字符。指令7:字符發(fā)生器RAM地址設置。指令8:DDRAM地址設置。指令9:讀忙信號和光標地址。其中:BF:讀忙標志位,高電平表示忙、,此時模塊不能接收命令或者數(shù)據(jù)低電平表示不忙。指令2:光標復位,光標返回到地址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鍵值入棧保護鍵值轉化為ASII碼,存入存放器判釋放鍵值LCD1602寫命令顯示延時結束圖5.8LCD顯示流程圖if(s<10){write_disp(0,0,disp[0]);//將數(shù)值轉換為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電壓電流轉換模塊A/D的工作原理:初始化時將逐次逼近存放器各位清零;轉換開始時,先將逐次逼近存放器最高位置1,送入D/A轉換器,經D/A轉換后生成的模擬量送入比擬器,稱為Vo,與送入比擬器的待轉換的模擬量Vi進行比擬,假設Vo<Vi,該位1被保存,否那么被去除。然后再置逐次逼近存放器次高位為1,將存放器中新的數(shù)字量送D/A轉開始開始STARTEOCOE=1讀數(shù)OE=0結束圖5.9A/D轉換流程圖換器,輸出的Vo再與Vi比擬,假設Vo<Vi,該位1被保存,否那么被去除。重復此過程,直至逼近存放器最低位。轉換結束后,將逐次逼近存放器中的數(shù)字量送入緩沖存放器,得到數(shù)字量的輸出。逐次逼近的操作過程是在一個控制電路的控制下進行的。EOC表示轉換結束信號,要是轉換結束,EOC等于一,沒有結束就是零。OE是輸出使能端,高電平輸出。然后A/D開始讀取轉換的電壓電流值,輸出讀取的電壓電流值。#include<reg52.h>//A/D轉換#include<intrins.h#defineByteunsignedchar#defineWordunsignedintsbitDisClk=P2^7;sbitDisDat=P2^6;sbitA1=P0^0;sbitB1=P0^1;sbitC1=P0^2;sbitD1=P0^3;/*-----------------------------------------------------------功能:ADC0809接口程序目標芯片:AT89S52單片機占用資源:采集到的數(shù)字量接P1口、MCUADC0809變量名稱P3.7START/ALEADC_STP3.5EOCADC_EOCP3.6OEADC_OEALECLK〔經二分頻〕無用戶接口函數(shù):ByteADC0809(void)-----------------------------------------------------------*/#defineAdcDataP1 //ADC輸出的數(shù)字量接單片機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,鎖存轉換通道地址,開始轉換for(i=10;i>0;i--) ; //微秒級延時,保持高電平一段時間ADC_ST=0;while(!ADC_EOC) ; //等待ADC0809轉換結束ADC_OE=1; //使能ADC0809輸出i=AdcData; //MCU采集ADC0809的數(shù)字量ADC_OE=0; //關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)調試與改良6.1硬軟件結合進行調試軟件的調試是整個設計之中的一個重要環(huán)節(jié),它既可以對硬件連接的正確與否性進行檢測,也可以驗證軟件的匹配性,所以調式的成功與否至關重要。但是由于條件有限,我和隊友不可能進行真實的仿真實驗。假設開始我和本組隊友在進行調式時受挫,實驗用的放電放空的鎳鎘蓄電池在一段時間的充電之后始終沒有蓄積電量。于是我們就要展開分析,軟件這局部應該是沒有什么問題的,因為程序是先前的專業(yè)科技人員經過無數(shù)次實驗驗證的,所以目光要轉向硬件方面,首先啟動電路的電源,通盤檢測一下電路是否全部連接通,如果沒問題,接下來就檢查ADC變換是否進行,這只需要用其它的軟件單獨測試AD0329轉換器是否完好,倘假設這沒問題就等ADC轉換結束之后,讀入了轉換數(shù)據(jù),在單片機仿真的幾組內部信息顯示欄中查看CPU對程序的執(zhí)行情況,是否有采用定時查詢電壓的機制,定時器每500ms給出標志位,查詢A/D上的電壓值,然后根據(jù)不同的電壓選擇不同的方案結論本次設計一開始,曾經一度對課題有許多不清楚和不了解的地方,經過近一周時間的課題分析,并與同組同學進行討論,又在指導老師的講解下對課題有了初步了解,但是深入課題之后,發(fā)現(xiàn)由于間隔時間過長,許多過去課堂上學過的知識點都遺忘了,在進行設計中的相關實驗局部的操作時以及實驗儀器的使用方法和考前須知都不很熟練,甚至有些遺忘,通過查閱相關資料,將一些根底知識進行了回憶,但在實驗過程中仍出現(xiàn)了一些書本中沒有講到的問題?;赨CC3895智能充電器的設計,我分別設計了PWM控制模塊,溫度檢測模塊,A/D電壓電流轉化模塊,LCD顯示模塊,鍵盤輸入模塊。讀充電器實現(xiàn)智能化控制,自動斷電、充電完成報警提示等。同時,充電的時間盡量縮短,實現(xiàn)短時充電。致謝本研究及論文是在我的指導老師的親切關心和悉心指導下完成的。他嚴肅的科學態(tài)度,嚴謹?shù)闹螌W精神,精益求精的工作作風,深深地感染和鼓勵著我。從
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 女性員工勞動保護條例保障權益
- 《Python程序設計》課件-項目五 制作通訊錄 使用函數(shù)的參數(shù)傳遞打印學生通訊錄信息
- 基于人工智能的藥物篩選與設計
- 醫(yī)院護理練習題含答案
- 2024-2025學年高中歷史第5單元晚清時期的內憂外患與救亡圖存第16課兩次鴉片戰(zhàn)爭經典題集錦含解析新人教版必修中外歷史綱要上
- 2024年度小型挖掘機租賃合同樣本3篇
- 北京主要景點講解知到智慧樹章節(jié)測試課后答案2024年秋北京財貿職業(yè)學院
- 裝配式構件物流運輸發(fā)展現(xiàn)狀- 王姣14課件講解
- 數(shù)字經濟時代的商業(yè)模式創(chuàng)新研究
- 四川電子機械職業(yè)技術學院《影視導演基礎》2023-2024學年第一學期期末試卷
- 市場營銷學每章習題集
- KPI 統(tǒng)計和趨勢圖分析
- 譚浩強經典教材《C語言程序設計》課件_電子版
- 最新建筑材料標準以及分類
- 產品質量控制流程圖
- 民間療法—敷臍
- 教科研基地匯報材料
- 質量等級說明
- 消防工程防排煙及通風施工工藝方法
- 悠悠球的理論力學分析
- 國民經濟行業(yè)與分類代碼
評論
0/150
提交評論