本帖最后由 TCsbx 于 2017-11-20 13:31 编辑
4)程序设计
1 总体程序流程图 温度控制程序的设计应考虑如下:1)键盘扫描、键码识别和温度显示;2)炉温采样、数字滤波;3)数据处理;4)越限报警和处理;5)PID计算、温度标度转换 2 主程序框图 主程序包括8051本身的初始化等等。大体说来,本程序包括设置有关标志、暂存单元和显示缓冲区清零、T0初始化、CPU开中断、温度显示和键盘扫描程序 主程序 在主程序中首先给定PID算法的参数值,然后通过循环显示当前温度,并且设定键盘外部中断为最高优先级,以便能实时响应键盘处理;软件设定定时器T0为5秒定时,在无键盘响应时每隔5秒响应一次,以用来采集经过A/D转换的温度信号;设定定时器T1为嵌套在T0之中的定时中断,初值由PID算法子程序提供。在主程序中必须分配好每一部分子程序的起始地址,形式如下: ORG 0000H AJMP MAIN ORG 0003H AJMP INTO ORG 000BH AJMP TT0 ORG 001BH AJMP TT1 3 中断服务程序框图 T0中断服务程序是温度控制系统的主体程序,用于启动数/模转换器、读入采样数据、数字滤波、越限温度报警和越限处理、PID计算和输出可控硅的触发脉冲等。P1.3引脚上输出的该同步触发脉冲宽度由T1计数器的溢出中断控制,8051利用等待T1溢出中断的空闲时间(形成P1.3输出脉冲顶宽)完成把本次采样值转换成显示值而放入显示单元缓冲区和调用温度显示程序。8051从T1中断服务程序返回后即可恢复现场和返回主程序。 系统软件采用中断方式编程,主要部分是时钟中断程序,主要由输入处理程序、控制算法程序、显示处理、输出处理和自诊断程序等组成,其流程图如图2所示。仪表通电启动后,初始化程序进行时间给定,每隔500ms时钟中断一次,中断后进入时钟中断处理。对于纯滞后,大惯性环节控制对象,一般采用积分分离PID控制算法。在一般的PID控制中,当系统有较大的扰动或设定值较大幅度提降时,由于偏差较大及系统存在惯性和滞后,在积分项的作用下,会产生较大的超调和长时间波动,在温度缓慢变化过程中这一现象尤为严重,为此采用积分分离措施,即在偏差较大时,取消积分作用,偏差较小时,才将积分作用投入。 中断服务程序框图
4 报警电路子程序 子程序框图 5 键盘显示管理程序。
为了使8279具有合适的键盘、显示功能,首先要对芯片初始化。可适当地挑选8279的控制字,例如:使8279具有8位显示、右端输入、编码键盘、双键锁定时可选控制字10H.这时每次按键都将产生键特征码,并且存放在FIFOROM中,同时使8279的IRQ引脚变为高电平,可作为向CPU申请中断信号,如果CPU是中断开放的,则转向中断服务程序,可在中断服务程序中读取特征码。每当CPU读取FIFOROM中的数据后,8279自动撤消IRQ信号,IRQ引脚变为低电平。CPU返回主程序后,可由键特征码来决定程序的流向。问题是,当CPU从8279的FIFOROM中读取键特征码后,IRQ虽然恢复底电平,但FIFOROM中的数据并没有消失,仍保存在里面,这时即使使用对改8279清除的指令D3H,也不能将FIFOROM中的数改变,只有按其它键才能改变FIFOROM中的数据,因这样是无法实现按钮功能的。 为了使键盘具有按钮功能,应该利用8279的传感方式功能,在传感器方式中,8279每当检测到传感状态变化时,IRQ就变为高电平,图1是以8051CPU构成的系统为例,说明IRQ引脚电平的翻新过程。 8279的IRQ端经反相器接到8051的INT1端(即P3.3引脚)。先将8279设置成编码键盘,允许INT1中断,当键按下时,反相器输出低电平,CPU进入中断服务程序,读取键特征码后,又为高电平。返回主程序后,转向功能程序(例如调模进)。输出控制信号(例如P1.0为“1”时调模进电磁阀得电)后,将8279设置为传感器方式,并且不允许INT1中断,然后调试P3.3是否为低电平。如果按键松开,8279将测出传感器状态发生变化,而使IRQ由低电平转为高电平。也就是说P3.3脚为低电平时,按键已经松开,程序重新设置8279为编码键盘,INT1中断开放,以便使键盘脱离按钮功能。 程序清单如下: ORG 0000H
MOV DPTR,#7000H ; 指向8279数据口
INC DPTR ; 指向8279控制口
MOV A, #00H ; 设定8279工作方式
M0VX @DPTR,A
MOV A , #0GFH ; 清除8279内部显示RAM状态
MOVX @DPTR, A
MOV A , #22H
MOVX @DPTR , A ; 设定8279分频系数
LOOP:MOVX A , @DPTR
JB ACC.7 , LOOP ; 显示RAM清除完毕吗?
MOV A , 80H ; 指向第一位数码管
MOVX @DPTR , A
MOV A , 9FH ; 输出"1"一个字形
MOV DPTR ,#7000H
MOVX @DPTR , A
INC DPTR
LOOP1:M0VX A , @DPTR
AND A , #07H
CJNE A , #00H,L00P2
AJMP LOOP1 ; 无键按下转
LOOP2:MOV DPTR ,#7000H MOVX A , @DPTR; 有键按下将键值送累加器A
键值,由8279的行扫描信号(SL0-SL3)与列信号(RL0-RL4)组成,不同组合的矩阵将得到不同键,但
在同一矩阵中不会有相同的键值,这对初学者编制键显示程序大为方便.下表是通用键盘板键值:
名称 0 1 2 3 4 5 6 7 8 9
键值 C1 C8 C9D0 D8 E0 C2 CA D1 D9
名称 状态切换 清除
键值 DA C3 6 判定有无闭合键的子程序: 判定有无闭合键的子程序为KSI,供在键盘扫描程序中调 用。程序如下:
7 键盘扫描程序 如前所述,在单片机应用系统中常常是键盘和显示器同时存在,因此可以把键盘扫描程序和显示程序配合起来使用,即:把显示程序作为键扫描程序的延时子程序。这样做既省去了一个专门的延时子程序,又能保证显示器常亮的可观效果。 假定本系统中显示程序为DIR,执行时间约为6ms。键盘扫描程序如下: KEY1:ACALL KSI;检查是否有键闭合 JNZ LK1;A非“0”则转移 ACALL DIR;显示一次(“延时6s) AJMP KEY1 LK1: ACALL DIR; 有键闭合二次延时 ACALL DIR; 共12ms去抖动 ACALL KSI; 再检查是否有键闭合 JNZ LK2; 有键闭合转移到LK2 ACALL DIR AJMP KEY; 无键闭合,延时6ms后转KEY1 LK2: MOV R,#0FEH; 扫描初值送R2 MOV R,#00H; 扫描列号送R4 LK4: MOV DPTR,#0101H; A口地址 MOV A,R MOVX @DPTR,A; 扫描初值送A口 INC DPTR INC DPTR; C口地址 MOVX A,@DPTR; 读C口 JB ACC.0, LONE;ACC.0=1,第0行无键闭合,转LONE MOV A,#00H; 装第0行值 AJMP LKP LONE: JB ACC.1 LTWO;ACC.1=1,第1行无键闭合,转LTWO MOV A,#08H; 装第1行值 AJM PLKP LTWO: JB ACC.2,LTHR;ACC.2=1,第2行无键闭合,转LTHR MOV A#10H AJMP LKP LTHR: JB ACC.3,NEXT;ACC.3=1,第3行无键闭合,转NEXT MOV A,#18H; 装第3行值 LKP: ADD A,R; 计算键码 PUSH ACC; 保护键码 LK3: ACALL DIR; 延时6ms ACALLKSI; 检查是否继续闭合,若闭合再延时 JNZ LK3 POP ACC; 若键起,则键码送A RET NEXT: INC R; 扫描列号加1 MOV A,R JNB ACC.7,KND;若第7位=0,已扫完最高列则转KND RL A MOV R,A AJMP LK4; 进行下一行扫描 KND: AJMP KEY1; 扫描完毕,开始新一轮 8 A/D转换程序 (1)A/D转换子程序。 PUSH A SETB EA ; 开中断 SETB IT1; 外中断1定义为跳变触发 MOV DPTR,#0BFFFH; 送ADC0809口地址 MOV A,#00H; 选通IN0通道 MOVX @DPTR,A ; 启动A/D转换 NOP NOP NOP NOP NOP SETB EX1; 开外中断1 POP A RET (2)A/D转换结束中断程序。 ADINT1: PUSH PSW ; 保护现场 PUSH A PUSH DPH PUSH DPL MOV DPTR,#0BFFFH MOVX A,@DPTR ; 读A/D转换结果 MOV 60H,A ; 送入内部RAM60H中 MOV A,#00H; 再次启动IN0通道 MOVX @DPTR,A POP DPL ; 恢复现场 POP A POP PSW RET1 在整个用户程序中只唯一的一对指令(SETB P1.7及CLR P1.7)能使“看门狗”定时器复位。也就是说不会有任何“非法”的指令能使“看门狗”定时器误复位,致使系统已经“死机”而“看门狗”失效。当然,对对没有中断的用户系统,只需将清零指令(CLR P1.7)也插在主程序中就可以了;对于有多种中断的用户系统,如果没有中断嵌套,则清零指令(CLR P1.7)可以插在任一个中断子程序中,而在主程序中适当加入一些有关中断的冗余指令(如SETB ET0等),以免因有关中断的特殊功能寄存器数据受到干扰时导致中断功能失效;对于有二级中断嵌套的用户系统,清零指令(CLR P1.7)可以插在中断种数比较多的那一级中的任一个中断子程序中,插有“喂狗”指令的那一级中断系统将会受到“看门狗”的保护,而另一级中断系统如果失效,“看门狗”是“无动于衷”的,这时只能尽量减少这种中断子程序的执行时间以减少受到干扰的可能性。如果二级中断嵌套系统者受到“看门狗”的保护,就必需设计一个非常复杂的“看门狗”电路,其“喂狗”指令要由三部分来保证各个部分都能正常工作,需要说明的是,如果主程序运行一次的时间(包括可能被中断的时间)超过1.6秒,则要适当再插入一条SETB
|