我设计的空调控制器采集温度的传感器选择热电偶,热电偶采集的温度经过一系列的变换后,输出的电压值经过A/D转换后进入单片机,在单片机中看到的采集值是一数字量,这个数字量和键盘输入的数字量相比较,如果采集的值比设定的值小,就启动电机进行加热,如果采集的值比设定的值大,就启动压缩机进行制冷。
而且采集的值和设定的值都可以通过LED显示出来。
在设计中,我还设定了一个适宜的温度,当温度低于20℃或高于25℃时就会产生报警。
关键词传感器,温度采集,单片机,空调控制器
中文摘要IV
1设计任务描述1
1.1设计题目1
1.2设计要求1
1.2.1设计目的1
1.3基本要求1
1.3.1发挥部分1
2设计思路2
2.1温度传感器的选择2
2.2+5V稳压电源的实现2
2.3温度显示功能的实现2
2.4温度设定功能的实现2
2.5温度测量功能的实现2
2.6制冷和加热功能的实现3
3设计方框图4
4硬件设计5
4.1+5V稳压电源的实现5
4.1.1LM7805的介绍5
4.1.2+5V稳压电源电路5
4.2温度测量的基本组成部分5
4.2.1温度传感器5
4.2.2测量电路6
4.2.3A/D转换器6
4.3温度测量信号的采集6
4.3.1LM135系列的性能特点6
4.3.2热电偶的工作原理6
4.3.3热电偶冷端温度补偿电路7
4.3.4键盘输入电路7
4.3.5数码显示电路8
4.48255芯片简介8
5系统软件10
5.1软件流程图10
5.2各部分程序设计11
5.2.1主程序11
5.2.2I/O口初始化11
5.2.38255初始化12
5.2.4温度采集12
5.2.5显示子程序13
5.2.6制冷和加热13
6程序的调试15
7工作过程分析16
8主要元器件介绍17
8.1热电偶17
8.28255芯片17
8.3LM7805的介绍17
8.4C8051单片机17
小结18
致谢19
参考文献20
附录A1程序清单21
附录A2空调控制器原理图27
附录A3PCB板图28
1设计任务描述
1.1设计题目
空调控制器的设计
1.2设计要求
1.2.1设计目的
1)学会选择合适的传感器以及用法。
2)掌握软件编程方法及思路。
3)会用protel99SE绘制PCB板图。
1.3基本要求
1)硬件电路设计,包括原理图和PCB板图。
2)控制器软件设计。
3)要求能够设定温度、测量温度、显示温度、制冷控制以及风机控制。
1.3.1发挥部分
超过设定温度时点亮LED灯报警。
2设计思路
2.1温度传感器的选择
温度检测的方法较多,最经典的方法就是用热敏电阻<或热敏传感器)组成电桥来采集信号,在经放大、A∕D转换后送单片机。
目前比较先进的方法是采用专门的集成测温传感器,直接将温度转换成数字信号传送给单片机。
为了设计需要,本文采用了由LM335构成的K型热电偶冷端温度补偿电路。
因为它构成的电路可以测量摄氏温度,而且温度系数为10mv/℃。
2.2+5V稳压电源的实现
在设计中使用了很多集成元器件,根据它们的技术要求,正常工作时均为5V供电,且电路工作稳态电流较小,因此对电源要求不高。
因此在本次设计中我选用LM7805集成稳压电路,它的输出电压为5V,输出电流可达1.5A。
由LM7805集成稳压器组成的5V电压源主要由变压器、整流电路、滤波电路、稳压电路组成。
2.3温度显示功能的实现
为了使室内的温度更直观的展现在使用者的面前,我在这个程序中添加了数码管显示部分。
温度的设定和采集都要显示出来,显示功能是通过软件编程来实现的。
显示功能主要是应用8255来实现的,通过设置8255
2.4温度设定功能的实现
温度设定功能也是通过软件编程来实现的,在本次设计中温度的设定是通过键盘输入设定的。
2.5温度测量功能的实现
通过温度传感器感测外界的温度,然后传感器把温度的变化转换成有用模拟量电压值,但是单片机只能处理数字量,所以从传感器出来的模拟量还要经过A/D转换器,把模拟量转换成数字量。
所以在软件编程时,要对A/D初始化和启动A/D转换器,这样就把温度转换成了十六进制的数字量,然后再把从A/D转换器采集进来的数通过查表转换成十进制的数,通过数码管显示出来,这样显示在人们眼前的就是室内的实际温度值。
2.6制冷和加热功能的实现
通过键盘输入的是设定的温度值,也就是人们希望达到的温度,它进入单片机之后就是一个数字量,输入的这个数字量和采集进来的数字量进行比较,如果采集的值比设定的值小,就启动电机进行加热,如果采集的值比设定的值大,就启动压缩机进行制冷。
3设计方框图
图3-1空调控制器总体方框图
4硬件设计
4.1+5V稳压电源的实现
4.1.1LM7805的介绍
产生+5V稳压电源的核心元件是集成稳压器LM7805,LM7805是美国半导体公司的固定输出三端正稳压器集成电路,输出电流在1A以上,输出电压是+5V。
内其内部包括过热、过流和调整管保护等电路,误差放大电路,基准电压电路和调整电路,使用比较方便且稳定精度高。
4.1.2+5V稳压电源电路
该电路主要由变压器、整流电路、滤波电路和稳压电路组成。
整流电路是由四个二极管组成的整流桥,整流电路主要是利用二极管的单向导电性。
滤波电路是通过电容来实现的。
+5V稳压电源电路如图4-1所示。
图4-1+5V稳压电源电路
4.2温度测量的基本组成部分
一个完整的温度采集系统通常包含几个部分,包括温度传感器、测量电路、模拟前端信号处理、A∕D转换器三个基本组成部分。
4.2.1温度传感器
获取生产或生活中被测环境或者被测物质的温度信息,一般都离不开传感器,这里由于被测对象的状态往往是一种非物理量<如温度),而MCU是一个只能识别和处理电信号的数字系统,因此需要利用传感器将非电物理量转换成电信号才能完成温度测量和控制的任务。
4.2.2测量电路
通常传感器的输出可能是电阻值、电容值或者电流值,这些信号不适宜进行直接测量,往往需要转换成电压信号,传递给后面的A/D转换器,所以很多时候需要搭建简单的测量电路,使得传感器输出的参数变化转换为电压的变化。
4.2.3A/D转换器
无论是计算机,还是各种MCU、或者DSP等处理器只能处理数字信号,即使经过处理的信号仍然只是模拟物理量,还不能直接和这些处理器通信,而A/D转换器就是实现从模拟量到数字量转换的关键器件。
模数转换技术是实现各种模拟信号通向数字世界的桥梁。
4.3温度测量信号的采集
4.3.1LM135系列的性能特点
在设计中我用的温度采集电路是热电偶冷端温度补偿电路,这个电路是由LM335构成的K型热电偶冷端温度补偿电路。
下面介绍LM335的性能特点如下:
<1)它属于电压输出式精密集成温度传感器,电压温度系数为+10mV/K,输出电压与热力学温度成正比。
<2)测温精度高,测温范围宽。
LM335测温范围为—40~+100℃。
<3)动态阻抗低。
当工作电流为0.4~5mA时,其动态阻抗仅为0.5~0.6
<4)具有类似于稳压管的特性,使用时须经过限流电阻接正电源,亦可由集成恒流源给它提供恒定的工作电流。
<5)价格低,易校准。
利用一只10
电位器即可校准+25℃时的输出电压值。
4.3.2热电偶的工作原理
热电偶的工作原理可以这样解释,当两种不同的导体或半导体A或B组成一个回路,其两端相互连接时,只要两端<一端温度为T,称为工作端或者是热端;另一端温度为
,称为自由端,也称参考端或者冷端)的温度不同,则回路中就会有电流产生,回路中存在的电动势称为热电动势。
热电偶就是利用这一效应来工作的。
4.3.3热电偶冷端温度补偿电路
由LM335构成的K型热电偶冷端温度补偿电路如图4-2所示。
利用LM335来测量热电偶的冷端温度
,
为限流电阻,
是校准温度的电位器。
LM335的输出电压经过
和
分压之后,得到所需的补偿电压
,其电压温度系数为式<4-1)。
<4-1)
图4-2K型热电偶冷端温度补偿电路
因
接运算放大器LM308A的反相输入端,故可视为
。
型热电偶产生的温差热电势e则接到LM308A的同相输入端。
经LM308A放大之后就实现了热电偶的冷端温度补偿。
考虑到LM335的输出电压与热力学温度成正比,要想输出与摄氏温度成正比的电压信号
,还应扣除LM335在0℃时的输出电压
。
现利用LM329B型6.9V基准电压源和精密多圈电位器
,得到
,也加至LM308A的反相输入端,因此实际补偿电压就变成了
。
最终可使输出电压
℃)
。
4.3.4键盘输入电路
键盘输入电路如图4-3所示。
图4-3键盘输入电路
键盘输入用到了8255,PB和PC口是8255两个八位输出口,8255控制端口的地址分别为8000H,8001H,8002H和8003H,它们由地位地址A0,A1加以区别,A0,A1从地位地址锁存器74LS373引出,外设芯片8255的接口配置与外部存储器的接口配置方式相同,同样占据数据总线和地址总线。
4.3.5数码显示电路
数码显示电路如图4-4所示。
图4-4数码显示电路
数码管采用共阴极方式,PA口是8位输入口,用于读入扫描键盘的位置。
8255的片选地址
是由高八位地址(A8~A15>通过74LS138译码产生的。
从PA0~PA3查询扫描行的输入状态,从PA4~PA7查询功能键的输入状态,判断是否有数字键或功能键按下。
4.48255芯片简介
8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。
具有3个通道3种工作方式的可编程并行接口芯片<40引脚)。
其各口功能可由软件选择,使用灵活,通用性强。
8255可作为单片机与多种外设连接时的中间接口电路。
8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控制线接口。
同时必须具有与外设连接的接口A、B、C口。
由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:
与CPU连接部分、与外设连接部分、控制部分。
8255的引脚功能如下:
RESET:
复位输入线,当该输入端处于高电平时,所有内部寄存器<包括控制寄存器)均被清除,所有I/O口均被置成输入方式。
CS:
芯片选择信号线,当这个输入引脚为低电平时,即
=0时,表示芯片被选中,允许8255与CPU进行通讯,
=1时,8255无法与CPU做数据传输。
RD:
读信号线,当这个输入引脚为低电平时,即
=0且
=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。
WR:
写入信号,当这个输入引脚为低电平时,即
=0且
=0时,允许CPU将数据或控制字写入8255。
5系统软件
5.1软件流程图
图5-1空调控制器的软件流程图
5.2各部分程序设计
5.2.1主程序
MAIN:
MOVWDTCN,#0DEH
MOVWDTCN,#0ADH
MOVXBR2,#40H
LCALLPORT
LCALLDIGITAL
LCALLINT8255
MOVEIE2,#10H
MOVP3IF,#00H
MOVAMX0CF,#00H
MOVAMX0SL,#00H
MOVREF0CN,#03H
MOVADC0CF,#58H
MOVADC0CN,#0C0H
SETBEA
ORLADC0CN,#10H
LOP:
LCALLLCD
AJMPLOP
在主函数之前先设置A/D转换器的中断入口,然后再编写主程序,在主函数最起初先禁止看门狗程序,然后使能交叉开关。
然后依次调用I/O口初始化程序,要显示的数的断码初始化程序,以及8255初始化程序。
然后是设置各端口为漏极开路,即低电平有效。
接下来是A/D转换器的初始化,选择时钟周期为1MHz,系统时钟是12MHz,增益大小选择为1,所以ADC0CF设为58H,启动方式为写BUSY=1,数据位右对齐,所以ADC0CN设为C0H。
由于A/D转换器是采集外界温度的,采集结束之后还要用数码管显示出来,所以在执行完A/D中断结束之后,返回来要接着条用显示的程序。
因为A/D转换器采集外界的温度是随时更新的,因此,在这里是循环调用的
5.2.2I/O口初始化
PORT:
MOVEMI0CF,#2CH
MOVP74OUTt,#3FH
RET
I/O口是单片机的重要组成部分,所以在编写程序时要对它进行初始化。
让EMIF工作在地址/数据复用方式,只用外部存储器,ALE高/低脉冲占1个SYSCLK周期,所以EMI0CF设为2CH;P7为漏极开路方式,P4、P5、P6为推拉方式,所以设置P74OUT为3FH。
5.2.38255初始化
int8255:
movDPTR,#8003H
mova,#80H
movx@DPTR,a
ret
控制字设为80H,即设置PC和PB口为输出,PA口为输入。
8003H为8255的控制寄存器地址。
5.2.4温度采集
ADC0:
mova,adc0l
mov33H,adc0l
swapa
anla,#0FH
mov30H,a
mova,adc0h
mov34H,adc0h
swapa
anla,#0F0H
orla,30H
mov31H,a
lcallSC
lcallCOMPARE
lcalllcd
anldc0cn,#0dfH
orladc0cn,#10H
moveie2,#10H
reti
把温度转换成易于单片机处理的数字信号,是通过A/D转换器来实现的。
C8051F020有两个A/D转换器,分别是ADC0和ADC1,ADC0是12位的A/D转换器,而ADC1是8位的A/D转换器。
在此次设计中我用的是12位的A/D转换器ADC0,由于ADC0是12位的A/D转换器,所以被采集进来的数是被分在两个存储单元存储的。
存储的时候把低8位adc0l放在33H单元中,把高四位放在adc0h放在34H单元中。
由于采集进来的数要和输入的数进行比较,所以还要把33H和34H中的数合并在一个单元中,以便后来进行比较。
最后我把这两个分开的数合并之后存放在了31H单元中。
5.2.5显示子程序
lcd:
movDPTR,#8001H
mova,R3
movx@DPTR,a
movDPTR,#8002H
mova,@R1
movx@DPTR,a
lcallDelay1
mova,R3
rla
movR3,a
cjneR3,#40H,lop1
movR3,#01H
lop1:
incR1
cjneR1,#77H,lcd
movR1,#71H
MOVEIE2,#12H
ret
8255的片选地址
是由高八位地址(A8~A15>通过74LS138译码产生的。
键盘输入用到了8255,PB和PC口是8255两个八位带锁存的输入口,可实现输出数据锁存。
PB口的端口地址为8001H,PC口的端口地址为8002H。
用PB口作六个数码管的位选。
用ULN2003作显示器的位选驱动。
PC口作字型码锁存。
8255控制字的端口地址是8003H。
74LS244作数码管字型显示驱动。
数码管选择为共阴极。
采集到的温度值和设定的温度值都会通过数码管显示出来,而且采集的值时随时更新的。
5.2.6制冷和加热
COMPARE:
mova,6CH。
ad
clrc
cjnea,6BH,lop8。
shuru
ajmpstop
lop8:
jcwarm
cool:
clrp3.5
clrp0.1
ajmpwork
warm:
setbp3.5
setbp0.1
ajmpwork
stop:
clrp3.5
setbp0.1
work:
nop
ret
空调就是能给人适宜的温度,当室内的温度很高时,我们会感觉很闷,所以我们就要设定一个自己想要的温度,如果室内的温度比我们自己设定的温度要高,那么空调控制器就会启动制冷装置,使室内的温度达到我们需要的温度。
在本次设计中,在启动制冷装置时,我就点亮一个LED灯。
在冬天时,偶尔室内的温度会很低,人们会感觉很不舒适,那么在这时,空调控制器就会启动加热装置,使室内的温度可以让我们感觉温暖。
在启动加热装置时,我用的的是启动直流电动机。
6程序的调试
我们编写的每一个程序都需要进行调试,我在设计中遇到了很多困难。
首先是在温度采集的值和我们输入的值之间进行比较这一块出现了问题,由于A/D转换器采集进来的数是放在两个存储单元中的,而且是十六进制的数字量,一开始我想把从A/D转换器采集进来的数转换成十进制的数,然后也把从键盘输入的数字量也转换成使劲数进行比较,可是在调试的过程中我发现这种做法很麻烦,所以后来我就把从A/D转换器采集进来的数放在一个存储单元中,然后和键盘输入的数进行比较。
把A/D转换器采集进来的数合并在一个存储单元中的程序如下:
ADC0:
mova,adc0l
mov33H,adc0l
swapa
anla,#0FH
mov30H,a
mova,adc0h
mov34H,adc0h
swapa
anla,#0F0H
orla,30H
mov31H,a
其次,在设计中发现,应该限制一个温度范围,也就是说,一旦温度超过设定的温度范围就会产生报警。
温度范围设在20℃~25℃之间,这段程序如下:
cjnea,#20h,lop9
ljmplop10
lop9:
jclop14
ljmplop11
lop10:
setbp0.0
ljmplop12
lop11:
cjnea,#25h,lop13
ljmplop10
lop13:
jclop10
lop14:
clrp0.0
lop12:
swapa
mov6dH,a
anla,#0fH
movdptr,#tabc
movca,@a+dptr
mov75H,a
mova,6CH
ret
7工作过程分析
在主函数之前先设置A/D转换器的中断入口,然后再编写主程序,在主函数最起初先禁止看门狗程序,然后使能交叉开关。
然后依次调用I/O口初始化程序,要显示的数的断码