找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4004|回复: 1
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:316627 发表于 2018-4-28 19:46 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
51单片机之烟雾报警器(MQ-2)
今天朋友做毕业设计,让我帮他写下程序,花了两个小时,给了他们一个模板,虽然很简单,但是还是拿出来分享吧,适用于初学者。高手不要忘下看了


要求:液晶屏显示.四个按键分别控制选择设定值位数,加一,减一。报警功能开关键
lcd.c文件
#include<reg51.h>#define LCD1602_4PINS#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;#define uchar unsigned char#define uint unsigned intvoid 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); //写一个指针加1LcdWriteCom(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 intsbit 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);  //误差 0usvoid 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;  /* 关闭蜂鸣器 */}  }}

04243A61-F77C-4495-B5D5-B5F77B6EB95F.jpeg (61.53 KB, 下载次数: 111)

04243A61-F77C-4495-B5D5-B5F77B6EB95F.jpeg
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:312830 发表于 2018-4-29 19:19 | 只看该作者
方便加下你qq吗?我想看原格式的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表