四位共陰數碼管顯示DHT11溫濕度

四位共陰數碼管顯示DHT11溫濕度

工具/原料

keil4
c語言基礎

方法/步驟

//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();

}

}

}

//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);

}

//延時函數

#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);

//}

注意事項

注意引腳控制
注意延時時間,控制數碼管動態顯示時間

本文內容整理自網絡, 文中所有觀點看法不代表淘大白的立場