四位共阴数码管显示DHT11温湿度
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);
//}