#include<reg51.h> //温度在数码管显示,但是闪烁
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit Data=P3^6; //定义数据线
sbit D=P1^0;
uchar T[8];
unsigned char code wei[8] = {0x08,0x04,0x00,0x0c,0x10,0x14,0x18,0x1c};//位选控制 查表的方法控制
unsigned char code duan[17] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
void DHT11_delay_us(uchar n)
{
while(--n);
}
void DHT11_delay_ms(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
//void xiamshi(uchar T)
//{
// uchar T1,T2,T3;
// T1=T/10;
// T2=T%10;
// P0=duan[T1];
// P2=wei[2];
// P0=duan[T2];
// P2=wei[1];
// P0=duan[12];
// P2=wei[0];
//}
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;
}
void DHT11_receive() //接收40位的数据
{
uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,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;
}
T[0]=TH/10+'0';
T[1]=TH%10+'0';
T[2]='c';
T[3]=' ';
T[4]=RH%10+'0';
T[5]=RH/10+'0';
T[6]='h';
T[7]='r';
}
}
/*发送数据*/
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=114;j>0;j--);
}
//void send(uchar T[6])
//{
// SBUF=T[6];
// while(TI==0);
// TI=0;
//}
void init_uart()
{
TMOD=0x20;
SCON=0x40;
PCON=0x00;
TH1=0xfd;
TL1=0xfd; //2¨ì??ê9600 0xf4 2¨ì??ê?a2400
TR1=1;
}
void send(unsigned char ch)
{
SBUF=ch;
while(TI==0);
TI=0;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_String(uchar *T,unsigned int strlen)
{
unsigned int k=0;
do
{
send(T[k]);
k++;
}
while(k < strlen);
}
void main()
{
uint i;
init_uart();
while(1)
{
DHT11_delay_ms(1500); //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
DHT11_receive();
send_String(T,8);
for(i=0;i<=5;i++)
{
P2=wei[i];//位选,选择让哪一位亮
P0=duan[T[i]]; //段选,让数码管显示什么
DHT11_delay_ms(12); //延时使显示充分
P1=0x00; //消隐
}
send('\n');
}
}
|