打印
[总线接口]

CO2浓度传感器相关资料

[复制链接]
1260|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
vellerzheng|  楼主 | 2014-8-10 19:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     各位高手请指点下,您的指导是他人前进的不竭动力。为什么我用51单片机发送5个字节的命令,传感器没有返回5个值,而我不用51单片机,直接用串口调试助手给CO2浓度传感器发送相同的5个字节的命令,CO2浓度传感器有5个字节的值返回过来呢?而且我用串口给这个51单片机发送5个命令也可以接收,并显示这5个字节数据处理后的数值。  如果能帮我解决这个问题,我将表示最诚挚的感谢。      
   //通信协议如下:波特率19200,8位数据位,一位停止位
     
#define N 5     //接收字节数
void uart_init();
void delay_ms(uint z);
uchar flag,i;                                                       //删除无用变量                           
uchar code table[]={0xff,0xfe,0x02,0x02,0x03};            //发送5个人字节的命令
uchar table1[N];                                              //接收缓存数组
uchar j=0;   
uint Co2_Val,CO2_RANGE=5000;      
unsigned char num[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                                 'B', 'C', 'D', 'E', 'F' };


void LCD_INIT();
void Data_Decode(uchar* ptr);
void write_data(uchar data1);   //lcd1602显示
void write_com(uchar command);
void write_char(uchar line, uchar num, char a);

main()
{        
        uchar *p;
               uint Co2_hi,n;
         uart_init();
                LCD_INIT();    //
         while(1)
         {

                  ES=0;
              for(i=0;i<5;i++)
              {
                    SBUF=table[i];
                    while(!TI);
                   TI=0;                 
              }               
               ES=1;

                  delay_ms(500);         
        
                                         
                if(flag==1)
                 {
                                ES=0;
                                    p=table1;
                                Data_Decode(p);             //接收到的数据处理函数
                                Co2_hi=Co2_Val/1000;
                                  if(Co2_hi!=0)
                                  {write_char(0,1,num[Co2_hi]);}
                                 write_char(0,2,num[Co2_Val/100%10]);
                                 write_char(0,3,num[Co2_Val/10%10]);
                                 write_char(0,4,num[Co2_Val%10]);

                                 ES=1;        
                                 flag=0;
                     }   
                    delay_ms(50);            
         }
}









void uart_init()          //晶振11.0592,波特率19200
{  
    TMOD = 0x20;
    SCON = 0x50;  //  SM0=0;  SM1=1;
    REN=1;
    TH1 = 0xFD;
    TL1 = 0xFD;
    PCON=0x80;            //波特率加倍
    EA = 1;
    ES = 1;
    TR1 = 1;      
}
void ser()interrupt 4
{                 
             RI=0;
             table1[j++]=SBUF;                               //存数据到接收缓存
             if(j==N)                                         //数组满时,允许处理
            {  flag=1;
                        j=0;
                        }
}




/****************************************
名称:Data_Decode
功能: 数据解码
输入:
输出:
****************************************/
void Data_Decode(uchar* ptr)
{
   unsigned long  temp = 0;
    //FF FA 02 02 50
    temp = ptr[3];
    temp <<= 8;
    temp |= ptr[4];


    if(temp >= CO2_RANGE)    //限制最大值
    {
        temp = CO2_RANGE - 1;
    }

    Co2_Val = temp;

    //  传感器通信指示:
    //----------------------------------------------------------------
//   Time_REF.CO2_counter = 0; //传感器正常采样时间累计清零
//   LP_Flash;
}

相关帖子

沙发
zhangmangui| | 2014-8-10 23:28 | 只看该作者
直接用串口调试助手发送的话     上位机输出的串口线和CO2是怎么连接的  
单片机输出经过MAX232等芯片后才会与上位机的串口一样了

使用特权

评论回复
板凳
vellerzheng|  楼主 | 2014-8-11 10:58 | 只看该作者
zhangmangui 发表于 2014-8-10 23:28
直接用串口调试助手发送的话     上位机输出的串口线和CO2是怎么连接的  
单片机输出经过MAX232等芯片后才 ...

上位机输出的串口线到 MAX232再把CO2传感器与MAX232的T1in和R1out管脚相连,就有数据返回。而单片机输出的用P3.0,P3.1管脚直接与CO2传感器相连的。这样不行吗?为什么单片机发送的串口信号也要用MAX232转换再发送给CO2传感器呢?

使用特权

评论回复
地板
zhangmangui| | 2014-8-11 21:58 | 只看该作者
vellerzheng 发表于 2014-8-11 10:58
上位机输出的串口线到 MAX232再把CO2传感器与MAX232的T1in和R1out管脚相连,就有数据返回。而单片机输出 ...

上位机输出的串口线到 MAX232再把CO2传感器与MAX232的T1in和R1out管脚相连
这样链接可以的话    直接接口单片机的P3.0和P3.1应该是可以的  
那你就将两个单片机的IO短接到一起   试试单片机能不能自发自收呢

使用特权

评论回复
5
vellerzheng|  楼主 | 2014-8-18 19:46 | 只看该作者
zhangmangui 发表于 2014-8-11 21:58
上位机输出的串口线到 MAX232再把CO2传感器与MAX232的T1in和R1out管脚相连
这样链接可以的话    直接接口 ...

我加了两块Max232,问题解决了,谢谢你了。

使用特权

评论回复
6
zhangmangui| | 2014-8-18 21:28 | 只看该作者
vellerzheng 发表于 2014-8-18 19:46
我加了两块Max232,问题解决了,谢谢你了。

好的   知道了  谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝