PIC18f452_LM35溫度報警_MCP4725正弦波發(fā)生器_第1頁
PIC18f452_LM35溫度報警_MCP4725正弦波發(fā)生器_第2頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、2016年9月12日組長組員蠱囂A薫宙二Is川玄fews:川SASAOZZH後畀竦41宙1咲皿.w宙星d宙囂&曰設計任務與要求1、PIC18F452的單片機最小系統:調試器下載、晶體振蕩器、復位電路、LCD1602顯示、4*4鍵盤;2、220V轉5V的三種方案對比,列舉在一張表中;3、以LM336、LM35組成傳感器電路,測量外部溫度,鍵盤可以設定高溫報警、低溫報警(擴展要求:設定值可以存儲到外部24C02中);設定值與實際測量值,均可以在LCD中顯示;4、以MCP4725設計一個正弦波發(fā)生器,頻率10-50HZ可調節(jié),步進1HZ;(實際測試指標盡量接近要求,允許有誤差)二.220V轉

2、5V的三種方案對比開關電源穩(wěn)壓電源阻容電源原理開關電源是利用現代電力電子技術,控制開關管開通和關斷的時間比率,維持穩(wěn)定輸出電壓的一種電源,(1) 電源變壓器:降壓(2) 整流電路:交流變直流(3)濾波電路:得到平滑的直流電壓(4)穩(wěn)壓電路:使輸出的直流電壓穩(wěn)定工作原理是利用電容在一定的交流信號頻率下產生的容抗來限制最大工作電流分類線性穩(wěn)壓器、開關穩(wěn)壓器、充電泵按整流電路分:半波整流、橋式整流按整流電路分:半波整流、全波整流組成開關電源一般由脈沖寬度調制(PWM)控制IC和MOSFET構成電源變壓器整流電路濾波電路穩(wěn)壓電路降壓電容器、半波整流二極管、穩(wěn)壓二極管、電阻優(yōu)點咼效率,寬電壓輸入范圍低功

3、率耗散,提供隔離(利用變壓器)低噪聲,低紋波,良好的負載調整率,高穩(wěn)定度,高準確度。低成本取得非隔離的小電流電源。它的輸出電壓通??稍趲追饺龓资秉c瞬態(tài)響應慢,加大設計難度,較咼的輸出紋波和噪聲效率低電容降壓式電源是一種非隔離電源,在應用上要特別注意隔離,防止觸電。三、溫度檢測1、設計方案用LM35溫度傳感器檢測溫度,輸入單片機,經過AD轉換,顯示到LCD顯示屏。通過4*4矩陣鍵盤設定最高溫度、最低溫度,將檢測到的溫度值與設定溫度比較,超過范圍則蜂鳴器響起報警。2、模塊設計1)4*4矩陣鍵盤的設計鍵盤需用到klklO作為09數字輸入,kl5作為復位,kl6作為開始。鍵開關狀態(tài)的可靠輸入:如

4、果檢測到有按鍵按下時,延時5到10ms進行消除按鍵抖動,再確認該鍵電平是否仍保持閉合狀態(tài)電平,如保持閉合狀態(tài)電平則確認為真正鍵按下狀態(tài),從而消除了抖動影響。在這種行列式矩陣鍵盤非編碼鍵盤的單片機系統中,鍵盤處理程序首先執(zhí)行等待按鍵并確認有無按鍵按下的程序段。當確認有按鍵按下后,下一步就要識別哪一個按鍵按下。我們使用的是逐行掃描查詢法。按鍵部分由兩種按鍵組成,一種是等待按鍵(除非有按鍵按下,否則等待按鍵);另一種是無需等待按鍵;前者用于輸入溫度和時間,后者用于判斷完后的重新循環(huán)按鍵。2)、LCD1602液晶顯示的設計溫度顯示工作原理:LCD1602可以采用兩種方式與單片機連接,一種是采用8位數據

5、總線DOD7,和RS、R/W、EN三個控制端口;另一種是只用D4-D7作為四位數據分兩次傳送。本實驗將使用并采用八位數據方式來控制1602顯示。進行LCD設計主要是LCD的控制/驅動和外界的接口設計??刂浦饕峭ㄟ^接口與外界通信、管理內/外顯示RAM,控制驅動器,分配顯示數據;驅動主要是根據控制器要求,驅動LCD進行顯示??刂破鬟€常含有內部ASCII字符庫,或可外擴的大容量漢字庫。內部引線已經連接好,不用外接杜邦線。3)LM35溫度傳感器的設計PIC18F452內置的是10位A/D轉換器,但是一次只能讀入8位,故要用到兩個存儲空間,根據采用A/D轉換后結果的對齊方式不同而有不同的讀取方法,一般

6、是采用右對齊的。在程序運行時,LM35溫度傳感器從零攝氏度輸出零伏起每升高一攝氏度輸出增加10mV。由LM35溫度傳感器輸入的電壓經過A/D轉換成10位的數字量轉換成實際的電壓值,并將實際的電壓值的各個位分開裝入顯示緩沖區(qū)。轉換后的數字量為0-1023,而我們所需要的溫度為0-100,這里有一個換算的過程,將AD轉換而來的結果整除10,這樣得到的結果剛好在0-100內。然后將轉換的結果顯示在LCD上。測量電壓與編碼值的關系式:XxVref10234)24C02的應用CN11利用I2C進行對EEPROM進行寫操作和讀操作,將每次我們設定好的最高溫度、最低溫度,檢測周期寫入EEPROM,然后在每次

7、上電復位時,將上一次存入的值顯示為初始值,這樣可以對上一次的操作保留記憶。寫操作必須要寫入器件地址、存儲區(qū)地址、存儲的內容。5)、蜂鳴器報警如果當前溫度超過最高設定或者低于最低設定,LED燈會閃爍進行報警。程序設計中用的是RB0接蜂鳴器,當達到條件時,蜂鳴器開始鳴叫。3、代碼設計#include<p18f452.h>#include<delays.h>#include<adc.h>/*RB0接CN11-2蜂鳴器RB1接CN11-3SCLRB2接CN11-4SDARC0RC7接CN18-07鍵盤RB3RB5LCDRA0AD*/宏定義PORTBbits.RB0#

8、defineRB0#defineRSPINPORTBbits.RB5/DataorInstrumentSelect#defineRWPINPORTBbits.RB4/WriteorRead#defineEPINPORTBbitS.RB3/6800modeEnablesingle#defineSCLPORTBbitS.RB1/SDA#defineSDAPORTBbitS.RB2/SCL#defineRC0PORTCbitS.RC0#defineRC1PORTCbits.RC1#defineRC2PORTCbits.RC2/全局變量unsignedcharL=0,H=0,T=0,N=0/定義高H低

9、L溫度T及實時溫度的編寫符號unsignedinta/a為AD讀出值unsignedintt=10unsignedintTimeoutintflagintresultintxh/函數聲明voidInterruptHandlerHigh(void)/按鍵的識別碼和編入碼romunsignedcharASC=0x30,0x31,0x32,0x33romunsignedcharKEYCODE=0XEE,0XDE,0XBE,0X7E,0XED,0XDD,0XBD,0X7D,0XEB,0XDB,0XBB,0X7B,0x34,0x35,0x36,0x37,0x38,0x39/0/1/2/3/4/5/6/7

10、/8/90XE7,0XD7,0XB7,0X77,/14重置按鍵/15輸入完成后開始信號Delay()unsignedcharpfor(p=0p<100p+)Delayus()unsignedcharqfor(q=0q<10q+)/IIC部分voidllCstart(void)SD=1/先將SDA=1,以準備在SCL=1時,將SDA=0SC=1/時鐘總線拉高Dela()/調用延時函數,略作延時SD=0/SCL=1時,將SDA拉低即產生啟動信號Dela()/調用延時函數,略作延時SC=0/將SCL=0,完成啟動信號操作Dela()/調用延時函數,略作延時/名稱:IIC停止信號函數/vo

11、idIICstop(void)SD=0/先將SDA=0,以準備在SCL=1時,將SDA=1SC=1/時鐘總線拉高Dela()/調用延時函數,略作延時SD=1/SCL=1時,將SDA拉高即產生停止信號Dela()/調用延時函數,略作延時SC=0/將SCL=0,完成啟動信號操作Dela()/調用延時函數,略作延時/名稱:向IIC總線寫入1個字節(jié)函數/voidWrite1Byte(unsignedcharBuf1)unsignedchark/1個字節(jié)要分8次寫入,需要定義一個寄存器用來計數for(k=0k<8k+)/做一個8次的循環(huán),每次寫入1位,需要寫8次if(Buf1&0x80)/

12、從最高位開始寫S=1/如果欲寫入數據為1,就將數據線置1elseS=0/如果欲寫入數據為0,就將數據線寫0Delayus()S(=/時鐘線做一個上升沿,將一位數據寫入Bu=Buf1<<1/數據左移一位,將下次要寫入的位數據移到最高位Delayus()/將SCL=0,以準備通過上升沿將數據寫入Delayus()TRISBbit.TRISB2=1/將RC4(SDA)設置為輸入狀態(tài)/Delayus();/從時序圖中讀出來感覺這一步愛是真正ACK給低電平的時候,好像這個延遲又不用給了SC=1/將SCL=1,做個上升沿準備讀應答信號Delayus()SC=0/將SCL=0,結束應答信號讀操作

13、TRISBbit.TRISB2=0/將RC4(SDA)恢復為輸出狀態(tài)/名稱:從IIC總線讀入1個字節(jié)函數/unsignedcharRead1Byte(void)unsignedchark/1個字節(jié)要分8次讀出,需要定義一個寄存器用來計數unsignedcharg=0/定義一個寄存器用保存讀出數據TRISBbit.TRISB2=1/將RC4(SDA)設置為輸入狀態(tài)for(k=0k<8k+)/做一個8次的循環(huán),每次讀入1位,需要讀8次=g<<1/數據左移一位,空出最低位以準備保存讀入的一位數據S=1/將SCL=1,做個上升沿準備讀一位數據Delayus()Delayus()if(

14、SDA=1)/讀一位數據,并判斷=g|0x01/如果讀入數據為1,就將接收緩沖區(qū)最低一位置1else=g&0xfe/如果讀入數據為0,就將接收緩沖區(qū)最低一位寫0S=0/SCL恢復為0,結束一位數據讀操作Delayus()Delayus()TRISBbit.TRISB2=0/將RC4(SDA)恢復為輸出狀態(tài)returng/將讀入的一個字節(jié)返回/名稱:軟件模擬IIC向AT24C02指定地址寫一個字節(jié)函數/voidWriteAT24C02(unsignedcharAddress,unsignedcharDatabuf)/直接調用本函數即可對AT24C02的Address地址寫DatabufI

15、ICstart()/IIC啟動信號Write1Byt(0xA0)/發(fā)送AT24C02的器件地址和寫信號Write1Byt(Address)/發(fā)送地址Write1Byt(Databuf)/發(fā)送數據IICstop()/產生IIC停止信號/*在讀數據的時候并沒有主機向從機的應答,這是怎么回事*/名稱:軟件模擬IIC從AT24C02指定地址讀一個字節(jié)函數/unsignedcharReadAT24C02(unsignedcharAddress)/直接調用本函數即可從AT24C02的Address地址讀出數據返回unsignedcharbuf/定義一個寄存器用來暫存讀出的數據IICstart()/IIC啟

16、動信號Write1Byt(0xA0)/發(fā)送AT24C02的器件地址和寫信號Write1Byt(Address)/發(fā)送地址IICstart()/IIC啟動信號Write1Byt(0xA1)/發(fā)送AT24C02的器件地址和讀信號buf=ReadlByte()/讀一個字節(jié)數據IICstopQ/產生IIC停止信號return(buf)/將讀出數據返回/名稱:1602忙檢測函數/voidlcd_wait_busy(void)TRISDbits.TRISD7=1/為讀狀態(tài)做準備RSPIN=0/選擇指令寄存器RWPIN=1/選擇讀EPIN=1/使能線電平變化while(PORTDbits.RD7=1)/讀忙

17、狀態(tài),不忙時退出EPIN=0/恢復使能線電平TRISDbits.TRISD7=0/名稱:1602寫命令函數/voidlcd_write_com(unsignedcharcombuf)RSPIN=0/選擇指令寄存器RWPIN=0/選擇寫PORTD=combuf/把命令字送入RDEPIN=1/使能線電平變化,命令送入1602的8位數據口Delay1TCY()EPIN=0/恢復使能線電平/名稱:1602寫命令函數(帶忙檢測)/voidlcd_write_com_busy(unsignedcharcombuf)lcd_wait_busy()/調用忙檢測函數lcd_write_com(combuf)/調

18、用寫命令函數/名稱:1602寫數據函數(帶忙檢測)/voidlcd_write_data(unsignedchardatabuf)lcd_wait_busy()/調用忙檢測函數RSPIN=1/選擇數據寄存器RWPIN=O/選擇寫PORTD=databuf/把數據字送入P2EPIN=1/使能線電平變化,命令送入1602的8位數據口DelaylTCY()EPIN=0/恢復使能線電平/名稱:1602顯示地址寫函數/voidlcd_write_address(unsignedcharx,unsignedchary)x&=0x0f/列地址限制在0-15y&=0x01/行地址限制在0-1i

19、f(y=0x00)lcd_write_com_busy(x|0x80)/第一行的歹U地址寫入elselcd_write_com_busy(x+0x4()|0x8()/第二行的歹U地址寫入/名稱:1602初始化函數/voidlcdreset(void)Delay100TCYx(15)lcd_write_com()x38)Delay100TCYx(5)lcd_write_com(0x38)Delay100TCYx(5)lcd_write_com(0x38)lcd_write_com_busy(0x38)/8位數據,雙歹U,5*7字形lcd_write_com_busy()x08)lcd_write

20、_com_busy()x01)lcd_write_com_busy(0x06)lcd_write_com_busy(0x0c)/顯示功能關,無光標/清屏指令/寫入新的數據后,光標右移,顯示屏不移動/顯示功能開,無光標,/名稱:指定地址寫入函數/voidlcd_write_char(unsignedcharx,unsignedchary,unsignedcharbuf)lcd_write_address(x,ylcd_write_data(buf)/寫入顯示數據/名稱:讀取按鍵對應數值函數/intanjian(void)/通過讀取橫排和豎排的識別按鍵unsignedchariunsignedch

21、arKeyTempwhile(1)TRISC=0xf0LATC=0xf0if(0xf0!=(PORTC&0xf0)Delay1KTCYx(10)if(0xf0!=(PORTC&0XF0)KeyTemp=PORTC&0xF0TRISC=0x0FLATC=0x0fKeyTemp|=(PORTC&0X0F)for(i=0i<sizeof(KEYCODE)i+)if(KeyTemp=KEYCODEi)KeyTemp=ii=sizeof(KEYCODE)+1if<eyTemp=0)return0/0if(KeyTemp=1)/1return1if(KeyTem

22、p=2)/2return2if(KeyTemp=3)/3return3while(OXOF!=(PORTC&0X0F)if(KeyTemp=4)/4return4if(KeyTemp=5)/5return5if(KeyTemp=6)/6return6if(KeyTemp=7)/7return7if(KeyTemp=8)/8return8if(KeyTemp=9)/9return9if(KeyTemp=15)/開始判斷return15elseNop()/不需要等待的接收按鍵,按鍵編號接收14intunwaitkey()unsignedchariunsignedcharKeyTempTRI

23、SC=0xf0LATC=0xf0if(0xf0!=(PORTC&0xf0)Delay1KTCYx(10)if(0xf0!=(PORTC&0XF0)KeyTemp=PORTC&0xF0TRISC=0x0FLATC=0x0fKeyTemp|=(PORTC&0X0F)for(i=0i<sizeof(KEYCODE)i+)if(KeyTemp=KEYCODEi)KeyTemp=ii=sizeof(KEYCODE)+1if(KeyTemp=14)return1elsereturn0voiddelay(intt)inta,bfor(a=0a<ta+)for(b=

24、0b<100b+)voiddelayms()unsignedchari,jfor(i=0i<5i+)for(j=0j<10j+)/為AD做準備unsignedintADC(void)inta1,a2,a3,a4OpenADC(ADC_FOSC_32&ADC_RIGHT_JUST&ADC_8ANA_0REF,ADC_CH0&ADC_INT_OFF)/A/D時鐘源,晶振32分頻率/A/D轉換結果右對齊/A/D參考電壓源,電源工作電壓/通道選擇/中斷關閉,查詢模式Delay10TCYx(5)/Delayfor50TCYConvertADC()/Startco

25、nversionwhile(BusyADC()/Waitforcompletionresult=ReadADC()ReadresultCloseADC()/DisableA/Dconvertera=result*440/1023if(a/100)=1)lcd_write_char(12,'1')lcd_write_char(13,1,'O')lcd_write_char(14,1,'O')elselcd_write_char(12,1,a/1C+)x30)lcd_write_char(13,1,a%1C+0x30)lcd_write_char(1

26、4,1,'')/顯示AD轉換值returnavoidmain()flag=0while(1)inti=0,jTRISB=0B11000000TRISD=0B00000000lcdreset()/RB3-5設置為輸出/RD設置為輸出/復位1602unsignedintk1/低溫十位按鍵unsignedintk2/低溫各個位按鍵unsignedintk3/高溫十位按鍵unsignedintk4/高溫個位按鍵unsignedintk5/時間十位按鍵unsignedintk6/時間個位按鍵unsignedint11/低溫十位數據unsignedint12/低溫個位數據unsignedi

27、nth1/高溫十位數據unsignedinth2/高溫個位數據unsignedintt1/時間十位unsignedintt2/時間個位unsignedintks/識別按鍵/初始化led屏幕lcd_write_ehar(8,0,'M')led_write_ehar(9,0,'I')led_write_ehar(10,0,'N')led_write_ehar(11,0,':')/低溫十位/低溫個位/低溫數/高溫十位/高溫個位/高溫數lcd_write_char(0,0,'M')lcd_write_char(1,0,&#

28、39;A')lcd_write_char(2,0,'X')lcd_write_char(3,0,':')lcd_write_char(8,1,'T')lcd_write_char(9,1,'E')lcd_write_char(10,1,'M')lcd_write_char(11,1,':')flag=0RB0=0while(1)/鍵入和將數值顯示在led上k1=anjian()l1=ASCk1led_write_address(12,0)led_write_data(11)k2=anjian

29、()l2=ASCk2lcd_write_address(13,0)lcd_write_datal2L=k1*10+k2k3=anjian()h1=ASCk3lcd_write_address(,)lcd_write_datah1k4=anjian()h2=ASCk4lcd_write_address(,)lcd_write_datah2H=k3*10+k4if(H<L)RB0=1INTCONbits.GIEH=0flag=1breakks=anjian()/接收開始信號if(ks=15)i=0Timeout=0interruptINTCON=0x20/disableglobalanden

30、ableTMR0INTCON2=0x84/TMR0highpriorityRCONbits.IPEN=1/enableprioritylevelsTMR0H=(655365000)/256/cleartimer0.01s的延時TMR0L=(655365000)%256/cleartimerT0CON=0x80/setuptimer0-prescaler1:2INTCONbits.GIEH=1/enableinterrupts/TRISBbits.TRISB0=0;RB=0while(1)unsignedintm1=0,m2=0if(Timeout=1)m1=ADC()delay(200)m2=

31、ADC()if(m2m1)>300000)RB0=1delay(1000)INTCONbits.GIEH=0flag=1Timeout=0while(unwaitkey()=14)flag=1if(a>H)|(a<L)RB0=1/信號口,為1則響elseRBO=Oif(flag=1)INTCONbits.GIEH=0/disableinterruptsbreak/Highpriorityinterruptvector/PIC中斷標準服務程序#pragmacodeInterruptVectorHigh=0x08/中斷向量voidInterruptVectorHigh(void)

32、_asmgotoInterruptHandlerHigh/jumptointerruptroutine_endasm/Highpriorityinterruptroutine/中斷服務程序/#pragmacode#pragmainterruptInterruptHandlerHighvoidInterruptHandlerHigh()if(INTCONbits.TMR0IF)/checkforTMR0overflowINTCONbit.TMROIF=0/clearinterruptflagTimeout=1/indicatetimeoutTMR0H=(65536TMR0L=(65536xh=u

33、nwaitkey()5000)/2565000)%256if(xh=1)flag=1/收到信號則flag置1,則關閉中斷,重新開始輸入判斷四正弦波發(fā)生器1、設計方案在正弦波的1/4個周期上均勻取65個點,周期輸出這些點的數值,其他正弦波周期按照數值大小正負進行轉換輸出。通過鍵盤更改頻率參數,修改取樣時間周期,改變輸出的正弦波頻率,同時在LCD屏幕輸出當前頻率。2、模塊設計1) LCD、中斷直接套用實驗代碼2) 鍵盤采用4*4鍵盤,只需用到兩個按鍵,所以直接掃描第一行,再判斷按鍵是1還是2,1為頻率加1,2為頻率加2.3) I2C采用其自帶函數寫入數據。4) 主函數開始后顯示默認頻率10,接收按

34、鍵,通過條件判斷頻率加減。3、代碼設計1) 如需增加一個按鍵,按下后頻率*2,只需增加接收按鍵3,判斷按鍵為3是,將Freq+改為Freq=Freq*2;2) 如需將輸出正弦波的絕對值,將下列代碼紅框內數據刪掉即可。if<t<64)"0到EEwrit6_mcp4725(SINt);else/63|127write_mcp4725(SIN-t.);elseiff七瓷192)/127SU191writemcp4725(pjcf:Idt-);elseif(t<256)/LS1S255已mcp4725(Cj<£:-SIN25£七);2)以下為源代碼

35、#include<p18F452.h>#include<I2C.h>#include<delays.h>#defineuintunsignedint#defineucharunsignedchar#defineRC0PORTCbits.RC0#defineRC1PORTCbits.RC1#defineRC6PORTCbits.RC6#defineRC2PORTCbits.RC2#definesclPORTCbits.RC3#definesdaPORTCbits.RC4#defineRC5PORTCbitS.RC5/5#defineRB0PORTBbits.R

36、B0#defineRB1PORTBbits.RB1/3#defineRB2PORTBbits.RB2/4#defineRSPIN1PORTBbits.RB5/DataorInstrument.Select#defineRWPIN1PORTBbits.RB4/WriteorRead#defineEPINPORTBbits.RB3/6800modeEnablesingle#defineALL65536uintt=0intFrequintTH,TLintij,k,flag=OuintTmuintSIN=0x800,0x832,0x864,0x896,0x8c8,0x8fa,0x92c,0x95d,0

37、x98f,0x9c0,0x9f1,0xa21,0xa52,0xa82,0xab1,0xae0,0xb0f,0xb3d,0xb6b,0xb98,0xbc4,0xbf0,0xc1c,0xc47,0xc71,0xc9a,0xcc3,0xceb,0xd12,0xd39,0xd5e,0xd83,0xda7,0xdca,0xdec,0xe0e,0xe2e,0xe4d,0xe6c,0xe89,0xea6,0xec1,0xedb,0xef5,0xf0d,0xf24,0xf3a,0xf4f,0xf63,0xf75,0xf87,0xf97,0xfa6,0xfb4,0xfc1,0xfcd,0xfd7,0xfe0,0

38、xfe8,0xfef,0xff5,0xff9,0xffc,0xffe,0xfffunsignedintJP=1,2voidInterruptHandlerHigh(void)voidchoose(void)voidwrite_mcp4725(unsignedintdac_value)voidkey(void)voidlcd_wait_busy(void)voidlcd_write_com(unsignedcharcombuf)voidlcd_write_com_busy(unsignedcharcombuf)voidlcd_write_data(unsignedchardatabuf)void

39、lcd_write_address(unsignedcharx,unsignedchary)voidlcd_write_char(unsignedcharx,unsignedchary,unsignedcharbuf)voidlcdreset(void)/名稱:1602忙檢測函數/voidlcd_wait_busy(void)TRISDbit.TRISD7=1/為讀狀態(tài)做準備RSP=0/選擇指令寄存器RWPI=1/選擇讀EP=1/使能線電平while(PORTDbits.RD7=1)/讀忙狀態(tài),不忙時退出EP=0/恢復使能線電平TRISDbi.TRISD7=0/名稱:1602寫命令函數/voi

40、dlcd_write_com(unsignedcharcombuf)RSPI=0/選擇指令寄存器RWP=0/選擇寫PORT=combuf/把命令字送入RDEPI=1/使能線電平變化,命令送入1602的8位數據口Delay1TCY()EPI=0/恢復使能線電平/名稱:1602寫命令函數(帶忙檢測)/voidlcd_write_com_busy(unsignedcharcombuf)lcd_wait_busy()/調用忙檢測函數lcd_write_com(combuf)/調用寫命令函數/名稱:1602寫數據函數(帶忙檢測)/voidlcd_write_data(unsignedchardatabu

41、f)lcd_wait_busy()/調用忙檢測函數RSP=1/選擇數據寄存器RWP=0/選擇寫POR=databuf/把數據字送入P2EP=1/使能線電平變化,命令送入1602的8位數據口DelaylTCY()EP=0/恢復使能線電平/名稱:1602顯示地址寫函數/voidlcd_write_address(unsignedcharx,unsignedchary)&=0x0f/列地址限制在0-15&=0x01/行地址限制在0-1if(y=0x00)lcd_write_com_busy(x|0x80)/第一行的歹U地址寫elselcd_write_com_busy(x+0x4()

42、|0x8()/第二行的歹U地址寫入/名稱:指定地址寫入函數/voidlcd_write_char(unsignedcharx,unsignedchary,unsignedcharbuf)lcd_write_address(x,ylcd_write_data(buf)/寫入顯示數據/名稱:1602初始化函數/voidlcdreset(void)Delay100TCYx(15)lcd_write_com(0x38)DelaylOOTCYx(5)lcd_write_com()x38)DelaylOOTCYx(5)lcd_write_com()x38)lcd_write_com_busy(0x38)/

43、8位數據,雙歹U,5*7字形lcd_write_com_busy()x08)lcd_write_com_busy()x01)lcd_write_com_busy()x06)lcd_write_com_busy(0x0c)/顯示功能關,無光標/清屏指令/寫入新的數據后,光標右移,顯示屏不移動/顯示功能開,無光標,voidwrite_mcp4725(unsignedintdac_value)unsignedchartemp=0StartI2C()/SendtheStartBitIdleI2C()/Waittocompletetemp=0xc4/寫操作WriteI2C(temp)IdleI2C()/

44、Waittocompletetemp=(unsignedchar)(dac_value>>)/高位WriteI2C(temp)IdleI2C()/Waittocompletetemp=(unsignedchar)dac_value/低位WriteI2C(temp)IdleI2C()/WaittocompleteStopI2C()IdleI2C()/SendtheStopcondition/Waittocompletevoidchoose(void)if(RB2=0)=JPielseif(RC5=0)=jPi+1elseif(RC6=0)j=3k=jif(!(RB2&&

45、;RC5&&RC6)/有按下flag=kwhile(!(RB2&&RC5&&RC6)/松手檢測/鍵盤獲取voidkey(void)RC=0,RC1=1,RC2=1,RB1=1i=0choose()Nop()voidmain(void)TRISB=0B11000101/RB3-5設置為輸出TRISD=0B00000000/RD設置為輸出TRISC=0B11111000Freq=10lcd_write_char(1,C,'F')lcd_write_char(2,0,'=')lcd_write_char(3,C,Cx3C

46、+Freq/一()lcd_write_char(4,),0x3C+Freq%10)INTCON=0x20/disableglobalandenableTMR0interruptINTCON2=0x84/TMR0highpriorityRCONbits.IPEN=1/enableprioritylevelsT=1000000/256/Freq/采樣時間間隔TH=(uint)(ALLTm+20)/256/cleartimerTMR0H=THTL=(uint)(ALLTm+20)%256/cleartimerTMR0L=TL/中斷初始值T0CON=0x88/setuptimer0-prescaler1:8INTCONbits.GIEH=1/enableinterruptslcdreset()/復位1602Openl2C(MASTER,SLEW_ON)TRISCbits.TRISC3=1TRISCbits.TRISC4=1whi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論