//家用可燃气体监测报警器
//硬件:MQ-2 MQ5 OLED 蜂鸣器 按键 风扇
//1 OLED显示天然气、液化气浓度
//2 OLED显示可燃气体报警临界值
//3 2个按键用于修改可燃气体报警临界值
//4 MQ2检测到的浓度或者MQ7检测到的浓度 高于临界值时,蜂鸣器报警+风扇打开
//line:
//mq2 vcc-3.3v gnd-gnd data-p6.0
//mq5 vcc-3.3v gnd-gnd data-p6.1
//oled vcc-3.3v gnd-gnd scl-p2.0 sda-p2.2
//buzzer vcc-3.3v gnd-gnd data-p3.6
//fan vcc-3.3v gnd-gnd data-p3.5
//key1-p1.1 key2-p2.1 nocare
cppint main(void)
{
unsigned char dis[10];
unsigned char time_cyc = 0;
int set_value = 50; //设置临界值
int adc_prec[4]; //adc结果的百分比结果
WDTCTL = WDTPW + WDTHOLD; /* Stop WDT */
/* 初始化显示 */
OLED_Init(); /* OLED初始化 */
OLED_ShowString(0, 0, "MQ-2:");
OLED_ShowString(0, 2, "MQ-5:");
OLED_ShowString(0, 4, " SET:");
dis[0] = set_value % 100 / 10 + '0';
dis[1] = set_value % 10 + '0';
dis[2] = 37; //这表示百分号
dis[3] = 0;
OLED_ShowString(8 * 6, 4, dis);
/*按键端口 */
P1DIR &= ~BIT1;
P1SEL &= ~BIT1;
P1REN |= BIT1;
P1OUT |= BIT1;
P2DIR &= ~BIT1;
P2SEL &= ~BIT1;
P2REN |= BIT1;
P2OUT |= BIT1;
/* 风扇端口 P35 */
P3DIR |= BIT5;
/* 蜂鸣器端口P3.6 PWM 频率是(1MHZ/1000) 占空比是TBCCR6/TBCCR0 */
P3SEL |= BIT6; // P3.5-7.6 option select
_EINT();
while (1)
{
//显示MQ2 MQ5
delay_ms(10);
time_cyc = (time_cyc + 1) % 10;
if (time_cyc == 1) /* 10 个10ms执行一次 */
{
adc_prec[0] = (int) ((float) (ADCresults[0]) * 1.0 / 4096.0 * 100); //结果转化成百分比
dis[0] = adc_prec[0] % 100 / 10 + '0';
dis[1] = adc_prec[0] % 10 + '0';
dis[2] = 37; //这表示百分号
dis[3] = 0;
OLED_ShowString(8 * 6, 0, dis);//第一排显示MQ2
adc_prec[1] = (int) ((float) (ADCresults[1]) * 1.0 / 4096.0 * 100); //结果转化成百分比
dis[0] = adc_prec[1] % 100 / 10 + '0';
dis[1] = adc_prec[1] % 10 + '0';
dis[2] = 37; //这表示百分号
dis[3] = 0;
OLED_ShowString(8 * 6, 2, dis);//第一排显示MQ5
}
//按键1检测处理
if (!(P1IN & BIT1))
{
while (!(P1IN & BIT1))
;
if (set_value < 95)
set_value += 1; //临界值加1
adc_prec[0] = (int) ((float) (ADCresults[0]) * 1.0 / 4096.0 * 100); //结果转化成百分比
dis[0] = set_value % 100 / 10 + '0';
dis[1] = set_value % 10 + '0';
dis[2] = 37; //这表示百分号
dis[3] = 0;
OLED_ShowString(8 * 6, 4, dis);
}
//按键2检测处理
if (!(P2IN & BIT1))
{
while (!(P2IN & BIT1))
;
if (set_value > 5)
set_value -= 1; //临界值-1
adc_prec[0] = (int) ((float) (ADCresults[0]) * 1.0 / 4096.0 * 100); //结果转化成百分比
dis[0] = set_value % 100 / 10 + '0';
dis[1] = set_value % 10 + '0';
dis[2] = 37; //这表示百分号
dis[3] = 0;
OLED_ShowString(8 * 6, 4, dis);
}
//临界值判断
if (adc_prec[0] > set_value || adc_prec[1] > set_value) //MQ2>临界值 或者 MQ7>临界值
{
TBCCR6 = 500; //打开蜂鸣器
P3OUT &= ~BIT5;//打开风扇
}
else
{
TBCCR6 = 0; //关闭打开蜂鸣器
P3OUT |= BIT5;//关闭风扇
}
}
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR(void)
{
switch (__even_in_range(ADC12IV, 34))
{
case 12: // Vector 12: ADC12IFG3
ADCresults[0] = ADC12MEM0; // Move A0 results, IFG is cleared
ADCresults[1] = ADC12MEM1; // Move A1 results, IFG is cleared
ADCresults[2] = ADC12MEM2; // Move A2 results, IFG is cleared
ADCresults[3] = ADC12MEM3; // Move A3 results, IFG is cleared
default:
break;
}
}
cpphttps://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!