您的位置:首页 > 其它

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

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


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

lcd.c文件

#include<reg51.h>

#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 << 4; //发送低四位
Lcd1602_Delay1ms(1);

LCD1602_E = 1;//写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;

}

void LcdWriteData(uchar dat) //写入数据

{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //选择写入数据
LCD1602_RW = 0; //选择写入

LCD1602_DATAPINS = dat;//由于4位的接线是接到P0口的高四位,所以传送高四位不用改
Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;

LCD1602_DATAPINS = dat << 4; //写入低四位
Lcd1602_Delay1ms(1);

LCD1602_E = 1; //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;

}

void LcdInit()  //LCD初始化子程序

{
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<reg51.h>

#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<sizeof(buff),i++)

  LcdWriteData(buff[i]);

}

   

unsigned int get_adc_value()

{

  

}  

 

void main()

{

  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<0)
set_value_ single=9;
}
  case 1:
{
set_value_ decade--;
if(set_value_ decade<0)
set_value_ decade=9;
}
  case 2:
{
set_value_ hundreds--;
if(set_value_ hundreds<0)
set_value_ hundreds=9;
}
default:break;
}
 key_num=0;
break;
 }
 case 4:
 {
beep_on_off=~beep_on_off;
key_num=0;
break;
 }
 default:break;
}

set_value=set_value_ hundreds*100+set_value_ decade*10+set_value_ single;
LcdWriteCom(0x80+sizeof(buff));
LcdWriteData(set_value/100);        /* 写入百位 */
LcdWriteData((set_value%100)/10);   /* 写入十位 */
LcdWriteData(set_value%10);/* 写入个位 */
if(beep_on_off==1)
{
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;   /* 关闭蜂鸣器 */
}

  }

  

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: