水温控制系统设计论文.docx
《水温控制系统设计论文.docx》由会员分享,可在线阅读,更多相关《水温控制系统设计论文.docx(17页珍藏版)》请在冰豆网上搜索。
![水温控制系统设计论文.docx](https://file1.bdocx.com/fileroot1/2022-11/24/10de0929-29b8-4a00-986f-51390764f9bb/10de0929-29b8-4a00-986f-51390764f9bb1.gif)
水温控制系统设计论文
水温控制系统设计论文
学校:
系别:
专业:
指导教师:
姓名及学号:
2011年5月
目录
标题.....................................................................2
摘要.................................................................2
一、设计要求...........................................................2
二、设计方案及论证............................................................2
三、硬件设计及实现....................................................3
1、主控系统设计................................................................3
2、温度采集系统.............................................................4
四、系统软件设计...............................................................7
1系统软件流程图....................................................7
2系统软件...........................................................9
结束语................................................................10
参考文献...............................................................10
水温控制系统
摘要:
设计关键词:
AT89C52单片机数字温度传感器DS18B20八段数码管显示
独立键盘输入温度采集与转换
一、设计要求
1、温度设定范围为40~90℃,最小区分度为1℃,标定温度小于等于1℃。
2、环境温度降低时,(如用电风扇降温)温度控制的静态误差小于等于1℃。
3、用十进制数码管显示水的实际温度。
二、设计方案及论证
1、控制器模块:
采用AT89C52作为系统控制器。
2、温度采集模块:
采用数字温度传感器DS18B20,如图1所示。
图1DS18B20测温电路
3、显示模块:
采用三位LED七段数码管分别显示温度的十位、个位和小数位。
按键采用单列3按键进行温度设定。
系统框图如图2所示:
三、硬件设计与实现
系统硬件电路主要由AT89C52单片机开发板、DS18B20单线数字温度传感器组成。
1、主控系统设计
图3系统硬件模块关系图
2、温度采集部分设计
本系统采用半导体温度传感器作为敏感元件。
传感器我们采用了DS18B20单总线可编程温度传感器,来实现对温度的采集和转换,直接输出数字量,可以直接和单片机进行通讯,大大简化了电路的复杂度。
DS18B20应用广泛,性能可以满足题目的设计要求。
DS18B20的测温电路如图4所示。
图4DS18B20测温电路
(1)DSI8B20的测温功能的实现:
其测温电路的实现是依靠单片机软件的编程上。
当DSI8B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的0,1字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后,数据格式以0.0625℃/LSB形。
温式表示度值格式如表1所示,其中“S”为标志位,对应的温度计算:
当符号位S=0时,直接将二进制位转换为十进制;当S=1时,先将补码变换为原码,再计算十进制值。
DSI8B20完成温度转换后,就把测得的温度值与TH做比较,若T>TH或T(2)温度转换算法及分析
由于DS18B20转换后的代码并不是实际的温度值,所以要进行计算转换。
温度高字节(MSByte)高5位是用来保存温度的正负(标志为S的bit11~bit15),高字节(MSByte)低3位和低字节来保存温度值(bit0~bit10)。
其中低字节(LSByte)的低4位来保存温度的小数位(bit0~bit3)。
由于本程序采用的是0.0625的精度,小数部分的值,可以用后四位代表的实际数值乘以0.0625,得到真正的数值,数值可能带几个小数位,所以采取小数舍入,保留一位小数即可。
也就说,本系统的温度精确到了0.1度。
算法核心:
首先程序判断温度是否是零下,如果是,则DS18B20保存的是温度的补码值,需要对其低8位(LSByte)取反加一变成原码。
处理过后把DS18B20的温度Copy到单片机的RAM中,里面已经是温度值的Hex码了,然后转换Hex码到BCD码,分别把小数位,个位,十位的BCD码存入RAM中。
(3) 键盘、显示
系统键盘使用AT89C52单片机开发板上自带键盘进行键盘输入操作。
数字显示部分第一种方法是采用采用数码管,由于要求的测量精度为≤10C,所以本系统采用三位数码管进行显示。
数码管显示图如图5
图5
本系统通过键盘设定温度并可以进行复位,其电路图如图6
图6
四、系统软件设计
1、系统软件流程图
系统软件主要由温度采集、键盘扫描、数码管显示、报警子程序、中间接口程序组成。
其主程序流程图如图7,温度采集子程序流程图如图3.2,键盘扫描子程序流程图如图8。
Y
N
蜂鸣器连续鸣响
图7主程序流程图
读取温度DS18B20模块的流程
图8温度采集子程序流程图
键盘扫描处理流程
图9键盘扫描子程序流程图
注:
显示温度
(1)未插DS18B20时,数码管显示设定值50.
(2)插入DS18B20时,数码管显示当前温度XX.X
2、系统软件
系统软件的源程序:
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS=P2^0;//定义DS18B20接口
sbitDAT_595_PIN=P1^2;
sbitSCK_595_PIN=P1^0;
sbitRCK_595_PIN=P1^1;
sbitBUZZ=P3^3;
inttemp,seding;
ucharflag1,sebai=0,seshi=5,sege=0,sexiao=0;
voiddisplay(unsignedchar*lp,unsignedcharlc);//数字的显示函数;lp为指向数组的地址,lc为显示的个数
voidWrite_595(uchar*lp);
//voiddelay(void);//延时子函数,5个空指令
//voiddelay10ms(void);
//voidreadrom(void);
codeunsignedchartable[]={0xf5,0x05,0xb3,0x97,0x47,0xd6,0xf6,0x85,0xf7,0xd7,
//0123456789
0xfd,0x0d,0xbb,0x9f,0x4f,0xde,0xfe,0x8d,0xff,0xdf,0x00};
//0.1.2.3.4.5.6.7.8.9.灭
//共阴数码管0-9-_空表
ucharcodebit_buf[8]={0xdf,0xbf,0x7f,0xef,0xfd,0xfb,0xf7,0xfe};//0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharl_tmpdate[8]={0,0,0,0,0,0,0,0};//定义数组变量,并赋值1,2,3,4,5,6,7,8,就是//本程序显示的八个数
inttmp(void);
voidtmpchange(void);
voidtmpwritebyte(uchardat);
uchartmpread(void);
bittmpreadbit(void);
voiddsreset(void);
voiddelayb(uintcount);
voidScan_Key(void);
voidDelayk(void);
voidmain()//主函数
{
intl_tmp;
BUZZ=1;
while
(1)
{
Scan_Key();//设定温度上限
if(sebai==0)l_tmpdate[4]=20;elsel_tmpdate[4]=sebai;
l_tmpdate[5]=seshi;
l_tmpdate[6]=sege+10;
l_tmpdate[7]=20;
tmpchange();//温度转换
l_tmp=tmp();
if(l_tmp<0)
l_tmpdate[0]=10;//判断温度为负温度,前面加"-"
else
{
l_tmpdate[0]=temp/1000;//显示百位,这里用1000,是因为我们之前乖以10位了
if(l_tmpdate[0]==0)
l_tmpdate[0]=20;//判断温度为正温度且没有上百,前面不显示
}
l_tmp=temp%1000;
l_tmpdate[1]=l_tmp/100;//获取十位
l_tmp=l_tmp%100;
l_tmpdate[2]=l_tmp/10;//获取个位
l_tmpdate[2]+=10;
l_tmpdate[3]=l_tmp%10;//获取小数第一位
seding=sebai*100+seshi*10+sege;
if(temp>10*seding)//超过设定值报警
BUZZ=0;
else
BUZZ=1;
display(l_tmpdate,5);
}
}
voiddisplay(unsignedchar*lp,unsignedcharlc)//显示
{
uchari;
for(i=0;i{
Write_595(lp);
}
}
voidWrite_595(uchar*lp)//写数到595,数码管显示
{
uchari,j;
uintdat;
for(i=0;i<8;i++)
{
RCK_595_PIN=0;
dat=bit_buf[i];
dat=dat<<8;
dat|=table[lp[i]];
for(j=0;j<16;j++)
{
SCK_595_PIN=0;
if(dat&0x8000){
DAT_595_PIN=1;
}else{
DAT_595_PIN=0;
}
dat=dat<<1;
SCK_595_PIN=1;
}
RCK_595_PIN=1;
}
}
/*voiddelay(void)//空5个指令
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}*/
voiddelayb(uintcount)//delay
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
voiddsreset(void)//DS18B20初始化
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//读一位
{
uinti;
bitdat;
DS=0;i++;//小延时一下
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//读一个字节
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好//一个字节在DAT里
}
return(dat);//将一个字节数据返回
}
voidtmpwritebyte(uchardat)//写一个字节到DS18B20里
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1部分
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//写0部分
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//发送温度转换命令
{
dsreset();//初始化DS18B20
delayb
(1);//延时
tmpwritebyte(0xcc);//跳过序列号命令
tmpwritebyte(0x44);//发送温度转换命令
}
inttmp()//获得温度
{
floattt;
uchara,b;
dsreset();
delayb
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);//发送读取数据命令
a=tmpread();//连续读两个字节数据
b=tmpread();
temp=b;
temp<<=8;
temp=temp|a;//两字节合成一个整型变量。
tt=temp*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625度,所以读回//数据的最低位代表的是0.0625度。
temp=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位
//也转换为可显示数字,同时进行一个四舍五入操作。
returntemp;//返回温度值
}
voidScan_Key(void)
{
ucharkey_value;
P2=0xff;
if((P2&0x0f)!
=0x0f)
{
Delayk();
if((P2&0x0f)!
=0x0f)
{
key_value=(P2&0x0f);
while((P2&0x0f)!
=0x0f);
switch(key_value)
{
case0x07:
sebai=++sebai%10;
break;
case0x0b:
seshi=++seshi%10;
break;
case0x0d:
sege=++sege%10;
break;
case0x0e:
sexiao=++sexiao%10;
break;
default:
break;
}
}
}
}
voidDelayk(void)//延时子程序
{
unsignedcharm;
for(m=200;m>0;m--);
//for(n=200;n>0;n--);
}
参考文献:
[1]张毅刚,单片机原理及应用[M]。
高等教育出版社,2003
[2]王晓威,左谨平,唐叔进.基于液晶显示模块的图片处理技术[J].中国仪器仪表,2005,(07)
[3]田军夏,路平.中文LCD与单片机的4种常用接口电路[J].仪表技术与传感器,2005,(03)