历史上的今天
今天是:2024年11月07日(星期四)
2019年11月07日 | dht11和ds18b20温湿度控制 单片机程序
2019-11-07 来源:51hei
基于51单片机,传感器使用dht11和ds18b20,dht11测温度精度有限,18b20可以弥补。第一行显示dht11采集到的湿度和温度,以及继电器状态。第二行显示18b20采集到温度和THI。THi是畜牧业衡量动物热应激指数的标准,不需要的删除掉。继电器是通过THI指数高低控制的。
单片机源程序如下:
/*********************************************************************************************
程序名: DHT11-1602
编写人: fby
编写时间: 2019年3月21日
硬件支持: STC89C52RC DHT11 LCD1602
接口说明: DHT11:VCC DATA NC GND
*********************************************************************************************
说明:1、单片机是STC89C52RC,晶振频率11.0592MHz,实验成功。
2、好东西要共享,大家随意折腾~~
*********************************************************************************************/
#include "reg52.h"
#include #include #include"temp.h" #define uchar unsigned char //无符号字符型类型数据 #define uint unsigned int //无符号整型数据 #define ulong unsigned long //无符号整型数据 #define xiao float //xiaoshu #define IODATA P0 uchar dat_r[10]; //用于存放从DHT11读取到的数值 uchar sData[10]; sbit DATA=P2^0; //定义数据线 sbit RS=P2^6; //定义rs端口 sbit RW=P2^5; //定义rw端口 sbit E=P2^7; sbit jidian=P3^7; //定义继电器 static uint i; extern uint zheng; void delay200ms(void) //误差 0us { unsigned char a,b,c; for(c=4;c>0;c--) for(b=116;b>0;b--) for(a=214;a>0;a--); _nop_(); //if Keil,require use intrins.h } /******************************************************************************* * 函 数 名 : datapros() * 函数功能 : 温度读取处理转换函数 * 输 入 : temp * 输 出 : 无 *******************************************************************************/ void datapros(int temp) { float tp; if(temp< 0) //当温度值为负数 { sData[0]=0; //因为读取的温度是实际温度的补码,所以减1,再取反求出原码 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } else { sData[0]=1; tp=temp;//因为数据处理有小数点所以将温度赋给一个浮点型变量 //如果温度是正的那么,那么正数的原码就是补码它本身 temp=tp*0.0625*100+0.5; //留两个小数点就*100,+0.5是四舍五入,因为C语言浮点数转换为整型的时候把小数点 //后面的数自动去掉,不管是否大于0.5,而+0.5之后大于0.5的就是进1了,小于0.5的就 //算加上0.5,还是在小数点后面。 } //显示数据处理 sData[1] = '0'+(temp / 10000); sData[2] = '0'+(temp % 10000 / 1000); sData[3] = '0'+(temp % 1000 / 100) ; sData[4] = '0'+(temp % 100 / 10); sData[5] = '0'+(temp % 10); //真实数据 sData[7] = temp / 10000; sData[8] = temp % 10000 / 1000; sData[9] = temp % 1000 / 100 ; sData[10] =temp % 100 / 10; } /******************************************************************************* * 函 数 名 : Timer1Init * 函数功能 : 定时器1初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Timer1Init() { TMOD|=0X10;//选择为定时器1模式,工作方式1,仅用TR1打开启动。 TH1=0XFC; //给定时器赋初值,定时1ms TL1=0X18; ET1=1;//打开定时器1中断允许 EA=1;//打开总中断 TR1=1;//打开定时器 } /********************************************************************************************* 函数名:延时函数 调 用:Delay30us();/Delay20ms();/Delay1s(); 参 数:无 返回值:无 结 果:延时相应时间 备 注:振荡晶体为11.0592MHz(所有延时函数Copy自STC-ISP(v6.85).exe) **********************************************************************************************/ void Delay30us() //@11.0592MHz-40 { unsigned char i; i = 11; while (--i); } void Delay20ms() //@11.0592MHz { unsigned char i, j; i = 36; j = 217; do { while (--j); } while (--i); } void Delay1s() //@11.0592MHz { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } /********************************************************************************************* 函数名:DHT11启动函数 调 用:无 参 数:无 返回值:无 结 果:DHT11开始工作 备 注: **********************************************************************************************/ void DHT11_start() // 主机控制DHT11开始工作 { DATA=1; // 主线空闲状态 _nop_(); _nop_(); DATA=0; // 主机发送开始工作信号 Delay20ms(); //延时18ms以上 DATA=1; // 拉高并延时等待DHT11响应 Delay30us(); } /********************************************************************************************* 函数名:DHT11读数据函数 调 用:? = DHT11_rec_byte(); 参 数:无 返回值: 结 果:读DHT11数据并保存到dat 备 注: **********************************************************************************************/ uchar DHT11_rec_byte() //接收一个字节 { uchar i,dat=0; for(i=0;i<8;i++) //从高到低依次接收8位数据 { while(!DATA); ////等待50us低电平过去 Delay30us(); Delay30us(); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //左移位使正确接收8位数据,数据为0时直接移位 if(DATA==1) //数据为1时,使dat加1来接收数据1 dat+=1; while(DATA); //等待数据线拉低 } return dat; } /********************************************************************************************* 函数名:接收DHT11的40位的数据并校验 调 用:? = DHT11_receive(); 参 数:无 返回值:无 结 果:结果保存到dat_r[i]中 备 注: **********************************************************************************************/ void DHT11_receive() //接收40位的数据 { uchar R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; //xiao thi; //uint zheng; DHT11_start(); // 主机控制DHT11开始工作 if(DATA==0) { while(DATA==0); //等待拉高 Delay30us(); Delay30us();
上一篇:基于51单片机的电子时钟课程设计
史海拾趣
|
8. 第八章 dScope for Windows使用详解 1. 第一节 概述 1. 1. 主窗口(Mainframe Window) 可设置其它各种调试窗口,设置断点、观察点,修改地址空间,加载文件等等; 2. 2. 调试窗口(DEBUG Window) 支持用户程序的各种显示方式,可连续运行 ...… 查看全部问答> |
|
[求助]关于直接通过I/O接口访问硬盘数据的可能性及思路的探索。 这个问题大概是这样的: 在OS里要访问硬盘上的数据要经过文件系统,现在我想不经过文件系统,直接对硬盘上的数据进行读写。 我的思路来自于市场上的硬盘播放器(就是可以直接播放硬盘里的多媒体文件的设备)。查了一 ...… 查看全部问答> |
|
小弟在研究硬盘电机的驱动,我曾试过用小功率管9013,8050,8550等等来搭成达林顿管子,但是驱动电机的时候发热严重,而且明显有气无力...虽然能转...在网上找了很久,想用场效管IRF540N来驱动,但是不知道电路如何搭建...求各位高手,走过路过的能 ...… 查看全部问答> |
|
求助,哪位告诉能指点下, 在8962上面使用lwip 如何实现不同网段的能够连接啊???就是公司网络 192.168.1.12的电脑 可以 ping通 192.168.2.2的电脑但是我的板子 192.168.1.10 ping不同 192.168.2.2的电脑… 查看全部问答> |
|
大三嵌入式又要分方向了, ARM 、 PCL、 单片机,感觉吧....就是没感觉,有没有前辈给这三个方向的发展,优缺点,就业情况分析一下啊? 小弟先谢谢了....!!! … 查看全部问答> |




