4、编程与应用
4.1、编程实现c=a*a+b*b。设a、b均小于10,a存在31H单元,b存在32H单元,把c存入33H单元。
答: MOV A,31H
;以下求a的平方值在A中
MOV B,31H
MUL AB
MOV 33H,A
;暂时将a的平方值保存在33H单元
MOV A,32H
;以下求b的平方值在A中
MOV B,32H
MUL AB
ADD A,33H
;累加b的平方值与暂存在33H单元中的a的平方值
MOV 33H,A
;将最后累加结果存入33H单元
4.2、将两个半字节数,合并成一字节数。将片内RAM
50H、51H地址中的内容各自低4位合并后,结果存入片内RAM 52H地址中。
答: MOV
A,51H
;取51H单元的值到累加器A
ANL A,#0FH
;只保留低4位的值(高4位清零)
SWAP
A
;将保留的低4位的值交换到高4位,源高4位的0000交换到低4位
MOV 52H,A
;暂存到52H单元
MOV
A,50H
;取50H单元的值到累加器A
ANL A,#0FH ;只保留低4位的值(高4位清零)
ORL 52H,A
;将A的低4位合并到52H单元保存值的低4位
4.3、设有D1、K1连接如附图。
①试编程实现如下控制:D1初始点亮,此后开关每按下一次,D1改变状态一次。
②试编程实现如下控制:D1初始点亮,此后开关闭合时,每隔250毫秒D1改变状态一次,开关打开时D1维持最后状态不改变(设晶振频率=3MHz)。
①答: CLR P1.0
;初始点亮D1
SETB P1.7
;确保P1.7端口可以输入开关状态
L0: JNB P1.7,$
;等待开关释放
JB P1.7,$
;等待开关闭合
CPL P1.0
;翻转D1状态
SJMP L0
;循环检测与控制
②答: CLR A
;用累加器累计定时器溢出次数
MOV TMOD,#02H
;定时器0方式2
MOV TH0,#(256-250) ;基本定时周期1ms=250*4us(基本计时脉冲周期=4us@3MHz)
MOV TL0,TH0
;首次计数初值装入TL0,重装入计数初值装入TH0
CLR TF0
;清定时器0溢出标志
SETB TR0
;启动定时器0运行
L0: JBC
TF0,L1
;定时器0溢出则清TF0并转去累计溢出次数及进一步处理
JMP
L0
;累计定时器0溢出次数
CJNE
A,#250,L0 ;溢出次数未达250次说明250ms未到则继续累计
CLR
A
;250ms已到则清零累加器准备进行下一个250ms的累计
JB
P1.7,L0 ;250ms已到但开关未闭合则不执行动作
CPL
P1.0
;250ms已到且开关闭合则翻转D1状态
JMP
L0
;循环检测与控制
加载中,请稍候......