打印
[国产单片机]

am2303温湿度传感器程序有点疑问请大神指点

[复制链接]
1130|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ordinaryboy|  楼主 | 2013-8-13 23:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序是我参考官方的说明书(官方的使用说明书在百度文库有),根据时序图写的,本来出来那时非常happy!结果放了两天再去单片机运行加载我的主体程序(结合si4432无线报火警项目),发现程序竟然奇葩的在51运行不出来,再次回头单运行温湿度程序结果伤了!!!求大神答疑!!!!!!! 截取am2303.c文件,本来是在12864显示的
#include<reg52.h>
#include"am2303.h"
#include"suidao.h"

//extern DataPort;
bit Flag_sign = 0;          //温度正负符号
unsigned char T_H,T_L,H_H,H_L,Check_data;  //温度高8位,温度低8位,湿度高8位,湿度低8位,校验位
unsigned int Temperature,Humidity;         //温度,湿度
unsigned char tab[6]={0x00,0x00,0x00,0x00,0x00,0x00};//存储温湿度共6位数据, 显示在12864为  湿度 xx.x%   温度 +xx.xC


/*******************初始化******************/
void Am2303_init()
{
  delay_ms(2500);                 //响应主机起始信号
  SDA = 0;
delay_ms(1);        //拉低延时800us
  SDA = 1;                   +
  delay_us(3);  // 释放总线  20us以上
             //传感器响应信号,拉低80us,再拉高80us   
while(!SDA);          // if(!SDA){delay();delay();delay();delay();} LED1 =0;程序会卡在这,原因初步分析是与51单总线启动时启动不了,但是不知道为何会
                                                                                       这样,本来就运行出来过,即使有事卡过来了,但是不会出正确数据
   while(SDA);
}
/*********************读8位0/1的位数据***********/
unsigned char  Am2303_read()
{
   unsigned char i,dat=0,temp;
   for(i = 0; i<8; i++)
      {
          while(!SDA);                                
                delay_us(4); //延时时间为26us~70us
                if(SDA)
                  temp = 1;        
                  else         
                    temp = 0;                                             
                  dat = (dat <<= 1)|temp;                  
          }
         
          return dat;
            
}
/**************读40位的数据***************/
void Am2303_read_temp()                        
  {
    Am2303_init();
           
    H_H = Am2303_read();         
        H_L = Am2303_read();           
        T_H = Am2303_read();
        T_L = Am2303_read();
        Check_data = Am2303_read();         
        while(!SDA);//等待低电平结束
                 
        SDA = 1;                //最后将总线拉高
        
  }           
/********************转换******************/
void Am2303_deal()
{
           unsigned char         dat;
         dat = H_H + H_L + T_H + T_L;
         if(dat == Check_data)
                  {
                    //  Temperature = T_H;           // 处理温度        两种处理方法任选
                        //  Temperature <<= 8;
                          //Temperature |= T_L;
                  
                   Temperature = T_H*256 + T_L;
                          if(Temperature & 0x8000)        //判断温度为负        
                                  {
                                     Flag_sign = 1;          //温度为负的符号标志位
                                     Temperature &=  0x7fff;                     
                                  }
                      tab[0] = Temperature/100 +0x30;           //百位
                          tab[1] = Temperature%100/10 + 0x30;         //十位
                          tab[2] = Temperature%10 + 0x30;                //个位
                     
                          Humidity = H_H;                //处理湿度
                          Humidity <<= 8;
                          Humidity |=  H_L;
                          tab[3] = Humidity/100 +0x30;           //百位
                          tab[4] = Humidity%100/10 + 0x30;         //十位
                          tab[5] = Humidity%10 + 0x30;                //个位
                  }
         H_H = H_L = T_H = T_L = 0;//处理错误数据
}

相关帖子

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

本版积分规则

1

主题

1

帖子

0

粉丝