#include<reg52.h>
//#include"dht21shumaguan.c"
#include <intrins.h>
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
unsigned int i;
sbit CLK=P3^2; //MAX7219时钟信号线
sbit LD=P3^3; //数据加载线
sbit DIN=P3^4; //数据输入线
sbit p33= P2^7;//dht11数据输入口
uchar dis1[];
unsigned char code num[]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,
0x77,0x1f,0x4e,0x3d,0x01,0x00};
void w_max7219(unsigned char addr,unsigned char wdata);
void init_max7219(); //MAX7219
void timer_ms(unsigned char tim);
unsigned char a,b;
//unsigned char num[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,}; //共阳
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=114;j>0;j--);
}
//dht11程序部分
typedef unsigned char U8;//全局变量uchar类型意思是可接收8位二进制
typedef unsigned int U16;//全局变量uint类型意思是可接受16位二进制
U8 U8FLAG;
U8 U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;//分别代表高8位温度,低八位温度,高八位湿度,低八位湿度,校验和U8
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;//同上
U8 U8comdata;
/***********************/
U16 DHTData1,DHTData2;
/***********************/
U8 count; //数据接收变量
void Delay(U16 j) //100us延时
{
U8 i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_10us(void) //进入函数3us
{ U8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{ U8 i;
for(i=0;i<8;i++)
{ U8FLAG=2;//将其赋值为2所以下段程序中其变量只能执行253此每次约1us做延时用的
while((!p33)&&U8FLAG++);//由于初始时主机将数据线拉低大约时间记不清了自己看时序图吧其中U8FLAG最多可加到255
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
if(p33)U8temp=1;//此处代表dht11与单片机连接上了选择接收到的数据是一还是零
U8FLAG=2;
while((p33)&&U8FLAG++); //超时则跳出for循环
if(U8FLAG==1)break;
U8comdata<<=1;
U8comdata|=U8temp;
}
}//按照说明上接到的顺序是温度高八位温度低八位湿度高八位湿度低八位
void RH(void)
{
//主机拉低18ms
p33=0;
Delay(5); /************************/
p33=1; //总线由上拉电阻拉高主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us(); //主机设为输入判断从机响应信号
p33=1; //判断从机是否有低电平响应信号如不响应则不读数据,响应则向下运行
if(!p33)//p20==0往下执行
{U8FLAG=2;//判断从机发出80us的低电平响应信号是否结束
while((!p33)&&U8FLAG++);//强制低电平信号最长为254us
U8FLAG=2;//判断从机发出80us的高电平,如发出则进入数据接收状态
while((p33)&&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;
p33=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;//低八位为0
DHTData1 = U8RH_data_H;
DHTData1<<= 8;
DHTData1 |= U8RH_data_L;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;//低八位为0
DHTData2 = U8T_data_H;
DHTData2 <<=8;
DHTData2|= U8T_data_L;
U8checkdata=U8checkdata_temp;//湿度值
}
}
}
void display()
{
dis1[0]=DHTData1/100;
dis1[1]=DHTData1%100/10;
dis1[2]= DHTData2/100;
dis1[3]= DHTData2%100/10;
dis1[4]= DHTData2%10;
U8checkdata=U8checkdata_temp;
}
void main(){
while(1){
RH();
init_max7219(); //MAX7219初始化函数
display();
w_max7219(0x01,num[ 0]); //向MAX7219
w_max7219(0x02,num[ dis1[2]]);
w_max7219(0x03,num[dis1[3]]-0x80);
w_max7219(0x04,num[dis1[4]]);
delayms(1000);
init_max7219();
// w_max7219(0x05,num[5]);
// w_max7219(0x06,num[6]);
// w_max7219(0x07,num[7]);
// w_max7219(0x08,num[8]);
}
}
void init_max7219()
{
w_max7219(0x0a,0x07);
w_max7219(0x0b,0x07);
w_max7219(0x09,0x00);
w_max7219(0x0c,0x01);
w_max7219(0x0f,0x00);
timer_ms(2);
}
/*********************************************************************************************
函数名称:w_max7219
*********************************************************************************************/
void w_max7219(unsigned char addr,unsigned char wdata)
{
unsigned int temp,i=1,j,k;
LD=0;
while(i<16)
{
if(i<8) temp=addr;
else temp=wdata;
for(j=0;j<8;j++)
{
CLK=0;
if((temp&0x80)==0x80) DIN=1;
else DIN=0;
for(k=5;k>0;k--);
CLK=1;
for(k=5;k>0;k--);
temp<<=1;
}
i+=8;
}
LD=1;
}
/*-------------------------------------------------------------------------------------------
函数名称: timer_ms
函数说明: 1ms延时子程序
------------------------------------------------------------------------------------------*/
void timer_ms(unsigned char tim)
{
unsigned char i;
while(tim--)
{
for(i=0;i<200;i++); //延时1ms
}
} |