找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MQ-2烟雾传感器的单片机程序问题

[复制链接]
跳转到指定楼层
楼主
ID:345583 发表于 2020-3-10 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 孤仙1233 于 2020-3-10 17:43 编辑

MQ-2烟雾传感器经ADC0809转换,反馈大概的浓度值,但是烧入后51开发板蜂鸣器一直响,请求大神们帮我看看    谢谢!


#include <reg52.h>  //器件配置文件
#include <intrins.h>
#include <stdio.h>
#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^6;  //单片机P2.6接模块A引脚
sbit BB = P2^5;  //单片机P2.6接模块B引脚
sbit CC = P2^4;  //单片机P2.6接模块C引脚
int k,j;
unsigned char AD_DATA[1]; //保存IN0通道转换后的数据
int a[2],b[2];

unsigned char i;

void InitUART(void)       //串口初始化
{

SCON = 0x50;
   TH1 = 0xfd;
  TL1 = TH1;
  TMOD |= 0x02;
  
  TR1 = 1;
TI = 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);
  }
}
}
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;
}
}
/***********************************
函数名:  AD()
功能:    启动AD转换将值储存于 AD_DATA[0]
***********************************/
void AD(void )
{
   ST=0;
Analog_IO_Sel(0);  //设置为IN0输入
   ST=1; //启动AD转换

   ST=0;  
   while(0==EOC);//等待转换结束
   OE=1;  
   AD_DATA[0]=P0; //读取AD数据,数据范围为0-255
   OE=0;
   delayms(100);
   ST=0;
Analog_IO_Sel(1);  //设置为IN1输入
   ST=1; //启动AD转换

   ST=0;  
   while(0==EOC);//等待转换结束
   OE=1;  
   AD_DATA[1]=P0; //读取AD数据,数据范围为0-255
   OE=0;
   delayms(100);
  if (adc0809_data>=251)
  {
     adc0809_data=250;
  }
}
/***********************************
函数名:  t0()
功能:    产生ADC0809CLK所需要的时钟
***********************************/
void t0(void) interrupt 1
{  
TH0=(65536-2)/256;   //重装计数初值
  TL0=(65536-2)%256;   //重装计数初值
   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;

k=a[0]*100+a[1]*10+a[2];
j=b[0]*100+b[1]*10+b[2];
}



void main()
{
    InitUART();
   CLK=0;
    TMOD|=0x01; //设定定时器 T0工作方式
    TH0=(65536-2)/256; //利用T0中断产生CLK信号
    TL0=(65536-2)%256;  
    TR0=1; //启动定时器T0
    ET0=1;
   
ES = 1;
EA=1; //开总中断
  //InitUART();
while(1)
   {
      AD();
         Conut();   //计算
     
   
    printf("%d",k);
      printf("%d",j);

   delayms(100);  //100MS  
   }  
}
/*void InterrupUART ()    interrupt 4
{
  if (RI)
  {
     RI = 0;
  SBUF = SBUF ;
  }
  if (TI)
   {
      TI =0;
   
   }
}*/

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:345583 发表于 2020-3-10 17:43 | 只看该作者
问题已找到
回复

使用道具 举报

板凳
ID:701939 发表于 2020-3-28 22:16 | 只看该作者

哪里出现问题能说说吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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