基于单片机温度控制电路的设计报告 本文关键词:单片机,控制电路,温度,报告,设计
基于单片机温度控制电路的设计报告 本文简介:单片机课程设计目录摘要41前言51.1概述51.2课题分析51.3设计思路52硬件电路设计描述62.1系统的基本组成62.2系统框图62.3温度控制模块62.4温度采集模块72.5液晶显示模块72.6按键模块82.7ISP模块82.8单片机模块82.9单片机最小系统93软件设计流程114组装和调试1
基于单片机温度控制电路的设计报告 本文内容:
单片机课程设计
目
录
摘
要4
1前言5
1.1概述5
1.2课题分析5
1.3设计思路5
2硬件电路设计描述6
2.1系统的基本组成6
2.2系统框图6
2.3温度控制模块6
2.4温度采集模块7
2.5液晶显示模块7
2.6按键模块8
2.7
ISP模块8
2.8单片机模块8
2.9单片机最小系统9
3软件设计流程11
4组装和调试12
5课程设计中存在的问题和解决方案存在问题及解决方案13
5.1
PCB布线问题13
5.2
编程问题13
5.3
LCD显示问题13
5.4
PCB制作过程13
5.5调试过程13
参考文献15
致谢16
附录:17
附录一:水温控制原理图17
附录二:PCB图18
附录三:
实物图19
附录四:元件清单20
附录五:源程序代码21
摘
要
该系统采用AT89S51单片机实现温度控制,并且通过LCD1602显示。在硬件实现方面,温度测量使用DS18B20温度传感器,控制部分使用固态继电器,通过和软件设计相结合,使系统在较短的时间内达到稳定。再由软件来补偿器件的固有误差,是温度的控制达到较高的精度,满足要求。
关键字:单片机;DS18B20;LCD1602;固态继电器
1前言
1.1概述
现代信息技术的三大基础是信息采集控制(即温控技术)、信息传输(通信技术)和信息处理(计算机技术)。温控器属于信息技术的前沿尖端产品,尤其是温控器被广泛用于工农业生产、科学研究和生活等领域,数量日渐上升。近百年来,温控器的发展大致经历了以下二个阶段;
(1)模拟、集成温度控制器;(2)智能数码温控器。目前,国际上新型温控器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。
本设计的温度控制器是以单片机为核心的。单片微型计算机称为单片机,它在一片芯片上集成了中央处理器、存储器、定时器/计数器和各种输入输出设备等接口部件。采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。
1.2课题分析
单片机控制系统由微机和工农业生产对象两部分组成,其中包括硬件电路和软件程序,整个控制系统是通过接口将计算机和生产过程中产生的温度联系起来实现计算机对生产过程中的数据处理和控制。
本文介绍了MCS—51单片机对温度控制系统硬件接口和软件设计的基本思想。包括单片机系统的程序设计、输入输出接口设计、温度控制电路的设计及键盘显示电路的设计。
1.3设计思路
此外整个控制系统可分为硬件电路设计和软件程序设计两大部分。可分别对它们进行分析设计。当确定好自己的方案后,就分模块进行软件和硬件的设计与调试。当个模块都调试完毕后,最后将所有模块组合在一起进行总调,直到达到理想的效果为止。
2硬件电路设计描述
2.1系统的基本组成
本系统是由核心处理器模块、温度采集模块、复位模块、控制执行模块等组成。采用用AT89S51单片机作为控制核心,使用DS18B20温度传感器接收温度,同时用LCD1602显示温度,三个独立按键,以及温度控制模块(用固态继电器控制温度)。
2.2系统框图
我们此次水温控制的设计理念是,以单片机89S51为控制核心,通过温度传感器感受温度,从LCD1602中显示,通过编程,与参考温度进行比较,再控制固态继电器的通断,控制加热管是否工作。按键设置时对参考温度进行加减,从而将水温控制再40°C——100°C。系统框图(见图1)。
Lcd显示温度及最高、低温度
按键输入设置
单片机89S51
DS18B20温度传感器采集温度模块
温度控制加热、降温保温模块
加热管
图1:系统框图
2.3温度控制模块
固特牌小功率单相交流固态继电器,采用国际上SSR最新设计线路,输入采用直流控制型式,输出端由双向可控硅交流开关组成,内置瞬态TVS保护和高I2T技术,有效保护过压过流,交流过零通断。采用国际顶尖品牌元器件,光电隔离,双硅增强输出或单硅反并联增强输出,输出LED显示,开关型式分为过零导通型和随机导通型。
温度控制模块是通过P1.0端口输入数据,控制继电器的通断,继电器的1、2引脚连接加热管,对所测温度进行控制。
图2:温度控制模块
2.4温度采集模块
DS18B20主要由4部分组成:64位ROM、温度传感器、非挥发的温度报警除法器TH和TL、配置寄存器。ROM中的64位序列号是出厂前被光刻好的,它可以看做是DS18B20的地址序列码,每个DS18B20的64位序列号均不相同。ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。温度传感器DS18B20对外界水温进行采集,通过P3.5端口传送给单片机,见图3。
图3:温度采集模块
2.5液晶显示模块
液晶显示以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。液晶LCD1602显示预设的参考温度和测得的实际温度,见图4。
图4:液晶显示模块
2.6按键模块
按键模块对预设温度进行加减,从而控制温度的范围,见图5。
图5:按键模块
2.7
ISP模块
ISP插口外界数据线下载信息到单片机,见图6。
图6:ISP模块
2.8单片机模块
AT89S51是一种低功耗、高性能CMOS8位微控制器,具有
8K
在系统可编程
、Flash
存储器。使用Atmel
公司高密度非
易失性存储器技术制造,与工业80C51
产品指令和引脚完
全兼容。片上Flash允许程序存储器在系统可编程,亦适于
常规编程器。在单芯片上,拥有灵巧的8
位CPU
和在系统
可编程Flash,使得AT89S52为众多嵌入式控制应用系统提
供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,
32
位I/O
口线,看门狗定时器,2
个数据指针,三个16
位
定时器/计数器,一个6向量2级中断结构,全双工串行口,
片内晶振及时钟电路。另外,AT89S52可降0HZ静态逻辑操作,支持两种软件可选择节电模式。空闲模式下,CPU
停止工作,允许RAM、定时器/计数器、串口、中断继续工
作。掉电保护方式下,RAM内容被保存,振荡器被冻结,
单片机一切工作停止,直到下一个中断或硬件复位为止。
对于本设计,单片机起中央处理的作用,由于可以通过编程对其进行控制,所以利用KEIL与其结合,很方便就可以对电路进行调整和控制,具体电路如图7:
图7:
单片机模块
2.9单片机最小系统
8051片内有4KB的ROM∕EPROM,因此,只需要外接晶体振荡器和复位电路就可以构成最小系统。该最小系统可供使用的资源有以下4种:
(1)
由于片外没有扩展存储器和外设,P0、P1、P2、P3都可以作为用户I∕O口使用。
(2)
片内数据存储器有128B,地址空间为00H—7FH。
(3)
内部有4KB程序存储器,地址空间为0000H—0FFFH。
(4)
有两个定时器∕计数器T0和T1、一个全双工的串行通信接口、5个中断源。
图8:单片机最小系统
3软件设计流程
主程序流程图见图9。先预设一个参考温度,通过温度传感器感受温度,进行温度比较,通过继电器通断对被测液体加热,达到我们的预设温度。
开始
结束
感受外
界温度
温度比较
控制继电
器通断
图9
:主程序流程图
4组装和调试
将硬件各模块组合,便形成了最后的系统总图,水温控制电路(具体电路见附录-
水温控制原理图)。根据器件的尺寸和大小(具体见附录-元件清单),找到和做出其封装,导入PCB,手动布线,生成PCB板(具体电路见附录-水温控制的PCB图)。再通过打孔、腐蚀、焊接等步骤,并且做的过程中要进行不断的调试,利用万用表首先检查是否共地,同时检查线路的导电性能,是否有短路和断路的情况。
调试过程,由于本次设计采用模块化,在组装过程中,可以同时进行调试,大大降低了调试的难度,也提高了调试的效率。具体实现如下:首先将各个过孔焊接,运用万能表,检查线路是否连通,如果出现问题便开始查找问题原因,直到问题全部解决为止。然后焊接电阻等小型元器件。同样重复上述步骤……,直到所有器件全部焊接成功和所有问题全部解决为止。最后得到水温控制实物(具体见附录-水温控制的实物图)。
5课程设计中存在的问题和解决方案存在问题及解决方案
5.1
PCB布线问题
PCB布线的时候,因为LCD1602占地面积大,没考虑到下面可以隐藏器件,占的板子打,在同学的帮助下降这个问题解决了。
5.2
编程问题
由于DS18B20、LCD1602从来没有接触过,需要大量查阅资料进行编程。
5.3
LCD显示问题
前期LCD不显示字符,后面发现硬件出错了,及时改正。最终解决了问题。
5.4
PCB制作过程
PCB是我们制板子前的一个必不可少的内容,只有当你PCB走线布局做得好,后面制板和调试才能达到事半功倍的效果;解决方案:由于对PCB的接触并不深,导致布局连线很多方面并不理想,后来在老师的指导下,对PCB重新布局,同时对原理图进行了一些修改,来达到布线的方便和可靠。
5.5调试过程
在调试的过程中发现功能一直不能实现,就挨个模块进行屏蔽,挨个儿调试。最让我们苦恼的就是液晶显示这部分的程序,因为从来没有接触过液显,于是大量翻阅资料,请老师同学帮忙。
6设计感想
本次课程设计共经历了一个多星期的时间。虽然期间遇到的困难重重,但在老师们及同学的无私帮助下终于得以顺利完成。在这段时间里,每天都沉浸在课程设计的乐趣中让我感觉过得很充实,也学到了很多课堂上没有学到的东西。通过对各个模块的研究,让我接触到了很多课本上不曾有但非常实用的知识,让我开拓了视野、增广了知识面,我深刻的理解到了“学海无涯”的真正含义。
本次设计由于很多知识都是以前未见过的,都需要自己学会并运用。所以学会利用信息资源找到自己所需的资料,提升了自学能力,是这段时间我得到的另一个巨大的收获。以前对课本知识掌握的很模糊,但通过本次设计,让我对单片机知识,尤其是C语言编程有了重新的认识。虽然离专业水平还差的很远,但我相信“有志者,事竟成”,只要努力,就会有进步。
参考文献
[1]
李建忠.单片机原理及应用[M].西安:西安电子科技大学出版社,2004.
[2]
胡辉.单片机原理与应用[M].北京:中国水利水电出版社,2007.
[3]
谢维成,杨加国.单片机原理与应用及C51程序设计[M].北京:清华大学出版社,2006.
[4]
谭浩强.C程序设计[M].北京:清华大学出版社,1999.
[5]
冯博琴,刘路放.精讲多练C语言[M].西安:西安交通大学出版社,1997.
致谢
衷心感谢我的指导老师许立志在前期准备工作中对我的悉心指导和给的忠诚的建议,感谢在制作板子的过程中,薛世华老师的耐心指导,他严谨精细的治学态度,渊博的知识,孜孜不倦的工作热忱和诲人不倦的精神,我将铭记在心,感谢程序调试过程中任涛和何敏同学的帮助;最后感谢图书馆、电子阅览室为我提供查找资料的场所和优质的服务。
附录:
附录一:水温控制原理图
附录二:PCB图
附录三:
实物图
附录四:元件清单
1
Part
Type
Designator
footprint
2
0.1u
C4
RAD0.2
3
1k
R5
AXIAL0.3
4
1k
R4
VR5
5
10k
R1
AXIAL0.3
6
10u
C3
RB.2/.41
7
12MHZ
X1
XTAL1
8
33p
C1
RAD0.2
9
33p
C2
RAD0.2
10
AT89S51
U1
DIP40
11
CON2
CZ
12
CON2
J2
SIP2
13
DS18B20
J1
SIP3
14
HEADER
5*2
JP1
ISP
15
PZ
RP1
SIP9
16
SSR
R6
SSR
17
SW-PB
S2
SW-PB
18
SW-PB
S1
SW-PB
19
SW-PB
S4
SW-PB
20
SW-PB
S3
SW-PB
21
U2
LCD
LCD1602
附录五:源程序代码
/********************************************************************
名称
:
单片机水温控制器**********************************************************************/
#include
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
jump_ROM
0xCC
#define
start
0x44
#define
read_EEROM
0xBE
uchar
wendumin=10;
uchar
wendumax=60;
uchar
current=10;
uchar
msg1[16]=“cankao:
--
C
“;
uchar
msg2[16]=“temperature:10
C“;
uchar
flag=0;
uchar
time=0;
uchar
setflag=0;
//uchar
postive=0;
//uchar
wendu;
//uchar
function=0;
sbit
E=P1^3;
sbit
RW=P1^2;
sbit
RS=P1^1;
sbit
DQ=P2^0;
sbit
P1_0=P1^0;
sbit
P2_1=P2^1;
sbit
P2_2=P2^2;
/********************************************************************
名称
:
delay()
功能
:
延时,延时时间大概为100US。
/***********************************************************************/
void
delay_1()
{
int
i,j;
for(i=0;
i>
i;
temp=temp
write_bit(temp);
delay(5);
}
}
/********************************************************************
名称
:
Retemp()
功能
:
读取温度**********************************************************************/
void
Retemp()
{
uint
TMPH,TMPL;
Reset();
write_byte(jump_ROM);
write_byte(start);
Reset();
write_byte(jump_ROM);
write_byte(read_EEROM);
TMPL=read_byte();
TMPH=read_byte();
current=TMPL/16+TMPH*16;
}
//-------------------------------------
void
Delay8(uchar
a)
//
delay
40us
{
for(;a!=0;a--)
;
}
//=============================================
void
SendCommandByte(unsigned
char
ch)
{
RS=0;
RW=0;
P0=ch;
E=1;
Delay8(20);
E=0;
Delay8(500);
//delay
40us
}
//-------------------------------------------------------
void
SendDataByte(unsigned
char
ch)
{
RS=1;
RW=0;
P0=ch;
E=1;
Delay8(20);
E=0;
Delay8(500);
//delay
40us
}
//-------------------------------------------------
void
InitLcd()
{
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x30);
SendCommandByte(0x38);//设置工作方式
SendCommandByte(0x0c);
//显示状态设置
SendCommandByte(0x01);
//清屏
SendCommandByte(0x06);
//输入方式设置
}
//=============================================
void
DisplayMsg1(ucharp)
{
unsigned
char
count;
SendCommandByte(0x80);
//设置DDRAM地址
for(count=0;count0;j--)
for(i=249;i>0;i--);
}
void
scankey()
{
uchar
temp=0xFF;
P3=0XFF;
if((P3
if((P3
switch(temp)
{
case
0x14:flag=1;break;
case
0x44:flag=2;;break;
default:time++;
if(time==3)
{time=0;}
break;
}
while((P3
}
}
/*void
datahandle()
{
if(setflag==1)
{
switch(flag)
{
case
1:
{
wendu+=1;
if(wendu>=99)
{wendu=99;}
flag=0;
break;
}
case
2:
{
wendu-=1;
if(wendu=30)
{wendumin=30;}
}
flag=0;
break;
case
2:
{
wendumin--;
if(wendumin=99)
{wendumax=99;}
}
flag=0;
break;
case
2:
{
wendumax--;
if(wendumax=wendumax)
{
P1_0=1;
P2_1=0;
P2_2=1;
}
else
if(current<=wendumin)
{
P1_0=0;
P2_2=0;
P2_1=1;
}
else
{
P1_0=1;
P2_2=1;
P2_1=1;
}
}
}
void
time0()
interrupt
1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
scankey();
Retemp();
if(time!=0)
{datahandle();}
}
void
time1()
interrupt
3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
msg1[8]=wendumin/10+0x30;
msg1[9]=wendumin%10+0x30;
msg1[12]=wendumax/10+0x30;
msg1[13]=wendumax%10+0x30;
msg2[12]=current/10+0x30;
msg2[13]=current%10+0x30;
DisplayMsg1(msg1);
DisplayMsg2(msg2);
}
32