找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么CO传感器MQ-7检测的数据不能传输到单片机进而在液晶屏上显示呢?

[复制链接]
跳转到指定楼层
楼主
板子是自己焊接的,1602调试可用,图片中与四根杜邦线相连的器件就是MQ-7,芯片与ADC0832的0通道连接,单片机进行数据处理后将数据显示在液晶屏1602上。程序是直接烧入在芯片中,所以下载器只接了正负极,给板子供电。

问题是MQ-7可以检测气体,但是数据传不到单片机,无法进一步处理,是硬件问题还是软件问题呢,请给出具体解决办法吧,非常感谢了,以下是所有程序


主函数部分






  1. #include <reg52.h>
  2. #include <intrins.h>  
  3. #include <math.h>   
  4. #include <stdio.h>
  5. #include "ad08.h"
  6. #include "l1602.h"
  7. #define uint unsigned int
  8. #define uchar unsigned char


  9. uchar qt;

  10. void LCD_init(void);
  11. unsigned int Adc0832(unsigned char channel);
  12. void LCD_disp_char(uchar x,uchar y,uchar dat);//??????????????,X(0-15),y(1-2)  
  13. void LCD_disp_str(uchar x,uchar y,uchar *str);
  14. void main()
  15. {

  16.         LCD_init();           
  17.          

  18.         while(1)
  19.         {
  20.           qt=Adc0832(0);
  21.          qt = qt*19.607843; //转换为实际电压便于显示
  22.    qt=qt/1000%10;
  23.          LCD_disp_str(9,0,"Q:");
  24.          LCD_disp_char(11,0,qt/100+0x30);
  25.          LCD_disp_char(12,0,qt%100/10+0x30);
  26.          LCD_disp_char(13,0,qt%100%10+0x30);
  27.                  LCD_disp_str(14,0,"p");

  28.         }
  29. }
复制代码
ADC0832部分





  1. #include <reg52.h>
  2. #include <intrins.h>  
  3. #include <math.h>   
  4. #include <stdio.h>
  5. #include "ad08.h"

  6. unsigned int Adc0832(unsigned char channel)
  7. {
  8.         uchar i=0;
  9.         uchar j;
  10.         long dat=0;
  11.         uchar ndat=0;
  12.         uchar  Vot=0;

  13.         if(channel==0)channel=2;
  14.         if(channel==1)channel=3;
  15.         ADDI=1;
  16.         _nop_();
  17.         _nop_();
  18.         ADCS=0;//??CS?
  19.         _nop_();
  20.         _nop_();
  21.         ADCLK=1;//??CLK?
  22.         _nop_();
  23.         _nop_();
  24.         ADCLK=0;//拉低CLK端,形成下降沿1
  25.         _nop_();
  26.         _nop_();
  27.   ADCLK=0;
  28.         _nop_();
  29.         _nop_();       
  30.         ADCLK=1;//??CLK?
  31.         ADDI=channel&0x1;
  32.         _nop_();
  33.         _nop_();
  34.         ADCLK=0;//拉低CLK端,形成下降沿2
  35.         _nop_();
  36.         _nop_();
  37.         ADCLK=1;//??CLK?
  38.         ADDI=(channel>>1)&0x1;
  39.         _nop_();
  40.         _nop_();
  41.         ADCLK=0;//拉低CLK端,形成下降沿3
  42.         ADDI=1;//控制命令结束
  43.         _nop_();
  44.         _nop_();
  45.         dat=0;
  46.         for(i=0;i<8;i++)
  47.         {
  48.                 dat|=ADDO;//接收数据
  49.                 ADCLK=1;
  50.                 _nop_();
  51.                 _nop_();
  52.                 ADCLK=0;//形成一次时钟脉冲
  53.                 _nop_();
  54.                 _nop_();
  55.                 dat<<=1;
  56.                 if(i==7)dat|=ADDO;
  57.         }
  58.         for(i=0;i<8;i++)
  59.         {
  60.                 j=0;
  61.                 j=j|ADDO;//接收数据
  62.                 ADCLK=1;
  63.                 _nop_();
  64.                 _nop_();
  65.                 ADCLK=0;//形成一次时钟脉冲
  66.                 _nop_();
  67.                 _nop_();
  68.                 j=j<<7;
  69.                 ndat=ndat|j;
  70.                 if(i<7)ndat>>=1;
  71.         }
  72.         ADCS=1;//??CS?
  73.         ADCLK=0;//??CLK?
  74.         ADDO=1;//拉高数据端,回到初始状态
  75.         dat<<=8;
  76.         dat|=ndat;

  77.         return(dat);            //return ad data
  78. }
复制代码

ADC0832头文件





  1. #ifndef _L08_H
  2. #define _L08_H

  3. #include <reg52.h>

  4. #define uchar unsigned char
  5. #define uint unsigned int       
  6. sbit ADCS         =P1^2; //ADC0832 使能口
  7. sbit ADCLK  =P1^3; //ADC0832 时钟口
  8. sbit ADDI         =P1^4; //ADC0832                数据口
  9. sbit ADDO         =P1^4;

  10. unsigned int Adc0832(unsigned char channel);


  11. #endif
复制代码

液晶1602部分





  1. #include <reg52.h>
  2. #include <intrins.h>  
  3. #include <math.h>   
  4. #include <stdio.h>
  5. #include "l1602.h"

  6. #define uchar unsigned char
  7. #define uint unsigned int

  8.        
  9. void delay_n10us(uint n)  //延时
  10. {                 
  11.         uint i;                    
  12.         for(i=n;i>0;i--)            
  13.          {         
  14.          nop_();_nop_();_nop_();_nop_();_nop_();_nop_();   
  15.          }
  16. }
  17. void LCD_init(void)
  18. {  
  19.         delay_n10us(10);  
  20.         LCD_write_command(0x38);//??8???,2?,5x7
  21.         delay_n10us(10);  LCD_write_command(0x0c);//???,???,???
  22.         delay_n10us(10);  LCD_write_command(0x06);//??????,?????
  23.         delay_n10us(10);  LCD_write_command(0x01);//??????  
  24.         delay_n10us(100);       //????,????,???n?10us
  25. }

  26. void LCD_write_command(uchar dat)
  27. {  
  28.         delay_n10us(10);  
  29.         LCD_RS=0;         //??
  30.         LCD_RW=0;         //??
  31.         LCD_E=1;          //??
  32.         LCD_DB=dat;  delay_n10us(10);  //????,??LCD1602?,?for??1???????????
  33.         LCD_E=0;  delay_n10us(10);  //????,??LCD1602?,?for??1???????????
  34. }

  35. void LCD_write_data(uchar dat)
  36. {  
  37.         delay_n10us(10);  
  38.         LCD_RS=1;          //??
  39.         LCD_RW=0;                   //??
  40.         LCD_E=1;           //??
  41.         LCD_DB=dat; delay_n10us(10);
  42.          LCD_E=0;  delay_n10us(10);
  43. }

  44. void LCD_disp_char(uchar x,uchar y,uchar dat)
  45. {   
  46.         uchar address;   
  47.         if(y==0)           
  48.         address=0x80+x;  
  49.         else           
  50.         address=0xc0+x;   
  51.         LCD_write_command(address);   
  52.         LCD_write_data(dat);
  53. }

  54. void LCD_disp_str(uchar x,uchar y,uchar *str)
  55. {   
  56.         uchar address;   
  57.         if(y==0)           
  58.         address=0x80+x;   
  59.         else           
  60.         address=0xc0+x;   
  61.         LCD_write_command(address);   
  62.         while(*str!='\0')   
  63.                 {      
  64.                 LCD_write_data(*str);
  65.                 str++;
  66.                 }
  67. }
复制代码

液晶头文件





  1. #ifndef _L1602_H
  2. #define _L1602_H

  3. #include <reg52.h>

  4. #define LCD_DB        P0


  5. #define uchar unsigned char
  6. sbit         LCD_RS=P2^7;   
  7. sbit         LCD_RW=P2^6;  
  8. sbit         LCD_E=P2^5;

  9. void LCD_init(void);                          //?????
  10. void LCD_write_command(uchar command);        //?????
  11. void LCD_write_data(uchar dat);               //?????  
  12. void LCD_disp_char(uchar x,uchar y,uchar dat);//??????????????,X(0-15),y(1-2)  
  13. void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602???????

  14. #endif
复制代码




请大家帮忙解决以下吧,比较着急用呢,多谢了






IMG_20180612_090258.jpg (4.8 MB, 下载次数: 39)

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

使用道具 举报

沙发
ID:330198 发表于 2018-6-12 11:11 | 只看该作者

uchar类型的qt范围0--255,我怀疑ADC0832是可以读数据的,就是你在转换的时候qt乘上一个浮点数在赋值给qt的时候数据会出错。最好再加个浮点数类型的中间变量。

评分

参与人数 1黑币 +80 收起 理由
admin + 80 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:316425 发表于 2018-6-12 12:11 | 只看该作者
zhanghyg 发表于 2018-6-12 11:11
uchar类型的qt范围0--255,我怀疑ADC0832是可以读数据的,就是你在转换的时候qt乘上一个浮点数在赋值给qt ...

我先试试,多谢了
回复

使用道具 举报

地板
ID:316425 发表于 2018-6-12 12:31 | 只看该作者
zhanghyg 发表于 2018-6-12 11:11
uchar类型的qt范围0--255,我怀疑ADC0832是可以读数据的,就是你在转换的时候qt乘上一个浮点数在赋值给qt ...

非常感谢,已经有读数了
回复

使用道具 举报

5#
ID:543049 发表于 2019-5-30 10:03 | 只看该作者
在吗,可以给我说一下电路图什么样子么?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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