历史上的今天
今天是:2024年10月24日(星期四)
2019年10月24日 | STC15单片机DHT11温湿度检测(注释详细)oled显示程序
2019-10-24 来源:51hei
我这里加了oled用来显示温湿度,采用STC15,dht11模块
#include #include "intrins.h"//用于提供_nop_();函数 #include "OLED_Contrul_Hygrothermograph.c"//OLED控制函数 sbit YLED=P3^1; sbit RLED=P3^0; sbit DHT=P3^5;//DHT11模块 unsigned int Temperature[3]={1,1,1};//前两位为整数部分,后一位为小数部分 unsigned int Humidity[2]={1,1};//传回的湿度数据只有整数部分 unsigned char Data_Receive[5]; /*############################################################################################## 设计名称:基于DHT11的温湿度计(Hygrothermograph) 设计者:清河 平台:STC15F104W 硬件部分 显示:采用OLED12864显示温度和湿度 测量,采用DHT11模块,模块信息如下: ASATR ----- NA:DHT11 OC:3.3-5.5V U1:5-95%RH U2:-20-60℃ U3:±5%RH±2℃ SN:A1712882A 为保证延时准确,晶振设置为12MHz 借用了http://www.51hei.com/bbs/dpj-38067-1.html上的部分程序,在此表示感谢 ##############################################################################################*/ void Delay30us()//@12.000MHz { unsigned char i; i=87; while(--i); } void Delay20ms()//@12.000MHz { unsigned char i,j,k; i=1; j=234; k=113; do { do { while(--k); }while(--j); }while(--i); } void Delay1s()//@12.000MHz { unsigned char i,j,k; i=46; j=153; k=245; do { do { while(--k); }while(--j); }while(--i); } void OLED_Display()//OLED显示驱动函数 { OLED_DataDisplay_T(56,4,Temperature);//在指定位置显示温度 OLED_DataDisplay_H(56,6,Humidity);//在指定位置显示湿度 } void DHT_Collect()//温度采集函数 { unsigned char i,j;//for循环变量 unsigned char t;//超时判断 unsigned char dat8=0;//一次读取的8位数据,需要读5次 unsigned int CheckValue=0;//校验和 DHT=0;//主机发起始信号 Delay20ms();//主机拉低总线至少18ms DHT=1;//主机拉高总线20~40us Delay30us(); t=80;//设置超时等待时间 while(DHT&&t--);//等待DHT11拉低总线 if(t==0)//超时 { DHT=1; } t=250;//设置超时等待时间 while(!DHT&&t--);//等待DHT11拉高总线 if(t==0)//超时 { DHT=1; } t=250;//设置超时等待时间 while(DHT&&t--);//等待DHT11拉低总线 if(t==0)//超时 { DHT=1; } for(j=0;j<5;j++)//5次读取 { for(i=0;i<8;i++)//1次8个位 { //等待50us开始时隙 t=150;//设置超时等待时间 while(!DHT&&t--);//等待DHT11拉高总线 if(t==0)//超时 { DHT=1; } t=0;//记录时间清零 while(DHT&&++t);//等待并记录高电平持续时间 dat8<<=1; if(t>30)//高电平持续时间较长(70us) dat8+=1;//传输值为1 } Data_Receive[j]=dat8; } Delay30us();//等待DHT11拉低50us Delay30us(); DHT=1; for(i=0;i<4;i++) { CheckValue+=Data_Receive[i];//计算校验值 } if((unsigned char)CheckValue==Data_Receive[4])//比对 { Temperature[0]=Data_Receive[2]/10; Temperature[1]=Data_Receive[2]%10; Temperature[2]=Data_Receive[3]%10; Humidity[0]=Data_Receive[0]/10; Humidity[1]=Data_Receive[0]%10; } } void sys_init()//系统初始化函数 { YLED=1; RLED=1; OLED_Init(); //OLED初始化 OLED_CLS();//清屏 OLED_FormTitle(0,0);//显示标题文字Linyar Lab. OLED_FormName(0,2);//显示Hygrothermograph名称 OLED_FormLine(0,3);//显示一条横线 OLED_FormTemp(8,4);//显示温度文字 OLED_FormHumi(16,6);//显示湿度文字 OLED_AnyChar_16X16(96,4,TempChar);//在行4(每行高16像素),列96像素位置显示摄氏度℃字符 OLED_AnyChar_8X16(88,6,HumiChar);//在行6(每行高16像素),列88像素位置显示百分号%字符 OLED_AnyChar_8X16(72,4,PointChar);//在行4(每行高16像素),列72像素位置显示冒号:字符 } void main() { P3M0=0X00; P3M1=0X00; sys_init(); while(1) { DHT_Collect();//DHT11数据采集 YLED=1;RLED=0;//灯状态转换 OLED_Display();//OLED显示函数 RLED=1;YLED=0;//灯状态转换 Delay1s(); Delay1s();//注意:长时间的延时必须要有,不然会读出0 } }
史海拾趣
|
如今,汽车制造业已经与软件结下了不解之缘。不仅如此,汽车制造业已经深陷于软件危机之中。问题不是出在汽车制造业,这种软件危机只不过是设备软件产业本身所面临压力的间接反映而已。如今,新产品能够获得的市场窗口期非常狭窄,而功能上的复 ...… 查看全部问答> |
|
从2000年末开始,原中国电信以及重组后的中国电信和中国网通等固网运营商都把宽带接入、特别是利用现有市话双绞线提供的ADSL接入作为自己最为重要的新的业务增长点之一,并以此作为阻击其它一些新兴的驻地网运营商发展宽带业务的利器之一。以北京通 ...… 查看全部问答> |
|
现在的IP地址已经不够用了,但是依然可以使用非独立的IP地址来访问网络。 例如我的IP:10.15.1.79[mask:255.255.0.0],这个应该肯定不是独立IP了。 如果我要给外网发送一个IP报(140.252.0.1),可以判断是外网,就可以通过默认路由转发这个IP报。 ...… 查看全部问答> |
|
请问版主和高手们: AD中的参考电压怎么选择,内部参考电压何时用2.5V和1.5V,ADC12MCTLx中的Sref位的参考电压源应该根据什么选择。对此我不明白,请懂的朋友给解释一下,谢谢了!!… 查看全部问答> |
|
本帖最后由 dontium 于 2015-1-23 11:51 编辑 本文介绍德州仪器电池电量监测的基础知识,其包含电池电量基础知识、传统电池电量监测方法、基于电压的电量监测计、抗阻跟踪技术优势、电量检测等五部分内容。 希望对大家有所帮助噢!!~~ ...… 查看全部问答> |




