单片机课程设计(温度控制系统).doc

上传人:豆**** 文档编号:17517852 上传时间:2022-05-24 格式:DOC 页数:24 大小:281KB
返回 下载 相关 举报
单片机课程设计(温度控制系统).doc_第1页
第1页 / 共24页
单片机课程设计(温度控制系统).doc_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《单片机课程设计(温度控制系统).doc》由会员分享,可在线阅读,更多相关《单片机课程设计(温度控制系统).doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流单片机课程设计(温度控制系统)题 目: 基于51单片机的温度控制系统设计 姓 名: 贺丹 李嘉位 学 院: 工学院 专 业: 自动化 班 级: 自动114班 学 号: 32211405 32211409 指导教师: 2013年 9月 日南京农业大学教务处制摘要:3一、系统设计31.1 项目概要31.2设计任务和要求:4二、 硬件设计42.1 硬件设计概要42.2 信息处理模块42.3 温度采集模块52.3.1传感器DS18b20简介52.3.2实验模拟电路图62.3.3程序流程图72.4控制调节模块82.4.1升温调节系统82.4.2温度上下

2、限调节系统92.5显示模块11三、仿真后,部分显示成果12四、两周实习总结15五、致谢15六、参考文献15七、附录167.1原理图167.2参考程序16摘要: 在现代工业生产中,温度是常用的测量被控因素。本设计是基于51单片机控制,将DS18B20温度传感器实时温度转化,并通过1602液晶对温度实行实时显示,并通过加热片(PWM波,改变其占空比)加热与步进电机降温逐次逼近的方式,将温度保持在设定温度,通过按键调节温度报警区域,实现对温度在0-99控制的自动化。实验结果表明此结构完全可行,温度偏差可达0.1以内。关键字:AT89C51单片机;温控;DS18b20Abstract: In mode

3、rn industrial production, the temperature is commonly measured controlled factors.The design is based on the 51 SCM control, the DS18B20 temperature sensor real time temperature transformation, and through the 1602 LCD on the temperature of the real-time display, and by heating the sheet (PWM wave,

4、changing its duty cycle) heating and stepper motor cooling successive approximation approach, keeping the temperature at the set temperature, through the buttons adjust temperature alarm area, the temperature at 0 -99 control automation.The experimental results show that this structure is completely

5、 feasible, the deviation of temperature can reach 0.1 DEG C.Key word: AT89C51Monolithic integrated circuit ; Temperature control; DS18B20 一、系统设计1.1 项目概要 温度控制系统无论是工业生产过程,还是日常生活都起着非常重要的作用,过低或过高的温度环境不仅是一种资源的浪费,同时也会对机器和工作人员的寿命产生严重影响,极有可能造成严重的经济财产损失,给生活生产带来许多利的因素,基于AT89C51的单片机温度控制系统与传统的温度控制相比具有操作方便、价价格便宜

6、、精确度高和开展容易等优点,因此市场前景好。1.2设计任务和基本要求:(1) 采用DS18B20作为温度传感器进行温度检测。(2) 对采集温度用LCD1602进行显示(显示温度分辨率0.1);采集温度数值应采用数字滤波措施,保证显示数据稳定。(3) 设计相应的温度控制电路,根据测得的温度情况对加热器进行控制,将温度保持在设定温度。(4) 通过按键设置温度上下限,超限通过蜂鸣器报警。(5) 采用DS1302时钟芯片显示当前时间,并可以对时间进行设置。二、 硬件设计2.1 硬件设计概要根据需求,我们将系统分为五个模块,信息处理模块,温度采集模块、时间模块、控制调节模块、报警电路模块,显示模块。2.

7、2 信息处理模块AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROMFalsh Programmable and Erasable Read Only Memory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片

8、机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。单片机模块如图(1) 所示。图(1)单片机模块2.3 温度采集模块2.3.1传感器DS18b20简介 DALLAS最新单线数字温度传感器DS18b20简介新的“一线器件”,体积更小、适用电压更宽、更经济。Dallas半导体公司的数字化温度传感器DS18b20是世界上第一片支持“一线总线”接口温度传感器。一线总线独特而且经济的特点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新的概念。DS18b20、DS1822“一线总线”数字化温度传感器同DS1820一样,DS18b20也支持“一线总线”接口,测量温度范围为-55 +125,在-1

9、0 +85范围内,精度为0.5。DS18b20的精度较差为2。现场温度直接以“一线总线”的数字方式传输,大大提高了系统的抗干扰性。适合于恶劣环境的现场温度测量,如:环境控制、设备或过程控制、测量类消费电子产品等。与前一代产品不同,新的产品支持3V 5V的电压范围,使系统设计更灵活、方便。而且新一代产品更便宜,体积更小。DS18b20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。DS18b20的实验板原理接线图如图(2):图(2) DS18b20的实验板接线图 其中:DQ为数字信号输入/输出端;GND为电源地;VDD为外接供电电源输入端(在

10、寄生电源接线方式时接地)2.3.2实验模拟电路图温度检测控制模拟电路图Ds18b20原件及其连线如图(3),此温度传感器上显示的温度同步显示到LCD1602上,并有加温,减温按钮。图(3)温度检测控制模拟电路图2.3.3程序流程图图(4)主程序流程图图(5)DS18B20初始化子程序流程图 图(6)DS18B20读写的程序流程图2.4控制调节模块2.4.1升温调节系统 通过继电器的开合来控制加热片电路的通断,来达到设温效果,我们预设温度为25度,当温度低于25度时,单片机P3.6引脚输出高电平,继电器导通,对温度传感器加热,加热模块如图(7)所示。图(7)加温控制电路2.4.2温度上下限调节系

11、统 通过按键控制键选着调节对象,通过上升下降调节值大小,模拟电路图如图(78主控电路:我们设定温度为10-20度,为表示方便,这里设控制开关,升温开关,降温开关分别为,k1,k2,k3,开始显示的是当前温度,K1主控开关,用来控制进入的是当前温度,温度上限,下限的调节界面。按k1,一次进入三个界面。按K2为加1开关,按一下,加1,k3减1开关,按一下,减1.例如:开始时显示的是当前温度界面,按下k1进入高温设定界面,显示器上显示当前温度和温度上限,按k2,上限加1,按k3,上限减1,再按k1进入显现设定界面,显示器显示当前温度,和温度下限,按k2,下限加1,按k3,下限减1,再按k1,进入显示

12、当前温度界面。如图(8)2.4.3 报警电路系统 通过蜂鸣器的鸣叫实现报警,如果温度超过上限蜂鸣器鸣叫,温度低于下限蜂鸣器鸣叫。如图(8)、(9)。图(8)温度设定开关图(9)报警模块2.5显示模块通过采集DS18B20的温度,同步显示到LCD1602上,精确到小数点后第一位。如下图图(10)温度显示界面通过DS1302时钟芯片将时间同步显示到LCD1602上。如下图(时间可以设置在此没有设置)图(11)时间显示界面通过2402记录超过设定值的温度,如下图:图(12)记录超过设定值的温度显示界面 三、仿真后,部分显示成果图(10)开始启动时,显示时间信息图(11)显示当前温度图(12)温度低于

13、低温下限,蜂鸣器鸣叫图(13)温度高于温度上限,蜂鸣器鸣叫图(14)显示学号界面四、两周实习总结 这次单片机实习我们做的是温度控制系统。看到这个题目我们还是比较有信心的,对基本功能的设计,我们比较熟练,关键问题在于一些拓展功能的时限。第一周我们找了很多资料,通过两周的实习,我们 学到了很多的知识,也对DS18B20的用法以及DS1302的用法有了一个更深入的学习。五、参考文献1 郭天祥.新概念51单片机C语音教程入门提高开发拓展攻略M.北 京:北京:电子工业出版社,2009.2 韩广兴.电子元器件与实用电路基础M.北京:电子工业出版社,2005.3 方大千,朱丽.电子控制系统装置制作入门M.北

14、京:国防出版社,2006.4 刘向举,刘丽娜. 基于单片机的智能温度测控系统的设计J. 齐齐哈尔大 学学报(自然科学版). 2012(03)5 黄文力,邓小磊. DS18B20数字温度传感器接口程序的时序J. 仪器仪表 用户. 2011(06)6 黄晓林. 一种实用型智能恒温控制系统设计J. 自动化技术与应用. 2011(11)7 王文,王直. 基于ARM和DS18B20的温度监测系统J. 电子设计工程. 2011(20)8 陈锡华,贾磊磊. 温度传感器DS18B20序列号批量搜索算法J. 单片机与 嵌入式系统应用. 2011(09)六、附录 6.1原理图6.2参考程序main.c文件:#in

15、cludeSTC89C51RC.H#include#includeds18b20.h#includelcd1602.h#includeds1302.h#include2402.huchar data datadis=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

16、 K5=P33;/sbit L1=P25;/sbit speaker=P32;uchar keynum=1,flag,flag1,flag2,flag4,adder,q;uint k,count=1,th,tl,set;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) d

17、elay(5);if(K4=0) while(!K4); keynum+; if(keynum=6)keynum=1;return keynum;/*设置时间键盘函数*/void key_time() if(flag4=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(!

18、K2); if(set=-1)set=59;DS1302_SetTime(0x80, set); break; /设置秒case 3: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(0x82, set); break; /设置分case 4:if(K1=0) delay(5);if(K1=0) set+; while(!K1); if(set=60)set=0;if(K

19、2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=59;DS1302_SetTime(0x84, set); break; /设置时case 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) se

20、t+; while(!K1); if(set=13)set=0;if(K2=0) delay(5);if(K2=0) set-; while(!K2); if(set=-1)set=12;DS1302_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; /设置

21、年default: break;else flag4=0;/*设置温度的键盘扫描函数*/void key_lcd() if(flag1=1&k=3) /k一定不能掉,不然会在其他菜单里出现乱码 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-; wh

22、ile(!K2); if(th1=-1)th1=9; LCD_pos(0x43); write_dat(th1+0x30); break;case 2: if(K1=0) delay(5);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);

23、if(th3=10)th3=0;if(K2=0) delay(5);if(K2=0) th3-; while(!K2); if(th3=-1)th3=9; LCD_pos(0x4c); 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

24、:break; else flag1=0; /m一定不能掉,否则在调节温度的时候会影响其他菜单 th=th1*10+th2; /获取设置温度的高位 tl=th3*10+th4; /获取设置温度的低位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_R

25、TC();count=7;while(1)k=key4(); get_ds1302(&realtime);/取时间temp=read_temp(); /取温度delay(200); /延时 保持数据稳定 避免数据刷新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;

26、 break; case 2: /菜单二,显示温度LCD_pos(0); print( DS18B20 is OK );LCD_pos(0x40); print(NOW TEMP: );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

27、);LCD_pos(0x4f);write_dat(0x43); break; case 3: /菜单三,显示温度设置值LCD_pos(0);print( change temp: );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

28、(0x4d);write_dat(th4+0x30);LCD_pos(0x4e); /摄氏度符号write_dat(0xdf); LCD_pos(0x4f);write_dat(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_

29、pos(0x00);print(AUTO llk32210309); /显示学号LCD_pos(0x40);print(AUTO wyp32210304); /显示学号break; default:break; 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一定不能掉,不然会在其他菜单里出现乱码,菜单四中需要显示存储的

30、报警数据 write_cmd(0xc9);write_dat(q/10%10+0x30);write_cmd(0xca);write_dat(q%10+0x30);DS18B20.h文件:#ifndef _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_

31、18b20(8);DQ=0;delay_18b20(80);DQ=1;delay_18b20(15);x=DQ;delay_18b20(15);/* 读一个字节*/uchar read_byte()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_18

32、b20();write_byte(0xcc); /跳过读序号列号的操作write_byte(0x44);/ 启动温度转换 /delay_18b20(100);init_18b20();write_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; /也

33、可以写成 t=(b*256+a)*0.625 ;return t;return (t3); /右移三位相当于5/8=0.625返回温度有4位,千、百、十、个,转化后有一位小数位,没有千位#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

34、;LCD_RS=0;LCD_RW=1;LCD_EN=1; _nop_(); _nop_(); _nop_(); /_nop_(); busy=(bit)(P0 & 0x80);LCD_EN=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();

35、LCD_DB=cmd;LCD_RS=0;_nop_();LCD_RW=0;_nop_();LCD_EN=1;_nop_();_nop_();LCD_EN=0;void delay_5ms(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);

36、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=P42;sbit ACC0=ACC0;sbit ACC7=ACC7

37、;unsigned char l_tmpdate7=5,34,15,26,6,3,13;/秒分时日月周年08-05-15 12:00:00code unsigned char write_rtc_address7=0x80,0x82,0x84,0x86,0x88,0x8a,0x8c; /秒分时日月周年 最低位读写位typedef struct systemtime uchar second;uchar minute;uchar hour;uchar week;uchar day;uchar month;uchar year;uchar DateString9;uchar TimeString9;systemtime;/定义的时间类型/*向DS1302中写入1BYTE数据*/void writeB(uchar ucda) uchar i; ACC=ucda;for(i=8;i0;i-) T_IO=ACC0; T_CLK=1; T_CLK=0; ACC=ACC1;/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁