PIC16F1938單片機編程樣例_第1頁
PIC16F1938單片機編程樣例_第2頁
PIC16F1938單片機編程樣例_第3頁
PIC16F1938單片機編程樣例_第4頁
PIC16F1938單片機編程樣例_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、PIC單片機編程樣例MCU:PIC16F1938;開發(fā)語言:C語言開發(fā)工具:編譯環(huán)境:MPLAB IED;C 編譯器:HI-TECH PICC C compiler編輯軟件:source insight燒錄工具:MPLAB ICD2仿真軟件:Protues說明:程序已經(jīng)通過編譯并在仿真軟件和硬件平臺上成功跑起來;目的:對用到PIC16F系列單片機開發(fā)軟件的群眾提供樣例支持,希望有幫助。Protues仿真圖:1、一些定義typedef void VOID;typedef bit BIT;typedef unsigned char UINT8;typedef int INT16;typedef u

2、nsigned int UINT16;typedef long INT32;typedef unsigned long UINT32;VOID delay( VOID )int i = 100;while( i- );2、EEPROM讀寫/*功 能:從EEPROM中讀取一個字節(jié)的數(shù)據(jù)原 型:UINT8 EEPROM_read( UINT8 addr )參數(shù)說明:輸入?yún)?shù):addr 輸入地址 輸出參數(shù):無返 回:讀取的字節(jié)注 意: */UINT8 EEPROM_read( UINT8 addr )UINT8 EE_data;EEADRL = addr;EEPGD = 0;CFGS = 0;GIE

3、 = 0; /禁止所有中斷RD = 1;asm("nop");EE_data = EEDATL;RD = 0;GIE = 1; /恢復(fù)所有中斷return EE_data;/*功 能:向EEPROM中寫入一個字節(jié)的數(shù)據(jù)原 型:VOID EEPROM_write( UINT8 addr, UINT8 ee_data )參數(shù)說明:輸入?yún)?shù):addr 輸入地址,ee_data 需要寫入的數(shù)據(jù)輸出參數(shù):無返 回:無注 意: */VOID EEPROM_write( UINT8 addr, UINT8 ee_data )EEADRL = addr;EEDATL = ee_data;E

4、EPGD = 0; CFGS = 0; GIE = 0; /禁止所有中斷WREN = 1; /運行執(zhí)行編程/擦除操作EECON2 = 0x55; /必須按這樣的時序EECON2 = 0xAA;WR = 1; while( WR=1 ); /等待寫操作完成 GIE = 1;WREN = 0; /禁止執(zhí)行編程/擦除操作3、ADC模塊/* ADC模塊的初始化 */static VOID ADC_init( VOID )ADCON0 = 0b00110001; /選擇AN12通道、ADC使能位ADCON1 = 0b11100000; /AD轉(zhuǎn)換結(jié)果右對齊,64分頻作為轉(zhuǎn)換時鐘,選擇VSS,VDD作為參

5、考電壓ADIF = 0; /清楚AD轉(zhuǎn)換標(biāo)志static UINT16 throttle = 0;static VOID AD_Function( VOID )UINT8 i;UINT16 AD_result;UINT16 AD_max = 0;UINT16 AD_min = 2000;throttle = 0;for( i=0; i<AD_NUM; i+ )ADIF = 0;ADRESH = 0;ADRESL = 0;delay();ADCON0 |= 0x02;while( 0 = ADIF ); /等待轉(zhuǎn)換完成ADIF = 0;AD_result = ADRESH;AD_resul

6、t = AD_result << 8;AD_result = AD_result | ADRESL;throttle += AD_result;AD_max = AD_max > AD_result ? AD_max : AD_result;AD_min = AD_min < AD_result ? AD_min : AD_result;throttle = (throttle - AD_max - AD_min) / (AD_NUM - 2); /去掉最大值和最小值,均值濾波4、定時器0/* 定時器0初始化 */static VOID Timer0_init(VOID

7、)OPTION_REG = 0b10000100; /禁止所有弱上拉、內(nèi)部指令周期時鐘32分頻TMR0 = TIMER0_1MS; /定時器0的中斷間隔為1msTMR0IE = 1; /定時器0開中斷/總的中斷開關(guān)記得在所有模塊初始化完成后打開static UINT8 timecount = 0;static BIT time10msflg;static BIT time1msflg;VOID interrupt ISR(VOID)uart_handler(); /串口通訊接收/* 定時器0的處理 */if( 1 = TMR0IF )TMR0IF = 0; /清零標(biāo)志位TMR0 = TIMER

8、0_1MS; /重新賦值timecount+;if( timecount >= 10 )timecount = 0; time10msflg = 1;time1msflg = 1;/根據(jù)實際情況添加自己的代碼5、IO初始化/* IO 初始化 */static VOID IO_init(VOID)/* PORT A */ANSELA = 0x00; /所有IO為數(shù)字IOTRISA = 0x00; /所有IO為outputPORTA = 0x00; /初始化所有IO輸出電平為低電平/* PORT B */ANSELB = 0x03; /RB0和RB1都綁定為同一模擬AD輸入TRISB = 0

9、X03; /RB0和RB1為輸入,其他端口為輸出PORTB = 0x00;/* POTR C */PORTC =0xff; LATC = 0xff;TRISC =0xC4; /TX和RX引腳都要設(shè)置為1,禁止CCP1引腳輸出驅(qū)動器6、PWM模塊/* PWM模塊的初始化 */static VOID PWMCCP_init(VOID)CCP1CON = 0b00001100; /單輸出,PWM模式CCPTMRS0 &= 0b11111100; /CCP1選擇Timer2作為定時器PR2 = 249; /PWM周期計算:(PR2 + 1)*0.0625*4(16Mhz晶振四分頻,即指令周期)

10、*預(yù)分頻值,當(dāng)PR2為249時,PWM頻率為16KT2CON = 0x00; /預(yù)分頻為1:1;TMR2ON = 1; /使能定時器Timer2TRISC2 = 0; /打開CCP1引腳輸出驅(qū)動器CCPR1L = 0x00; /PWM占空比為0CCP1CON &= 0b11001111;/*功 能:PWM占空比設(shè)置原 型:VOID PWM_WidthSet( UINT8 width )參數(shù)說明:輸入?yún)?shù):width 占空比的百分比分子,設(shè)置值從0至100,例如width = 50時,設(shè)置的占空比為50% 輸出參數(shù):無返 回:無注 意: */static VOID PWM_WidthSe

11、t( UINT8 width )UINT16 PWM_width;UINT16 tmp;PWM_width = width * 10;if( 100 = width )/經(jīng)過Protues仿真,100時至少比1000大于4才可以達到完全的100PWM_width += 4;/* 高八位賦值 */CCPR1L = PWM_width >> 2 ;/* 低兩位賦值 */tmp = PWM_width & 0x0003;tmp = tmp << 4;CCP1CON &= 0b11001111;CCP1CON |= tmp;7、串口通訊模塊void uart_i

12、nit(void) UINT8 ii;for(ii=0;ii<_SUB_NUM_;ii+)get_uart_subii=0xff; RCSTA = 0xb0; TXSTA = 0x20; /add by lihf for test/TXSTA = 0x20; BAUDCONbits.BRG16=0; SPBRGH = 0; /8 位定時器 Baud Rate GeneratorSPBRG = _FOSC_/64/_BAUD_-1; /23;TXIE = 0; /發(fā)送不需要中斷處理RCIE = 1;PEIE = 1; /沒有開全局中斷 /發(fā)送數(shù)據(jù)static VOID UART_sent(

13、 UINT8 byte )/while( 0 = TXIF )/continue;TXREG = byte;while( 0 = TRMT )asm("nop");/接收在中斷里面調(diào)用uart_handler()函數(shù)#define _SUB_NUM_ 50UINT8 get_uart_sub_SUB_NUM_;void uart_handler(void) UINT8 i;if( 1 = RCIF )RCIF = 0;for(i=0;i<_SUB_NUM_-1;i+) get_uart_subi=get_uart_subi+1;get_uart_sub_SUB_NUM_

溫馨提示

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

評論

0/150

提交評論