|
網(wǎng)絡(luò)上有很多實(shí)現(xiàn)DHT11的程序,單大多都是89c52的。而有關(guān)stc12c5a60s2的很少。
本人是新手一枚,在寫關(guān)于stc12串口接收dht11數(shù)據(jù)時(shí),發(fā)現(xiàn)接收到的都是0。
這是為什么呢?在網(wǎng)上查了一堆資料后,明白是時(shí)序的原因。
stc12系列的處理速度比89c52的速度快,且我們寫的延時(shí)函數(shù)所延時(shí)的時(shí)間與參數(shù)不成正比。需要示波器。
硬件:芯片:stc12c5a60s2
晶振:110592mhz
部分代碼:
main.c中:
DHT11數(shù)據(jù)讀取 串口發(fā)送 波特率9600 STC12C5A60S2
/**************************************************/
#include <reg51.h>
#include "UART.H"
#include "DELAY.H"
#include "stdio.h"
#include <INTRINS.H>
//-------相關(guān)參數(shù)定義區(qū)-----------
sbit TRH = P2^0;//溫濕度傳感器DHT11數(shù)據(jù)接入
//char str1[]={" "};
//char str2[]={" "};
int TH_temp,TL_temp,RH_temp,RL_temp,CK_temp,respond,com_data,temp;
//-------聲明函數(shù)區(qū)--------------
void delay(unsigned int i);
void delay_ms(unsigned int i);
void Delay10u();
void Delay18ms(); //@11.0592MHz
char DHT11_rec_byte();
void DHT11_receive();
//-------主函數(shù)區(qū)----------
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:%d\n",(int)TH_temp);
printf("shidu:%d\n",(int)RH_temp);
delay(800);
}
}
//-------dht11函數(shù)區(qū)---------
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
//校驗(yàn) 8位 == CK_data
//調(diào)用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void DHT11_receive()
{
//主機(jī)拉低18ms
TRH=0;
Delay18ms();
TRH=1;
//DATA總線由上拉電阻拉高 主機(jī)延時(shí)50us
Delay10u();
Delay10u();
//delay_us();delay_us();delay_us();delay_us();
//主機(jī)設(shè)為輸入 判斷從機(jī)響應(yīng)信號(hào)
TRH=1;
//判斷DHT11是否有低電平響應(yīng)信號(hào) 如不響應(yīng)則跳出,響應(yīng)則向下運(yùn)行
if(!TRH)
{
respond=2;
//判斷DHT11發(fā)出 80us 的低電平響應(yīng)信號(hào)是否結(jié)束
while((!TRH)&& respond++);
respond=2;
//判斷從機(jī)是否發(fā)出 80us 的高電平,如發(fā)出則進(jìn)入數(shù)據(jù)接收狀態(tài)
while(TRH && respond++);
//數(shù)據(jù)接收狀態(tài)
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 <INTRINS.H>
//---------延時(shí)函數(shù)區(qū)----------
void delay(unsigned int i)
{
while(i--);
}
void delay_ms(unsigned int i)
{
while(i--)
delay(90);
}
//---------DHT11函數(shù)區(qū)----------
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);
}
//實(shí)測可以運(yùn)行,并接收到溫濕度整數(shù)部分。
//本人新手,寫的不好請輕噴
|
評(píng)分
-
查看全部評(píng)分
|