导航:首页 > 操作系统 > 基于单片机的湿度控制

基于单片机的湿度控制

发布时间:2025-05-12 12:32:56

⑴ 基于单片机的“粮仓温湿度自动控制系统”论文摘要 汉译英

Make use of the high-accuracy pragmatism granary humiture autocontrol system that the monolithic machine realizes, AT89C51 monolithic machine go along controls its reason , volume is small, have cost therefore comparatively low , use characteristics such as simple , working reliably. Besides, has adopt integrated temperature humidity sensor DHT11 to be the detecting component , has checked the granary different 3 bearing humiture, by the fact that the hardware circuit goes to sell data transfer at reced prices to monolithic machine , by the fact that RT1602C 2 * 16's LCD displays demonstrate the humiture data being unlike bearing, The monolithic machine makes corresponding operation at the same time to abnormal point , for example knot 1 location humidity is too big , the monolithic machine will pass navar , start a draught apparatus , design middle originally time at this time , the draught apparatus is a small electric fan. This system can realize the granary temperature , the humidity real-time control conveniently.

Keywords: AT89C51; DHT11; RT1602C; Humiture data collect; Monolithic machine navar

DHT11: Be the figure sensor unifying from one humiture that Guangzhou Aosong Ltd. proces

RT1602C: Be 2 * 16 LCD display

The humiture data collect burns: Distribute different in 3 of granary bearing , be bearing's turn to need to be able to embody the granary temperature hygral change on the entirety

希望能帮到你:)~

⑵ 跪求基于单片机的温湿度监控系统代码

#include <reg51.h>
#include <intrins.h> //Keil library (is used for _nop()_ operation)
#include <math.h> //Keil library
#include <stdio.h> //Keil library
unsigned char Tem,Hum;
unsigned char Set_Tem,Set_Hum;

sbit SS = P1^0; //片选
sbit SCLK = P1^1; //ISD4003 时钟
sbit MOSI = P1^2; //数据输入
sbit MISO = P1^3; //数据输出
sbit LED = P1^7; //指示灯
sbit ISD_INT = P3^2; //中断
sbit AN = P1^6; //执行
sbit STOP = P1^5; //复位
sbit PR = P1^4; //PR=1 录音 PR=0 放音
sbit DATA=P2^0;
sbit SCK=P2^1;
sbit SCL=P1^1;
sbit SDA=P1^0;

#define TEMP 0
#define HUMI 1
typedef union
{ unsigned int i;
float f;
} value;
//蔽塌enum {,EMP,HUMI};
//以上所示为系统的主程序结构,其中子程序可根据系统整个具体的要求进行添加代码,
//刷新LED显示子程序write_led();硬件采用译码器;按键检测子哗仿程序check_key();的执行通过读单片机I/O口高低电平识别按键。
//以下所示代码为读温湿度传感器子程序read_ sensor()的程序内容:
/********************************************************************
工程名 SHTxx demo program (V2.1)
文件名: SHTxx_Sample_Code.c
MCU: 80C51 family
编译器: Keil Version 6.14
*******************************************************************/乱并纤
//-------------------------------------------------------------------
// mol-var
//-------------------------------------------------------------------
void warning(void);
void Delay(unsigned int time);

#define noACK 0
#define ACK 1

unsigned int *p_value;

#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
//-------------------------------------------------------------------
char s_write_byte(unsigned char value)
//-------------------------------------------------------------------
// 写一个字节,检查应答信号
{
unsigned char idata i,error=0;
for (i=0x80;i>0;i/=2)
{ if (i & value) DATA=1;
else DATA=0;
SCK=1;
_nop_();_nop_();_nop_(); //时钟脉冲宽度 5 us
SCK=0;
}
DATA=1; //释放DATA
SCK=1; //9个CLK后应答
error=DATA; //检查应答信号 (DATA 被拉低)
SCK=0;
return error; // 如果没有应答则error=1
}//
//-------------------------------------------------------------------
char s_read_byte(unsigned char ack)
//-------------------------------------------------------------------
// 读一个字节,检查应答信号
{
unsigned char i,val=0;
DATA=1; //释放DATA信号
for (i=0x80;i>0;i/=2)
{ SCK=1;
if (DATA) val=(val | i);
SCK=0;
}
DATA=!ack; //如果 "ack==1" ,拉低DATA
SCK=1; //clk #9 for ack
_nop_();_nop_();_nop_(); //延时5微秒
SCK=0;
DATA=1; //释放DATA
return val;
}

//-------------------------------------------------------------------
void s_transstart(void)
//-------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{
DATA=1; SCK=0; //初始状态
_nop_();
SCK=1;
_nop_();
DATA=0;
_nop_();
SCK=0;
_nop_();_nop_();_nop_();
SCK=1;
_nop_();
DATA=1;
_nop_();
SCK=0;
}

//-------------------------------------------------------------------
void s_connectionreset(void)
//-------------------------------------------------------------------
//通讯复位: 至少在9 SCK 周期后,DATA=1 传输开始
// _____________________________________________________
// DATA: //|_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___|
{
unsigned char i;
DATA=1; SCK=0; //初始状态
for(i=0;i<9;i++) //9 SCK周期
{ SCK=1;
SCK=0;
}
s_transstart(); //通讯开始
}
//-------------------------------------------------------------------
char s_softreset(void)
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //复位通讯
error+=s_write_byte(RESET); //发送复位命令
return error; //如果传感器没有响应则error=1
}

//-------------------------------------------------------------------
char s_read_statusreg(unsigned char *p_value,unsigned *p_checksum)
//-------------------------------------------------------------------
//读效验寄存器状态 (8-bit)
{
unsigned char error=0;
s_transstart(); //通讯开始
error=s_write_byte(STATUS_REG_R); //发送命令
*p_value=s_read_byte(ACK); //读状态寄存器(8-bit)
*p_checksum=s_read_byte(noACK); //读效验和
return error; //如果传感器没有响应则error=1
}

//-------------------------------------------------------------------
char s_write_statusreg(unsigned char *p_value)
//-------------------------------------------------------------------
// writes the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //通讯开始
error+=s_write_byte(STATUS_REG_W);// 发送命令
error+=s_write_byte(*p_value); //发送状态寄存器的值
return error; //如果传感器没有响应则error=1

}
//-------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//-------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned char idata error=0;
unsigned int i;
s_transstart(); //通讯开始
switch(mode)
{ //发送名令
case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
default : break;
}
for (i=0;i<65535;i++) if(DATA==0) break; //等待传感器完成测量
if(DATA) error+=1;
*(p_value) =s_read_byte(ACK); //读取第一个字节
*(p_value+1)=s_read_byte(ACK); //读取第二个字节
*p_checksum =s_read_byte(noACK); //读取效验和
return error;
}
//-------------------------------------------------------------------
//-------------------------------------------------------------------
void calc_sth11(float *p_humidity ,float *p_temperature)
//-------------------------------------------------------------------
// 计算温度和湿度
// input : humi [Ticks] (12 bit)
// temp [Ticks] (14 bit)
// output: humi [%RH]
// temp
{ const float xdata C1=-4.0;
const float xdata C2=+0.0405;
const float xdata C3=-0.0000028;
const float xdata T1=+0.01;
const float xdata T2=+0.00008;

float rh=*p_humidity; //计算湿度值
float t=*p_temperature; // 计算温度值
float rh_lin;
float rh_true;
float t_C;
t_C=t*0.01 - 40;
rh_lin=C3*rh*rh + C2*rh + C1;
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;
if(rh_true>100)rh_true=100; //如果结果超出了可能的范围就取消
if(rh_true<0.1)rh_true=0.1;
*p_temperature=t_C;
*p_humidity=rh_true;
}

//-------------------------------------------------------------------
float calc_dewpoint(float h,float t)
//-------------------------------------------------------------------
// calculates dew point
// input: humid,ty , temperature
// output: dew point
{ float dew_point,logEx;
logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2);
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
//-------------------------------------------------------------------
void main_measure()

//-------------------------------------------------------------------
// 使用SHT10功能步骤:
// 1.通讯复位
// 2. 测量温度,湿度
// 3. 计算温度,湿度
// 45. 显示温度,湿度

{ value humi_val,temp_val;
float dew_point,error;
unsigned char checksum;
unsigned int idata i;

s_connectionreset();
while(1)
{ error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //测量湿度
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //测量温度
if(error!=0) s_connectionreset();
//如果有错误就复位
else
{ humi_val.f=(float)humi_val.i; //将整数转换成浮点数
temp_val.f=(float)temp_val.i;
calc_sth11(&humi_val.f,&temp_val.f);
//计算温度,湿度
dew_point=calc_dewpoint(humi_val.f,temp_val.f);
//计算dew
//printf("temp:%5.1fC humi:%5.1f%% dew point:%5.1f,\n",temp_v,l.f,humi_v,l.f,dew_point);
}
for (i=0;i<40000;i++);//----------延时0.8s
}
}
//语音功能子程序
//下面代码为语音芯片使用范例,该功能放在主程序中的warning()子程序中执行。

void delay(unsigned int time) //延迟 n 微秒
{
while(time!=0)
{
time-- ;
}
}
void delayms(unsigned int time) //延迟 n 毫秒
{
TMOD=0x01;
for(time;time>0;time--)
{
TH0 = 0xfc;
TL0 = 0x18;
TR0 = 1;
while(TF0!=1)
{;}
TF0=0;
TR0=0;
}
}
//************************************
//ISD4002 spi 串行发送子程序,8 位数据
//************************************
void spi_send(unsigned char isdx)
{
unsigned char idata k;
SS=0;//SS=0; //,s=0,打开 spi 通信端
SCLK=0;
for(k=0;k<8;k++) //先发低位再发高位,依发送。 { i
{
if((isdx&0x01)==1)
MOSI=1;
else
MOSI=0;
isdx=isdx>>1;
SCLK=1;
delay(2);
SCLK=0;
delay(2);
}
}
//*******************************
//发送 stop 指令
//*******************************
void isd_stop(void)
{
delay(10);
spi_send(0x30);
SS=1;
delayms(50);
}
//*******************************
//发送上电指令,并延迟 50ms
//*******************************
void isd_pu(void)
{ delay(10);
SS=0;
spi_send(0x20);
SS=1;
delayms(50);
}
//发送掉电指令,并延迟 50ms
//*******************************

void isd_pd(void)
{
delay(10);
spi_send(0x10);
SS=1;
delayms(50);
}
//*******************************
//发送 play 指令
//*******************************
void isd_play(void)
{
LED=0;
spi_send(0xf0);
SS=1;
}
//*******************************
//发送 rec 指令
//*******************************
void isd_rec(void)
{
LED=0;
spi_send(0xb0);
SS=1;
}
//*******************************
//发送 setplay 指令
//*******************************
void isd_setplay(unsigned char adl,unsigned char adh)
{
spi_send(adl); //发送放音起始地址低位
adh=adh||0xe0;
spi_send(adh); //发送放音起始地址高位
SS=1;
}
//*******************************
//发送 setrec 指令
//*******************************
void isd_setrec(unsigned char adl,unsigned char adh)
{
spi_send(adl); //发送放音起始地址低位
adh=adh||0xa0;
spi_send(adh); //发送放音起始地址高位
SS=1;
}
//************************************
//芯片溢出,LED 闪烁提醒停止录音
//************************************
void isd_overflow(void)
{
while(AN==0)
{
LED=1;
delayms(300);
LED=0;
delayms(300);
}
}
//************************************
//检查芯片是否溢出(读,OVF,并返回 OVF 值)
//************************************
unsigned char chk_isdovf(void)
{
SS=0;
delay(2);
SCLK=0;
delay(2);
SCLK=1;
SCLK=0;
delay(2);
if (MISO==1)
{
SCLK=0;
SS =1; //关闭 spi 通信端
isd_stop(); //发送 stop 指令
return 1; //OVF 为 1,返回 1
}
else
{
SCLK=0;
SS =1; //关闭 spi 通信端
isd_stop(); //发送 stop 指令
return 0; //OVF 为 0,返回 0
}
}
//**********************************************************************
//主程序
//功能:1.录音时,按住 AN 键,LED 点亮开始录音,松开 AN 即可停止录音
// 再次按下 AN 键,LED 点亮开始录第二段音,依次类推,直到芯片溢出。
// 按 stop 键芯片复位
// 2.放音时,按一下 AN 键,即播放一段语音。按 stop 键芯片复位。
//************************************************************************

void voice(void)
{
unsigned char ovflog;
while(1)
{
P0=P1=P2=P3=0xff; //初始化
while (AN==1) //等待 AN 键按下
{
if (AN==0) //按键防抖动
{delayms(20);}
}
isd_pu(); // AN 键按下,ISD 上电并延迟 50ms
isd_pd();
isd_pu();
if (PR==1) //如果 PR=1 则转入录音部分
{
delayms(500); //延迟录音
isd_setrec(0x00,0x00); //发送 0x0000h 地址的 setplay 指令
do
{
isd_rec(); //发送 rec 指令
while(AN==0) //等待录音完毕
{
if (ISD_INT==0)//如果芯片溢出,进行 LED 闪烁提示,
isd_overflow(); //如果取消录音(松开AN键)则停止录音,芯片复位
}
if (ISD_INT==0)
break;
LED=1; //录音完毕,LED 熄灭
isd_stop(); //发送停止命令
while(AN==1) //如果 AN 再次按下,开始录制下一段语音
{
if(STOP==0) //如果按下 STOP 按键,则芯片复位
break;
if (AN==0)
delayms(500);
}
}while(AN==0);
}
else //如果 PR==0 则转入放音部分
{
while(AN==0){;}
isd_setplay(0x00,0x00); //发送 setplay 指令,从 0x0000 地址开始放音
do
{
isd_play(); //发送放音指令
delay(20);
while(ISD_INT==1) //等待放音完毕的 EOM 中断信号
{;}
LED=1;
isd_stop(); //放音完毕,发送 stop 指令
if (ovflog=chk_isdovf())//检查芯片是否溢出,如溢出则停止放音,芯片复位
break;
while(AN==1) //等待 AN 键再次按下
{
if (STOP==0)
break;
if(AN==0)
delayms(20);
}
}while(AN==0); // AN 键再次按下,播放下一段语音
}
isd_stop();
isd_pd();
}
}
#define ZLG7290 0x70
#define RADR 0x01
#define uchar unsigned char
#define uint unsigned int

/************************************/
void I2cStart(void)
{
SDA=1;
SCL=1;
Delay(10);
SDA=0;
Delay(10);
SCL=0;
}
/************************************/
void I2cStop(void)
{
SDA=0;
SCL=1;
Delay(10);
SDA=1;
Delay(10);
SCL=0;
}
/************************************/
void WriteI2cByte(uchar dat)
{
uchar k;

SCL=0;
for (k=0;k<8;k++)
{
SDA=(bit)(dat&0x80);
SCL=1;
Delay(10);
SCL=0;
dat<<=1;
}
SCL=0;
}
/*************************************/
uchar ReadI2cByte(void)
{
uchar dat,k;

for (k=0;k<8;k++)
{
SCL=0;
SDA=1; //一定要将SDA置为高电平,否则不能正常连续取数据
Delay(10);
SCL=1;
dat<<=1;
if (SDA)
dat|=0x01;
SCL=0;
Delay(10);
}
SCL=0;

return dat;
}
/*************************************/
void SendAck(void)
{
SDA=0;
Delay(10);
SCL=1;
Delay(10);
SCL=0;
}
/*************************************/
void SendNoAck(void)
{
SDA=1;
SCL=1;
Delay(10);
SCL=0;
}
/************************************/
void I2cWaitAck(void)
{
uchar ack;

SDA=1;
SCL=1;
Delay(10);
ack=SDA;
SCL=0;
}
/***********************************************************/
void I2cReadSequence(uchar sla,uchar sbua,uchar *s,uchar len)
{
uchar l;

I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();

I2cStart();
WriteI2cByte(sla+1);
I2cWaitAck();
for (l=0;l<len-1;l++)
{
*s=ReadI2cByte();
SendAck();
s++;
}
*s=ReadI2cByte();
SendNoAck();
I2cStop();
}
/************************************************************/
void I2cWriteSequence(uchar sla,uchar sbua,uchar *s,uchar len) //wr
{
uchar k;

I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();
for (k=0;k<len;k++)
{
WriteI2cByte(*s);
I2cWaitAck();
s++;
}
I2cStop();
}
/**************************************************************/
void I2cWriteByteToSlaver(uchar sla,uchar sbua,uchar dat)
{
I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();
WriteI2cByte(dat);
I2cWaitAck();
I2cStop();
Delay(10);
}
/**************************************************************/
uchar I2cReadByteFromSlaver(uchar sla,uchar sbua)
{
uchar dat;

I2cStart();
WriteI2cByte(sla);
I2cWaitAck();
WriteI2cByte(sbua);
I2cWaitAck();

I2cStart();
WriteI2cByte(sla+1);
I2cWaitAck();

dat=ReadI2cByte();
SendAck();
SendNoAck();
I2cStop();

return dat;
}
/**************************************************/
void main()
{
voice();//完成语音芯片的初始化 置入工作状态
s_softreset();
while(1)//进入程序主循环
{
main_measure();//读温湿度传感器 得到温度值Tem 湿度值Hum
/* if(Tem>Set_Tem && Hum >Set_Hum)//设置报警区间
{
warning();//执行警告 启动报警
} */
}
}

⑶ 基于单片机粮库的温湿度控制系统设计 答辩会问什么问题 (能写多少写多少 越多也好)

正式答辩开始,下面是我的部分发言:

尊敬的评委老师以及在座的各位同学:大家早上好。我是X级XX专业的XX,很高兴在这里论文答辩,希望今天能为我20年的学生生涯画上一个完满的句号。(这句可是我琢磨了半天的经典啊)

下面,论文答辩 论文答辩ppt 论文答辩技巧,就我毕业论文的选题原因,国内外研究现状,研究目的,研究方法,研究内容,研究结论等问题向大家做一个简单的汇报。

之所以选择这样一个论文题目,主要是基于以下三方面的考虑:…………

以上是我毕业论文的一些基本情况,欢迎各位老师批评指正(这句话挨了一顿批,答辩主席先给我个下马威。这句可是我上网时看到的,以示谦卑,没想到犯了本本主义错误。答辩之前最好是多答辩评委老师的性格爱好都有个底,尤其是答辩委员会的主席,他可是一把手),谢谢。

在答辩中有一些小体会,这里与大家分享,希望对大家有所帮助。

答辩分为三个阶段:陈述期(20-25分钟)、提问期、回答期,三个阶段大致一个多小时左右一个人。

在陈述期的20分钟,有的学院要答辩者做PPT,有的则不用;有的陈述时要脱稿,有的则可以看稿子。在这个阶段,一般情况下没有老师在听你讲什么,他们都在低头看你给他们发的论文和论文简介,因为这么厚的论文是没有老师有时间看的,他们也都是临阵摸枪,看个大概。所以在这一阶段,你的任务就是磨时间,注意语气要平缓,要稳,发言时尽量不要太专业化,没有人听你讲晦涩的理论,当然,更不能拉家常,说一些你们邻居家怎们怎么的事情,这显得你太没专业素养和水准。总之,这个度要拿捏好。注意观察老师和同学的表情,察言观色才是硬道理。

在提问期这个阶段,聆听是你的主要任务。老师会为你磨时间。有本校的老师,一般都会先评价下你的论文,当然是说很多好话的,这都是讲给答辩委员会主席听的。接下来就是提问,老师提问的时候你要记好他的问题,理解他的意思。在记得时候要注意把你回答的要点关键字一起写上,因为老师问完了你就要回答的,如果你反应比较快,你可以把老师的问题分类做个概述,然后按类作答,这样更显得你这孩子不错。

回答之前要对老师的评价和建议表示感谢,接下来回答老师的问题。第一个问题,先念一下题目,然后作答。作答时忌讳一盲目自大,得意洋洋,一副欠抽的样子,忌讳二信心不足,慌里慌张,没有底气,一副心虚的样子。要知道论文是你写的,你看的相关东西比他们多,所以你可以大胆的说,只要自圆其说即可。在这一阶段回答时要言简意赅,一语中的,废话少说,言多语失,能说就说,不能说的就说自己在这方面写论文的时候也考虑过,但考虑的不充分。忌讳的是不知道了就不说话,大家都不说话,气氛就凝固了,在论文答辩中如果没人说话,那就不好了,所以一定要说,哪怕你说不会,也比不说好。

值得一提的是,老师提问的问题有大有小。有对理论的,所以你要对你论文的理论了如指掌,尤其是一些相近的名词,尤其是长的差不多的词,比如这次我们同学的社会资源、社会资本、社会关系这三个词就让老师给缠了半天;有对方法的,所以你要对你做的调查细节注意再注意,不要有闪失。应付的东西老师都能看出来,人家干了这么多年,眼睛都很毒的;有对细节感兴趣的,所以你要对你的论文的逻辑结构、句子通顺与否、措词、错别字、标点尤其是摘要部分注意注意再注意注意,在这些方面出问题显得你不够认真仔细,所以校对时要下功夫,可以和同学交换校对,因为我们对自己写的东西,挑错别字是很困难的。摘要就那么点字,又在论文开头,这可是门面啊,还有最好有个后记,感谢之类的话,虽然老套,但咱们读了这么多年的书也应该感谢一下老师,必须的嘛。

答辩通过基本上是十拿九稳的,但是咱们也不能弄的太难看。自己丢人无所谓,给导师丢人就是罪过了。为了导师,为了自己,也要好好表现。好了,基本上就说这么多吧,各个专业各个学校的情况不一样,我说的只是一家之言,仅供参考而已,希望对大家有些帮助。

阅读全文

与基于单片机的湿度控制相关的资料

热点内容
卡尔曼滤波算法书籍 浏览:763
安卓手机怎么用爱思助手传文件进苹果手机上 浏览:840
安卓怎么下载60秒生存 浏览:799
外向式文件夹 浏览:231
dospdf 浏览:428
怎么修改腾讯云服务器ip 浏览:382
pdftoeps 浏览:489
为什么鸿蒙那么像安卓 浏览:732
安卓手机怎么拍自媒体视频 浏览:183
单片机各个中断的初始化 浏览:720
python怎么集合元素 浏览:477
python逐条解读 浏览:829
基于单片机的湿度控制 浏览:496
ios如何使用安卓的帐号 浏览:879
程序员公园采访 浏览:807
程序员实战教程要多长时间 浏览:970
企业数据加密技巧 浏览:132
租云服务器开发 浏览:809
程序员告白妈妈不同意 浏览:332
攻城掠地怎么查看服务器 浏览:597