毕业论文
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 ; 输出\一个字形 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 C9 D0 D8 E0 C2 CA D1 D9 名称 状态切换 清除 键值 DA C3
4.3.2.1判定有无闭合键的子程序:
判定有无闭合键的子程序为KSI,供在键盘扫描程序中调 用。程序如下:
KSI:
MOV MOV MOVX INC INC MOVX CPL ANL RET
DPTR,#0FDF9H A, #00H @DPTR,A DPTR DPTR A,@DPTR A A,#0FH
;A口地址
;A口送00H
;C口地址 ;读C口
;屏蔽高四位
4.3.2.2键盘扫描程序
如前所述,在单片机应用系统中常常是键盘和显示器同时存在,因此可以把
毕业论文
键盘扫描程序和显示程序配合起来使用,即:把显示程序作为键扫描程序的延时子程序。这样做既省去了一个专门的延时子程序,又能保证显示器常亮的可观效果。
假定本系统中显示程序为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
ACALL KSI; 检查是否继续闭合,若闭合再延时 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; 扫描完毕,开始新一轮
4.3.3 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
毕业论文
4.3.4温度检测子程序
A/D转换采用查询方式。为提高数据采样的可靠性,对采样温度进行数字滤波。数字滤波的算法很多,这里采用4次采样取平均值的方法。如前所述,本系统A/D转换结果乘2正好是温度值,因此,4次采样的数字量之和除以2就是检测的当前温度。检测结果高位存入50H,低位存入51H。温度检测子程序流程图如图1所示。
N
A清检测结果缓冲区采样次数4→R2NR2-1=0Y4次累加结果除2→检测结果缓冲区启动A/D转换转换结束Y累加采样结果结果低8位→51H高8位→50H 返回
A图1:温度检测子程序流程图
温度检测子程序TIN:
TIN: MOV TEMP1,#00H ; 清检测温度缓冲区
MOV TEMP0,#00H
MOV R2,#04H; 取样次数送R2
MOV DPTR,#7FF8H; 指向A/D转换器0通道
LTIN1:MOVX @DPTR,A; 启动转换 HERE:JNB IE1,HERE; 等待转换结束
MOVX A,@DPTR ; 读转换结果
ADD A,TEMP0; 累加(双字节加法)
MOV TEMP0,A MOV A,#00H