51单片机之烟雾报警器(MQ 您所在的位置:网站首页 51单片机adc0809 51单片机之烟雾报警器(MQ

51单片机之烟雾报警器(MQ

#51单片机之烟雾报警器(MQ| 来源: 网络整理| 查看: 265

今天朋友做毕业设计,让我帮他写下程序,花了两个小时,给了他们一个模板,虽然很简单,但是还是拿出来分享吧,适用于初学者。高手不要忘下看了大笑

要求:液晶屏显示.四个按键分别控制选择设定值位数,加一,减一。报警功能开关键

lcd.c文件

#include #define LCD1602_4PINS #define LCD1602_DATAPINS P0 sbit LCD1602_E=P2^7; sbit LCD1602_RW=P2^5; sbit LCD1602_RS=P2^6; #define uchar unsigned char #define uint unsigned int void Lcd1602_Delay1ms(uint c)   //误差 0us {     uchar a,b; for (; c>0; c--) { for (b=199;b>0;b--) {   for(a=1;a>0;a--); }       }     } void LcdWriteCom(uchar com)  //写入命令 { LCD1602_E = 0;//使能清零 LCD1602_RS = 0;//选择写入命令 LCD1602_RW = 0;//选择写入 LCD1602_DATAPINS = com;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改 Lcd1602_Delay1ms(1); LCD1602_E = 1;//写入时序 Lcd1602_Delay1ms(5); LCD1602_E = 0; // Lcd1602_Delay1ms(1); LCD1602_DATAPINS = com LcdWriteCom(0x32);//将8位总线转为4位总线 LcdWriteCom(0x28);//在四位线下的初始化 LcdWriteCom(0x0c);  //开显示不显示光标 LcdWriteCom(0x06);  //写一个指针加1 LcdWriteCom(0x01);  //清屏 LcdWriteCom(0x80);  //设置数据指针起点 }

main.c文件:

/* *CS_ :片选使能,低电平芯片使能。  *CH0 :模拟输入通道 0,或作为 IN+/-使用。  *CH1 :模拟输入通道 1,或作为 IN+/-使用。  *GND :芯片参考 0 电位(地)。  *DI  :数据信号输入,选择通道控制。  *DO  :数据信号输出,转换数据输出。  *CLK :芯片时钟输入。  *Vcc/REF :电源输入及参考电压输入(复用)。  */ #include #define uchar unsigned char #define uint unsigned int sbit key1=P1^4;  /* 报警值设定位选择器 */ sbit key2=P1^5; /* 报警值加一 */ sbit key3=P1^6;  /* 报警值减一*/ sbit key4=P1^7;  /* 报警功能开关键*/ sbit LED1=P2^0;  /* 报警指示灯LED1*/ sbit LED2=P2^1;  /* 报警指示灯LED2*/ sbit beep=P2^2;  /* 蜂鸣器报警*/ sbit ADC_CS=P1^0;   /* ADC使能管脚 */ sbit ADC_CLK=P1^1;  /* ADC时钟信号管脚 */ sbit ADC_IO=P1^2;   /* ADC输入输出管脚*/ void Lcd1602_Delay1ms(uint c);   //误差 0us void LcdWriteCom(uchar com);  /*LCD1602写入8位命令子函数*/ void LcdWriteData(uchar dat); /*LCD1602写入8位数据子函数*/ void LcdInit(); /*LCD1602初始化子程序*/ unsigned char *buff=" max value :"; unsigned int set_value=100;     /* 报警值默认设置为100 ,三位数字*/ unsigned int adc_value=0; unsigned char Key_Scan()   /* 按键扫描函数 */ { unsigned char key_num = 0 ;  /* check key if press */ if ((key1 ==0)||(key2 ==0)||(key3 ==0)||(key4 ==0)) { Delay10ms(1); //消除抖动 if ((key1 ==0)||(key2 ==0)||(key3 ==0)||(key4 ==0)) { if(key1==0)  key_num=1; if(key2==0)  key_num=2; if(key3==0)  key_num=3; if(key4==0)  key_num=4; } } while((key1 ==0)||(key2 ==0)||(key3 ==0)||(key4 ==0)); return key_num;   //将读取到键值的值返回 } void all_init(void) {    unsigned char i;    LcdInit();/* 初始化LCD显示 */    LED1=0;   /* 熄灭报警灯 */    LED2=0;   /* 熄灭报警灯 */       beep=0;   /* 关闭蜂鸣器 */    ADC_CS=1; /* 使能为1 */   LcdWriteCom(0x80);   for(i=0;i   unsigned char key_num;   unsigned char beep_on_off=0;    /* 默认为关闭状态 */   unsigned char set_value_ hundreds; /* 百位 */   unsigned char set_value_ decade;   /* 十位 */   unsigned char set_value_ single;   /* 个位 */   unsigned char set_value_bit_select=0;      all_init();      while(1)   {     adc_value=get_adc_value(); key_num=Key_Scan(); set_value_ hundreds=set_value/100; set_value_ decade  =(set_value%100)/10; set_value_ single  =set_value%10; switch(key_num) {  case 1:  { set_value_bit_select++; if(set_value_bit_select>=3)   set_value_bit_select=0; key_num=0; break;        }  case 2:  {    switch(set_value_bit_select) {   case 0: { set_value_ single++; if(set_value_ single>9) set_value_ single=0; }   case 1: { set_value_ decade++; if(set_value_ decade>9) set_value_ decade=0; }   case 2: { set_value_ hundreds++; if(set_value_ hundreds>9) set_value_ hundreds=0; } default:break; } key_num=0; break;  }    case 3:  {    switch(set_value_bit_select) {   case 0: { set_value_ single--; if(set_value_ single set_value_ hundreds--; if(set_value_ hundreds if(adc_value>=set_value)    /* 判断气体浓度是否大于设定值 */ { LED1=1;   /* 点亮报警灯 */ LED2=1;   /* 点亮报警灯 */    beep=1;   /* 打开蜂鸣器 */ } else { LED1=0;   /* 熄灭报警灯 */ LED2=0;   /* 熄灭报警灯 */    beep=0;   /* 关闭蜂鸣器 */ } }     else { LED1=0;   /* 熄灭报警灯 */ LED2=0;   /* 熄灭报警灯 */    beep=0;   /* 关闭蜂鸣器 */ }   }    }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有