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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

7、上電復(fù)位時(shí),將上一次存入的值顯示為初始值,這樣可以對(duì)上一次的操作保留記憶。寫操作必須要寫入器件地址、存儲(chǔ)區(qū)地址、存儲(chǔ)的內(nèi)容。5)、蜂鳴器報(bào)警如果當(dāng)前溫度超過(guò)最高設(shè)定或者低于最低設(shè)定,LED燈會(huì)閃爍進(jìn)行報(bào)警。程序設(shè)計(jì)中用的是RB0接蜂鳴器,當(dāng)達(dá)到條件時(shí),蜂鳴器開(kāi)始鳴叫。3、代碼設(shè)計(jì)#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及實(shí)時(shí)溫度的編寫符號(hào)unsignedinta/a為AD讀出值unsignedintt=10unsignedintTimeoutintflagintresultintxh/函數(shù)聲明voidInterruptHandlerHigh(void)/按鍵的識(shí)別碼和編入碼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輸入完成后開(kāi)始信號(hào)Delay()unsignedcharpfor(p=0p<100p+)Delayus()unsignedcharqfor(q=0q<10q+)/IIC部分voidllCstart(void)SD=1/先將SDA=1,以準(zhǔn)備在SCL=1時(shí),將SDA=0SC=1/時(shí)鐘總線拉高Dela()/調(diào)用延時(shí)函數(shù),略作延時(shí)SD=0/SCL=1時(shí),將SDA拉低即產(chǎn)生啟動(dòng)信號(hào)Dela()/調(diào)用延時(shí)函數(shù),略作延時(shí)SC=0/將SCL=0,完成啟動(dòng)信號(hào)操作Dela()/調(diào)用延時(shí)函數(shù),略作延時(shí)/名稱:IIC停止信號(hào)函數(shù)/vo

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

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

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

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

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

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

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

18、用寫命令函數(shù)/名稱:1602寫數(shù)據(jù)函數(shù)(帶忙檢測(cè))/voidlcd_write_data(unsignedchardatabuf)lcd_wait_busy()/調(diào)用忙檢測(cè)函數(shù)RSPIN=1/選擇數(shù)據(jù)寄存器RWPIN=O/選擇寫PORTD=databuf/把數(shù)據(jù)字送入P2EPIN=1/使能線電平變化,命令送入1602的8位數(shù)據(jù)口DelaylTCY()EPIN=0/恢復(fù)使能線電平/名稱:1602顯示地址寫函數(shù)/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初始化函數(shù)/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位數(shù)據(jù),雙歹U,5*7字形lcd_write_com_busy()x08)lcd_write

20、_com_busy()x01)lcd_write_com_busy(0x06)lcd_write_com_busy(0x0c)/顯示功能關(guān),無(wú)光標(biāo)/清屏指令/寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)/顯示功能開(kāi),無(wú)光標(biāo),/名稱:指定地址寫入函數(shù)/voidlcd_write_char(unsignedcharx,unsignedchary,unsignedcharbuf)lcd_write_address(x,ylcd_write_data(buf)/寫入顯示數(shù)據(jù)/名稱:讀取按鍵對(duì)應(yīng)數(shù)值函數(shù)/intanjian(void)/通過(guò)讀取橫排和豎排的識(shí)別按鍵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)/開(kāi)始判斷return15elseNop()/不需要等待的接收按鍵,按鍵編號(hào)接收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做準(zhǔn)備unsignedintADC(void)inta1,a2,a3,a4OpenADC(ADC_FOSC_32&ADC_RIGHT_JUST&ADC_8ANA_0REF,ADC_CH0&ADC_INT_OFF)/A/D時(shí)鐘源,晶振32分頻率/A/D轉(zhuǎn)換結(jié)果右對(duì)齊/A/D參考電壓源,電源工作電壓/通道選擇/中斷關(guān)閉,查詢模式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轉(zhuǎn)換值returnavoidmain()flag=0while(1)inti=0,jTRISB=0B11000000TRISD=0B00000000lcdreset()/RB3-5設(shè)置為輸出/RD設(shè)置為輸出/復(fù)位1602unsignedintk1/低溫十位按鍵unsignedintk2/低溫各個(gè)位按鍵unsignedintk3/高溫十位按鍵unsignedintk4/高溫個(gè)位按鍵unsignedintk5/時(shí)間十位按鍵unsignedintk6/時(shí)間個(gè)位按鍵unsignedint11/低溫十位數(shù)據(jù)unsignedint12/低溫個(gè)位數(shù)據(jù)unsignedi

27、nth1/高溫十位數(shù)據(jù)unsignedinth2/高溫個(gè)位數(shù)據(jù)unsignedintt1/時(shí)間十位unsignedintt2/時(shí)間個(gè)位unsignedintks/識(shí)別按鍵/初始化led屏幕lcd_write_ehar(8,0,'M')led_write_ehar(9,0,'I')led_write_ehar(10,0,'N')led_write_ehar(11,0,':')/低溫十位/低溫個(gè)位/低溫?cái)?shù)/高溫十位/高溫個(gè)位/高溫?cái)?shù)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)/鍵入和將數(shù)值顯示在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()/接收開(kāi)始信號(hào)if(ks=15)i=0Timeout=0interruptINTCON=0x20/disableglobalanden

30、ableTMR0INTCON2=0x84/TMR0highpriorityRCONbits.IPEN=1/enableprioritylevelsTMR0H=(655365000)/256/cleartimer0.01s的延時(shí)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/信號(hào)口,為1則響elseRBO=Oif(flag=1)INTCONbits.GIEH=0/disableinterruptsbreak/Highpriorityinterruptvector/PIC中斷標(biāo)準(zhǔn)服務(wù)程序#pragmacodeInterruptVectorHigh=0x08/中斷向量voidInterruptVectorHigh(void)

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

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

34、鍵,通過(guò)條件判斷頻率加減。3、代碼設(shè)計(jì)1) 如需增加一個(gè)按鍵,按下后頻率*2,只需增加接收按鍵3,判斷按鍵為3是,將Freq+改為Freq=Freq*2;2) 如需將輸出正弦波的絕對(duì)值,將下列代碼紅框內(nèi)數(shù)據(jù)刪掉即可。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忙檢測(cè)函數(shù)/voidlcd_wait_busy(void)TRISDbit.TRISD7=1/為讀狀態(tài)做準(zhǔn)備RSP=0/選擇指令寄存器RWPI=1/選擇讀EP=1/使能線電平while(PORTDbits.RD7=1)/讀忙狀態(tài),不忙時(shí)退出EP=0/恢復(fù)使能線電平TRISDbi.TRISD7=0/名稱:1602寫命令函數(shù)/voi

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

41、f)lcd_wait_busy()/調(diào)用忙檢測(cè)函數(shù)RSP=1/選擇數(shù)據(jù)寄存器RWP=0/選擇寫POR=databuf/把數(shù)據(jù)字送入P2EP=1/使能線電平變化,命令送入1602的8位數(shù)據(jù)口DelaylTCY()EP=0/恢復(fù)使能線電平/名稱:1602顯示地址寫函數(shù)/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地址寫入/名稱:指定地址寫入函數(shù)/voidlcd_write_char(unsignedcharx,unsignedchary,unsignedcharbuf)lcd_write_address(x,ylcd_write_data(buf)/寫入顯示數(shù)據(jù)/名稱:1602初始化函數(shù)/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位數(shù)據(jù),雙歹U,5*7字形lcd_write_com_busy()x08)lcd_write_com_busy()x01)lcd_write_com_busy()x06)lcd_write_com_busy(0x0c)/顯示功能關(guān),無(wú)光標(biāo)/清屏指令/寫入新的數(shù)據(jù)后,光標(biāo)右移,顯示屏不移動(dòng)/顯示功能開(kāi),無(wú)光標(biāo),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)/松手檢測(cè)/鍵盤獲取voidkey(void)RC=0,RC1=1,RC2=1,RB1=1i=0choose()Nop()voidmain(void)TRISB=0B11000101/RB3-5設(shè)置為輸出TRISD=0B00000000/RD設(shè)置為輸出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/采樣時(shí)間間隔TH=(uint)(ALLTm+20)/256/cleartimerTMR0H=THTL=(uint)(ALLTm+20)%256/cleartimerTMR0L=TL/中斷初始值T0CON=0x88/setuptimer0-prescaler1:8INTCONbits.GIEH=1/enableinterruptslcdreset()/復(fù)位1602Openl2C(MASTER,SLEW_ON)TRISCbits.TRISC3=1TRISCbits.TRISC4=1whi

溫馨提示

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

評(píng)論

0/150

提交評(píng)論