资源描述
目录
摘要 2
一 概述 2
二 方案选择 5
三 器件选择 6
四 电路原理图 6
五 工作原理 9
六 实验中遇到的问题及分析 17
七 实验的扩展 18
八 心得体会 18
摘要
该系统主电路采用89S51单片机实现温度控制,加热和制冷部分由于条件限制,只采用模拟的方式。电路可实现温度的显示,设置上下限温度,超出范围报警以及和PC机通信的功能。系统测量精度和控制精度良好。我们为本系统共设计了两套程序,我主要负责其中一套程序的编写和单片机最小系统板的组建。
关键词:89S51单片机 温度控制 程序 模拟
一 概述
实现温度控制的方法有多种,可以用工控机作为控制器,用热电阻测量温度;也可以用单片机作为控制器,用热电偶进行温度测量。当然每一种方案都有其各自的优点。本章详细列举、说明了基于89C2051单片机的温度控制的方案、并画出了其原理方框图,对方案的优缺点进行了分析。
2.1 设计思想
方案
(1) 硬件组成:单片机、A/D转换器、LED显示器、集成的热电偶温度变送器、固态继电器、大功率发热器。
(2) 工作原理:由集成的热电偶变送器对系统温度进行检测,并完成信号标准化、变送功能。单片机执行控制功能、由固态继电器控制大功率发热器电源的导通与断开,从而达到控制温度的目的。
(3) 系统原理框图
2.2 论证分析
最终方案论述:很显然,方案较其它相比无论在经济上和实现容易程度上都要好。
方案在实行控制的时候不像其它采用D/A转换后再控制调节阀的方法,而是直接外接一个固态继电器,通过内部改变定时器的中断时间来调节一个周期内电子开关的导通和断开时间。这样既节省了材料也可以很大程度上减少硬件电路的结构。
综上所述方案有如下的特点:
(1) 在完成所要求的任务的基础之上还有着结构简单、明了的特点,很容易实现,而且在一定的程度上节约成本。
(2) 由于采用了离线的方法,很大程度上的减少了编程的麻烦,实现起来较容易。
(3) 采用了无污染能源,保护环境。同时也省去了为建造燃料供应子系统的费用,节约了成本。采用了模拟的PWM变换,和固态继电器。可以将采样频率提高到很多的水平,使控制结果更准确,实时性、控制效果更好。
在系统的运行过程中可能出现各种干扰,如信号不稳定、电路板搞干扰能力差、程序跑飞等,也可能在搬运或者使用过程中对电路板或者原器件的磨损等。所以在设计过程中应做好搞干扰设计,以求将干扰对系统产生的影响降到最低。
3.3.1 硬件抗干扰设计
在硬件设计过程中为了减少外部信号对系统的影响采用了以下几种抗干扰措施。
1 I/O口外接滤波电容和上拉电阻,减小信号干扰。
2制作PCB板时对重点信号线实行地线包络,并于导线集中的地方和过孔处补上泪滴,加强连接。
3. PCB板的双面分别填充电源层与地线层,并对没有并线的地方进行覆铜
2. PCB板布局实行模块化分离,模块之间进行信号隔离,对电源变压器进行隔离。
3.3.2 软件抗干扰措施
软件抗干扰就有投资低的优点,本文采用的软件抗干扰措施如下:
(1) 指令冗余
当CUP受到干扰后,往往将一些操作数当作指令码来执行,引起程序的混乱,我们首先要尽快将程序纳入正轨,也就是让程序弹飞到某一个单字节指令NOP,这就是指令冗余,自此,常在一些对程序的流向起决定作用的指令之前插入两条NOP指令,以保证弹飞的程序迅速纳入正确的控制轨道。在某些对系统工作状态至关重要的指令前也可插入两条NOP指令,以保证被正确执行。
(2) 软件陷阱
当弹飞的程序落到非程序区(如ROM中未使用的空闲和程序中的数据表格区)时,就形成了死循环,解决的办法就是用一条引导指令强行将捕获的程序印象到一个指定的地址,为了加强捕获的效果,一般还在其前面加两条NOP指令。因此,软件陷阱由三条指令组成:
NOP
NOP
LJIMP START
a. 未使用的中断向量区
当干扰未使用的中断开放,并激活这些中断时,就会进一步引起混乱,如果我们在这些地方布上陷阱,就能及时捕获到中断。可在中断入口处加入RETI指令。
b. 未使用的大片ROM空间
对于剩下的ROM空间,一般在每隔一段设置一个陷阱(02H 00H 00H)从头开始,此时前两个00H即是设置陷阱的地址,又是NOP指令,起到双重的作用。
3.3.3 软件调试
1. 模糊表的求取
在软件设计部分中已经说明,运算中由于单片机的运算能力有限,所以将矩阵的运算部分采用了离线的方式,进行求取。其体的求取过程如下:
(1) 将熟练操作人员得出的关系得出关系R。如图3-20。
(2)运行编好的程序,求出控制量。
依次输入各种情况下的隶属度,并进行解求出控制表。
二 方案选择
本系统若根据赛题要求可有多种实现方案。
(1)方案一 此方案是传统的一位式模拟控制方案,选用模拟电路,用电位器设定给定值,反馈的温度值和设定值比较后,决定加热或不回热。系统受环境影响大,不能实现复杂的控制算法,不能用数码显示,不能用键盘设定。
(2)方案二 此方案是传统的二位式模拟控制方案,其基本思想与方案一相同,但由于采用上下限比较电路,所以控制精提高。这种方法还是模拟控制方式,因此也不能实现复杂的控制算法使控制精度做得较高,而且仍不能用数码显示和键盘设定
(3)方案三 此方案采用89S51单片机系统来实现。单片机软件编程灵活、自由度大,可用软件编程实现各种控制看法和逻辑控制。可实现数码显示和键盘设定等多种功能,系统电路框图如下:
数码显示
电源电路
键盘设定
键盘设定
89S51
单
片
机
控制电路
串行接口
电源电路
数据采集
方案一和方案二是传统的模拟控制方式,而模拟控制系统难以实现复杂控制规律,控制方案的修改也较麻烦。而方案三是采用以89S51为控制核心的单片机控制系统,尤其对温度控制,它可达到模拟控制所达不到的控制效果,并且可实现显示、键盘设定等多种功能,又易于扩展,大大提高了系统的智能化,也使得系统所测结果精度大大提高。故选择方案三。
三 器件选择
由于单片机最小系统板采用的是去年省赛的板子,所以受到了很多限制。如对系统精度至关重要的A/D转换换器,板子上采用的是ADC0809。因为是八位的,所以精度不高,最多只能达到0.4度左右。但考虑到已有现成的板子,采用0809同样可达到实验的目的,所以A/D部分暂不作更改。
传感器部分既可采用热敏电阻,也可采用集成的温度传感器。但由于热敏电阻的精度、重复性、可靠性都比较差,所以我们采用的集成的LM35,LM35
四 电路原理图
单片机最小系统电路:
由于去年大赛的板子(旧板)是03级的学生设计的,故存在许多缺陷,具体表现在单片机和ADC0809之间的读写线接反,
单片机P0口和ADC0809的数据线高低位接反。显示部分的74LS245多接了一个排阻。经过多次的检查,找出了错误。
最终的电路图如图示:
单片机最小系统部分:
ADC0809的A/D采样部分:
四位LED数码管显示部分:
单片机串口通信电路
RXD
TXD
:
温度采集部分:
报警电路: 温控模拟部分:
五 工作原理
具体电路原理详见本组另一成员的报告,在此仅介绍系统的软件部分,我们总共写了两份程序,其中一份为我个人独立完成。下面为程序的主要流程图。
主程序 显示程序
开始
开始
设初值
设初值
显示第一位?
启动A/D转换
是否调整?
扫描三位
扫描四位
否
是
调上限
调下限
退出
显示数据转换程序
开始
显示
否
取数
中断完毕?
是
转换
送显缓
串口通信程序
转ASCII
是否超限?
送显缓
TI为1?
超上限
=1
超下限
=0
清零
未超
报警
送数
返回
返回
;;显示区地址分别为63H,62H,61H,60H
;上限温度地址分别为2EH,2DH,2CH
;下限温度地址分别为2BH,2AH,29H
;用到的位地址有00H,01H,30H
; ===============主程序===============
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0
ORG 0030H
MAIN: MOV SP,#70H ;置初值
CLR P1.7
MOV R0,#40H
SETB PSW.4
SETB PSW.3
SETB IT0
SETB EA
SETB EX0
MOV TMOD,#20H ;波特率9600
MOV TH1,#0FDH
MOV TL1,#0FDH
SETB TR1
MOV SCON,#50H
SETB TI
CLR 30H
CLR 01H
SETB P1.7
CLR P1.6
CLR P1.5
MOV DPTR,#0BFFFH
MOV A,#00H
MOV 2EH,#0
MOV 2DH,#0
MOV 2CH,#0
MOV 2BH,#0
MOV 2AH,#0
MOV 29H,#0
MOV 62H,#0
LOOP: MOV DPTR,#0BFFFH
MOVX @DPTR,A ;启动A/D转换
CLR 00H
WAIT: LCALL XUAN
CHAXUN:JNB P1.3,LOOP1 ;调整
JNB P1.4,LOOP2
JNB 00H,GG ;判断是否再启动
LJMP LOOP
GG: LJMP WAIT
;===========上限温度调整===========
LOOP1: CLR EX0
LCALL DELAY1
JNB P1.3,$
MOV 62H,2EH
MOV 61H,2DH
MOV 60H,2CH
JB P1.2,M2
MOV A,2EH
ADD A,#01
DA A
MOV 2EH,A
CJNE A,#10H,M1
MOV 2EH,#00
M1: JNB P1.2,$
M2: JB P1.1,M4
MOV A,2DH
ADD A,#01H
DA A
MOV 2DH,A
CJNE A,#10H,M3
MOV 2DH,#00
M3: JNB P1.1,$
M4: JB P1.0,M5
MOV A,2CH
ADD A,#01
DA A
MOV 2CH,A
CJNE A,#10H,M5
MOV 2CH,#00
M5: JNB P1.0,$
SETB 30H ;是否显示第一位的标志位
MOV 63H,#11H ;显示“上”
MOV 62H,2EH
MOV 61H,2DH
MOV 60H,2CH
LCALL DELAY
JNB P1.3,TUI ;再次中断时,退出
LJMP LOOP1
;==========下限温度调整===========
LOOP2: CLR EX0
JNB P1.3,$
MOV 62H,2BH
MOV 61H,2AH
MOV 60H,29H
JB P1.2,L2
MOV A,2BH
ADD A,#01
DA A
MOV 2BH,A
CJNE A,#10H,L1
MOV 2BH,#00
L1: JNB P1.2,$
L2: JB P1.1,L4
MOV A,2AH
ADD A,#01H
DA A
MOV 2AH,A
CJNE A,#10H,L3
MOV 2AH,#00
L3: JNB P1.1,$
L4: JB P1.0,L5
MOV A,29H
ADD A,#01
DA A
MOV 29H,A
CJNE A,#10H,L5
MOV 29H,#00
L5: JNB P1.0,$
SETB 30H ;是否显示第一位的标示位
MOV 63H,#0FH ;显示“下”
MOV 62H,2BH
MOV 61H,2AH
MOV 60H,29H
LCALL DELAY
JNB P1.4,TUI ;再次中断时,退出
LJMP LOOP2
TUI: MOV A,2BH
CLR C
CJNE A,2EH,AA ;比较上限是否低于下限
MOV A,2AH
CJNE A,2DH,AA
CJNE A,60H,E1
LJMP E2
E1: JC SHANG_BAO
LJMP E2
;======超上限温度报警======
SHANG_BAO:
SETB P1.7
SETB P1.6
CLR P1.5
LJMP X2
E2: CLR P1.5
CLR P1.6
CLR P1.7
X1: MOV A,2BH
CJNE A,62H,E3
MOV A,2AH
CJNE A,61H,E3
MOV A,29H
CJNE A,60H,E3
LJMP E4
E3: JNC XIA_BAO
LJMP E4
;======低于下限温度报警======
XIA_BAO:SETB P1.7
SETB P1.5
CLR P1.6
LJMP X2
E4: CLR P1.5
CLR P1.6
CLR P1.7
X2: CLR 30H
ACALL DELAY
;========串口通信=========
MOV R3,#30H ;转ASCII码
MOV A,62H
ADD A,R3
DA A
MLP3: JBC TI,MLP2 ;当TI为1时清0
SJMP MLP3
MLP2: MOV SBUF,A
MOV A,61H
ADD A,R3
DA A
MLP5: JBC TI,MLP4
TT: MOV DPTR,#0FAFFH
D2: MOVX @DPTR,A
DJNZ 30H,D2 ;十位
MOV 30H,#40
MOV DPTR,#TAB0
MOV A,60H
MOVC A,@A+DPTR
MOV DPTR,#0FBFFH
D3: MOVX @DPTR,A
DJNZ 30H,D3 ;个位
RET
TAB0:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,
; 0 1 2 3 4 5 6 7
7FH,6FH,77H,7CH,39H,5EH,79H,71H
; 8 9 A B C D E F
DB 76H,78H,38H,6EH,00H ,77H,
; H K L Y 无 R
DELAY12: MOV R4,00H
MOV R5,00H
X3: DJNZ R4,$
DJNZ R5,X3
RET
;-------中断0服务程序-------
INT0: PUSH A
PUSH PSW
MOV DPTR,#0BFFFH
MOVX A,@DPTR ;读A/D转换结果
MOV 2FH,#0FFH
CLR CY ;程序调整高低位
RLC A
JC N1
CLR 78H
MOV A,29H
CJNE A,2CH,AA
LJMP XXX ;正常
AA: JNC ERRO ;上限低于下限,跳转
XXX: SETB EX0
MOV A,@R0
LCALL XUAN
LJMP WAIT
ERRO: MOV 63H,#0EH ;显示“ERRO“
MOV 62H,#15H
MOV 61H,#15H
MOV 60H,#0H
SETB 30H
SETB 01H
EEEE: LCALL DELAY
JNB P1.3,XX1 ;是否重新调整
JNB P1.4,XX2
LJMP EEEE
XX1: LJMP LOOP1
XX2: LJMP LOOP2
;==========显示数据转换=========
Xian: MOV A,@R0
MOV B,#100
MUL AB
MOV R3,A
MOV A,B
MOV B,#10
DIV AB
MOV R1,#62H
MOV @R1,A
DEC R1
MOV @R1,B
MOV A,R3
MOV B,#10
MUL AB
DEC R1
MOV @R1,B
CLR 30H
ACALL DELAY
MOV A,2EH
CJNE A,62H,E1
MOV A,2DH
CJNE A,61H,E1
MOV A,2CH
SJMP MLP5
MLP4: MOV SBUF,A
MOV A,#46 ;小数点
MLP8: JBC TI,MLP9
SJMP MLP8
MLP9: MOV SBUF,A
MOV A,60H
ADD A,R3
DA A
MLP7: JBC TI,MLP6
SJMP MLP7
MLP6: MOV SBUF,A
MOV A,#32
MLP10: JBC TI,MLP11
SJMP MLP10
MLP11: MOV SBUF,A
RET
;==========延时加显示=========
DELAY: MOV R3,#0A0H
D00: ACALL DISPLAY
DJNZ R3,D00
RET
DISPLAY:JNB 30H,DD
MOV 30H,#40
MOV DPTR,#TAB0
MOV A,63H
MOVC A,@A+DPTR
MOV DPTR,#0F8FFH
D0: MOVX @DPTR,A
DJNZ 30H,D0 ;千位
DD: MOV 30H,#40
MOV DPTR,#TAB0
MOV A,62H
MOVC A,@A+DPTR
MOV DPTR,#0F9FFH
D1: MOVX @DPTR,A
DJNZ 30H,D1 ;百位
MOV 30H,#40
MOV DPTR,#TAB0
MOV A,61H
MOVC A,@A+DPTR
JB 01H,TT
ADD A,#80H
N1: RLC A
JC N2
CLR 79H
N2: RLC A
JC N3
CLR 7AH
N3: RLC A
JC N4
CLR 7BH
N4: RLC A
JC N5
CLR 7CH
N5: RLC A
JC N6
CLR 7DH
N6: RLC A
JC N7
CLR 7EH
N7: RLC A
JC N8
CLR 7FH
N8: MOV A,2FH
MOV @R0,A
SETB 00H
POP PSW
POP A
RETI
;=======延时=======
DELAY1: MOV R6,#60
DE1: MOV R7,#248
MOV R7,$
DJNZ R6,DE1
RET
END
六 实验中遇到的问题及分析
1、单片机最小系统方面由于是去年03级的同学设计的,我们用的又是旧板,故存在很多缺陷,一方面我们没有正确的原理图,只有一张其他同学随便画的图,就算有了原理图,也不知道板上错在哪里,所以只能用万用表一个个的找。通过我们的认真检查,结果发现
不管是板上还是图纸上都出了相当大的错误,图上很多引脚都标注错误了,而板上就更是离谱了,居然把单片机和ADC0809的读写线接反,把单片机的P0口和ADC0809的数据线高低位接反,74LS245上还多接了一个排阻,造成LED显示不正常。诸如上面的错误给我们造成了相当大的麻烦,因此我们花了相当长的时间在查错上。
2、由于传感器LM35的灵敏度是+10.0mV/℃,因此LM35的输出电压为毫伏级,温度为100℃时,输出也只有1V。而ADC0809的参考电压为5伏,所以增益为5才能满足要求,易于编程。本系统采用超低温漂移高精度运算放大器OP07将电压放大,再经电压跟随器LM310输出,以便有大的输入阻抗。由于买不到LM310,于是便将OP07接成电压跟随器替代LM310。而电路中的RW1调为4K就满足增益为5的要求。即(R1+Rf)/R1=5,其中Rf是反馈电阻,也就是RW1。3、程序设计方面,因为是自己头一次尝试独立完成一份相对规模较大程序,因些也遇到了不少的麻烦。第一是程序地址空间分配问题,因为51单片机片内资源有限,往往会发生冲突,此时保护就显得相当的重要。第二因为汇编可读性较差,写程序时由于多采用跳转指令,所以往往会把自已搞糊涂掉。要克服这个,需要大量的编程经验,又需要有足够的耐心。第三是汇编的效率问题,虽然就那么几条指令,但是用法却相当的灵活,这学期以来的编程经历让我深有体会,若能写出高效率的代码,将是一件相当有成就感的事。
七 实验的扩展
该设计可再有很多扩展功能,如加热器断线报警、测温元件断电监测、加热容器缺水报警等众多功能。本系统已通过串口线与PC机相连,可在此基础上再与打印机相连,实时打印温度变化曲线。可在PC机上写后序软件,通过串口监视,完成一系列复杂功能,也可通过串口通信给系统发出指令,完成远程控制。
八 心得体会
1、硬件装焊方面要有足够的耐心和细心,就算电路设计的再好,在焊接时出一点小差错,也是不允许的,往往电路的错误都是由于一些小问题引起的,如短路等,将造成不可预测的后果
2、软件方面注意的细节也很多,下面简单介绍一下这阵子写程序得到的一些经验:
(1)写较大的程序时一定要事先做好资源分配。
(2)堆栈指针SP应设初值。
(3)R1、R0也应规定好用哪一区的,即设PSW.3和PSW.4。
(4)进入中断时一定要记得保护ACC和PSW(视情况而定)。
(5)不止进中断时要保护,有时候在正常程序下也要对某些值进得保护。可用堆栈式的保护也可先赋值给其他地址,过后再赋回来
(6)妥善使用位地址,位地址可做为一些标志位,可以给编程带来很大的方便。在本程序中,我就用了三个位地址,使程序大大的简化了
总之,系统设计是一件相当好玩的事,特别是独立完成之后的那种成就感,非同道中人是无法体会的到的。单片机很有意思,51只是基础,后面的路还很长。16位、32位MCU正在等着我,我将朝着系统设计这个方向不懈努力。
展开阅读全文