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