stm89将从DHT11上获取到的数据,显示到数码管上的代码
时间: 2024-02-12 18:08:07 浏览: 124
下面是基于STM89单片机从DHT11获取数据并显示在数码管上的代码,仅供参考:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit DHT11=P0^0;
uchar code table[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //共阴数码管0~9及字母A~F的编码表
uchar rh_data_H,rh_data_L,temp_data_H,temp_data_L,checkdata;
uchar flag; //标志位,用于切换读取湿度和温度数据
void delay(uint z) //延时函数,z为延时时间
{
uint x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display(uchar num) //数码管显示函数
{
uchar i;
LSA=1;LSB=1;LSC=1;
P0=table[num]; //在P0口输出相应的LED段码
for(i=0;i<100;i++); //延时一段时间,防止闪烁
}
void t0() interrupt 1 //定时器0中断服务程序,用于触发DHT11的数据传输
{
TH0=(65536-1000)/256; //计时1ms
TL0=(65536-1000)%256;
flag=1; //标志位置1
}
void main()
{
uchar i;
TMOD=0x01; //定时器0工作模式1
TH0=(65536-1000)/256; //计时1ms
TL0=(65536-1000)%256;
EA=1; //开放总中断
ET0=1; //定时器0中断
TR0=1; //启动定时器0
while(1)
{
if(flag==1)
{
flag=0; //标志位清零
if(DHT11==0) //判断DHT11是否应答
{
delay(30); //延时30us,等待DHT11的应答信号结束
if(DHT11==1) //判断DHT11应答信号的结束位
{
RH_data_H=0;RH_data_L=0;Temp_data_H=0;Temp_data_L=0;checkdata=0;
for(i=0;i<8;i++) //循环读取湿度数据的高八位、低八位、校验位、温度数据的高八位、低八位
{
while(DHT11==0); //等待DHT11的一个时间周期结束
delay(5); //延时5us,等待数据位开始
if(DHT11==1) //判断数据位是0还是1
{
switch(i) //根据i的值分别读取湿度数据的高八位、低八位、校验位、温度数据的高八位、低八位
{
case 0:RH_data_H|=0x80;break; //以二进制形式将数据存储到相应的变量中
case 1:RH_data_L|=0x80;break;
case 2:checkdata|=0x80;break;
case 3:Temp_data_H|=0x80;break;
case 4:Temp_data_L|=0x80;break;
}
}
while(DHT11==1); //等待数据位结束
}
if(checkdata==RH_data_H+RH_data_L+Temp_data_H+Temp_data_L) //判断校验位是否正确
{
display(Temp_data_L); //将温度数据的低八位显示在数码管上
}
}
}
}
}
}
```
阅读全文