|
最近一直在调试DHT11,知道对时序要求比较高,延时函数都是用示波器测量的。 液晶是用的12864,就不贴程序了,一直显示的为0,求各位大虾帮忙解决一下。
MCU:atmega16 内部晶振:1MHz
void delay_10us() //10us
{
NOP();
}
void delay_20us()
{
NOP(); //10us
NOP(); //12us
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP();
NOP(); //20us
}
void delay_nus(uint i)
{
while(--i);
}
void delay_ms(uint ms)
{
uint i;
while(ms--)
{
for(i=144;i>0;i--);
}
}
/*******DHT11的引脚控制*************/
#define DHT_OUT DDRA|= BIT(3)
#define DHT_IN DDRA&=~BIT(3)
#define DHT_1 PORTA|= BIT(3)
#define DHT_0 PORTA&=~BIT(3)
#define DHT_R (PORTA& BIT(3))
/******变量的定义*******/
uchar RH_data_H,TM_data_H,RH_data_L,TM_data_L,Check_Data,temp;
uchar data[5]; //数据缓冲数组
/*************************************************************
函数名称:Receive_Data
功能:接受数据
************************************************************/
void Receive_Data()
{
uchar i,j,m;
DHT_IN;
for(i=0;i<5;i++) //五字节的数据
{
data[i]=0x00;
for(j=0;j<8;j++)
{
while(!DHT_R); //等待高电平的到来,当高电平到来后便开始计时
delay_nus(5); //这边的50us是低电平时隙开始
//延时50us后看还是不是高电平,如果是高那么这位就为1,否则为0
//delay_nus(5);
//上面延时了50us,此时引脚数据寄存器还是高电平的话,表明接受到的是1
if(DHT_R) //否则为0
{
data[i]|=BIT(7-j); //由此可知,先读取的高位,此命令只是写入1的位,data[i] = 0X00,所以没写的还是0
while(DHT_R); //如果是低电平则表示下一位的开始
}
}
}
}
/***********************************************
函数名称:Ask_Reply_Do
功能:主机发出信号,DHT11回复信号,并且处理接收到的数据
**************************************************/
void Ask_Reply_Do()
{
//主机拉低18ms
uchar i;
DHT_OUT; //DATA_OUT;
DHT_0; //PORT_CLR;
delay_ms(50);
DHT_1; //PORT_SET
//总线由上拉电阻拉高 主机延时20us
delay_nus(2);
DHT_IN; //DATA_IN;
// delay_10us(); //主机设为输入 判断从机响应信号
if(!DHT_R) // 判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
{
//判断从机是否发出 80us 的低电平响应信号是否结束
while(!DHT_R); //等待从机把电平拉高
while(DHT_R); //从机是否发出了高电平,是的话就跳出继续
//判断从机是否发出80us的高电平,如发出则进入数据接收状态
Receive_Data();
DHT_OUT;
DHT_1; //PORT_SET;
//数据校验
temp=(data[0]+data[1]+data[2]+data[3]);
if(data[4]==temp)
{
RH_data_H=data[0]; //只要整数部分
RH_data_L=data[1];
TM_data_H=data[2];
TM_data_L=data[3];
Check_Data=data[4];
}
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|