微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 自写的奥松am2303温湿度传感器驱动程序,有问题,求大神.....

自写的奥松am2303温湿度传感器驱动程序,有问题,求大神.....

时间:10-02 整理:3721RD 点击:
这个程序是我参考官方的说明书(官方的使用说明书在百度文库有),根据时序图写的,本来出来那时非常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;//处理错误数据
}

小弟为本论坛新手,所以奖励方面就请见谅了!

为何没人回答了?急用了,求大神啊

这个论坛都是一群烂人,怎么会有人回答你 这些人都是要的是结果  成品  最好有人做出来过

上一篇:ARM core 介绍
下一篇:怎么找不到com口?

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top