数字式温湿度测量仪设计.docx
《数字式温湿度测量仪设计.docx》由会员分享,可在线阅读,更多相关《数字式温湿度测量仪设计.docx(24页珍藏版)》请在冰豆网上搜索。
数字式温湿度测量仪设计
长沙学院
《单片机原理及应用》
课程设计说明书
题目
数字式温湿度测量仪设计
系(部)
专业(班级)
姓名
学号
指导教师
起止日期
《单片机原理及应用》课程设计任务书8
系(部):
电信系专业:
2011级电子信息工程
课题名称
数字式温湿度测量仪设计
设计内容及要求
1、课题内容:
以单片机为核心,使用SHT11温、湿度传感器设计一个
数字式温湿度计。
测量一路温度和湿度信号并用12864液晶屏显示。
测温范
围-55-125摄氏度,精度0.5摄氏度;湿度测量范围:
0-100%RH。
液晶屏的
第一行显示“温湿度测量仪”,第二行显示设计者姓名和学号,第三行显示测量温度、温度设定的上、下限报警值。
第四行显示测量湿度、湿度设定的上、下限报警值。
当温度或湿度高于设定上限值或低于下限值时驱动峰鸣器演奏歌曲一首作为报警信号。
2、要求:
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过,并提交
一篇课程设计说明书。
设计工作量
1、汇编或C51语言程序设计;
2、程序调试;
3、在Proteus上进行仿真成功;
4、提交一份完整的课程设计说明书,包括设计原理、程序设计、程序
分析、仿真分析、调试过程,参考文献、设计总结等。
进度安排
起止日期(或时间量)
设计内容(或预期目标)
备注
第一天
课题介绍,答疑,收集材料,C51介绍
第二天
设计方案论证,练习编写C51程序
第三天~第六天
程序设计
第六天~第八天
程序调试、仿真
第九天~第十天
系统测试并编写设计说明书
教研室
意见
年月日
系(部)主管领导意见
年月日
一、概述
温湿度测量有着广泛的应用,标准温湿度测量仪主要应用于计量、气象、军事等领域,实现准确高精度的测量温湿度,同时还可以作为其他温湿度仪表校正的参考标准。
数字式通风干湿表是一种重要的湿度标准器,干湿球温度的测量精度是制约其湿度精度的重要因素,本文设计的数字式标准温湿度测量仪,着重提高温度的测量精度,达到高精度湿度测量的目的。
温湿度是人们日常生活中接触最多的两个物理量,人们的日常生活、动植物的生存繁衍和周围环境的温湿度息息相关,石油、化工、冶金、纺织、机械制造、航空航天、制药、烟草、档案保管、粮食存储等领域对温、湿度也有着较高的要求。
例如:
烟叶和纸张是吸湿性极高的材料,卷烟生产的每一个阶段对温、湿度都有非常特别的要求,以确保所使用材料的水分,保证生产的效率和产品质量;印刷车间的温、湿度控制水平对印刷质量有很大的影响[2];为防止库存武器弹药、金属材料等物品霉烂、生锈,必须保持环境温度不能过高和干燥;而水果、种子、肉类等的保存又需要保证一定的湿度;在矿山、棉麻、塑料、粉末金属、食品生产加工等企业的生产车间(环境)中往往会产生大量的可燃或易燃粉尘,如果空气湿度过低,在一定的能量下,极易发生粉尘爆炸。
二、设计内容及要求
1、课题内容
以单片机为核心,使用SHT11温、湿度传感器设计一个数字式温湿度计。
测量一路温度和湿度信号并用12864液晶屏显示。
测温范围-55-125摄氏度,精度0.5摄氏度;湿度测量范围:
0-100%RH。
液晶屏的第一行显示“温湿度测量仪”,第二行显示设计者姓名和学号,第三行显示测量温度、温度设定的上、下限报警值。
第四行显示测量湿度、湿度设定的上、下限报警值。
当温度或湿度高于设定上限值或低于下限值时驱动峰鸣器演奏歌曲一首作为报警信号。
2、要求
完成该系统的硬件和软件的设计,在Proteus软件上仿真通过,并提交一篇课程设计说明书。
三、设计原理
1、 温度传感器的选择
采用热电阻温度传感器。
热电阻是利用导体的电阻随温度变化的特性制成的测温元件。
现应用较多的有铂、铜、镍等热电阻。
其主要的特点为精度高、测量范围大、便于远距离测量。
铂的物理、化学性能极稳定,耐氧化能力强,易提纯,复制性好,工业性好,电阻率较高,因此,铂电阻用于工业检测中高精密测温和温度标准。
缺点是价格贵,温度系数小,受到磁场影响大,在还原介质中易被玷污变脆。
按IEC标准测温范围-200~650℃,XX电阻比W(100)=1.3850时,R0为100Ω和10Ω,其允许的测量误差A级为±(0.15℃+0.002 |t|),B级为±(0.3℃+0.005 |t|)。
铜电阻的温度系数比铂电阻大,价格低,也易于提纯和加工;但其电阻率小,在腐蚀性介质中使用稳定性差。
在工业中用于-50~180℃测温。
2、 湿度传感器的选择
测量空气湿度的方式很多,其原理是根据某种物质从其周围的空气吸收水分后引起的物理或化学性质的变化,间接地获得该物质的吸水量及周围空气的湿度。
电容式、电阻式和湿涨式湿敏原件分别是根据其高分子材料吸湿后的介电常数、电阻率和体积随之发生变化而进行湿度测量的。
采用CHR-01湿敏电阻。
CHR-01湿敏电阻适用于阻抗型高分子湿度传感器,它的工作电压为交流1V,频率为50Hz~2kHz,测量湿度范围为20%~90%RH,测量精度±5%,工作温度范围为0~+85℃,最高使用温度120℃,阻抗在60%RH(25℃)时为30(21~40.5)KΩ。
采用555时基或RC振荡电路,将湿度传感器等效为阻抗值,测量振荡频率输出,振荡频率在1k Hz左右。
四、设计方案
把各个功能模块编写成单独的源文件进行调试,调试成功以后,再将各部分联合在一起。
用户温度输入数据时上限、下限分别在七段数码管的0、1、2、3位置显示,湿度输入数据时上限、下限分别在七段数码管的4、5、6、7位置显示。
读键存储的过程是循环程序。
可循环等待直到用户输入正确并确认为止。
采样转换模块是一个比较重要的模块,在调试的阶段遇到的问题较多,由于它是程序运行的瓶颈,如果这一部分通不过的话,那么程序就无法执行下去,本系统采用的是延时的方法。
温湿度判断控制模块也一个非常重要的模块,由于温湿度对于植被的生长起着决定性的作用,因此,如果这两个因素控制不好,这个系统就失败了,这就需要我认真的考虑这一模块的控制方式,调试阶段比较顺利。
除了以上所提到的模块之外,还有一些模块也很重要,也都需要认真的调试,如报警模块等。
调试了各模块之后,接下来的工作就是将各源程序段连接起来,进行综合调试了,综合调试需要我们特别注意细节部分,这样才能尽可能的减少错误的产生。
程序:
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharg,s,b;
uinttemp,temp_dat;
floatf_temp;
voidlcd_display_temp_max(ucharname,ucharmax,ucharmin,bitf);
uchards18b20_int_date(void);
uchards18b20_float_date(void);
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbitPSB=P2^3;
sbitDS=P3^3;
sbitfm=P3^4;
sbitk1=P3^5;
sbitk2=P3^6;
sbitk3=P3^7;
uintt,k;
uchartimeh,timel;
ucharshi,fen,miao;
ucharcodedis5[]={'.'};
ucharcodedis0[]={"0123456789"};
ucharcodedis1[]={"00时00分00秒"};
ucharcodedis2[]={".℃-55~90℃"};
ucharcodedis3[]={""};
ucharcodedis4[]={0xa1,0xa0,0xca,0xfd,0xd7,0xd6,0xca,0xbd,
0xce,0xc2,0xb6,0xc8,0xbc,0xc6,"℃"};
;
ucharcodezbjbxf[]={
0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1,
0x91,0xA1,0x81,0x64/*,0xA3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,
0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xC2,0x62,
0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x91,
0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2,
0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD8*/};
ucharcodechuzhi[]=
{
0xff,0xff,
0xFC,0x8E,
0xFC,0xED,
0xFD,0x43,
0xFD,0x6A,
0xFD,0xB3,
0xFD,0xF3,
0xFE,0x2D,
0xFE,0x47,
0xFE,0x76,
0xFE,0xA1,
0xFE,0xC7,
0xFE,0xD9,
0xFE,0xF9,
0xFF,0x16
};
voidwarning();
voiddelayms(uintxms)
{
uchari,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay(uintz)//延时165MS,即十六分音符
{
uinty;
for(z;z>0;z--)
for(y=19000;y>0;y--);//大致时间
}
voidds18b20_init(void)
{uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bitds18b20_tmpreadbit(void)//readabit读一位
{
uinti;
bitdat;
DS=0;
i++;//i++fordelay小延时一下
DS=1;
i++;
i++;
dat=DS;
i=8;
while(i>0)i--;
return(dat);
}
uchards18b20_tmpread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=ds18b20_tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好
}//一个字节在DAT里
return(dat);//将一个字节数据返回
}
voidds18b20_tmpwritebyte(uchardat)
{//写一个字节到DS18B20里
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
DS=0;i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidds18b20_tmpchange(void)//DS18B20beginchange发送温度转换命令
{
ds18b20_init();//初始化DS18B20
delayms(10);
ds18b20_tmpwritebyte(0xcc);//跳过序列号命令
ds18b20_tmpwritebyte(0x44);//发送温度转换命令
}
uintds18b20_gettemp()
{
uchara,b;
ds18b20_init();
delayms(10);
ds18b20_tmpwritebyte(0xcc);
ds18b20_tmpwritebyte(0xbe);
a=ds18b20_tmpread();
b=ds18b20_tmpread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
returntemp;
}
voidwrite_com(ucharcom)
{
rs=0;
rw=0;
en=0;
P0=com;
delayms(5);
en=1;
delayms(5);
en=0;
}
voidwrite_data(uchardate)
{
rs=1;
rw=0;
en=0;
P0=date;
delayms(5);
en=1;
delayms(5);
en=0;
}
voidlcd_pos(ucharX,ucharY)
{
ucharpos;
if(X==0)
{
X=0x80;
}
if(X==1)
{
X=0x90;
}
if(X==2)
{
X=0x88;
}
if(X==3)
{
X=0x98;
}
pos=X+Y;
write_com(pos);
}
voidwrite_sfm(intadd,uintdate)
{
ucharshi,ge;
shi=date/10;
ge=date%10;
lcd_pos(0,0+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidkeyscan()
{
if(k1==0)
{
delayms(5);
if(k1==0)
{
k++;
while(!
k1);
if(k==1)
{
TR0=0;
write_com(0x0f);
lcd_pos(0,5);
}
}
if(k==2)
{
lcd_pos(0,3);
}
if(k==3)
{
lcd_pos(0,1);
}
if(k==4)
{
k=0;
write_com(0x0c);
TR0=1;
}
}
if(k!
=0)
{
if(k2==0)
{
delayms(5);
if(k2==0)
{
while(!
k2);
if(k==1)
{
miao++;
if(miao==60)
miao=0;
write_sfm(5,miao);
lcd_pos(0,5);
}
if(k==2)
{
fen++;
if(fen==60)
fen=0;
write_sfm(3,fen);
lcd_pos(0,3);
}
if(k==3)
{
shi++;
if(shi==24)
shi=0;
write_sfm(1,shi);
lcd_pos(0,1);
}
}
}
if(k3==0)
{
delayms(5);
if(k3==0)
{
while(!
k3);
if(k==1)
{
miao--;
if(miao==-1)
miao=59;
write_sfm(5,miao);
lcd_pos(0,5);
}
if(k==2)
{
fen--;
if(fen==-1)
fen=59;
write_sfm(3,fen);
lcd_pos(0,3);
}
if(k==3)
{
shi--;
if(shi==-1)
shi=23;
write_sfm(1,shi);
lcd_pos(0,1);
}
}
}
}
}
voidinit()
{
PSB=1;
write_com(0x30);
delayms(5);
write_com(0x0c);
delayms(5);
write_com(0x01);
delayms(5);
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TMOD=0x11;
ET0=1;
ET1=1;
PT0=1;
PT1=0;
EA=1;
TR0=1;
}
voidwrite_sfm3(intadd3,uintdate3)
{
ucharshi,ge;
shi=date3/10;
ge=date3%10;
lcd_pos(1,0+add3);
write_data(0x30+shi);
write_data(0x30+ge);
}
voidwrite_sfm4(intadd4,uintdate4)
{
ucharshi,ge;
shi=date4/10;
ge=date4%10;
lcd_pos(1,0+add4);
write_data(0x30+shi);
write_data(0x30+ge);
}
voiddis_temp(uintt)
{
b=t/10;
write_sfm3(0,b);
//lcd_pos(1,0);
//write_data(dis0[b]);
s=t%10;
write_sfm4(2,s);
/*s=t%100/10;
lcd_pos(1,1);
write_data(dis0[s]);
lcd_pos(1,2);
write_data('.');
g=t%10;
lcd_pos(1,3);
write_data(dis0[g]);*/
}
voidwarning()
{
uinttemp_music;//存放简谱数组中的每一个音符的临时变量
uchari=0;
ucharjp;//jp用于取出temp中的高8位和低8位
while
(1)
{
temp_music=zbjbxf[i];
if(temp_music==0xff)
break;
jp=temp_music/16;//取数的高4位,音频数值
if(jp!
=0)
{
timeh=chuzhi[jp*2];//构造定时器初值高8位
timel=chuzhi[jp*2+1];//构造定时器初值低8位
TR1=1;//开定时器
}
else
{
TR1=0;//关定时器
fm=1;//关蜂鸣器
}
delay(temp_music%16);//取数的低4位,节拍(音符总时延)
TR1=0;//唱完一个音停5MS
fm=1;
delayms(5);
i++;
}
TR1=0;//关定时器
fm=1;//关蜂鸣器
}
voidmain()
{
uchari;
init();
delayms(10);
lcd_pos(0,1);
i=0;
while(dis1[i]!
='\0')
{
write_data(dis1[i]);
i++;
}
lcd_pos(1,0);
i=0;
while(dis2[i]!
='\0')
{
write_data(dis2[i]);
i++;
}
lcd_pos(2,0);
i=0;
while(dis3[i]!
='\0')
{
write_data(dis3[i]);
i++;
}
lcd_pos(3,0);
i=0;
while(dis4[i]!
='\0')
{
write_data(dis4[i]);
i++;
}
while
(1)
{
keyscan();
ds18b20_tmpchange();
temp_dat=ds18b20_gettemp();
if(b>25||b<15)
{
warning();
}
}
}
voidtimer()interrupt1
{
TH0=15535/256;
TL0=15535%256;
t++;
if(t==20)
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(1,shi);
}
write_sfm(3,fen);
}
write_sfm(5,miao);
dis_temp(temp_dat);
}
}
voidtimer0()interrupt3
{
TH1=timeh;
TL1=timel;
fm=~fm;
}
五、测试结果
通过实物仿真,得到下图所示结果:
六、设计心得体会
在为期两周的单片机课程设计中,第一周是要将以前做过的实验再次仿真一遍,在做完以前的题目后,刘辉老师让我们抽签选取自己的课程设计题目,我选到了第八个题目,就是数字式温湿度测量仪设计这个课题,在做这个课题当中,刚开始连接实物的时候,显示屏只亮,并没有任何的显示,最后发现由于是电路板的一个地方松了,最后将其扭紧,就得到了测试结果所显示的画面。
在这两周的课程设计中,遇到了不少的问题,发现了自己在知识上的很多漏洞,最后在老师同学的帮助下得以完成。
同时也在这次的课程设计中