温湿度测量仪课程设计报告1

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告
题目:简易温湿度测量仪
目录
一、设计目的 (2)
二、设计器材清单 (2)
三、任务要求 (2)
1.基本要求 (2)
2.发挥部分 (2)
四、方案论证 (2)
1.采集传感器数据方案 (2)
2.键盘扫描方案 (2)
3.设置上下限方案 (2)
4.显示方案 (2)
5.语言选择方案 (3)
五、电路与程序设计 (3)
1.温湿度采集电路的设计 (3)
2.报警电路的设计 (4)
3.液晶显示设置 (4)
六、测试方案与测试结果 (4)
1.测试方案与测试条件 (4)
1)硬件测试方案 (4)
2)软件测试方案 (5)
3)综合测试方案 (5)
2.测试结果及其完整性 (5)
3测试结果分析 (5)
1)硬件结果 (6)
2)软件结果 (6)
七、实现的功能 (6)
八、心得体会 (6)
九、参考文献 (6)
附录:源程序代码 (7)
设计原理图 (18)
一:设计目的
1、提高对单片机的工作原理的认识。

熟悉相关控制程序。

2、了解传感器的工作原理,学习相关电路知识。

3、通过综合设计,进一步提高动手能力。

二:设计器材
AT89C51单片机学习板一个,USB线一根,DHT11传感器一个,蜂鸣器一个,LCD1602液晶显示屏一块,PNP三极管一个,5.1千欧和4.7千欧电阻各一个,插针和杜邦线若干。

三:任务要求
利用51学习板和DHT11设计并制作数字式温湿度测量仪。

1. 基本要求
1)测量空气温湿度
2)通过数码管显示温度和湿度,显示位数精确到个位,要求观察时无闪烁;
3)设置温度和湿度的上下限,通过蜂鸣器报警;
4)将温度和湿度单位显示在数据后面,温度C、湿度%RH;
2. 发挥部分
1)温度和湿度报警以不同的声音,并闪烁显示告警项。

2)使用按键来设置上下限,并显示。

3)实现摄氏度与华氏度的转换。

4)采用液晶1602或者12864来显示温湿度情况。

5)其它(如进一步扩展量程和提高精度(显示小数),自动量程转换等)。

四:方案论证
采集传感器数据方案
通过DHT11直接采集数据,然后进行数据处理。

1、键盘扫描方案
采用扫描的办法,把扫描函数放在一个死循环里,然后一直扫描按键的按下与否,如按下则执行相应的运用。

2、设置上下限方案
通过一个按键进入上下限设置模式,然后用八个四组按键分别对温湿度的上下限进行设置。

3、显示方案
采用液晶显示,功耗低,延时小,显示相对较为清晰。

4、语言选择方案
采用C语言进行程序的编写,C语言相对汇编语言比较简单易懂。

五:电路与程序设计
1.温湿度采集电路的设计
DHT11引脚说明:
Pin 名称注释
1 VDD 供电3-5.5VDC
2 DATA 串行数据,单总线
3 NC 空脚,请悬空
4 GND 接地,电源负极
根据引脚说明,连接线长度短于20米时用5K上拉电阻,因此采集电路如图所示:
2.报警电路的设计:
当温湿度超过上下限时,蜂鸣器中断报警开始,4个LED灯开始闪烁,蜂鸣器开始报警。

3.液晶显示设置:
六、测试方案与测试结果
1、测试方案及测试条件1)硬件测试方案:
我们首先用了面包板来做硬件测试,当运行最后的程序时,硬件的连法是正确的,这时再焊到板子上。

2)软件测试方案:
我们的程序是一块一块添加上去的,第一次都是单独测试它的运行无误后,再添加到整个模块里面。

最后的程序是通过仔细观察各种极限情况的执行的效果来分析其好坏。

3)综合测试方案:
我们是在室温下和天气预报的温湿度数据对比来看准不准确。

再通过用电吹风加热吹干的方法鉴别其灵敏度。

2.测试结果及其完整性
a:在keilC里按编译运行后没有任何错误和警告,点run后,很快会显示温湿度,数值准确。

b:此时按下K0键,进入温湿度正常显示模式。

c:此时按下K1键,上下限显示。

.
d:此时按下K2键,华氏度显示.
e:此时按下K4键,湿度上限+1,按下K8键,湿度上限-1.
f:此时按下K5键,湿度上限+1,按下K9键,湿度上限-1.
g:此时按下K6键,温度上限+1,按下KA键,温度上限-1.
h:此时按下K7键,温度下限+1,按下KB键,温度下限-1.
综合分析,设计完整可靠。

3.测试结果分析
1)硬件结果:
能正确显示和更新温湿度,表明采集电路没问题。

当超限时能发出响亮的报警声音,表示报警电路没问题。

2)软件结果:
a:能正确显示和更新温湿度,反应灵敏无闪烁,表示采集子程序和显示子程序良好。

b:当按下按键时能快速做出反应,也不会很快出现连续输入,表明按键扫描和处理子程序良好。

c:当设置上下限后,只是超出当前温湿度,才会报警,表明报警子程序设计良好。

d:当按温度模式转换键后,总会来回转换,表明模式转换子程序运行良好。

七:实现的功能
1.测量环境温湿度, 通过液晶屏显示温度和湿度,显示位数精确到个位,并显示单位。

. 2.摄氏和华氏温度能够来回转换。

3.在进入设置时,能够显示当前系统设定的限值。

4.报警能够同时通过蜂鸣器报警还是LED灯报警。

八:心得体会
经过了三周多的时间,我们终于成功做出了温湿度测量仪,在这期间从毫无头绪到慢慢理出思路,我们查阅了很多资料,也问了很多同学老师朋友,才能成功做出这个测量仪,实在是感触颇多。

在这期间不但要学会团队合作精神,要有包容的心态,还要能虚心请教,用心思考,耐心查错,也要不断地从失败中总结经验教训。

程序的软硬设计是我们最大的难题。

本来对于单片机以及C语言并不怎么精通的我们算是遇到的很多障碍。

一开始试着在网络上搜索原理图和程序,搜到了却看不懂,一条一条指令去查,去问,一条一条试着运行,终于琢磨出了大概的框架。

慢慢掌握了指令的用法之后,编程序变得比较得心应手,也是在那一段比较艰难的时光里唯一让我们觉得离成功更近一步了的喜悦感。

纸上谈兵是有了足够的资本了,但实际焊接电路的时候又遇到了很多问题。

我们都不是第
一次焊电路了,但依然存在很多老问题,比如虚焊啊,比如没有事先规划好元器件的排列啊,总之是吃足了苦头,还好最后静下心来,一点一点规划好步骤,在万无一失的前提下终于焊好了电路。

值得一提的是,一开始我们的分工就很明确,有人负责设计、编程、焊接、测试、记录、报告。

在这样合理的安排下我们以比想象快的速度完成了这次实验,也算是之前的各种离谱错误里边唯一有先见之明的安排了。

希望在今后的学习过程中,我们能继续秉承着这种良好的学习习惯,继续不断地进取,不断地提升自我!
通过这次课程设计,我们小组也进步很多。

主要从几个方面有了很大的成长。

硬件方面:对传感器和放大器又有了进一步的了解,知道了PNP和NPN的区别。

有源蜂鸣器和无源蜂鸣器的区别。

软件方面:第一次将汇编语言和实际结合起来,做了一个完整的有运用价值的程序,对汇编语言更加熟悉。

由于单片机的内存有限,就对程序的有效性要求很高,这对自己的编程效率都有很大改善。

实践方面:通过查找资料,设计电路,找元件。

到班级元件清单的购买和确认,都对自己对单片机等材料的熟悉和了解有了更深刻的认识。

从最开始的在面包板上实现功能的调试成功到焊接在电路板上都经历了不晓得挑战,当我们这一组的小伙伴们都成功运行了的时候我们都得到了锻炼。

通过综合设计,硬件和软件的排错能力也提高很多。

实践本来就是我们最薄弱的环节,我们有了这样的锻炼真的很感谢本次的课程设计。

九:参考文献
[1] 胡汉才单片机原理及其接口技术清华大学出版社
[2]李朝青单片机原理及接口技术. 北京航空航天大学出版社,2005
[3]马忠梅等单片机的C语言应用程序设计(第4版),2007
[4]江世明基于Proteus的单片机应用技术. 电子工业出版社,2009
[5]彭伟单片机C语言程序设计实训100例. 电子工业出版社,2009
[6]张毅刚新编MCS-51单片机应用设计(第3版) 哈尔滨工业大学出版社2008
[7]LCD1602、DHT11数据手册
源程序代码
#include<regx51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x20};
uchar code shidu_str_temp[]={"shi:"};
uchar code wendu_str_temp[]={"wen:"};
uchar code shidu_danwei[]={"%RH"};
uchar ts, tg, tx, rhs, rhg, rhx,ftb,fts,ftg,ftx;
uchar U8FLAG;
uchar U8count,U8temp;
uchar U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata; uchar
U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8c heckdata_temp;
uchar U8comdata;
uchar U8ALarm_temp_RHHL[2]={90,20};
uchar U8ALarm_temp_THL[2]={23,16};
uint Time0_Count=0;
uint U16F;
uchar keyflag=0;
sbit keysn=P1^3;
sbit DHT=P1^4; //DHT通信端口
sbit wela=P1^1;
sbit dula=P1^0;
sbit beep=P3^6; //蜂鸣器端口
sbit Led_ce=P1^2;
sbit Led_D3= P0^7;
sbit Led_D2= P0^6;
sbit Led_D1=P0^5;
sbit Led_D0=P0^4;
bit HT_ALarm=0; //高温标志
bit LT_Alarm=0; //低温标志
bit RHH_ALarm=0; //高湿度标志bit RHL_ALarm=0; //低湿度标志sbit RS=P1^5;
sbit RW=P1^6;
sbit E=P1^7;
void display();
void disp_alarm_temp() ;
void disp_fs() ;
void Delay(uint j) //(j/10)ms
{
uchar i;
for(;j>0;j--)
{
for(i=0;i<27;i++);
}
}
void Delay_5us(void) //5us {
uchar i;
i--;
i--;
i--;
i--;
i--;
i--;
}
//串行总线
void keyscan() //键盘扫描函数{
uchar a,b,d,keynum;
for(d=0;d<4;d++)
{
P0=0;
dula=1;
dula=0;
P0=_crol_(0xfe,d);
wela=1;
wela=0;
keysn=0;
a=P0&0x0f;
if(a!=0x0f)
{
Delay(100);
b=P0&0x0f;
if(a==b)
{
switch(b)
{
case 0x0e:
keynum=0+4*d;
keyflag=keynum;
if(keynum==4) //上限加
{
U8ALarm_temp_RHHL[0]++;
Delay(500);
disp_alarm_temp();
}
if(keynum==8) //上限减
{
U8ALarm_temp_RHHL[0]--;
Delay(500);
disp_alarm_temp();
}
break;
case 0x0d:
keynum=1+4*d;
keyflag=keynum;
if(keynum==1)
{
disp_alarm_temp();
}
if(keynum==5)
{
U8ALarm_temp_RHHL[1]++;
Delay(500);
disp_alarm_temp();
}
if(keynum==9)
{
U8ALarm_temp_RHHL[1]--;
Delay(500);
disp_alarm_temp();
}
break;
case 0x0b:
keynum=2+4*d;
keyflag=keynum;
if(keynum==2)
{
disp_fs();
}
if(keynum==6)
{
U8ALarm_temp_THL[0]++;
Delay(500);
disp_alarm_temp();
}
if(keynum==10)
{
U8ALarm_temp_THL[0]--;
Delay(500);
disp_alarm_temp();
}
break;
case 0x07:
keynum=3+4*d;
keyflag=keynum;
if(keynum==7)
{
U8ALarm_temp_THL[1]++;
Delay(500);
disp_alarm_temp();
}
if(keynum==11)
{
U8ALarm_temp_THL[1]--;
Delay(500);
disp_alarm_temp();
}
break;
default:break;
}
}
while(P0&0x0f!=0x0f); //按键释放检测}
keysn=1;
}
}
void COM(void) //bit读取
{
uchar i;
for(i=0;i<8;i++)
{
U8FLAG=2;
while((!DHT)&&U8FLAG++);
Delay_5us();
Delay_5us();
Delay_5us();
U8temp=0;
if(DHT)U8temp=1;
U8FLAG=2;
while((DHT)&&U8FLAG++);
//----------------------
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为1
U8comdata<<=1; //DHT11数据是从高位开始传的,于是用左移,进行数据处理
U8comdata|=U8temp; //0
}//rof
}
void shuju()
{
rhs=U8RH_data_H%100/10;//湿度的十位
rhg=U8RH_data_H%10; //湿度个位
rhx=U8RH_data_L%100/10;//湿度小数
ts=U8T_data_H%100/10;
tg=U8T_data_H%10;
tx=U8T_data_L%100/10;
U16F=320+180*ts+18*tg; //( (ts*10+tg ) *1.8 +32 ) *10= (ts*10+tg )
if(U16F>=1000)
{
ftb=U16F/1000;
fts=U16F/100%10;
ftg=U16F/10%10;
}
if(U16F<1000)
{
ftb=10;
fts=U16F/100;
ftg=U16F/10%10;
}
ftx=U16F%10;
RHH_ALarm=((rhs*10)+rhg)>= U8ALarm_temp_RHHL[0] ? 1:0; RHL_ALarm=((rhs*10)+rhg)<= U8ALarm_temp_RHHL[1] ? 1:0; HT_ALarm=((ts*10)+tg)>= U8ALarm_temp_THL[0] ? 1:0;
LT_Alarm=((ts*10)+tg)<= U8ALarm_temp_THL[1] ? 1:0;
}
void write_com(uchar com) //写指令
{
RS=0;
P2=com;
Delay(50);
E=1;
Delay(50);
E=0;
}
void write_data(uchar date) //写数据{
RS=1;
RW=0;
P2=date;
Delay(50);
E=1;
Delay(50);
E=0;
}
void init() //1602液晶屏初始化{
wela=0;
dula=0;
P0=0x00;
E=0;
write_com(0x38);
write_com(0x0e);
write_com(0x06);
write_com(0x01);
write_com(0x80);
Delay(150);
write_com(0x38);
Delay(50);
write_com(0x38);
Delay(50);
write_com(0x38);
}
void set_led_pos(uchar pos)//设置显示位置{
write_com( pos|0x80);
}
void display() //lcd1602显示
{
uchar i;
set_led_pos(0x00);
for(i=0;i<4;i++)
{
write_data(shidu_str_temp[i]);
}
set_led_pos(0x40);
for(i=0;i<4;i++)
{
write_data(wendu_str_temp[i]);
}
set_led_pos(0x08);
for(i=0;i<3;i++)
{
write_data(shidu_danwei[i]);
}
set_led_pos(0x04);write_data(table[rhs]); set_led_pos(0x05);write_data(table[rhg]); set_led_pos(0x06);write_data('.');
set_led_pos(0x07);write_data(table[rhx]); set_led_pos(0x44);write_data(table[ts]); write_data(table[tg]);
write_data('.');
write_data(table[tx]);
write_data(0xdf);
write_data('C');
}
void disp_fs() //华氏度转换
{
uchar i;
set_led_pos(0x00);
for(i=0;i<4;i++)
{
write_data(shidu_str_temp[i]);
}
set_led_pos(0x04);write_data(table[rhs]);
set_led_pos(0x05);write_data(table[rhg]);
set_led_pos(0x06);write_data('.');
set_led_pos(0x07);write_data(table[rhx]);
set_led_pos(0x08);
for(i=0;i<3;i++)
{
write_data(shidu_danwei[i]);
}
set_led_pos(0x40);
for(i=0;i<4;i++)
{
write_data(wendu_str_temp[i]);
}
set_led_pos(0x44);write_data(table[ftb]);
set_led_pos(0x45);write_data(table[fts]);
set_led_pos(0x46);write_data(table[ftg]);
set_led_pos(0x47);write_data('.');
set_led_pos(0x48);write_data(table[ftx]);
set_led_pos(0x49);write_data('F');
}
void disp_alarm_temp() //上下限显示{
uchar i;
set_led_pos(0x00);
for(i=0;i<4;i++)
{
write_data(shidu_str_temp[i]);
}
set_led_pos(0x04);
write_data(table[ U8ALarm_temp_RHHL[0]/10]);
set_led_pos(0x05);
write_data(table[ U8ALarm_temp_RHHL[0]%10]);
set_led_pos(0x06);write_data(',');
set_led_pos(0x07);write_data(table[U8ALarm_temp_RHHL[1]/10]);
set_led_pos(0x08);write_data(table[U8ALarm_temp_RHHL[1]%10]);
write_data(0x20); write_data(0x20);
set_led_pos(0x40);
for(i=0;i<4;i++)
{
write_data(wendu_str_temp[i]);
}
set_led_pos(0x44);
write_data(table[ U8ALarm_temp_THL[0]/10]);
set_led_pos(0x45);
write_data(table[ U8ALarm_temp_THL[0]%10]);
set_led_pos(0x46);write_data(',');
set_led_pos(0x47);write_data(table[U8ALarm_temp_THL[1]/10]);
set_led_pos(0x48);write_data(table[U8ALarm_temp_THL[1]%10]);
write_data(0x20);
}
void T0_INT() interrupt 1 //蜂鸣器中断报警
{
Led_ce=0;
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
beep=~beep;
if(++Time0_Count==500)
{
Time0_Count=0;
if(RHH_ALarm==1) Led_D3=~Led_D3;else Led_D3=0;
if(RHL_ALarm==1) Led_D2=~Led_D2;else Led_D2=0;
if (HT_ALarm==1) Led_D1=~Led_D1;else Led_D1=0;
if(LT_Alarm==1) Led_D0=~Led_D0;else Led_D0=0;
TR0=0;
}
}
void RH(void) //byte读取
{
//主机拉低18ms
DHT=0;
Delay(180);
DHT=1;
//总线由上拉电阻拉高主机延时20us
Delay_5us();
Delay_5us();
Delay_5us();
Delay_5us();
//主机设为输入判断从机响应信号
DHT=1;
//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行
if(!DHT) //T !
{
U8FLAG=2;//////////////////////////////////////////////////// //判断从机是否发出80us 的低电平响应信号是否结束
while((!DHT)&&U8FLAG++);
U8FLAG=2;
//判断从机是否发出80us 的高电平,如发出则进入数据接收状态
while((DHT)&&U8FLAG++);
//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
DHT=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_ L_temp);
if(U8temp==U8checkdata_temp)
{
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
}//fi
}
void main()
{
P1=0x0c;
Led_ce=0;
P1=0xf0;
init();
Delay(50);
ET0=1;
ET1=1;
EA=1;
TMOD=0x01;
TH0=(65535-1000)/256; TL0=(65535-1000)%256; TR0=0;
while(1)
{
RH();
shuju();
keyscan();
switch(keyflag)
{
case 0:
display();
if((RHH_ALarm==1||RHL_ALarm==1)||(HT_ALarm==1||LT_Alarm==1))
TR0=1;
else
TR0=0;
}
}
}
设计原理图:。

相关文档
最新文档