基于51单片机的湿度控制器40含原理图与C代码41毕业论文设计.docx
《基于51单片机的湿度控制器40含原理图与C代码41毕业论文设计.docx》由会员分享,可在线阅读,更多相关《基于51单片机的湿度控制器40含原理图与C代码41毕业论文设计.docx(15页珍藏版)》请在冰豆网上搜索。
基于51单片机的湿度控制器40含原理图与C代码41毕业论文设计
(此文档为word格式,下载后您可任意编辑修改!
)
单片机湿度控制器
摘要
本系统采用AT89C51作为控制系统,通过模拟传感器把湿度信号采集后送给ADC0804,转换成数字信号后送入单片机,再通过LCD1602显示出来,同时独立键盘输入湿度上门限值和下门限值,当湿度值低于下门限值或上门限值时系统驱动蜂鸣器报警和控制电路进行湿度控制,当湿度再次回到两个门限值之间时消除报警和停止湿度控制,本系统实时刷新当前湿度和门限值,适用于大棚,花卉以及家庭湿度检测与控制。
目前工业自动化水平已成为衡量各行各业现代化水平的一个重要标志。
同时,控制理论的发展也经历了古典控制理论、现代控制理论和智能控制理论三个阶段。
智能控制的典型实例是模糊全自动洗衣机等。
关键词:
AT89C51,LCD1602,ADC0804,湿度控制与检测
Single-chipsensortoHoutoADC0804,conversionintodigitalsignalHouintosingletabletsmachine,thenbyLCD1602displayedout,whileindependentkeyboardenteredreturnedtotwoathresholdvalueZhijianShieliminationalarmandstopimportantsymbolofthemeasureofallwalksoflifethelevelofmodernization.Thesametime,thedevelopmentofcontroltheorycontroltheoryandthetheoryofintelligentcontrolinthreestages.Thetypicalexampleoftheintelligentcontrolfuzzyautomaticwashingmachine.
Keyword:
AT89C51,LCD1602,ADC0804,)指数字量变化一个最小量时模拟信号的变化量,定义为满刻度与2^n的比值。
分辩率又称精度,通常以数字信号的位数来表示。
2)转换速率(ConversionRate)是指完成一次从模拟转换到数字的AD转换所需的时间的倒数。
积分型AD的转换时间是毫秒级属低速AD,逐次比较型AD是微秒级属中速AD,全并行串并行型AD可达到纳秒级。
采样时间则是另外一个概念,是指两次转换的间隔。
为了保证转换的正确完成,采样速率(SampleRate)必须小于或等于转换速率。
因此有人习惯上将转换速率在数值上等同于采样速率也是可以接受的。
常用单位是ksps和Msps,表示每秒采样千百万次(kiloMillionSamplesperSecond)。
3)量化误差(QuantizingError)由于AD的有限分辩率而引起的误差,即有限分辩率AD的阶梯状转移特性曲线与无限分辩率AD(理想AD)的转移特性曲线(直线)之间的最大偏差。
通常是1个或半个最小数字量的模拟变化量,表示为1LSB、12LSB。
4)偏移误差(OffsetError)输入信号为零时输出信号不为零的值,可外接电位器调至最小。
5)满刻度误差(FullScaleError)满度输出时对应的输入信号与理想输入信号值之差。
6)线性度(Linearity)实际转换器的转移函数与理想直线的最大偏移,不包括以上三种误差。
2.6湿度传感器
2.6.1湿敏元件的特性
湿敏元件是最简单的湿度传感器。
湿敏元件主要电阻式、电容式两大类。
2.6.2湿敏电阻
湿敏电阻的特点是在基片上覆盖一层用感湿材料制成的膜,当空气中的水蒸气吸附在感湿膜上时,元件的电阻率和电阻值都发生变化,利用这一特性即可测量湿度。
湿敏电阻的种类很多,例如金属氧化特湿敏电阻、硅湿敏电阻、陶瓷湿敏电阻等。
湿敏电阻的优点是灵敏度高,主要缺点是线性度和产品的互换性差。
2.6.3湿敏电容
湿敏电容一般是用高分子薄膜电容制成的,常用的高分子材料有聚苯乙烯、聚酰亚胺、酷酸醋酸纤维等。
当环境湿度发生改变时,湿敏电容的介电常数发生变化,使其电容量也发生变化,其电容变化量与相对湿度成正比。
湿敏电容的主要优点是灵敏度高、产品互换性好、响应速度快、湿度的滞后量小、便于制造、容易实现小型化和集成化,其精度一般比湿敏电阻要低一些。
国外生产湿敏电容的主厂家有Humirel公司、Philips公司、Siemens公司等。
以Humirel公司生产的SH1100型湿敏电容为例,其测量范围是(1%~99%)RH,在55%RH时的电容量为180pF(典型值)。
当相对湿度从0变化到100%时,电容量的变化范围是163pF~202pF。
温度系数为0.04pF℃,湿度滞后量为±1.5%,响应时间为5s。
除电阻式、电容式湿敏元件之外,还有电解质离子型湿敏元件、重量型湿敏元件(利用感湿膜重量的变化来改变振荡频率)、光强型湿敏元件、声表面波湿敏元件等。
湿敏元件的线性度及抗污染性差,在检测环境湿度时,湿敏元件要长期暴露在待测环境中,很容易被污染而影响其测量精度及长期稳定性。
2.6.3湿度测量的名词术语
湿度:
湿度是表示空气中水蒸气的含量。
湿度又分为绝对湿度和相对湿度两种。
绝对湿度:
绝对湿度亦称水蒸气密度,它表示水蒸气的质量与总容积的比值,
dv代表绝对湿度,它表示每立方米干燥空气与水蒸气的混合物中所含水分的克数;p为水蒸气的压强(单位是Pa);Tab为干燥空气的温度值(单位是℃).需要指出,国内也有人将空气中所含水蒸气的压强理解为绝对湿度,这与国外关于绝对湿度的定义不相符。
相对湿度:
相对湿度表示在相同湿度下大气中水蒸气的实际压强与饱和水蒸气的压强之比,通常用百分数来表示。
相对湿度的英文缩写为RH(RelativeHumidity),
露点:
在水蒸气冷却过程中最初发生结露的温度。
若气温低于露点,水蒸气开始凝结。
湿度比:
它表示水蒸气的质量与干燥空气的质量比。
大气压强:
在单位面积上大气的压力。
通常将海平面高度的大气压强称为1个标准大气压,p0=101.325Pa。
大气压强随高度的增加而降低。
设A、B两点的高度差h2-.IEEETran.onComp.Poek,andManu(.measurementsbyMEMSinertialsensors
V.BistrovAutomaticControlandComputerSciences,2011,Volume45,Number5,Pages284-292
附录一
#includesbits1=P2^4;
sbits2=P2^5;
sbits3=P2^6;
sbits4=P2^7;
sbitspeaker=P3^2;
sbitD1=P3^0;
sbitD0=P3^1;
ucharcodetable[]="Humidity";
ucharcodetable1[]="%";
ucharcodetable2[]="Low";
ucharcodetable3[]="%High";
ucharresult,Low=202,High=216;
voiddelay(uinti)延时程序
{
ucharj;
while(i--)
{
for(j=0;j<115;j++)
{
};
}
}
voidinit_ad()初始化AD
{
cs=0;
}
voidstart_ad()启动AD
{
cs=0;
_nop_();
wr=0;
_nop_();
rd=1;
_nop_();
wr=1;
_nop_();
_nop_();
cs=1;
_nop_();
_nop_();
}
voidread_ad()读AD转换后的值
{
cs=0;
_nop_();
wr=1;
_nop_();
wr=0;
_nop_();
rd=0;
_nop_();
_nop_();
result=P0;
_nop_();
_nop_();
rd=1;
_nop_();
cs=1;
_nop_();
}
voidwrite_com(ucharcom)向液晶屏写指令
{
lcdrs=0;
P1=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(ucharresult)向液晶屏写数据
{
lcdrs=1;
P1=result;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit()液晶屏初始化
{
ucharnum;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);清屏指令
write_com(0x8a);写入的首地址
}
voiddisplay()液晶屏显示
{
uintnum,Low1,Low2,High1,High2;
ucharx,y;
x=result%10010;
y=result%10;
Low1=Low%10010;
Low2=Low%10;
High1=High%10010;
High2=High%10;
write_com(0x01);清屏指令
write_com(0x8a);写入的首地址写入当前湿度值
write_data(x+0x30);
delay(5);
write_data(y+0x30);
delay(5);
write_com(0x80);数据指针设置
for(num=0;num<10;num++)
{
write_data(table[num]);写第一行数据写入字母Humidity
delay(5);
}
write_com(0x8c);
delay(5);
write_data(table1[0]);写入%
write_com(0x80+0x40);设置数据地址指针为2行
for(num=0;num<3;num++)
{
write_data(table2[num]);写第二行数据写入字母Low
delay(5);
}
write_com(0x80+0x45);
for(num=0;num<7;num++)
{
write_data(table3[num]);写第二行数据写入字母High
delay(5);
}
write_com(0x80+0x43);写入的首地址写Low的值
write_data(Low1+0x30);
delay(5);
write_data(Low2+0x30);
delay(5);
write_com(0x80+0x4c);写入的首地址High的值
write_data(High1+0x30);
delay(5);
write_data(High2+0x30);
delay(5);
write_data(table1[0]);写入%
write_com(0x80+0x4e);设置数据地址指针为2行
}
voidkeyscan()
{
if(s1==0)
{
delay(10);
if(s1==0)
{
High++;
if(High==99)
High=98;
while(!
s1);
}
}
if(s2==0)
{
delay(10);
if(s2==0)
{
High--;
if(High==01)
High=02;
while(!
s2);
}
}
if(s3==0)
{
delay(10);
if(s3==0)
{
Low++;
while(!
s3);
}
}
if(s4==0)
{
delay(10);
if(s4==0)
{
Low--;
while(!
s4);
}
}
}
unsignedchartimer0h,timer0l,time;生日歌
codeunsignedcharsszymmh[]={5,1,1,5,1,1,6,1,2,5,1,2,1,2,2,7,1,4,
5,1,1,5,1,1,6,1,2,5,1,2,2,2,2,1,2,4,
5,1,1,5,1,1,5,2,2,3,2,2,1,2,2,7,1,2,6,1,2,
4,2,1,4,2,1,3,2,2,1,2,2,2,2,2,1,2,4};
音阶频率表高八位
codeunsignedcharFREQH[]={
0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,
0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,1,2,3,4,5,6,7,8,i
0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,
0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,
};
音阶频率表低八位
codeunsignedcharFREQL[]={
0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,
0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,1,2,3,4,5,6,7,8,i
0xEE,0x44,0x6B,0xB4,0xF4,0x2D,
0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,
};
voiddelay2(unsignedchart)
{
unsignedchart1;
unsignedlongt2;
for(t1=0;t1{
for(t2=0;t2<8000;t2++)
{
}
}
TR0=0;
}
voidt0int()interrupt1
{
TR0=0;
speaker=!
speaker;
TH0=timer0h;
TL0=timer0l;
TR0=1;
}
Voidsong()
{
TH0=timer0h;
TL0=timer0l;
TR0=1;
delay2(time);
}
voidbeen(void)
{
unsignedchark,i;
TMOD=1;置CT0定时工作方式1
EA=1;
ET0=1;IE=0x82CPU开中断,CT0开中断
i=0;
while(i<35){音乐数组长度,唱完从头再来
k=sszymmh[i]+7*sszymmh[i+1]-1;
timer0h=FREQH[k];
timer0l=FREQL[k];
time=sszymmh[i+2];
i=i+3;
song();
}
}
voidmain()
{
lcdrw=0;
init_ad();
init();
Low=Low*0.39;
High=High*0.39;
while
(1)
{
keyscan();
start_ad();
delay(10);
read_ad();
delay(10);
result=result*0.39;
display();
delay(1000);
if(result>High||result{
been();
D0=0;;
}
}
}
附录二