我这里加了oled用来显示温湿度,采用STC15,dht11模块,有兴趣可以玩下
- #include<STC15.H>
- #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
- }
- }
复制代码
全部资料51hei下载地址:
温湿度检测 oled.zip
(52.82 KB, 下载次数: 458)
|