单片机MQ-2烟雾检测+ADC0809 AD转换+lcd1602显示程序
2019-11-11 来源:51hei
单片机源程序如下:
/*============================================================
//
//程序编写:刘先生
接线:D0--D7接P0.0-P0.7
ST---P2.3
EOC--P2.2
OE---P2.1
CLK--P2.0
本程序源码只供学习参考,不得应用于商业用途,如有需要请联系作者。
[注:使用12M或11.0592M晶振,实测使用11.0592M]
=============================================================*/
#include #include #include 'lcd.h' #define adc0809_data P0 //单片机P0接模块D0~D7引脚 sbit STR = P2^3; //单片机P2.3接模块STR引脚, 启动转换信号 sbit EOC = P2^2; //单片机P2.2接模块EOC, 转换结束信号,高电平有效 sbit OE = P2^1; //单片机P2.1接模块OE,输出允许信号,高电平有效 sbit CLK = P2^0; //单片机P2.0接CLK ,ADC0809时钟,输入50-800KHZ的频率 //一般选用500K //将短接片去掉开启位选功能,否则默认IN0为输入引脚 sbit AA = P2^6; //单片机P2.6接模块A引脚 sbit BB = P2^5; //单片机P2.6接模块B引脚 sbit CC = P2^4; //单片机P2.6接模块C引脚 unsigned char AD_DATA[1]; //保存IN0通道转换后的数据 unsigned char disbuff[4] = { 0,0,0,0,}; unsigned char Disp[]='0123456789'; //使用字符串保存数字0~9所对应的ASCLL码 unsigned char I_Disp[]='Smoke_C : '; //初始显示值 unsigned char i; /*********************************** 函数名: AD() 功能: 启动AD转换将值储存于 AD_DATA[0] ***********************************/ void AD(void ) { STR=0; STR=1; //启动AD转换 STR=0; while(0==EOC);//等待转换结束 OE=1; AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255 OE=0; } /*********************************** 函数名: t0() 功能: 产生ADC0809CLK所需要的时钟 ***********************************/ void t0(void) interrupt 1 using 0 { CLK=~CLK; } /*********************************** 函数名: Conut() 功能: 将AD_DATA[0]的各位拆分以方便lcd显示 ***********************************/ void Conut(void) { disbuff[0]=AD_DATA[0]/100; disbuff[1]=AD_DATA[0]/10%10; disbuff[2]=AD_DATA[0]%10; } /*********************************** 函数名: delayms() 功能: 延时 ms 毫秒 ***********************************/ void delayms(unsigned int ms) { unsigned char j; i=100; for(;ms;ms--) { while(--i) { j=10; while(--j); } } } /*********************************** 函数名: LcdDisplay() 功能: 用lcd显示数组disbuff[]中的值 ***********************************/ void LcdDisplay(void) { LcdWriteCom(0x0b+0x80); for(i=0;i<3;i++) { LcdWriteData(Disp[disbuff[i]]); } } /*********************************** 函数名: Analog_IO_Sel() 参数说明: m 的值对应ADC0809芯片上模拟输入的IO 功能: 确定模拟输入位选 ***********************************/ void Analog_IO_Sel(unsigned char m) { switch(m) { case 0 : CC = 0; BB = 0; AA = 0; break; case 1 : CC = 0; BB = 0; AA = 1; break; case 2 : CC = 0; BB = 1; AA = 0; break; case 3 : CC = 0; BB = 1; AA = 1; break; case 4 : CC = 1; BB = 0; AA = 0; break; case 5 : CC = 1; BB = 0; AA = 1; break; case 6 : CC = 1; BB = 1; AA = 0; break; case 7 : CC = 1; BB = 1; AA = 1; break; } } void main() { EA=1; //开总中断 TMOD=0x02; //设定定时器 T0工作方式 TH0=216; //利用T0中断产生CLK信号 TL0=216; TR0=1; //启动定时器T0 ET0=1; STR=0; OE=0; Analog_IO_Sel(0); //设置为IN0输入 LcdInit(); for(i=0;i<10;i++) //显示初始值 { LcdWriteData(I_Disp[i]); } while(1) { AD(); Conut(); //计算 LcdDisplay(); //lcd显示 delayms(10); //10MS } }