网络上有很多实现DHT11的程序,单大多都是89c52的。而有关stc12c5a60s2的很少。
本人是新手一枚,在写关于stc12串口接收dht11数据时,发现接收到的都是0。
这是为什么呢?在网上查了一堆资料后,明白是时序的原因。
stc12系列的处理速度比89c52的速度快,且我们写的延时函数所延时的时间与参数不成正比。需要示波器。
硬件:芯片:stc12c5a60s2
晶振:110592mhz
部分代码:
main.c中:
DHT11数据读取 串口发送 波特率9600 STC12C5A60S2
/**************************************************/
#include
#include "UART.H"
#include "DELAY.H"
#include "stdio.h"
#include
//-------相关参数定义区-----------
sbit TRH = P2^0;//温湿度传感器DHT11数据接入
//char str1[]={" "};
//char str2[]={" "};
int TH_temp,TL_temp,RH_temp,RL_temp,CK_temp,respond,com_data,temp;
//-------声明函数区--------------
void delay(unsigned int i);
void delay_ms(unsigned int i);
void Delay10u();
void Delay18ms(); //@11.0592MHz
char DHT11_rec_byte();
void DHT11_receive();
//-------主函数区----------
void main(void)
{
Uart1Init(); //初始化串口9600
DHT11_receive(); //温湿度读取
delay(100);
while(1)
{
// DHT11_receive(); //温湿度读取
// delay_ms(120);
// delay_ms(120);
DHT11_receive();
// delay_ms(1000);
// delay_ms(120);
printf("wendu:%dn",(int)TH_temp);
printf("shidu:%dn",(int)RH_temp);
delay(800);
}
}
//-------dht11函数区---------
char DHT11_rec_byte()
{
char i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
Delay10u();
Delay10u();
Delay10u();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/
//湿度读取子程序
//温度高8位== TH_data
//温度低8位== TL_data
//湿度高8位== RH_data
//湿度低8位== RL_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void DHT11_receive()
{
//主机拉低18ms
TRH=0;
Delay18ms();
TRH=1;
//DATA总线由上拉电阻拉高 主机延时50us
Delay10u();
Delay10u();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = DHT11_rec_byte();
RL_temp = DHT11_rec_byte();
TH_temp = DHT11_rec_byte();
TL_temp = DHT11_rec_byte();
CK_temp = DHT11_rec_byte();
TRH=1;
}
}
delay.c中:
#include
//---------延时函数区----------
void delay(unsigned int i)
{
while(i--);
}
void delay_ms(unsigned int i)
{
while(i--)
delay(90);
}
//---------DHT11函数区----------
void Delay10u()
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 24;
while (--i);
}
void Delay18ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 1;
j = 194;
k = 159;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
//实测可以运行,并接收到温湿度整数部分。
//本人新手,写的不好请轻喷
设计资源 培训 开发板 精华推荐
- OM13093: 面向LPC11C24的LPCXpresso板,带有CMSIS DAP硬件调试器
- TAR5S39 点稳压器(低压差稳压器)的典型应用
- LTC2916、1.8V、-5% 电源监视器
- 用于手机的 6-LED 白光 LED 驱动器
- 使用 Microchip Technology 的 TC9491A 的参考设计
- 千兆以太网交换机RTL8367N
- LTC2258IUJ-12、12 位、65Msps 超低功耗 1.8V ADC 的典型应用电路
- LT3091HDE 负输出电流监视器的典型应用
- DC1525A-A,基于 LTC2175-14、14 位、125Msps、1.8V 四路串行 ADC 的演示板
- MB3771供电系统异常状态检测典型应用电路(VCC=5V)