// PIC16F1827 Configuration Bit Settings // 'C' source line config statements // CONFIG1 #pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin) #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled) #pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input) #pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled) #pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled) #pragma config BOREN = OFF // Brown-out Reset Enable (Brown-out Reset disabled) #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin) #pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled) #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled) // CONFIG2 #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off) #pragma config PLLEN = OFF // PLL Enable (4x PLL disabled) #pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset) #pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.) #pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming) // #pragma config statements should precede project file includes. // Use project enums instead of #define for ON and OFF. #include #define _XTAL_FREQ 8000000 //クロック動作周波数を8MHzとして__delay_msを使用する //#define _XTAL_FREQ 32000000 //クロック動作周波数を8MHzとして__delay_msを使用する #define DIG1 RA1 #define DIG2 RA0 #define DIG3 RA7 #define DIG4 RA6 #define colon RA3 #define SDA RA4 #define Speaker RA2 #define Switch RA5 unsigned short int temperature = 0; unsigned short int humidity = 0; Display7SEG(char num, unsigned short int dp);//引数はnum=(表示する数字・記号),dp=(デジマルポイントの有無(0or1))) Display7SEG_4DIG(unsigned short int number, char option);//引数はnum=表示する数字,オプションoptionはc(°C),p(%),n(無し) TemperatureAndHumiditySensor(); Beep(unsigned short int num); int main() { OSCCON = 0b01110100; //内部クロック8MHz ANSELA = 0b00000000; //ポートAをデジタルI/Oピンとして使う ANSELB = 0b00000000; //ポートBをデジタルI/Oピンとして使う TRISA = 0b11111111; //ポートAを出力に設定 TRISB = 0b00000000; //ポートBを出力に設定 __delay_ms(1500);//温湿度センサが起動するのを待つ Beep(300);//起動音 while (1) { while(Switch == 0){ //スイッチが押されるまで待機 } Beep(100);//スイッチが押されたことを確認 TemperatureAndHumiditySensor();//センサと通信 //温度を表示-------------------------- for(unsigned int i =0;i<500; i++){ Display7SEG_4DIG(temperature,'c');//°C } //温度を表示-------------------------- //湿度を表示-------------------------- Beep(100);//湿度表示開始音 for(unsigned int i =0;i<500; i++){ Display7SEG_4DIG(humidity, 'p');//%persent } //湿度を表示-------------------------- } return 0; } Display7SEG_4DIG(unsigned short int number, char option) { unsigned short int DIG[4]; unsigned short int temp; temp = number; DIG[3] = temp / 1000; temp = number; DIG[2] = (temp - 1000 * DIG[3]) / 100; temp = number; DIG[1] = (temp - 1000 * DIG[3] - 100 * DIG[2]) / 10; temp = number; DIG[0] = temp - 1000 * DIG[3] - 100 * DIG[2] - 10 * DIG[1]; TRISB = 0b00000000; TRISA = 0b00000000; DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; colon = 0; if(option == 'n'){ Display7SEG(DIG[0],0); }else{ Display7SEG(option,0); } DIG1 = 1; //1桁目を表示 __delay_ms(1); DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; colon = 0; Display7SEG(DIG[1],0); DIG2 = 1; //2桁目を表示 __delay_ms(1); DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; colon = 0; Display7SEG(DIG[2],1); DIG3 = 1; //3桁目を表示 __delay_ms(1); DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; //すべてのLEDを消灯 colon = 0; Display7SEG(DIG[3],0); DIG4 = 1; //4桁目を表示 __delay_ms(1); DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; //すべてのLEDを消灯 colon = 0; if(option != 'n'){ Display7SEG('d',0); } colon = 1; //コロン,°表示 __delay_ms(1); DIG1 = 0; DIG2 = 0; DIG3 = 0; DIG4 = 0; colon = 0; } Display7SEG(char num, unsigned short int dp) { unsigned short int dp_b; if(dp == 1){ dp_b = 0b00001000; }else{ dp_b = 0b00000000; } switch (num) { case 0: PORTB = 0b10110111 | dp_b;//0 正論理 //PORTB = 0b01001000; //0 負論理 break; case 1: PORTB = 0b00010100 | dp_b;//1 //PORTB = 0b11101011; //1 break; case 2: PORTB = 0b01110011 | dp_b;//2 //PORTB = 0b10001100; //2 break; case 3: PORTB = 0b01110110 | dp_b;//3 //PORTB = 0b10001001; //3 break; case 4: PORTB = 0b11010100 | dp_b;//4 //PORTB = 0b00101011; //4 break; case 5: PORTB = 0b11100110 | dp_b;//5 //PORTB = 0b00011001; //5 break; case 6: PORTB = 0b11100111 | dp_b;//6 //PORTB = 0b00011000; //6 break; case 7: PORTB = 0b00110100 | dp_b;//7 //PORTB = 0b11001011; //7 break; case 8: PORTB = 0b11110111 | dp_b;//8 //PORTB = 0b00001000; //8 break; case 9: PORTB = 0b11110110 | dp_b;//9 //PORTB = 0b00001001; //9 break; case 'c': PORTB = 0b10100011;//C break; case 'p': PORTB = 0b01011001; break; case 'd': PORTB = 0b00000100; break; } } TemperatureAndHumiditySensor(){ unsigned int data[40]; unsigned int c; //picから温度センサーへ開始信号送信 TRISA = 0b00000000; SDA = 0; __delay_ms(25); SDA = 1; __delay_us(10); //情報受信開始 TRISA = 0b11111111; while(SDA != 0) //LOWになるまで待つ { } while(SDA == 0) //Hiになるまで待つ { } //温湿度情報受信開始 for(c=0 ; c <40 ; c++) { while(SDA == 1) //LOWになるまで待つ(1の間はwhile文の中にいる) { } while(SDA == 0) //Hiになるまで待つ (0の間はwhile文の中にいる) { } __delay_us(40); if(SDA == 1){ data[c] = 1; } else{ data[c] = 0; } } //温度湿度の計算 humidity = 0*data[0] + 0*data[1] + 0*data[2] + 0*data[3] + 0*data[4] + 0*data[5] + 512*data[6] + 256*data[7] + 128*data[8] + 64*data[9] + 32*data[10] + 16*data[11] + 8*data[12] + 4*data[13] + 2*data[14] + data[15]; temperature = 0*data[16] + 0*data[17] +0*data[18] +0*data[19] +0*data[20] +0*data[21] +512*data[22] +256*data[23]+ 128*data[24]+ 64*data[25]+ 32*data[26] + 16*data[27] + 8*data[28] + 4*data[29] + 2*data[30] + data[31]; humidity = 10*humidity; temperature = 10*temperature; } Beep(unsigned short int num){ TRISA = 0b11111011; //speakerを出力に設定 for(unsigned int s=0; s