/**************************************** * A/Dコンバータの使い方2参照 * 886_UV_level Meter by T.Inoue 2018/06/26 ***************************************/ #include <16f886.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,MCLR,NOIESO,NOFCMEN,NODEBUG,BORV40 #device ADC=10 //A/D変換10ビットモード #use delay(CLOCK = 10000000) //クロック10MHz #use fast_io(B) //入出力モード固定 ////// 液晶表示器ライブラリ用設定 #define mode 0 //空きピンの入出力モード #define input_x input_B //接続ポート指定 #define output_x output_B #define set_tris_x set_tris_B #define stb PIN_B3 //制御信号設定 #define rs PIN_B2 #include //ライブラリインクルード /// グローバル変数宣言 float temp_v,uv_power; //計測データ float指定 /************ メイン関数 *************/ void main() { setup_adc_ports(sAN0 | sAN1 | VSS_VDD);////RA0,RA1ピンがアナログ入力 setup_adc(ADC_CLOCK_DIV_32); //Fosc/32 3.2usec //// 液晶表示初期表示 lcd_init(); //液晶表示器初期化 lcd_clear(); //全消去 printf(lcd_data,"Start!!"); //スタートメッセージ出力 // 計測表示繰り返しループ while(1) { /// 温度計測 set_adc_channel(1); //チャネル1選択 delay_us(15); //アクイジション待ち temp_v = read_adc(); //A/D変換データ10ビット読み込み temp_v = (temp_v *160 ) / 1024; //温度データへスケール変換 10mV/degC,0.9=30degC,1600mV=100degc,0mv=-60degC lcd_cmd(0x01); //1行目の先頭へ移動 printf(lcd_data, "Temp = %2.1f DegC",temp_v); /// UV出力電圧 set_adc_channel(0); //チャネル0選択 delay_us(15); //アクイジション待ち uv_power = read_adc(); //A/D変換データ10ビット読み込み uv_power = (uv_power * 5) / 1024; //フルスケール5.0VxOPAmp1倍=5.0V :ML8511出力電圧 2.2V/10mW/cm2 // UV-Power換算 uv_power = (uv_power - 1.0)/0.12; //uv_v=0.12*uv_power+1.0より換算 lcd_cmd(0xC0); //2行目の頭に移動 printf(lcd_data, "UV=%2.1fmW", uv_power); // UV-Index換算 lcd_cmd(0xC9); //2行目の0A頭に移動 if(uv_power >= 11.0) printf(lcd_data,"5:U.St."); if((uv_power >=8)&&(uv_power <11))printf(lcd_data,"4:V.St."); if((uv_power >=6)&&(uv_power <8)) printf(lcd_data,"3:Strg."); if((uv_power >=3)&&(uv_power <6)) printf(lcd_data,"2:Midl."); if(uv_power <= 3) printf(lcd_data,"1:Weak "); delay_ms(500); //0.5秒待ち } }