四位共阴数码管显示DHT11温湿度

2025-10-23 20:05:07

1、//main.c文件

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

****程序功能:四位共阴极数码管显示DHT11温湿度

****编写人员:盖工

****编写时间:2016-03-07

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

#include "includes.h"

#include "DHT11.h" 

#include "Delay_time.h" 

/********段选IO口**********/

sbit SMG1=P3^4;

sbit SMG2=P3^5;

sbit SMG3=P3^6;

sbit SMG4=P3^7;

INT16U a,b,time,flag = 0;

unsigned char code tab[]={0x3f,0x05,0x5b,0x4f,0x65,

0x6e,0x7e,0x07,0x7f,0x6f}; //显示0-9       

void delay(unsigned int n)

{

unsigned char i,j;

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

for(j=0;j<110;j++);

}

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

****函数名称:TEMP_show

****函数描述:温湿度显示函数

****返回值:

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

void TEMP_show()

SMG2 = 1;

P1 = tab[temp1];

delay(5);

SMG2 = 0;

SMG1 = 1;

P1 = tab[temp0];

delay(5);

SMG1 = 0;

SMG3 = 1;

P1 = tab[temp2];

delay(5);

SMG3 = 0;

SMG4 = 1;

P1 = tab[temp3];

delay(5);

SMG4 = 0;

}

void main(){

int i; 

P3=0xff; 

while(1)

{

RH();

Data_Deal(); 

for(i=0;i<3000;i++) //大约3s动态刷新一次

{

TEMP_show(); 

}  

}

}

2、//DHT11.c文件

#include "includes.h"

#include "DHT11.h" 

#include "Delay_time.h" 

//#include "Usart.h"

sbit   data_dht = P2^2;

INT8U  dis_deal[5]; 

INT16U temp0,temp1,temp2,temp3;

INT8U  U8FLAG;

INT8U  U8TEMP;

INT8U  U8T_data_H,U8T_data_L,U8RH_data_H ,U8RH_data_L ,U8checkdata;

INT8U  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;

INT8U  U8comdata;

INT8U  outdata[5];  //定义发送的字节数   

INT8U  indata[5];

INT8U  str[5];

INT16U U16temp1,U16temp2;

void  COM(void)

{

INT8U i;     

  for(i=0;i<8;i++)     //接收8bit的数据

{  

U8FLAG=2;  

 while((!data_dht) &&U8FLAG++);   //等待50us的低电平开始信号结束

Delay_10us_1T();   //延时27us

Delay_10us_1T();

Delay_7us_1T(); 

U8TEMP=0; //接收数据为‘0’

if(data_dht)

U8TEMP=1; //如果26~28us之后还未高电平则接受的数据为‘1’

U8FLAG=2; 

while((data_dht) && U8FLAG++); //等待数据信号高电平

//超时则跳出for循环  

 if(U8FLAG == 1) break;

//判断数据位是0还是1   

// 如果高电平高过预定0高电平值则数据位为 1    

U8comdata<<=1; //接受的数据高位在前,左移

 U8comdata|=U8TEMP;        

}

//--------------------------------

//-----湿度读取子程序 ------------

//--------------------------------

//----以下变量均为全局变量--------

//----温度高8位== U8T_data_H------

//----温度低8位== U8T_data_L------

//----湿度高8位== U8RH_data_H -----

//----湿度低8位== U8RH_data_L -----

//----校验 8位 == U8checkdata-----

//----调用相关子程序如下----------

//---- Delay();, Delay_6us();,COM(); 

//--------------------------------

void RH(void)

{

  //主机拉低18ms 

data_dht = 0;

Delay18Ms_1T();

data_dht = 1;

//总线由上拉电阻拉高 主机延时20us

Delay_10us_1T();

Delay_10us_1T(); 

//主机设为输入 判断从机响应信号 

data_dht = 1;

//判断从机是否有低电平响应信号 如不响应则跳出,响应则向32zsasz下运行  

if(!data_dht)  

{  

U8FLAG = 2;

 //判断从机是否发出 80us 的低电平响应信号是否结束  

 while((!data_dht)&&(U8FLAG ++));

 //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态  

U8FLAG = 2;

 while((data_dht)&&(U8FLAG ++));

//数据接收状态  

COM();

U8RH_data_H_temp = U8comdata; //湿度高位

COM();

U8RH_data_L_temp = U8comdata; //湿度地位

COM();

U8T_data_H_temp = U8comdata; //温度高位

COM();

U8T_data_L_temp = U8comdata; //温度地位

COM();

U8checkdata_temp = U8comdata; //校验位

    //最后一bit接收完成后 从机拉低50us   

 data_dht = 1;

//数据校验 

U8TEMP = (U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);

 if(U8TEMP == U8checkdata_temp)

U8RH_data_H =U8RH_data_H_temp;

U8RH_data_L =U8RH_data_L_temp;

U8T_data_H=U8T_data_H_temp;

U8T_data_L=U8T_data_L_temp;

U8checkdata=U8checkdata_temp;

}

}

void Data_Deal (void){

str[0]=U8RH_data_H;

str[1]=U8RH_data_L;

str[2]=U8T_data_H;

str[3]=U8T_data_L;

str[4]=U8checkdata;

//读取模块数据周期不易小于 2S  

dis_deal[0] = str[0]; 

dis_deal[1] = str[2];

temp0 = str[2]/10;

temp1 = str[2]%10;

temp2 = str[0]/10;

temp3 = str[0]%10;

Delay_Ms(150);

}

3、//延时函数

#include "includes.h"

#include "Delay_Time.h"

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

函数名称:Delay_Ms

函数描述:毫秒级延时函数  1T 模式

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

void Delay_Ms(INT16U ms)  

{

INT16U i,j;

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

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

}

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

函数名称:Delay_Us

函数描述:微秒级延时函数

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

void Delay_Us(INT8U us)

{

while(us--);           

}

void Delay_7us_1T()

{

unsigned char i;

_nop_();

i = 16;

while (--i);

}

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

***函数名: Delay_10Us()

***函数描述:延时

***返回值: NULL

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

void Delay_10us_1T()        //延时10us左右

{

unsigned char i;

_nop_();

_nop_();

_nop_();

i = 24;

while (--i);

}

void Delay18Ms_1T() //n = 3t -3

INT8U i,j,k;

_nop_();

_nop_();

i = 1;

j = 194;

k = 159;

do

{

do

{

while(--k);

}while(--j);

}while(--i);

}

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

//函数名称:Delay_15us

//函数描述:微秒级延时函数

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

//void Delay_15us() //@11.0592MHz

//{

// unsigned char i;

// _nop_();

// _nop_();

// i = 38;

// while (--i);

//}

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

//函数名称:Delay_50us

//函数描述:微秒级延时函数

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

//void Delay_50us() //@11.0592MHz

//{

// unsigned char i, j;

// _nop_();

// _nop_();

// _nop_();

// i = 1;

// j = 133;

// do

// {

// while (--j);

// } while (--i);

//}

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

//函数名称:Delay_70us

//函数描述:微秒级延时函数

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

//void Delay_70us() //@11.0592MHz

//{

// unsigned char i, j;

// i = 1;

// j = 189;

// do

// {

// while (--j);

// } while (--i);

//}

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

//函数名称:Delay_500us

//函数描述:微秒级延时函数

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

//void Delay_500us() //@11.0592MHz

//{

// unsigned char i, j;

// i = 6;

// j = 93;

// do

// {

// while (--j);

// } while (--i);

//}

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢