利用ADC0809模块转化MQ-2数据 然后反馈回来的数据无论输入5V还是接地 数据都一样 求求各位大神帮忙看下 谢谢
#include <reg52.h>
#include <intrins.h>
#include <stdio.h>
void ConfigUART (unsigned int baud);
#define adc0809_data P0 //单片机P0接模块D0~D7引脚
sbit ST = 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^4; //单片机P2.6接模块A引脚
//unsigned char Disp[]="0123456789"; //使用字符串保存数字0~9所对应的ASCLL码
unsigned char AD_DATA[2]; //保存IN0通道转换后的数据
float a,b;
unsigned char i;
void ConfigUART (unsigned int baud)
{
SCON = 0x50;
//TMOD &= 0X0F;
TMOD |= 0x20;
TH1 = 256 - (11059200/12/32) / baud;
TL1 = TH1;
ET1 = 0;
TR1 = 1;
ES = 1;
//TR1 = 1;
}
void time0()
{
TMOD|=0x01;
TH0=216; //利用T0中断产生CLK信号
TL0=216;
TR0=1; //启动定时器T0
ET0=1;
//ST=0;
//OE=0;
// EA = 1;
}
void UART_T (unsigned char UART_data)//定义串口发送数据变量
{
SBUF = UART_data; //将接收的数据发送回去
while(TI == 0); //检查发送中断标志位
TI = 0; //令发送中断标志位为0(软件清零)
}
void UART_TC (unsigned char *str)
{
while(*str != '\0') //检查是否发送完毕
{
UART_T(*str); //发送
*str++; //指针指向下一个字符
}
*str = 0; //发送完毕后指针归零
}
char putchar(char c)
{
UART_T(c);
return c;
}
/***********************************
函数名: delayms()
功能: 延时 ms 毫秒
***********************************/
void delayms(unsigned int ms)
{
unsigned char j;
i=100;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/***********************************
函数名: AD()
功能: 启动AD转换将值储存于 AD_DATA[0]
***********************************/
void AD(void )
{
ST=0;
AA = 0; //设置为IN0输入
ST=1; //启动AD转换
delayms(10);
ST=0;
while(0==EOC);//等待转换结束
OE=1;
AD_DATA[0]=adc0809_data; //读取AD数据,数据范围为0-255
OE=0;
delayms(20);
ST=0;
AA = 1; //设置为IN1输入
ST=1; //启动AD转换
delayms(10);
ST=0;
while(0==EOC);//等待转换结束
OE=1;
AD_DATA[1]=adc0809_data; //读取AD数据,数据范围为0-255
OE=0;
delayms(20);
/* if (adc0809_data>=251)
{
adc0809_data=250;
}*/
}
/***********************************
函数名: t0()
功能: 产生ADC0809CLK所需要的时钟
***********************************/
/*void t0(void) interrupt 1 using 0
{
CLK=~CLK;
}*/
/***********************************
函数名: Conut()
功能: 将AD_DATA[0]的各位拆分以方便
***********************************/
void Conut(void)
{
/*a[0]=AD_DATA[0]/100;
a[1]=AD_DATA[0]/10%10;
a[2]=AD_DATA[0]%10;
b[0]=AD_DATA[1]/100;
b[1]=AD_DATA[1]/10%10;
b[2]=AD_DATA[1]%10;*/
a = AD_DATA[0]/250;
b = AD_DATA[1]/250;
}
void main()
{
ST=0;
OE=0;
ConfigUART(9600);
time0();
// ConfigUART();
//EA=1; //开总中断
// TMOD=0x02; //设定定时器 T0工作方式
/* TH0=216; //利用T0中断产生CLK信号
TL0=216;
TR0=1; //启动定时器T0
ET0=1;
//ST=0;
//OE=0;
EA = 1;*/
while(1)
{
AD();
Conut(); //计算
printf ("shfh");
printf ("%.2f",a);
printf ("%.2f",b);
delayms(10); //100MS
}
}
/***********************************
函数名: t0()
功能: 产生ADC0809CLK所需要的时钟
***********************************/
void t0(void) interrupt 1 using 0
{
TH0=216; //利用T0中断产生CLK信号
TL0=216;
CLK=~CLK;
}
void InterrupUART () interrupt 4
{
if (RI)
{
RI = 0;
SBUF = SBUF ;
}
if (TI)
{
TI =0;
}
}
|