//************************************ //16F88 HI-TECH C v.9.83 //RA0(AN0)の入力電圧をA/D変換して,周波数を無段階に //変更する。 //************************************ #define _LEGACY_HEADERS #include "pic.h" #include "stdlib.h" #include "lcd.h" #define _XTAL_FREQ 8000000 __CONFIG(CCPRB3 & DEBUGDIS & LVPDIS & BOREN & MCLRDIS & PWRTEN & WDTDIS & INTIO); unsigned int adconv(void); static void interrupt isr(void); unsigned int tmp; unsigned int tmp1; unsigned int dummy; char str[7]; void main(){ OSCCON = 0x70;// 内蔵OSC 8MHz ADCS2 = 0;//AD変換のクロック選択 ADCS1 = 0;//001で2.0μs ADCS0 = 1;// ADFM = 1;// AD変換結果は右詰めで格納 VCFG1 = 0;// 基準電圧はVddとVss VCFG0 = 0; CMCON=0x7; ANSEL = 0b00000001;// RA0(AN0)はアナログそれ以外はデジタル TRISA = 0b00000001;// RA0(AN0)入力それ以外は出力 TRISB = 0b00000000;// すべて出力 PORTA = 0xff;// すべてHigh PORTB = 0xff;// すべてHigh lcd_init();//SD1602の初期化 OPTION = 0b000000100;//プリスケラ-を32 TMR0=0; TMR0IF = 0;//タイマー0割り込みフラグクリア TMR0IE = 1;//タイマー0割り込み発生許可 GIE= 1;//割り込み全体の許可 while (1){ tmp = adconv();//AD変換の結果をtmpに代入 itoa(str,tmp,10);//tmpをキャラクターに変換 lcd_clear();//LCD表示クリア lcd_goto(0);//カーソルを0行目の先頭に移動する lcd_puts(str);//変換結果をLCDに表示 lcd_puts("mv"); } } unsigned int adconv(){ CHS2 = 0;//AD変換ポート設定 RA0(AN0) CHS1 = 0; CHS0 = 0; ADON = 1;//AD変換ON __delay_us(30);//アクイジション時間 20us GODONE = 1;//AD変換開始 while(GODONE);//変換完了待ち return (ADRESH<<8) + ADRESL;//左にシフト } static void interrupt isr(void){// 割り込みサービスルーチン RB7=1;//RB7をHIGHTに dummy=1;//パルス幅を5μsにするためのダミー dummy=1;// RB7=0;//RB7をLOWに・・・・・・・1パルスの発生終了 if(tmp>850){tmp1=850;}//AD変換値−−−を1023〜0を else{tmp1=tmp;}//850〜0に 850で約1.3khz 0で243 TMR0=tmp1/4; TMR0IF = 0;//割り込みフラグのクリアー }