- 打卡等级:偶尔看看III
- 打卡总天数:54
- 最近打卡:2025-05-01 09:07:55
管理员
- 积分
- 15609
|
发表于 2023-3-27 20:29:32
|
显示全部楼层
下面这个是网上看到的STC15的参考程序,也是要加延时啊 :
#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
##############################################################################################*/
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;//计算校验值
}
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
}
} |
|