《单片机课程设计-温度控制系统.doc》由会员分享,可在线阅读,更多相关《单片机课程设计-温度控制系统.doc(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 分类号 UDC 单位代码 10644 密 级 公 开 课程设计基于DS18B20测温单片机温度控制系统课程名称: 数字电子技术基础作 者: 指导教师: 柳 妮 系 别: 物理与工程技术系专 业: 电子科学与技术提交论文日期: 年 月 日 论文答辩日期: 年 月 日 中 国 达 州年 月单片机原理课程设计基于DS18B20测温单片机温度控制系统电子与科学 专业 2013级2 班 指导教师:柳妮摘要:介绍了以AT89S52单片机为控制核心的温度控制系统,系统采用数字温度计芯片DS18B20构成测温单元,通过AT89S52的开关量输出控制固态继电器(SSR)的通断,调节烤箱内温度。采用PID 控制
2、算法可以明显改善系统的稳态性能以及稳态响应。关键词:温度控制;单片机;PID算法;DS18B20Temperature Control System Based on DS18B20Automation School of Beijing University of posts and telecommunications Abstract: The temperature control system based on AT89S52 SCM as the controller is introduced in this paper. The temperature measurement
3、unit consists of digital thermometer chip .The output of switching value from AT89S52 controls the switch of solid state relay to regulate the temperature in the oven. An evident improvement on steady-state behavior and response of system is achieved when the PID control algorithm is used.Keywords:
4、temperature control; single chip microprocessor ; PID algorithm; DS18B20一、系统设计1.1 项目概要整个系统主控部分采用AT89S52构成单片机应用系统; 温度检测部分采用DS18B20 单总线数字温度传感器对温度进行检测;控制部分由固态继电器控制加热管的通断。工作时, 由键盘输入设定温度值,系统采用PID控制算法进行运算,通过单片机AT89S52的开关量控制固态继电器(SSR)的通断,以调节烤箱内温度至设定值,稳态误差在()1。液晶实时显示烤箱内温度和设定温度值。单片机温度控制系统原理图如图 1 所示图1 单片机温度控制
5、系统原理图1.2设计任务和基本要求:(1) 实现099度范围的温度检测,精度为1.0级。通过2位LED显示器显示被测温度值。(2) 可用按键设置温度报警值,并且在LED上显示。当超过报警限制时,发出声光报警。(3) 当温度超限时,按照某种控制规律控制执行器操作。二、 硬件设计2.1 硬件设计概要根据需求,我们将系统分为五个模块,信息处理模块,温度采集模块、时间模块、控制调节模块、报警电路模块,显示模块。2.2 信息处理模块AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电
6、压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。单片机模块如图(1) 所示。图2单片机模块2.3 温度采集模块2.3.1传感器DS18b20简介 DALLAS最新单线数字温度传感器DS
7、18b20简介新的“一线器件”,体积更小、适用电压更宽、更经济。Dallas半导体公司的数字化温度传感器DS18b20是世界上第一片支持“一线总线”接口温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新的概念。DS18b20、DS1822“一线总线”数字化温度传感器同DS1820一样,DS18b20也支持“一线总线”接口,测量温度范围为-55 +125,在-10 +85范围内,精度为0.5。DS18b20的精度较差为2。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测量
8、类消费电子产品等。与前一代产品不同,新的产品支持3V 5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。DS18b20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。2.3.2实验模拟电路图温度检测控制模拟电路图Ds18b20原件及其连线如图(3),此温度传感器上显示的温度同步显示到LCD1602上,并有加温,减温按钮。图3温度检测控制模拟电路图2.3.3程序流程图图4主程序流程图图5 DS18B20初始化子程序流程图 图6 DS18B20读写的程序流程图2.4控制调节模块2.4.1升温调节系统 通过继电器的开合来控制
9、加热片电路的通断,来达到设温效果,我们预设温度为25度,当温度低于25度时,单片机P3.6引脚输出高电平,继电器导通,对温度传感器加热,加热模块如图7所示。图7 加温控制电路2.4.2温度上下限调节系统 通过按键控制键选着调节对象,通过上升下降调节值大小,模拟电路图如图(78主控电路:我们设定温度为10-20度,为表示方便,这里设控制开关,升温开关,降温开关分别为,k1,k2,k3,开始显示的是当前温度,K1主控开关,用来控制进入的是当前温度,温度上限,下限的调节界面。按k1,一次进入三个界面。按K2为加1开关,按一下,加1,k3减1开关,按一下,减1.例如:开始时显示的是当前温度界面,按下k
10、1进入高温设定界面,显示器上显示当前温度和温度上限,按k2,上限加1,按k3,上限减1,再按k1进入显现设定界面,显示器显示当前温度,和温度下限,按k2,下限加1,按k3,下限减1,再按k1,进入显示当前温度界面。如图(8)2.4.3 报警电路系统 通过蜂鸣器的鸣叫实现报警,如果温度超过上限蜂鸣器鸣叫,温度低于下限蜂鸣器鸣叫。如图8、9。图8 温度设定开关图9 报警模块 2.5显示模块通过采集DS18B20的温度,同步显示到LCD1602上,精确到小数点后第一位。如下图图10 温度显示界面通过DS1302时钟芯片将时间同步显示到LCD1602上。如下图(时间可以设置在此没有设置)图11 时间显
11、示界面通过2402记录超过设定值的温度,如下图:图12 记录超过设定值的温度显示界面 三、仿真后,部分显示成果图(10)开始启动时,显示时间信息图(11)显示当前温度图(12)温度低于低温下限,蜂鸣器鸣叫图(13)温度高于温度上限,蜂鸣器鸣叫图(14)显示学号界面四、参考文献1 郭天祥.新概念51单片机C语音教程入门提高开发拓展攻略M.北 京:北京:电子工业出版社,2009.2 韩广兴.电子元器件与实用电路基础M.北京:电子工业出版社,2005.3 方大千,朱丽.电子控制系统装置制作入门M.北京:国防出版社,2006.4 刘向举,刘丽娜. 基于单片机的智能温度测控系统的设计J. 齐齐哈尔大 学
12、学报(自然科学版). 2012(03)5 黄文力,邓小磊. DS18B20数字温度传感器接口程序的时序J. 仪器仪表 用户. 2011(06)6 黄晓林. 一种实用型智能恒温控制系统设计J. 自动化技术与应用. 2011(11)7 王文,王直. 基于ARM和DS18B20的温度监测系统J. 电子设计工程. 2011(20)六、附录 6.1原理图6.2参考程序main.c文件:#includeSTC89C51RC.H#include#includeds18b20.h#includelcd1602.h#includeds1302.h#include2402.huchar data datadis=
13、0x00,0x00,0x00,0x00,0x00;uint temp=0;sbit K1=P10;sbit K2=P11;sbit K3=P12;sbit K4=P13;sbit K5=P14;sbit L1=P16;sbit K7=P17;sbit beep=P15;/sbit K1=P14;/sbit K2=P15;/sbit K3=P16;/sbit K4=P17;/sbit K5=P33;/sbit L1=P25;/sbit speaker=P32;uchar keynum=1,flag,flag1,flag2,flag4,adder,q;uint k,count=1,th,tl,se
14、t;systemtime realtime;/CurrentTime;uchar th1=8;uchar th2=5;uchar th3=2;uchar th4=0;uchar tab,w;void delay(uchar z)uchar x,y;for(x=z;x0;x-) for(y=110;y0;y-);/*控制页面 1-4页*/uchar key4() if(K4=0) delay(5);if(K4=0) while(!K4); keynum+; if(keynum=6)keynum=1; return keynum;/*设置时间键盘函数*/void key_time() if(fla
15、g4=1&k=1)if(K7=0)delay(5);if(K7=0)while(!K7);count+;if(count=8) count=2;switch(count)case 2:if(K1=0) delay(5);if(K1=0) set+; while(!K1); if(set=60)set=0; if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=59; DS1302_SetTime(0x80, set); break; /设置秒case 3:if(K1=0) delay(5);if(K1=0) set+; while
16、(!K1); if(set=60)set=0; if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=59; DS1302_SetTime(0x82, set); break; /设置分case 4:if(K1=0) delay(5);if(K1=0) set+; while(!K1); if(set=60)set=0; if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=59; DS1302_SetTime(0x84, set); break; /设置时case
17、5:if(K1=0) delay(5);if(K1=0) set+; while(!K1); if(set=31)set=0; if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=30; DS1302_SetTime(0x86, set); break; /设置日case 6:if(K1=0) delay(5);if(K1=0) set+; while(!K1); if(set=13)set=0; if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=12; DS1
18、302_SetTime(0x88, set); break; /设置月case 7:if(K1=0) delay(5);if(K1=0) set+; while(!K1); if(set=100)set=0; if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=99; DS1302_SetTime(0x8c, set); break; /设置年default: break;else flag4=0;/*设置温度的键盘扫描函数*/void key_lcd() if(flag1=1&k=3) /k一定不能掉,不然会在其他菜单里出现乱
19、码 if(K3=0)/按键判断,选择设置温度的光标 delay(5);if(K3=0) while(!K3); flag+; /按键标识位 if(flag=5)flag=1; switch(flag) case 1: if(K1=0) delay(5);if(K1=0) th1+; while(!K1); if(th1=10)th1=0; if(K2=0) delay(5);if(K2=0) th1-; while(!K2); if(th1=-1)th1=9; LCD_pos(0x43); write_dat(th1+0x30); break;case 2: if(K1=0) delay(5)
20、;if(K1=0) th2+; while(!K1); if(th2=10)th2=0; if(K2=0) delay(5);if(K2=0) th2-; while(!K2); if(th2=-1)th2=9; LCD_pos(0x44);/位置设定 write_dat(th2+0x30); break;case 3: if(K1=0) delay(5);if(K1=0) th3+; while(!K1); if(th3=10)th3=0; if(K2=0) delay(5);if(K2=0) th3-; while(!K2); if(th3=-1)th3=9; LCD_pos(0x4c);
21、 write_dat(th3+0x30); break;case 4: if(K1=0) delay(5);if(K1=0) th4+; while(!K1); if(th4=10)th4=0; if(K2=0) delay(5);if(K2=0) th4-; while(!K2); if(th4=-1)th4=9; LCD_pos(0x4d); write_dat(th4+0x30); break;default:break; else flag1=0; /m一定不能掉,否则在调节温度的时候会影响其他菜单 th=th1*10+th2; /获取设置温度的高位 tl=th3*10+th4; /获
22、取设置温度的低位void alarm_beep() /报警系统与当前温度进行比较并处理if(temp(th*10)|temp(tl*10) beep=beep;L1=0;adder+;tab=temp/10;write_add(adder,tab); else beep=1;L1=1; /*主函数*/void main()init_18b20();init_lcd();init_2402();beep=1;/Set_RTC();count=7;while(1) k=key4(); get_ds1302(&realtime);/取时间temp=read_temp(); /取温度delay(200
23、); /延时 保持数据稳定 避免数据刷新switch(k) case 1: /菜单一,显示时间并且可以设置时间 /key_time();/get_ds1302(&realtime);LCD_pos(0); print( Time: ); print(realtime.TimeString);LCD_pos(0x40); print( Date: ); print(realtime.DateString);flag4=1; break; case 2: /菜单二,显示温度 LCD_pos(0); print( DS18B20 is OK );LCD_pos(0x40); print(NOW TE
24、MP: );if(flagt=1)datadis0=0x2d;else datadis0=temp/1000+0x30;datadis1=temp/100%10+0x30;datadis2=temp/10%10+0x30;datadis3=0x2e;datadis4=temp%10+0x30;LCD_pos(0x49);print(datadis);LCD_pos(0x4e); /写入摄氏度符号write_dat(0xdf);LCD_pos(0x4f);write_dat(0x43); break; case 3: /菜单三,显示温度设置值 LCD_pos(0);print( change t
25、emp: );LCD_pos(0x40);print(TH= TL= );LCD_pos(0x43);write_dat(th1+0x30);LCD_pos(0x44);write_dat(th2+0x30);LCD_pos(0x45); /摄氏度符号write_dat(0xdf); LCD_pos(0x46);write_dat(0x43);LCD_pos(0x4c);write_dat(th3+0x30);LCD_pos(0x4d);write_dat(th4+0x30);LCD_pos(0x4e); /摄氏度符号write_dat(0xdf); LCD_pos(0x4f);write_d
26、at(0x43);flag1=1; break; case 4: /菜单四,记录报警温度 write_cmd(0x80);print( ALARM TEMP );write_cmd(0xc0);print( RECORD: );write_cmd(0xcb);write_dat(0xdf); write_cmd(0xcc);write_dat(0x43);flag2=1;break; case 5: /菜单五,显示学号 LCD_pos(0x00);print(AUTO llk); /显示学号LCD_pos(0x40);print(AUTO wyp); /显示学号break; default:b
27、reak; key_time();key_lcd();/菜单三中温度设置的按键扫描alarm_beep(); /报警系统通过2402存储超出的温度,并记录 if(K5=0)/按下K5,就记录当前报警的温度 delay(5); if(K5=0) while(!K5);q=read_add(adder); ;if(flag2=1&k=4) /k一定不能掉,不然会在其他菜单里出现乱码,菜单四中需要显示存储的报警数据 write_cmd(0xc9);write_dat(q/10%10+0x30);write_cmd(0xca);write_dat(q%10+0x30); DS18B20.h文件:#if
28、ndef _ds18b20_h_#define _ds18b20_h_#define uchar unsigned char#define uint unsigned int/晶振22MHZ/延时/sbit DQ=P37;bit flagt;void delay_18b20(uint i)while(i-);/*初始化程序*/ void init_18b20()uchar x=0;DQ=1;delay_18b20(8);DQ=0;delay_18b20(80);DQ=1;delay_18b20(15);x=DQ;delay_18b20(15);/* 读一个字节*/uchar read_byte
29、()uchar i=0;uchar dat=0;for(i=0;i=1;DQ=1;if(DQ)dat|=0x80;delay_18b20(5); return dat;/*写一个字节*/void write_byte(uchar dat)uchar i=0;for(i=0;i=1; /*温度转换并读取温度*/uint read_temp()uchar a=0;uchar b=0;uint t;init_18b20();write_byte(0xcc); /跳过读序号列号的操作write_byte(0x44);/ 启动温度转换 /delay_18b20(100);init_18b20();wri
30、te_byte(0xcc);/跳过读序号列号的操作write_byte(0xbe);/读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=read_byte(); /读第八位b=read_byte(); /读高八位if(b&0x80) /高八位的最高位于是否为1,若为1,则为负温度,若为0,则是0-128; flagt=1; a=a; b=b; else flagt=0;t=(b*256+a)*5; /也可以写成 t=(b*256+a)*0.625 ;return t;return (t3); /右移三位相当于5/8=0.625返回温度有4位,千、百、十、个,转化后有一位小数位,没有千位#
31、endifLCD1602.h文件:#ifndef _lcd1602_h_#define _lcd1602_h_#include#include #define LCD_DB P0 /定义LCD数据接口sbit LCD_RS=P26;sbit LCD_RW=P25;sbit LCD_EN=P27;/*测忙信号*/bit LCD_check_busy() /检查LCD是否繁忙函数bit busy;LCD_EN=0;LCD_RS=0;LCD_RW=1;LCD_EN=1; _nop_(); _nop_(); _nop_(); /_nop_(); busy=(bit)(P0 & 0x80);LCD_EN
32、=0;return(busy);/*写数据*/void write_dat(uchar dat)while(LCD_check_busy();LCD_DB=dat;LCD_RS=1;_nop_();LCD_RW=0;_nop_();LCD_EN=1;_nop_();_nop_();LCD_EN=0;/*写命令*/void write_cmd(uchar cmd) while(LCD_check_busy();LCD_DB=cmd;LCD_RS=0;_nop_();LCD_RW=0;_nop_();LCD_EN=1;_nop_();_nop_();LCD_EN=0;void delay_5ms(
33、void) /误差 0us unsigned char a,b; for(b=19;b0;b-) for(a=130;a0;a-);/*设置显示位置*/void LCD_pos(unsigned char pos)/设定显示位置 write_cmd(pos | 0x80);/*LCD初始化*/void init_lcd()write_cmd(0x38);delay_5ms();write_cmd(0x0c);write_cmd(0x06);write_cmd(0x01);void print(uchar *str) while(*str!=0) write_dat(*str); str+; #endif /一定不能掉DS1302.h文件:/* DS1302内部函数*/#ifndef _ds1302_h_#define _ds1302_h_#includeintrins.hsbit T_RST=P35;sbit T_CLK=P36;sbit T_IO=P34;/sbit T_RST=P41;/sbit T_CLK=P40;/sbit T_IO=
限制150内