标题:
我在51单片机上面用DHT11发送串口数据,但是数据接收不到
[打印本页]
作者:
captaine
时间:
2022-5-31 21:15
标题:
我在51单片机上面用DHT11发送串口数据,但是数据接收不到
使用另一个12板子,12MHZ,可以接收到数据,但是会出现乱码(这个板子的串口可能有问题)
单片机源程序如下:
/********************************************************************
实现功能:DHT11温湿度采集串口显示
使用芯片:STC12C5A60S2
晶振:11.059MHZ
波特率:9600
编译环境:Keil
*********************************************************************/
#include <STC12C5A60S2.H>
#include "intrins.h"
#include "delay.h"
#include "IO.h"
#define u8 unsigned char
#define u16 unsigned int
#define JUDGE 30 //用于判断通信的0和1,与单片机速度和晶振频率有关
u8 p[15];
u8 dat_r[5]; //用于存放从DHT11读取到的数值
void UartInit(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8???,?????
AUXR |= 0x40; //?????1T??
AUXR &= 0xFE; //??1?????1???????
TMOD &= 0x0F; //???????
TL1 = 0xE0; //???????
TH1 = 0xFE; //???????
ET1 = 0; //?????%d??
TR1 = 1; //???1????
}
void SendDataByUart1(u8 *a)//发送字符串
{
while(*a!='\0')
{
SBUF = *a++;
while(TI==0);
TI = 0;
}
}
char GetData (void)
{
u8 i,j; //for循环变量
u8 t; //超时判断
u8 dat8=0; //一次读取的8位数据,需要读5次
DATA = 0; //主机发起始信号
NDelay1ms(20); //主机拉低总线至少18ms
DATA = 1; //主机拉高总线20~40us
Delay30us();
t = 80; //设置超时等待时间
while(DATA && t--); //等待DHT11拉低总线
if(t == 0) //超时
{
DATA = 1;
return -1; //通信错误退出,返回错误信号:-1
}
//等80us响应信号
t = 250; //设置超时等待时间
while(!DATA && t--); //等待DHT11拉高总线
if(t == 0) //超时
{
DATA = 1;
return -2; //通信错误退出,返回错误信号:-2
}
//等80us响应信号
t = 250; //设置超时等待时间
while(DATA && t--); //等待DHT11拉低总线
if(t == 0) //超时
{
DATA = 1;
return -3; //通信错误退出,返回错误信号:-3
}
for(j=0; j<5; j++) //5次读取
{
for(i=0; i<8; i++) //1次8个位
{
//等待50us开始时隙
t = 150; //设置超时等待时间
while(!DATA && t--); //等待DHT11拉高总线
if(t == 0) //超时
{
DATA = 1;
return -4; //通信错误退出,返回错误信号:-4
}
t = 0; //记录时间清零
while(DATA && ++t); //等待并记录高电平持续时间
dat8 <<= 1;
if(t > JUDGE) //高电平持续时间较长(70us)
dat8 += 1; //传输值为1
//else dat8 += 0;
}
dat_r[j] = dat8;
}
Delay30us(); //等待DHT11拉低50us
Delay30us();
DATA = 1; //结束,拉高总线
return 0; //返回成功信号
}
char Check(void)
{
u8 i; //for循环变量
u16 chk=0; //校验和
for(i=0; i<4; i++)
chk += dat_r[i]; //累加
if((u8)chk != dat_r[4]) //比对
return -1; //返回错误信号:-1
else
return 0; //返回正确信号:0
}
void SendOutDH11Str(void)
{
char i;
u8 HD11_str[11];//发送的数据
u8 RH,RL,TH,TL,revise;
i = GetData(); //读数据
if(i != 0) //有错误
{
//UART_T(-i); //返回错误值
return; //重新开始
}
i = Check(); //数据校验
if(i != 0) //有错误
{
//UART_T(-i); //返回错误值
return; //重新开始
}
RH = dat_r[0];//湿度整数
RL = dat_r[1];//湿度小数(根据数据手册,DHT11小数部分一直是0没用)
TH = dat_r[2];//温度整数
TL = dat_r[3];//温度小数(根据数据手册,DHT11小数部分一直是0没用)
revise = dat_r[4];//校验值
//数据处理
HD11_str[0]=RH/10+'0';
HD11_str[1]=(RH%10)+'0';
HD11_str[2]='%';
HD11_str[3]='R';
HD11_str[4]='H';
HD11_str[5]=' ';
HD11_str[6]=' ';
HD11_str[7]=(TH/10)+'0';
HD11_str[8]=(TH%10)+'0';
HD11_str[9]='^';
HD11_str[10]='C';
SendDataByUart1(HD11_str);
NDelay1ms(1000); //经测试,两次连读要至少延时80ms
}
void main(void)
{
Uart1_Init();
IO_Init();
EA=1;
while(1)
{
SendOutDH11Str();
}
}
void Uart1() interrupt 4 using 1
{
if(TI)
{
TI=0;
}
if(RI)
{
RI=0;
}
}
复制代码
DHT11_stc12.zip
(79.04 KB, 下载次数: 9)
2022-5-31 21:12 上传
点击文件名下载附件
作者:
人人学会单片机
时间:
2022-6-1 08:55
串口代码 供参考
http://www.51hei.com/bbs/dpj-201660-1.html
http://www.51hei.com/bbs/dpj-214747-1.html
作者:
lkc8210
时间:
2022-6-1 10:28
你SendDataByUart1的代码显然在跟中断拼速度
从结果来看
11.0592Mhz 是中断比较快,程序在39行死循环了
参考STC-ISP的例程,加个Busy来检测比较好
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1