51单片机c语言dht11,51单片机1602+dht11实时显示温度程序

/*-----------------------------------------------

硬件:单片机AT89C52、液晶1602、温湿传感器DHT11、晶振11.0592M

功能:实时显示周围环境温湿度,与所设温湿度区间不符立即蜂鸣报警,

具有报警消音功能,s1循环设置,s2加,s3减,s4报警消音

通讯连接:P0口与液晶1602通讯,P3.7口与温湿传感器DHT11通讯连接

------------------------------------------------*/

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit RS = P2^3;   //定义端口

sbit RW = P2^4;

sbit EN = P2^5;

sbit Data = P3^7;//定义数据线

sbit moshi=P2^6;   //模式切换

sbit INC=P2^7;     //加

sbit DEC=P2^0;     //减

sbit SPK=P3^6;     //蜂鸣报警

sbit XY=P2^1;           //蜂鸣报警消音

uchar rec_dat0[16];   //用于显示的接收数据数组

uchar rec_dat1[16];

uchar countRH=95,countRL=20,moshicount=0,n=0;//n为报警音乐节拍常数变量

uchar RH,RL,TH,TL;

char   countTH=50,countTL=0;

void xiaoyin();

unsigned char code music_tab[] ={

0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,

0x20, 0x40, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x10,

0x1C, 0x10, 0x18 , 0x40,

0x1C, 0x20, 0x20 , 0x20,

0x1C, 0x20, 0x18 , 0x20,

0x20, 0x80, 0xFF , 0x20,

0x30, 0x1C, 0x10 , 0x18,

0x20, 0x15, 0x20 , 0x1C,

0x20, 0x20, 0x20 , 0x26,

0x40, 0x20, 0x20 , 0x2B,

0x20, 0x26, 0x20 , 0x20,

0x20, 0x30, 0x80 , 0xFF,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x20, 0x1C , 0x10,

0x18, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x80,

0x20, 0x30, 0x1C , 0x10,

0x20, 0x10, 0x1C , 0x10,

0x20, 0x20, 0x26 , 0x20,

0x2B, 0x20, 0x30 , 0x20,

0x2B, 0x40, 0x20 , 0x15,

0x1F, 0x05, 0x20 , 0x10,

0x1C, 0x10, 0x20 , 0x20,

0x26, 0x20, 0x2B , 0x20,

0x30, 0x20, 0x2B , 0x40,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x20, 0x15 , 0x20,

0x1C, 0x20, 0x20 , 0x20,

0x26, 0x40, 0x20 , 0x20,

0x2B, 0x20, 0x26 , 0x20,

0x20, 0x20, 0x30 , 0x30,

0x20, 0x30, 0x1C , 0x10,

0x18, 0x40, 0x1C , 0x20,

0x20, 0x20, 0x26 , 0x40,

0x13, 0x60, 0x18 , 0x20,

0x15, 0x40, 0x13 , 0x40,

0x18, 0x80, 0x00

};

#define RS_CLR RS=0

#define RS_SET RS=1

#define RW_CLR RW=0

#define RW_SET RW=1

#define EN_CLR EN=0

#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------

uS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编,大致延时

长度如下 T=tx2+5 uS

------------------------------------------------*/

void DelayUs2x(unsigned int t)

{

while(--t);

}

/*------------------------------------------------

mS延时函数,含有输入参数 unsigned char t,无返回值

unsigned char 是定义无符号字符变量,其值的范围是

0~255 这里使用晶振12M,精确延时请使用汇编

------------------------------------------------*/

void DelayMs(unsigned char t)

{

while(t--)

{

//大致延时1mS

DelayUs2x(245);

DelayUs2x(245);

}

}

void delay (unsigned char m)   //控制频率延时

{

unsigned i=3*m;

while(--i);

}

/*------------------------------------------------

判忙函数

------------------------------------------------*/

bit LCD_Check_Busy(void)

{

DataPort= 0xFF;

RS_CLR;

RW_SET;

EN_CLR;

_nop_();

EN_SET;

return (bit)(DataPort & 0x80);

}

/*------------------------------------------------

写入命令函数

------------------------------------------------*/

void LCD_Write_Com(unsigned char com)

{

while(LCD_Check_Busy()); //忙则等待

RS_CLR;

RW_CLR;

EN_SET;

DataPort= com;

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入数据函数

------------------------------------------------*/

void LCD_Write_Data(unsigned char Data)

{

while(LCD_Check_Busy()); //忙则等待

RS_SET;

RW_CLR;

EN_SET;

DataPort= Data;

_nop_();

EN_CLR;

}

/*------------------------------------------------

写入字符函数

------------------------------------------------*/

void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data)

{

if (y == 1)

{

LCD_Write_Com(0x80 + x);

}

else

{

LCD_Write_Com(0xC0 + x);

}

LCD_Write_Data( Data);

}

/*------------------------------------------------

初始化函数

------------------------------------------------*/

void LCD_Init(void)

{

LCD_Write_Com(0x38);        //设置 8 位格式,2 行,5x7

LCD_Write_Com(0x0C);        //整体显示,关光标,不闪烁

LCD_Write_Com(0x06);        //写一个字符后地址指针加 1,设定输入方式,增量不移位

LCD_Write_Com(0x01); //清除屏幕显示

DelayMs(5);

}

//*******定时器初始化函数**********

void timerinit()         //采用中断0 控制节拍

{

TMOD=0x01;//设置定时器0为工作方式1

TH0=0xd8;

TL0=0xef;

EA=1; //开总中断

ET0=1;//开定时器0中断

}

//********************************

/*------------------------------------------------

DHT11延时函数

------------------------------------------------*/

void DHT11_delay_us(uchar n)//2微秒延时

{

while(--n);

}

void DHT11_delay_ms(uint z)//1毫秒延时

{

uint i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

/*------------------------------------------------

DHT11开始信号

------------------------------------------------*/

void DHT11_start()

{

Data=1;

DHT11_delay_us(2);

Data=0;

DHT11_delay_ms(20);   //延时18ms以上

Data=1;

DHT11_delay_us(30);

}

/*------------------------------------------------

接收八位二进制

------------------------------------------------*/

uchar DHT11_rec_byte()      //接收一个字节

{

uchar i,dat=0;

for(i=0;i<8;i++)    //从高到低依次接收8位数据

{

while(!Data);   等待50us低电平过去

DHT11_delay_us(8);     //延时60us,如果还为高则数据为1,否则为0

dat<<=1;           //移位使正确接收8位数据,数据为0时直接移位

if(Data==1)    //数据为1时,使dat加1来接收数据1

dat+=1;

while(Data);  //等待数据线拉低

}

return dat;

}

/*------------------------------------------------

接收40bit数据

------------------------------------------------*/

void DHT11_receive()      //接收40位的数据

{

uchar R_H,R_L,T_H,T_L,revise;

DHT11_start();

if(Data==0)

{

while(Data==0);   //等待拉高

DHT11_delay_us(40);  //拉高后延时80us

R_H=DHT11_rec_byte();    //接收湿度高八位

R_L=DHT11_rec_byte();    //接收湿度低八位

T_H=DHT11_rec_byte();    //接收温度高八位

T_L=DHT11_rec_byte();    //接收温度低八位

revise=DHT11_rec_byte(); //接收校正位

DHT11_delay_us(25);    //结束

if((R_H+R_L+T_H+T_L)==revise)      //校正

{

RH=R_H;

RL=R_L;

TH=T_H;

TL=T_L;

rec_dat0[0]=RH/10;

rec_dat0[1]=RH%10;

rec_dat1[0]=TH/10;

rec_dat1[1]=TH%10;

}

}

}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用C语言编程,结合C51单片机DHT11传感器与LCD1602显示屏进行温度显示。下面是一个示例代码,您可以参考: ```c #include <reg51.h> #include <stdio.h> #include <string.h> #define LCD_RS P2_0 #define LCD_RW P2_1 #define LCD_EN P2_2 #define LCD_DATA P0 void delay(unsigned int time) { unsigned int i, j; for (i = 0; i < time; i++) for (j = 0; j < 1275; j++); } void lcd_command(unsigned char cmd) { LCD_RS = 0; LCD_RW = 0; LCD_DATA = cmd; LCD_EN = 1; delay(1); LCD_EN = 0; } void lcd_data(unsigned char dat) { LCD_RS = 1; LCD_RW = 0; LCD_DATA = dat; LCD_EN = 1; delay(1); LCD_EN = 0; } void lcd_init() { lcd_command(0x38); // 8-bit数据接口,显示2行,5x7点阵字符 lcd_command(0x0C); // 显示开,光标和闪烁关闭 lcd_command(0x06); // 光标右移 lcd_command(0x01); // 清屏 } void lcd_display_string(unsigned char row, unsigned char column, unsigned char *str) { if (row == 0) lcd_command(0x80 + column); else if (row == 1) lcd_command(0xC0 + column); while (*str != '\0') { lcd_data(*str); str++; } } void dht11_read(unsigned char *temp, unsigned char *humi) { // 读取DHT11数据的代码,请根据您的具体硬件和引脚定义进行修改 // ... // 将温度和湿度值存入temp和humi指针指向的变量中 } void main() { unsigned char temp_str[16]; unsigned char humi_str[16]; unsigned char temp, humi; lcd_init(); while (1) { dht11_read(&temp, &humi); sprintf(temp_str, "Temp: %d C", temp); sprintf(humi_str, "Humi: %d %%", humi); lcd_display_string(0, 0, temp_str); lcd_display_string(1, 0, humi_str); delay(1000); // 延时1秒钟 } } ``` 请注意,以上代码仅供参考,具体的引脚定义和DHT11传感器的读取代码可能需要根据您的实际硬件进行修改。另外,LCD1602显示屏的引脚连接也需要根据您的具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值