历史上的今天
今天是:2025年01月29日(星期三)
2020年01月29日 | protues仿真实现DHT11以及51单片机源程序
2020-01-29 来源:51hei
protues仿真DHT11显示温湿度
仿真原理图如下

DHT11单片机源程序如下:
#include #include #define uchar unsigned char #define uint unsigned int sbit Data=P3^6; //定义数据线 uchar rec_dat[9]; //用于显示的接收数据数组 sbit lcdrs=P3^0; sbit lcdrw=P3^1; sbit lcden=P3^2; void delay(uint n) { uint x,y; for(x=n;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com) { lcdrs=0; //rs=0时输入指令 P2=com; delay(5); lcden=1; //en=1时读取信息 delay(5); lcden=0; //1 -> 0 执行指令 } void write_dat(uchar dat) { lcdrs=1; //rs=1时输入数据 P2=dat; delay(5); lcden=1; delay(5); lcden=0; } void init_lcd() { lcden=0; lcdrw=0; write_com(0x38); //8位数据,双列,5*7字形 write_com(0x0c); //开启显示屏,关光标,光标不闪烁 write_com(0x06); //显示地址递增,即写一个数据后,显示位置右移一位 write_com(0x01); } 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位的数据 { 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; } /*数据处理,方便显示*/ 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'; } } /*这里使用lcd1602来显示采集到的数据,lcd1602驱动程序在博主的51单片机系列博文中有详细讲解*/ void main() { uchar i; init_lcd(); //lcd1602初始化 while(1) { DHT11_delay_ms(100); //DHT11上电后要等待1S以越过不稳定状态在此期间不能发送任何指令 DHT11_receive(); write_com(0x80); //从lcd1602第一行第一个位置开始显示 for(i=0;i<9;i++) write_dat(rec_dat[i]); //显示数据 write_com(0x80+0x40); write_dat(0x2d); write_dat(0x42); write_dat(0x3a); ……………………
史海拾趣
|
三相正弦变频电源也是一个不小的设计了,单独的模块化制作比较少见,基本上都是一个整体的设计或者是一个产品 整理了一些不同的实现方案,供大家参考~~~~~~~~~ … 查看全部问答> |
|
1. WinCE上的ActiveSync使用的是哪一个function client driver? webcast上一篇课程说使用的是RNDIS,但是我的开发板上注册表HKLM/drivers/usb/functiondrivers/DefaultClientDriver的值为serial_class。一旦该值改变,则activesync不可使用。这是否 ...… 查看全部问答> |
|
WINCE中(pocket PC)有长时间点击触摸屏后出现右键菜单的功能,现在我不想要这个功能了,请问怎么屏蔽掉。就是说当我用笔针长时间点击触摸屏要它既不会出现画圈圈,也不会出现右键属性菜单,请问怎么实现,谢谢了。… 查看全部问答> |
|
要求得到设备的PID/VID等信息.. 小弟毫无LINUX经验..不知道怎么下手...哪位高人能给个思路? 是不是应该先用VC写一个找找灵感...?但是LINUX下有API用么!!!!急啊!!再线等..… 查看全部问答> |
|
装SQL CE 2.0时总是出现"the compu ter that you specified is not configured for NTFS.you 装SQL CE 2.0时总是出现\"the compu ter that you specified is not configured for NTFS.you do not have to set permissions\",整整一天了都没法解决,请高手指点迷津!谢谢… 查看全部问答> |




