//********************************************************************** void Pwm_Change_DutyEx(unsigned int duty_ratio) { CCPR1L = duty_ratio >> 2; CCP1CON.F6 = duty_ratio & 0b00000001; CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; } //********************************************************************** // 10回A/D変換し、その平均値を返す。クロックが8Mhzの場合、約1msec要する。 unsigned int Adc_Read_Ex(unsigned short channel) { unsigned int ad0; unsigned char cnt; ad0 = 0; GPIO.F4 = 1; for (cnt = 0; cnt < 10; cnt++) { ad0 += Adc_Read(channel); } GPIO.F4 = 0; return (ad0 / 10); } //********************************************************************** void main() { unsigned int ad0, old; unsigned char cnt; // OSCCON = 0b01110000; // クロックは8Mhz CMCON0 = 0b00000111; // コンパレータは使用しない。 ANSEL = 0b00000001; // A/D変換を使用する。 TRISIO = 0b00000001; GPIO = 0b00001000; Pwm_Init(3000); Pwm_Change_DutyEx((PR2 * 4) / 2); Pwm_Stop(); while(1) { // 心拍の立ち下がりをチェックする。 cnt = 0; while(1) { ad0 = Adc_Read_Ex(0); if (ad0 > (3100 / 5)) { // 3.1V以上かをチェックする。 cnt++; } else { cnt = 0; } if (cnt > 5) // 5回連続するかをチェックする。 break; } // ブザーを鳴らす。 Pwm_Start(); GPIO.F1 = 1; Delay_ms(10); GPIO.F1 = 0; Pwm_Stop(); // 心拍の立ち上がりをチェックする。 cnt = 0; while(1) { ad0 = Adc_Read_Ex(0); if (ad0 < (2900 / 5)) { // 2.9V以下かをチェックする。 cnt++; } else { cnt = 0; } if (cnt > 5) // 5回連続するかをチェックする。 break; } } } //**********************************************************************