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