求单片机程序关于温湿度。传感器采用DHT11,按键四个可以设置温湿度的上下限,显示用lcd1602,超限报警

作者&投稿:淫泼 (若有异议请与网页底部的电邮联系)
用51单片机跟DHT11温湿度传感器,完成对时间显示,以及温湿度的检测,如何设计?程序怎么写?~

你好!时间显示是采用 DS1302芯片吗?是否带有报警功能?
程序是c语言写吗?

你好!原理图有了吗?你是什么牌子的开发板。程序可以尝试完成

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
typedef unsigned char unint8; //unint8 代替undigned char 提高可移植性
typedef unsigned char unint16;
unsigned char str1[]={" "};
unsigned char str2[]={" "};
unsigned char code dis1[] = {" Xh RH: "}; //定义数组
unsigned char code dis2[] = {" DO T: "};
sbit buz=P1^0;
sbit TRH = P1^7;//温湿度传感器DHT11数据接入
sbit LCD_RS = P1^1;
sbit LCD_RW = P1^2;
sbit LCD_EN = P1^3;
unint8 TH_data,TL_data,RH_data,RL_data,CK_data;
unint8 TH_temp,TL_temp,RH_temp,RL_temp,CK_temp;
unint8 com_data,untemp,temp;
unint8 respond;
void initcom()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
}

void send(unsigned char temp)
{
//send biao zi
SBUF=temp;
while(!TI);
TI=0;
}

void sendwd()
{
//send wen du
uint w_d ;
w_d=TH_data+128;
SBUF=w_d;
while(!TI);
TI=0;
}

void sendsd()
{
//send shi du
SBUF=RH_data;
while(!TI);
TI=0;
}
/*********************************************************************************/
void delayNOP() //延时
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************************/

/*********************************************************************************/
// 毫秒级延时子程序
/*********************************************************************************/
void delay_ms(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 150; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/*********************************************************************************/

/*********************************************************************************/
//5us级延时程序
/*********************************************************************************/
void delay_us()
{
unint8 i;
i--;
i--;
i--;
i--;
i--;
i--;
}
/********************************************************************************/

/********************************************************************************/
// 测试LCD忙碌状态
//lcd_busy()为1时,忙,等待。lcd_busy()为0时,闲,可写指令与数据。
/********************************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************************/

/*******************************************************************************/
// 写入指令数据到LCD
/*******************************************************************************/
void lcd_wcmd(unsigned char cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*****************************************************************************/

/*****************************************************************************/
//写显示数据到LCD
//RS=高电平,RW=低电平,E=高脉冲,D0-D7=数据。
/*****************************************************************************/
void lcd_wdata(unsigned char dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/****************************************************************************/

/****************************************************************************/
//LCD初始化设定
/****************************************************************************/
void lcd_init()
{
delay_ms(15);
lcd_wcmd(0x38); //16*2显示,5*7点阵,8位数据
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x38);
delay_ms(5);
lcd_wcmd(0x0c); //显示开,关光标
delay_ms(5);
lcd_wcmd(0x06); //移动光标
delay_ms(5);
//lcd_wcmd(0x01); //清除LCD的显示内容,如果屏幕过暗,可将这俩句删除
//delay_ms(5);
}
/****************************************************************************/

/****************************************************************************/
//设定LCD显示位置
/****************************************************************************/
void lcd_dis_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80); //数据指针=80+地址变量
}
/****************************************************************************/

/****************************************************************************/
//收发信号检测,数据读取
/****************************************************************************/
char receive()
{
unint8 i;
com_data=0;
for(i=0;i<=7;i++)
{
respond=2;
while((!TRH)&&respond++);
delay_us();
delay_us();
delay_us();
if(TRH)
{
temp=1;
respond=2;
while((TRH)&&respond++);
}
else
temp=0;
com_data<<=1;
com_data|=temp;
}
return(com_data);
}
/****************************************************************************/

/****************************************************************************/
//湿度读取子程序
//温度高8位== TL_data
//温度低8位== TH_data
//湿度高8位== RH_data
//湿度低8位== RH_data
//校验 8位 == CK_data
//调用的程序有 delay();, Delay_5us();,RECEIVE();
/***************************************************************************/
void read_TRH()
{
//主机拉低18ms
TRH=0;
delay_ms(18);
TRH=1;
//DATA总线由上拉电阻拉高 主机延时20us
delay_us();
delay_us();
delay_us();
delay_us();
//delay_us();
//delay_us();delay_us();delay_us();delay_us();
//主机设为输入 判断从机响应信号
TRH=1;
//判断DHT11是否有低电平响应信号 如不响应则跳出,响应则向下运行
if(!TRH)
{
respond=2;
//判断DHT11发出 80us 的低电平响应信号是否结束
while((!TRH)&& respond++);
respond=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
while(TRH && respond++);
//数据接收状态
RH_temp = receive();
RL_temp = receive();
TH_temp = receive();
TL_temp = receive();
CK_temp = receive();
TRH=1;
//数据校验
untemp=(RH_temp+RL_temp+TH_temp+TL_temp);
if(untemp==CK_temp)
{
RH_data = RH_temp;
RL_data = RL_temp;
TH_data = TH_temp;
TL_data = TL_temp;
CK_data = CK_temp;
}
}
//湿度整数部分
str1[0] = (char)(0X30+RH_data/10);
str1[1] = (char)(0X30+RH_data%10);
str1[2] = 0x2e; //小数点
//湿度小数部分
str1[3] = (char)(0X30+RL_data/10);
str1[5] = 0X25; //"%"
str1[6] = 0X52; //"R"
str1[7] = 0X48; //"H"
//温度整数部分
str2[0] = (char)(0X30+TH_data/10);
str2[1] = (char)(0X30+TH_data%10);
str2[2] = 0x2e; //小数点
//温度小数部分
str2[3] = (char)(0X30+TL_data/10);
str2[5] = 0X27; //"'"
str2[6] = 0X43; //"C"
}
/****************************************************************************/
//冬天适宜温湿度 夏天适宜温湿度
//湿度:30%--80% 30%--60%
//温度:18℃--25℃ 23℃--28℃
/****************************************************************************/
void baoj()//报警函数
{
if(RH_data>=80) //湿度上限80%
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(RH_data<=30) //湿度下限30%
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(TH_data>=25) //温度上限25℃
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else if(TH_data<=18) //温度下限18℃
{

buz=0;
delay_ms(200);
buz=1;
delay_ms(10);

}
else
{
buz=1;
}
}

/****************************************************************************/
//主函数
//TH,TL,RH,RL分别代表温湿度的整数和小数部分
/****************************************************************************/
void main()
{

lcd_init();
initcom();
delay_us();

while(1)
{
unsigned char i,n=0x40,m;
read_TRH();
//写字符
for(i=0;i<=7;i++)
{
lcd_dis_pos(i); //显示字符
lcd_wdata(dis1[i]);
lcd_dis_pos(n+i); //显示字符
lcd_wdata(dis2[i]);
}
//写湿度数据
m=0x08;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str1[i]);
m++;
}
//写温度数据
m=0x48;
for(i=0;i<=7;i++)
{
lcd_dis_pos(m);
lcd_wdata(str2[i]);
m++;
}
//延时
delay_ms(500);
baoj();//报警
send(0xff);//wsd flags
//delay_ms(10);
sendwd();
//delay_ms(10);
sendsd();
//delay_ms(10);
}
}


基于5AT89C51单片机温湿度控制系统的C语言的编程。急急急!!!好心人回 ...
说的很复杂,其实很简单,完成两点:1,用传感器来采集数据,然后用AD转换,传给单品机,单片机做出比较,高于设定值执行一个操作。2,采用一个大循环,各个功能循环。没有难点,主要是关系多点

51单片机 控制数码管轮流显示温湿度
51单片机控制数码管轮流显示温湿度数码管是动态驱动的由于只有三位数码管所以希望先显示温度一段时间后再显示湿度该怎么编程C语言动态驱动的的delay后再去显示另外一种东西的话灯就熄... 51单片机 控制数码管轮流显示温湿度 数码管是动态驱动的 由于只有三位数码管 所以希望先显示温度 一段时间后再显示湿度 该怎么...

高分悬赏 谁能帮我写个程序 STH10温湿度采集的 用1602显示 STC89C52单...
include <iom16v.h> include <math.h> include "avrlcd3.1.c" \/\/这是我自己写的液晶显示函数 \/\/===宏定义=== define DATA_1 PORTA|=0X01 define DATA_0 PORTA&=0XFE define SCK_1 PORTA|=0X02 define SCK_0 PORTA&=0XFD define DATA_SETINPUT DDRA&=0XFE;PORTA|=0X01 define ...

如何用51单片机实现温湿度显示在大彩串口屏上
先查看串口屏的通讯协议,然后在单片机内部根据通讯协议编写数据帧.把数据发送给串口显示屏.

求设计基于51单片机的温湿度计
感觉没什么东西啊~~单片机控制基于I2C总线的SHT10系列数字温湿度传感器的温湿度值,不用处理直接做个类型转换就可以送LED示。然后在程序里加个对所采数据的比较,超过或低于设置值就让蜂鸣器响。没什么硬件,就一个单片机最小系统,一个温湿度传感器加一个数码管显示电路,再接个蜂鸣器全搞定。你把18B20换...

用vb与单片机连接起来精确控制温湿度,请问怎么编写vb的程序
温湿度部分VB程序 Option Explicit Dim buffer$ ' 字串暂存区 Dim com As Integer ' 序列埠变数 Dim D_ID, A_ID As Integer ' 控制板 ID Dim H_LMT, L_LMT, TP As Double ' 量测温度及上下 '--- Private Sub Command1_Click() ' 控制系统开始运 buffer$ = "" ' 清空暂存区 D_ID...

求老师大侠帮忙看看一个关于和51单片机相连的sht11温湿度传感器\/读取一...
嗯,默认你已经对硬件及时序比较熟悉了,直接解释一下数据读取过程了 先看一下初值部分 unsigned char i,val=0;...for(i=0x80;i>0;i\/=2)...先注意到val的初值为0,i的初值为0x80(对应的二进制为 1000 0000)每次循环之后有个'i\/=2' 即i的值减半 1000 0000 0x80 0100 0000 0x...

我要做一个基于单片机的温湿度检测系统,便携式的,传感器单片机然后液晶...
当然需要写程序 程序用编程器写入单片机,不同牌子单片机不同 像stc的可以串口写入,比较方便,所以一般学校也学这个

基于51单片机,温湿度无线检测系统设计
4-3-6温度控制子程序………28 4-3-7报警子程序………29 4-3-8键盘子程序用于调节设定值………29 第五章 调试及小结 5-1单片机温度控制系统的工作原理………32 5-2温度检测和A\/D转换电路图………32 5-3测试报告………32 小 结………34 致 谢………...

温湿度控制仪
include <iom16v.h> include <macros.h> include "ds18b20.h"include "delay.h"unsigned char temp_buf[4];\/ functionName: unsigned char resetDS18B20(void)description :DS18B20初始化 \/ unsigned char resetDS18B20(void){ unsigned char errTime=0;RLS_DS18B20; \/\/释放总线 _NOP();HLD_D...

河津市18483831644: 如何用单片机实现温湿度控制? -
泰很迪皿: 使用传感器检测温度,一般传感器会有一个模拟量输出,单片机如果内部有AD口的话就可以直接接上,然后程序内部进行AD转换成实际温度,跟设定的温度进行对比,大了就减温,小了就加热,实现恒温控制

河津市18483831644: 求设计基于51单片机的温湿度计 -
泰很迪皿: 感觉没什么东西啊~~单片机控制基于I2C总线的SHT10系列数字温湿度传感器的温湿度值,不用处理直接做个类型转换就可以送LED示.然后在程序里加个对所采数据的比较,超过或低于设置值就让蜂鸣器响. 没什么硬件,就一个单片机最小系统,一个温湿度传感器加一个数码管显示电路,再接个蜂鸣器全搞定. 你把18B20换成SHT10(其他温湿度传感器也可以)再加一根线,因为18B20是单总线的.再到网上当一个驱动程序就好了.找不到的话找我,我发给你.

河津市18483831644: 用单片机形式实现温湿控制
泰很迪皿: 因为你只要能够控制温度湿度,就只要一个温湿度一体传感器和一个89C2051就可以了,因为温湿度传感器只有一个控制脚.不需要8952作为主控芯片,892051的足够了. 其实你要的图:我告诉你,很简单,就这一个元件,随便连接单片机的IO口就可以,复位电路,晶振等基本的,网上有,自己找, 至于程序,网上有温湿度传感器的源程序,里有,我以前找到过. 程序一般不会有问题,只要把控制口改成你图中所连的就可以了. 老大,你悬赏分都不给啊?!

河津市18483831644: 51单片机c语言编程的温湿度检测控制程序 -
泰很迪皿: /********************************************************************* 文件名 : 温度采集DS18B20.c* 描述 : 该文件实现了用温度传感器件DS18B20对温度的采集,并在数码管上显示出来.* 创建人 : 东流,2009年4月10日* 版本号 : 2.0****************...

河津市18483831644: 基于单片机的温湿度测试有几种方案 -
泰很迪皿: 目标可以明确,但方案的种数不太可能是确定的.我接触过两种,一种是干湿球原理,单片机测干湿球两路温度查表得到湿度;另一种是直接用温湿度传感器,例如DHT11之类的.

河津市18483831644: 求高手帮做一个基于S51单片机的温湿度计C语言程序以及其原理图 -
泰很迪皿: char key() { char a,temp,c=99; for(a=0;a<3;a++) { p1=0x08<<a; temp=P1&0x07; switch(temp) { case 0x01: c=a;break; case 0x02: c=a+3;break; case 0x04: c=a+6;break; } if(c<99)//按键抗弹跳 } return c; }

河津市18483831644: 我需要用sht10采集温湿度信息送入单片机,然后通过串口显示到PC上.程序该怎么写? -
泰很迪皿: 如果要通过串口与pc通信,则必须pc和单片机都要有串口通信的代码,单片机负责串口通信的程序代码当然要烧录到单片机上,负责温湿度采集的应该是单片机,所以单片机应该有采集温湿度的程序,这部分采集温湿度程序也要烧录到单片机上.

河津市18483831644: 如何用一个51单片机实现温湿度测量和时间的显示? -
泰很迪皿: 可以的,使用SHT10之类的温湿度一体传感器,时间可以用内部RTC或外置的,很方便的,有4K的容量基本就ok了

河津市18483831644: 51单片机上下位机温湿度控制在用到哪些元件 -
泰很迪皿: 上位机需要用到电脑和VB编程,当然如果你有现成的上位机的话就不需要自己程序的.而单片机和温湿度控制这方面,则需要温度传感器,例如DS18B20,湿度传感器HS1101 ,LED显示屏或者数码管,按键,单片机和其他外围元件等.

河津市18483831644: 急求用stc12c5a60s2单片机显示dht11温湿度传感器程序,基本的读取和时序程序就行 -
泰很迪皿: sbit DHT11_1 = P2^4 ; void COM1() { U8 i; for(i=0;i<8;i++){ U8FLAG=2;while((!DHT11_1)&&U8FLAG++); Delay_10us(); Delay_10us(); Delay_10us(); U8temp=0; if(DHT11_1)U8temp=1; U8FLAG=2; while((DHT11_1)&&U8FLAG++); //超时则跳...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网