[国产单片机] am2303温湿度传感器程序有点疑问请大神指点

[复制链接]
1347|0
 楼主| ordinaryboy 发表于 2013-8-13 23:01 | 显示全部楼层 |阅读模式
这个程序是我参考官方的说明书(官方的使用说明书在百度文库有),根据时序图写的,本来出来那时非常happy!结果放了两天再去单片机运行加载我的主体程序(结合si4432无线报火警项目),发现程序竟然奇葩的在51运行不出来,再次回头单运行温湿度程序结果伤了!!!求大神答疑!!!!!!! 截取am2303.c文件,本来是在12864显示的
  1. #include<reg52.h>
  2. #include"am2303.h"
  3. #include"suidao.h"

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


  9. /*******************初始化******************/
  10. void Am2303_init()
  11. {
  12.   delay_ms(2500);                 //响应主机起始信号
  13.   SDA = 0;
  14. delay_ms(1);        //拉低延时800us
  15.   SDA = 1;                   +
  16.   delay_us(3);  // 释放总线  20us以上
  17.              //传感器响应信号,拉低80us,再拉高80us   
  18. while(!SDA);          // if(!SDA){delay();delay();delay();delay();} LED1 =0;程序会卡在这,原因初步分析是与51单总线启动时启动不了,但是不知道为何会
  19.                                                                                        这样,本来就运行出来过,即使有事卡过来了,但是不会出正确数据
  20.    while(SDA);
  21. }
  22. /*********************读8位0/1的位数据***********/
  23. unsigned char  Am2303_read()
  24. {
  25.    unsigned char i,dat=0,temp;
  26.    for(i = 0; i<8; i++)
  27.       {
  28.           while(!SDA);                                
  29.                 delay_us(4); //延时时间为26us~70us
  30.                 if(SDA)
  31.                   temp = 1;        
  32.                   else         
  33.                     temp = 0;                                             
  34.                   dat = (dat <<= 1)|temp;                  
  35.           }
  36.          
  37.           return dat;
  38.             
  39. }
  40. /**************读40位的数据***************/
  41. void Am2303_read_temp()                        
  42.   {
  43.     Am2303_init();
  44.            
  45.     H_H = Am2303_read();         
  46.         H_L = Am2303_read();           
  47.         T_H = Am2303_read();
  48.         T_L = Am2303_read();
  49.         Check_data = Am2303_read();         
  50.         while(!SDA);//等待低电平结束
  51.                  
  52.         SDA = 1;                //最后将总线拉高
  53.         
  54.   }           
  55. /********************转换******************/
  56. void Am2303_deal()
  57. {
  58.            unsigned char         dat;
  59.          dat = H_H + H_L + T_H + T_L;
  60.          if(dat == Check_data)
  61.                   {
  62.                     //  Temperature = T_H;           // 处理温度        两种处理方法任选
  63.                         //  Temperature <<= 8;
  64.                           //Temperature |= T_L;
  65.                   
  66.                    Temperature = T_H*256 + T_L;
  67.                           if(Temperature & 0x8000)        //判断温度为负        
  68.                                   {
  69.                                      Flag_sign = 1;          //温度为负的符号标志位
  70.                                      Temperature &=  0x7fff;                     
  71.                                   }
  72.                       tab[0] = Temperature/100 +0x30;           //百位
  73.                           tab[1] = Temperature%100/10 + 0x30;         //十位
  74.                           tab[2] = Temperature%10 + 0x30;                //个位
  75.                      
  76.                           Humidity = H_H;                //处理湿度
  77.                           Humidity <<= 8;
  78.                           Humidity |=  H_L;
  79.                           tab[3] = Humidity/100 +0x30;           //百位
  80.                           tab[4] = Humidity%100/10 + 0x30;         //十位
  81.                           tab[5] = Humidity%10 + 0x30;                //个位
  82.                   }
  83.          H_H = H_L = T_H = T_L = 0;//处理错误数据
  84. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部