水温控制系统设计论文Word格式文档下载.docx
- 文档编号:16615580
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:17
- 大小:125.08KB
水温控制系统设计论文Word格式文档下载.docx
《水温控制系统设计论文Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《水温控制系统设计论文Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
采用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<
TL,则将该器件内的告警标志置位,并对主机发出的告警搜索命令做出响应。
(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<
reg52.h>
intrins.h>
#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<
lc;
i++)
Write_595(lp);
}
voidWrite_595(uchar*lp)//写数到595,数码管显示
uchari,j;
uintdat;
8;
RCK_595_PIN=0;
dat=bit_buf[i];
dat=dat<
<
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_();
}*/
voiddelayb(uintcount)//delay
uinti;
while(count)
i=200;
while(i>
0)
i--;
count--;
voiddsreset(void)//DS18B20初始化
DS=0;
i=103;
0)i--;
DS=1;
i=4;
bittmpreadbit(void)//读一位
bitdat;
i++;
//小延时一下
dat=DS;
i=8;
while(i>
return(dat);
uchartmpread(void)//读一个字节
uchari,j,dat;
dat=0;
for(i=1;
=8;
j=tmpreadbit();
dat=(j<
7)|(dat>
>
1);
//读出的数据最低位在最前面,这样刚好//一个字节在DAT里
return(dat);
//将一个字节数据返回
voidtmpwritebyte(uchardat)//写一个字节到DS18B20里
{
ucharj;
bittestb;
for(j=1;
testb=dat&
0x01;
dat=dat>
if(testb)//写1部分
i++;
//写0部分
voidtmpchange(void)//发送温度转换命令
dsreset();
//初始化DS18B20
delayb
(1);
//延时
tmpwritebyte(0xcc);
//跳过序列号命令
tmpwritebyte(0x44);
//发送温度转换命令
inttmp()//获得温度
floattt;
uchara,b;
tmpwritebyte(0xbe);
//发送读取数据命令
a=tmpread();
//连续读两个字节数据
b=tmpread();
temp=b;
temp<
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&
key_value=(P2&
0x0f);
while((P2&
0x0f)!
=0x0f);
switch(key_value)
{
case0x07:
sebai=++sebai%10;
break;
case0x0b:
seshi=++seshi%10;
case0x0d:
sege=++sege%10;
case0x0e:
sexiao=++sexiao%10;
default:
}
voidDelayk(void)//延时子程序
unsignedcharm;
for(m=200;
m>
0;
m--);
//for(n=200;
n>
n--);
参考文献:
[1]张毅刚,单片机原理及应用[M]。
高等教育出版社,2003
[2]王晓威,左谨平,唐叔进.基于液晶显示模块的图片处理技术[J].中国仪器仪表,2005,(07)
[3]田军夏,路平.中文LCD与单片机的4种常用接口电路[J].仪表技术与传感器,2005,(03)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 水温 控制系统 设计 论文
![提示](https://static.bdocx.com/images/bang_tan.gif)