水温控制系统设计论文.docx

上传人:b****3 文档编号:3710746 上传时间:2022-11-24 格式:DOCX 页数:17 大小:125.08KB
下载 相关 举报
水温控制系统设计论文.docx_第1页
第1页 / 共17页
水温控制系统设计论文.docx_第2页
第2页 / 共17页
水温控制系统设计论文.docx_第3页
第3页 / 共17页
水温控制系统设计论文.docx_第4页
第4页 / 共17页
水温控制系统设计论文.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

水温控制系统设计论文.docx

《水温控制系统设计论文.docx》由会员分享,可在线阅读,更多相关《水温控制系统设计论文.docx(17页珍藏版)》请在冰豆网上搜索。

水温控制系统设计论文.docx

水温控制系统设计论文

水温控制系统设计论文

 

学校:

系别:

专业:

指导教师:

姓名及学号:

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)

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1