也可通过4位共阴数码管来显示
已验证,可以成功通过proteus实现
单片机源程序如下:
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit Data=P2^6; //定义数据线
- uchar rec_dat[9]; //用于显示的接收数据数组
- uchar Temp;
- uchar Humi;
- uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise;
- // 0 1 2 3 4 5 6 7 8 9 A B C D E F
- uchar code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0xff};
- sbit digt1=P3^0;
- sbit digt2=P3^1;
- uchar Display_Digit[]={0,0};
- void delay(uint n)
- { uint x,y;
- for(x=n;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delayus(uint us)
- {
- while(--us);
- }
- 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 DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(30); //延时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位的数据
- {
-
- 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;
- }
- // /*数据处理,方便显示*/
- // rec_dat[0]='0'+(RH/10);
- // rec_dat[1]='0'+(RH%10);
- // rec_dat[2]='R';
- // rec_dat[3]='H';
- // rec_dat[4]=' ';
- // rec_dat[5]=' ';
- // rec_dat[6]='0'+(TH/10);
- // rec_dat[7]='0'+(TH%10);
- // rec_dat[8]='C';
- Temp = TH;
- Humi = RH;
- Display_Digit[0] = RH/10; //十位 CurrentT%100/10;
- Display_Digit[1] = RH%10; //个位 CurrentT%10;
- }
- }
- void display(uchar ge,uchar shi) //数码管扫描 个位 十位
- {
- P3=0X00;
- digt1=1; //不加NPN三级管位驱动需要取反
- delayus(30);
- P0=table[shi]+0X00; //0X80为小数点
- delay(3);
- digt1=0; //不加NPN三级管位驱动需要取反
- digt2=1; //不加NPN三级管位驱动需要取反
- P0=table[ge];
- delay(3);
- digt2=0; //不加NPN三级管位驱动需要取反
- }
- /*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/
- void main()
- {
- uchar h;
- while(1)
- {
- // DHT11_delay_ms(100); //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令
-
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
DHT11+SEG -CA.zip
(50.62 KB, 下载次数: 63)
|