////////////////////////////////////////////////////////// // 水温計 7セグバージョン // // C-COMPILER CCSC 00.11.18 // ////////////////////////////////////////////////////////// // config: HS // // (3F72) PowerUpTimer // // BrownOutDetect // // FlashProgramEnable // ////////////////////////////////////////////////////////// #include <16f873.h> #include #include // log10()関数計算用ファイル #use delay(CLOCK=8000000) #define pri_w 0 // THW #byte tmr0 = 1 //タイマーアドレス #byte port_a = 5 //ポートAアドレス #byte port_b = 6 //ポートBアドレス #byte port_c = 7 //ポートCアドレス long ad_data; //A/D変換データー格納用 float keisan; //各計算用 float suion_d; //水温計算結果用 int seg_l; //7seg low data int seg_h; //7seg high data int seg_out; //7seg出力用 int daina=0; //ダイナミック点灯用 long w_w[5]; //水温用計算結果格納用 //////// I/O初期設定 //////////////////////////////////////// void syoki(){ // // setup_adc_ports(RA0_ANALOG_RA3_RA2_REF); // setup_adc(adc_clock_div_32); //クロック設定 // //A0をA/Dコンバータ A2を低電圧側基準値 A3を高電圧側基準値 // //--------------------------------------------------------------// setup_counters(rtcc_internal,rtcc_div_64); // //カウンタ初期設定 // // set_tris_b(0x00); //全ピンout // port_b = 0x00; //ポートBクリア // set_tris_c(0x00); //全ピンout // port_c = 0x00; //ポートCクリア // // #use fast_io(b) // #use fast_io(c) // // enable_interrupts(rtcc_zero); //カウンタ割り込み許可 // enable_interrupts(global); //全割り込み許可 // // } // ////////////////////////////////////////////////////////////////// //////////// 7セグ表示用データ //////////////////////////////// void seg_data(int i){ // switch(i){ // case 0: // seg_out = 0x3f; //00111111 // break; // // case 1: // seg_out = 0x06; //00000110 // break; // // case 2: // seg_out = 0x5b; //01011011 // break; // // case 3: // seg_out = 0x4f; //01001111 // break; // // case 4: // seg_out = 0x66; //01100110 // break; // // case 5: // seg_out = 0x6d; //01101101 // break; // // case 6: // seg_out = 0x7d; //01111101 // break; // // case 7: // seg_out = 0x07; //00000111 // break; // // case 8: // seg_out = 0x7f; //01111111 // break; // // case 9: // seg_out = 0x67; //01100111 // break; // // default: // seg_out = 0x00; //00000000 // break; // } // } // ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////// // 割り込み処理  // #int_rtcc // rtcc_isr(){ // switch(daina){ // case 0: //7セグ下位表示条件 // port_b = 0x00; //7セグ消灯 // seg_data(seg_l); //7セグdata // port_b=seg_out | 0x80; //トランジスタ用// daina = 1; // break; // // case 1: //7セグ上位表示条件 // port_b = 0x00; // seg_data(seg_h); // port_b = seg_out; // daina = 0; // break; // // default: // daina = 0; // } // } // ////////////////////////////////////////////////////////////////// //////////// A/D変換値入力 ////////////////////////////////// void ad_in(int ch){ // int i,j; // float k; // k = 0; // for(j=1;j<=5;j++){ //5回ループ // ad_data = 0; // // for(i=1;i<=10;i++){ //10回ループ // set_adc_channel(ch); // delay_us(200); // ad_data = ad_data + read_adc(); // } // k = k + (ad_data); //50回の合計 // } // ad_data = k/50; //50回測定の平均 // } // ////////////////////////////////////////////////////////////////// //**************************************************************** // 温度測定 // void pri_w_temp(){ // ad_in(pri_w); //A/D変換 // // suion_d = ad_data * 2.587 - 2.6; //電圧変換 // // suion_d = log10(suion_d) * (-92.537) + 334.5; // //温度変換 // } // //**************************************************************** ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// main() { int i; //--------------------------------------------------------------- syoki(); //I/O初期設定 pri_w_temp(); //初期値用に測定 for(i=0;i<=4;i++) //測定値を配列に格納 w_w[i] = suion_d; //--------------------------------------------------------------- while(1){ pri_w_temp(); //測定 for(i=4;i>=1;i--) //配列のdataをシフト w_w[i] = w_w[i-1]; w_w[0] = suion_d; //最新のDATAをw_w[0]に格納 suion_d = 0; //suion_dをゼロクリア for(i=0;i<=4;i++) //過去5回の測定値合計 suion_d = suion_d + w_w[i]; suion_d = suion_d/5; //過去5回の平均値計算 i = suion_d; seg_l = (i%10); //1桁目の計算 seg_h = ((i/10)%10); //2桁目の計算 delay_ms(1000); //1秒待ち } //while(1) } //main