51单片机湿度系统,用共阴数码管显示
时间: 2023-03-02 19:24:54 浏览: 110
51单片机湿度系统可以通过连接传感器检测湿度,然后将检测到的数值通过51单片机进行处理并控制共阴数码管进行显示。共阴数码管可以根据不同的电平输入来显示不同的数字或字母,通过控制不同的输入信号,可以在共阴数码管上显示湿度值。需要注意的是,在编写程序时要考虑到数码管的共阴极需要连接到51单片机的输出引脚,同时也需要考虑到输入输出的电平匹配问题。
相关问题
DHT11湿度温度四数码管显示μvision4代码实现
以下是DHT11湿度温度传感器和四数码管显示的μVision4代码实现:
```
#include <reg52.h>
#define DHT11_DATA P1_0
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P2^5;
unsigned char code table[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90
}; //共阴数码管0~9的编码
unsigned char RH,TEMP; //湿度和温度
unsigned char T_DATA_H,T_DATA_L,RH_DATA_H,RH_DATA_L,checkdata; //DHT11数据
void delay(unsigned int time) //延时函数
{
unsigned int i,j;
for (i=0;i<time;i++)
{
for (j=0;j<110;j++);
}
}
void delay_us(unsigned int time) //微秒延时函数
{
unsigned int i;
for (i=0;i<time;i++);
}
void start_work() //DHT11开始工作
{
unsigned char i;
DHT11_DATA=0; //主机将总线拉低至少18ms
delay(20);
DHT11_DATA=1; //发送起始信号,总线由上拉电阻拉高
delay_us(20); //主机延时20~40us
DHT11_DATA=0; //主机将总线拉低80us
delay_us(80);
DHT11_DATA=1; //主机将总线拉高,等待DHT11响应信号
while(DHT11_DATA);
while(!DHT11_DATA);
while(DHT11_DATA);
for (i=0;i<8;i++) //接收湿度整数部分数据
{
while(!DHT11_DATA);
delay_us(40);
RH_DATA_H<<=1;
RH_DATA_H|=DHT11_DATA;
while(DHT11_DATA);
}
for (i=0;i<8;i++) //接收湿度小数部分数据
{
while(!DHT11_DATA);
delay_us(40);
RH_DATA_L<<=1;
RH_DATA_L|=DHT11_DATA;
while(DHT11_DATA);
}
for (i=0;i<8;i++) //接收温度整数部分数据
{
while(!DHT11_DATA);
delay_us(40);
T_DATA_H<<=1;
T_DATA_H|=DHT11_DATA;
while(DHT11_DATA);
}
for (i=0;i<8;i++) //接收温度小数部分数据
{
while(!DHT11_DATA);
delay_us(40);
T_DATA_L<<=1;
T_DATA_L|=DHT11_DATA;
while(DHT11_DATA);
}
for (i=0;i<8;i++) //接收校验码
{
while(!DHT11_DATA);
delay_us(40);
checkdata<<=1;
checkdata|=DHT11_DATA;
while(DHT11_DATA);
}
}
void main()
{
unsigned char i;
while(1)
{
start_work(); //DHT11开始工作
RH=RH_DATA_H; //湿度整数部分
TEMP=T_DATA_H; //温度整数部分
LSA=0; //选中第一位数码管
P0=table[TEMP/10]; //写入温度整数位
delay(5);
LSA=1; //关闭第一位数码管
LSB=0; //选中第二位数码管
P0=table[TEMP%10]; //写入温度小数位
delay(5);
LSB=1; //关闭第二位数码管
LSC=0; //选中第三位数码管
P0=table[RH/10]; //写入湿度整数位
delay(5);
LSC=1; //关闭第三位数码管
LSA=0; //选中第四位数码管
P0=table[RH%10]; //写入湿度小数位
delay(5);
LSA=1; //关闭第四位数码管
}
}
```
注意事项:
1. 本代码中使用的是STC89C51单片机,如果使用其他型号的单片机需要修改对应的IO端口。
2. DHT11需要一定的时间来完成数据读取和校验,因此需要适当的延时,否则会出现读取错误。
3. 数码管显示的部分需要根据具体的电路连接进行修改。
使用51单片机驱动TM1668显示DHT11温湿度的简单代码程序
以下是使用51单片机驱动TM1668显示DHT11温湿度的简单代码程序:
```c
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit DHT11=P3^5;
sbit STB=P1^0;
sbit CLK=P1^1;
sbit DIO=P1^2;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71
}; //共阴数码管0~9,A~F的段码
void delay(uint z) //延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_byte(uchar dat) //写入一个字节
{
uchar i;
for(i=0;i<8;i++)
{
CLK=0;
if(dat&0x01) DIO=1;
else DIO=0;
dat>>=1;
CLK=1;
}
}
void write_com(uchar com) //写入命令
{
STB=0;
write_byte(com);
STB=1;
}
void write_data(uchar addr,uchar dat) //写入数据
{
write_com(0x44);
STB=0;
write_byte(0xc0|addr);
write_byte(dat);
STB=1;
}
void init() //初始化
{
write_com(0x88); //亮度全调
write_com(0x40); //点地址方式
write_com(0xc0); //从第一位开始显示
}
void display(uchar x,uchar y) //显示温度和湿度
{
uchar wendu,shidu;
write_data(y,table[x/10]); //显示十位
write_data(y+1,table[x%10]); //显示个位
write_data(y+2,0x38); //显示小数点
write_data(y+3,table[shidu/10]); //显示十位
write_data(y+4,table[shidu%10]); //显示个位
}
void main()
{
uchar h,l,check;
init();
while(1)
{
DHT11=1;
delay(1);
DHT11=0; //起始信号
delay(18);
DHT11=1;
delay(1);
if(!DHT11) //判断DHT11响应信号是否存在
{
while(!DHT11);
while(DHT11);
h=0;
l=0;
h|=DHT11<<7;
h|=DHT11<<6;
h|=DHT11<<5;
h|=DHT11<<4;
h|=DHT11<<3;
h|=DHT11<<2;
h|=DHT11<<1;
h|=DHT11;
l|=DHT11<<7;
l|=DHT11<<6;
l|=DHT11<<5;
l|=DHT11<<4;
l|=DHT11<<3;
l|=DHT11<<2;
l|=DHT11<<1;
l|=DHT11;
check=0;
check|=DHT11<<7;
check|=DHT11<<6;
check|=DHT11<<5;
check|=DHT11<<4;
check|=DHT11<<3;
check|=DHT11<<2;
check|=DHT11<<1;
check|=DHT11;
if(h+l==check) display(h,l); //判断数据是否正确
}
}
}
```
请注意,上述代码仅供参考,实际使用时需要根据具体硬件和软件环境进行适当修改。
阅读全文