根据单片机的恒温箱课程教学设计.doc

收藏

编号:2607728    类型:共享资源    大小:138.52KB    格式:DOC    上传时间:2020-04-23
8
金币
关 键 词:
根据 依据 单片机 恒温箱 课程 教学 设计
资源描述:
.- 成都理工大学工程技术学院 《恒温箱控制系统》 课程设计报告 系别: 自动化工程系 专业: 自动化 姓名: 杜 亮 学号: 201120307202 2014年6月16日 摘要 温度的测量与控制在工业、农业、国防等行业有着广泛的应用。随着微电子技术的发展,各种高性能的半导体集成温度传感器,在温度测控领域得到了极为广泛的应用。恒温箱的智能控制系统是用半导体温度传感器做测温器,用单片机控制温度平衡,最终达到恒温的目的。 本文对系统所能实现的功能做了简单介绍,并简单介绍了系统使用的51单片机的性能和发展情况;同时对DS18B20做了介绍。 本文重点介绍了系统硬件的分析与设计,对硬件各部分的电路一一进行了介绍。绘制了电路原理图,并进行了电路的焊接,完成了系统的硬件调试。根据硬件的设计和系统所要实现的功能,本设计对软件也进行了设计,并经过反复的模拟运行、调试,完成了系统的软件设计,最后形成了一套完整的智能温度控制系统。 关键词 :温度平衡 DS18B20 51单片机 目录 摘要 - 1 - 目录 - 2 - 前言 - 3 - 1 系统设计分析 - 4 - 1.1 设计题目要求 - 4 - 1.2 设计方案选择 - 4 - 2 硬件电路设计 - 5 - 2.1 硬件电路设计 - 5 - 2.1.1 传感器 - 5 - 2.1.2 温度传感器DS18B20 - 6 - 2.1.3 LED数码管显示电路 - 6 - 2.2 硬件总电路图 - 7 - 3 程序设计 - 7 - 3.1 程序设计介绍 - 7 - 3.2 程序编写 - 7 - 4 总结 - 14 - 前言 近年来为了保证产品的质量,各个行业行为规范就越来越高,众多机械类、医药类、化工类、建筑类等工业和企业都离不开恒温箱的使用;为了确保恒温箱许多主要技术的指标可以达到国家技术所要求的规定,必须对其进行检测,保证产品的质量[1]。本系统所设计、研发的数字恒温箱能非常好地解决这些问题。 温度的控制系统是自动控制系统较为复杂的控制,其控制的滞后性是整个系统中最难克服的难题,因为温度的变化是纯滞后环节,而温度的控制也是一个惯性大,应变慢的控制对象[2]。在温度的控制系统中一般用到的是较为先进的控制系统理论和控制算法。本系统中采用了PID算法,其算法应用到了系统软件的设计中,对整个加热过程使用模糊PID控制方案,对于加热过程中所产生的各种干扰和恒温箱的惯性问题都进行了分析[3]。 恒温箱的智能控制系统采用半导体集成温度传感器满足温度测量要求,温度传感器将采集的温度信号转换成电流信号,然后再由转换电路将电流信号转换为电压信号,通过放大电路和模/数转换芯片将电压信号转换成数字信号,由单片机处理后,将测量得到的温度值显示于液晶显示器上。系统的全部输入输出控制集中由单片机统一管理,各有关运行参数的设定,可通过键盘输入,设定温度、箱温实时值在液晶显示模块上显示,操作方便。 该系统具有实时温度显示和温度设定功能,还具有温度上、下限报警和自动控制功能。当温度高于或低于设定值一定程度时,发出生光报警,消除由于单片机系统意外失控所造成的危险,提高了恒温箱工作的可靠性和使用安全性。 设计任务为:用单片机设计一个控制温度范围在30℃~80℃的智能温度控制系统。设计要求:完成该系统的软硬件设计,学习掌握单片机采集测控系统的设计方法,提高学习新知识、新技能的能力,培养独立设计的能力。 1 系统设计分析 1.1 设计题目要求 根据《计算机控制技术》课程的知识点,设计一个基于单片机的恒温箱控制系统。设计任务书要求设计一个以8088CPU或PC总线为核心,以AI、DI和AO、DO通道为主要接口,外配LED显示、键盘操作以及包括传感变送器及执行器的小型计算机控制系统。在Proteus下仿真进行验证。 1.2 设计方案选择 本设计的目的在于使箱内有一个恒温环境,当温度过高时要使温度能够降低,当温度过低时要使温度能够升高。温度传感器DS18B20是“一线总线”接口,且可以直接读出被测温度,测温范围大,因此选择DS18B20来采集温度。半导体制冷片是用直流电流使其运转的,可以连续的工作,且既有加热和制冷两种功能,使用两个继电器改变半导体的电流方向以实现加热(制冷)工作。显示方面则选用LCD1602,可以显示英文及数字,质量轻,耗电小,而且显示内容多。整个系统选择由STC89C51最小系统控制,STC89C51系列单片机具有强抗干扰、高速、低功耗的功能,且指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择。 2 硬件电路设计 2.1 硬件电路设计 图2.1系统总体框图 2.1.1 传感器 温度采集器件使用温度传感器,温度传感器包括热电偶、热敏电阻、RTD和IC温度传感器等几种,本设计中采用DS18B20温度传感器,该温度传感器应用时不需要任何外部器件即可实现测温电路,只通过一条数据线即可实现通信,精度可达到0.0625℃,测量温度可从-55℃~+125℃,且内部设有温度上、下限告警功能。设计如图2.2所示: 图2.2 DS18B20温度传感器 2.1.2 温度传感器DS18B20 温度传感器DS18B20是数字式温度传感器,是一种改进型的只能温度传感器,“一线总线”接口,相对于传统温度传感器精度高、稳定性好、电路简单、控制方便。能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点:①.可通过数据线供电,电压范围:3.0~5.5V;②.测温范围:-55~+125℃;③.无须外部器件,独特的单线接口仅需要一个端口引脚进行通信;④.多个DS18B20可以并联在唯一的三线上,实现多点组网功能;⑤.零待机功耗;⑥.用户可定义的非易失性温度报警设置;⑦.报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;⑧.可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃0.25℃、0.125℃和0.0625℃;⑨.负压特性:电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。DS18B20的引脚图和内部结构分别如图2.3所示: 图2.3 DS18B20封装图 2.1.3 LED数码管显示电路 显示方式可选择LED数码管,也可选择字符型LCD显示。本设计采用共阳极LED数码管显示,LED数码管价格便宜,电路简单,质量轻,可以显示简单的英文和数字,能够满足系统要求。设计如图2.4所示: 图2.4 LED数码管 2.2 硬件总电路图 图2.5 系统总电路图 3 程序设计 3.1 程序设计介绍 程序编写使用KEIL4软件,使用C语言编写。C语言是一种计算机程序设计语言,它既具有高级语言的特点,又具有汇编语言的特点。它的应用范围广泛,具备很强的数据处理能力,不仅仅在软件开发上,而且各类科研都需要用到C语言,适于编写系统软件,二维,三维图形和动画,具有应用比如单片机以及嵌入式系统开发。 3.2 程序编写 #include "reg52.h" #include"absacc.h" /*****DuLiang 201120307202****/ /****2014.6.18***/ #define uint unsigned int #define ulint unsigned long int #define uchar unsigned char sbit P20=P2^0; //数码管位选 sbit P21=P2^1; sbit P22=P2^2; sbit P23=P2^3; sbit ds=P2^7; //DS18B20引脚 sbit HEAT=P2^5; //加热引脚 sbit COOLING=P2^6; //降温引脚 sbit H_warn=P1^0; //高温报警引脚 sbit L_warn=P1^1; //低温报警引脚 bit time20ms=0; unsigned int wendu_value = 0; float f_temp; uint temp; uint set_temp_H=55,set_temp_L=45; //温度设定 uint temp_shi=0,temp_ge=0,temp_xiaoshu=0; uchar temp_wela=0; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,//0~9不带小数点 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//0~9带小数点 //共阳极数码管 uchar keyscan_num; /*子程序声明*/ void delay(uint delay_x); void display(); void dsreset(void); bit tempreadbit(void); uchar tempread(void); void tempwritebyte(uchar dat); void tempchange(void); uint get_temp(); uchar keyscan(void); /*定时器0和中断系统初始化*/ void init() { HEAT=1; TMOD=0x11; TH0=(65536-1000)/256; //1ms时基 TL0=(65536-1000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; ET0=1; ET1=1; EA=1; TR0=1; } void main() { init(); while(1) { switch(keyscan_num) { case 0: { P20=1;P21=1;P22=1;P23=1; P0=0xbf; } break; case 1: { if(wendu_value<(set_temp_L*10)) { HEAT=0; L_warn=0; } else{HEAT=1;L_warn=1;} if(wendu_value>(set_temp_H*10)) { COOLING=0; H_warn=0; } else{COOLING=1;H_warn=1;} } break; } } } void timer0(void) interrupt 1 { static uchar timecount=0,timecount1=0,timecount3=0; TR0=0; TH0=(65536-1000)/256; TL0=(65536-1000)%256; timecount++;timecount1++;timecount3++; if(timecount==5) { timecount=0; if(keyscan_num==1) display(); } if(timecount1==200) { timecount1=0; tempchange(); wendu_value=get_temp(); } if(timecount3==50) { timecount3=0; keyscan_num=keyscan(); } TR0=1; } void timer1(void) interrupt 3 { static uchar timecount2=0; TR1=0; TH1=(65536-1000)/256; TL1=(65536-1000)%256; timecount2++; if(timecount2==200) { timecount2=0; time20ms=!time20ms; } TR1=1; } /*****数码管显示子程序******/ void display() { temp_shi=wendu_value/100; temp_ge=wendu_value%100/10; temp_xiaoshu=wendu_value%100%10; P20=0; P21=0; P22=0; P23=0; if(temp_wela==0) { P0=table[temp_shi]; P20=1; } if(temp_wela==1) { P0=table[temp_ge+10]; P21=1; } if(temp_wela==2) { P0=table[temp_xiaoshu]; P22=1; } temp_wela++; if(temp_wela==3) { temp_wela=0; } } /*温度读取子程序*/ void delay(uint delay_x) { uint x,y; for(x=delay_x;x>0;x--) for(y=110;y>0;y--); } void dsreset(void) //DS18B20复位,初始化函数 { uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; } bit tempreadbit(void) //读一位数据函数 { uint i; bit dat; ds=0;i++; ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return(dat); } uchar tempread(void) //读1个字节数据函数 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在dat里 } return(dat); } void tempwritebyte(uchar dat) //向DS18B20写一个字节数据函数 { uint i; uchar j; bit testb; 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++; } } } void tempchange(void) //DS18B20开始获取温度并转换 { dsreset(); delay(1); tempwritebyte(0xcc); //写跳过读ROM指令 tempwritebyte(0x44); //写温度转换指令 } uint get_temp() //读取寄存器中存储的温度数据 { uchar a,b; dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); //读低8位 b=tempread(); //读高8位 temp=b; temp<<=8; temp=temp|a; f_temp=temp*0.0625; temp=f_temp*10+0.5; f_temp=f_temp+0.05; return temp; //temp是整型 } /*键盘子程序*/ uchar keyscan(void) { static uchar k=0; uchar Trg,Cont,ReadData; P3=0xff; ReadData=P3^0xff; Trg=ReadData&(ReadData^Cont); Cont=ReadData; switch(Trg) { case 0x01:{k=1;break;} case 0x02:{k=2;break;} case 0x04:{k=3;break;} case 0x08:{k=4;break;} } return(k); } 4 总结
展开阅读全文
提示  淘文阁 - 分享文档赚钱的网站所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:根据单片机的恒温箱课程教学设计.doc
链接地址:https://www.taowenge.com/p-2607728.html
关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

收起
展开