1.设在内RAM 40H开始的存储区有若干个字符和数字,已知最后一个为字符“$“(并且只有一个,试统计这些字符数字的个数,结果存入30H单元中。
参考程序:
ORG 0000H
START: MOV R1,#40H ;R1作为地址指针
CLR A ;A作为计数器
LOOP: CJNE @R1,#24H,NEXT ;与“$”号比较,不等转移
SJMP NEXT1 ;到“$“结束循环
NEXT: INC A ;计数器加1
INC R1 ;指针加1
SJMP LOOP ;循环
NEXT1: INC A ;再加入”$”这个字符
MOV 30H,A ;存结果
END
2.试编一程序,分别统计在内部RAM的30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H和52H单元中。
参考程序:
ORG 0000H
MOV 51H ,#0H
MOV 52# ,#0H
MOV R1 ,#30H
MOV R0 ,#20H
MOV A,@R1
INC R1
ANL A , #01H
JZ LOOP1
INC 51H
SJMP LOOP2
LOOP1: INC 52H
LOOP2: DJNZ R0 , LOOP3
RET
3.用8XX51的P1口接8个LED发光二极管,由 INT0接一消抖按键开关,开始的LED亮,以后由INT0按键每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。
请编制程序。
参考程序:
ORG 0000H
AJMP MAIN
ORG 0003H
RL A ;中断服务
MOV P1,A
RETI
MAIN: MOV A,#0FFH
MOV P1,A ;第一灯亮
SETB EA
SETB EX0 ;允许INT0外部中断
SETB IT0 ;中断触发方式为下降沿触发
SJMP $ ;等待中断
4.设有100个有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数并分别存放在30H、31H、32H单元中。
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV DPTR ,#2000H
MOV R1,#100
L4: MOVX A,@DPTR
INC DPTR
CJNE A,#0,L1
INC 32H
SJMP L2
L2: JC L3
INC 30H
SJMP L2
L3: INC 31H
L2: DJNZ R1,L4
SJMP $
5.编程将内部数据存储器20H~24H单元压缩的BCD码转换成ASCⅡ存放在于25H开始的单元。
参考程序:注意压缩的BCD码为一个字节占两位BCD码。
ORG 0000H
MOV R7,#05H ;R7为转换字节数
MOV R0,#20H ;R0为源操作数地址
MOV R1,#25H ;R1为目的操作数地址
NE: MOV A,@R0
ANL A,#0FH ;先取低位BCD码
ADD A,#30H ;将BCD码转换成ASCⅡ码
MOV @R1,A
INC R1
MOV A,@R0
ANL A,#0F0H ;取高位BCD码
SWAP A ;半字节交换
ADD A,#30H ;将高位BCD码转换成ASCⅡ码
MOV @R1,A
INC R0
INC R1
DJNZ R7,NE
SJMP $
END
编程题,另外加上第4章课件上的例子。
三、程序解释(每小题5分,共10分)
1.
ORG 0200H
MOV DPTR,#1000H
MOV R0,#20H
LOOP: MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC R0
CJNE R0,#71H,LOOP
SJMP $
程序功能:把片外数据存储器1000H~1050H中的内容传送到片内数据存储器 20H~70H中。
2. ORG 0200H
MOV A,R0
ANL A,#0FH
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV R0,A
SJMP $
TAB: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H; 0~9的ASCⅡ码
DB 41H,42H,43H,44H,45H,46H ;A~F的ASCⅡ码
程序功能:利用查表的方法实现RO中的十六进制数转换为ASCⅡ码
对每小题程序中划线的指令含义(或指令作用)进行解释,并说明程序的作用。
*********************************
1. 程序解释
ORG 100H
MOV A,R0 ;R0的内容送A
ANL A,#0FH
MOV R1,A
MOV A,R0
单片机编程100例详解 SWAP A ;A的内容高低4位交换
ANL A,#0FH
MOV R2,A
SJMP $ ;等待
END
该程序的作用是:将原R0中数据按照高低4位分成两个字节,低位字节保存在R1中,高位字节保存到R2中。
2. 程序解释
ORG 30H
MOV R0,#data1 ; data1送R0
MOV R1,#data2
MOV R2,#2
CLR C
LOOP: MOV A,@R0
SUBB A,@R1 ;(A)-(C)-((R1))→A
MOV @R0,A
INC R0
INC R1
DJNZ R2,LOOP ;(R2)-1不等于零,跳LOOP处
SJMP $
END
该程序的作用是:将data1中的双字节数据减去data2中的双字节数据,结果
保存到data1中
3. 程序解释
ORG 30H
VARDATA 30H
FUNC DATA 31H
MOV A,VAR ;30单元的内容送A
JZ DONE ;A为零转移
JNB ,POSI ;A的最高位为0(正数)转移
MOV A,#0FFH ;提示:0FFH表示-1
SJMP DONE
POSI: MOV A, #01H
DONE: MOV FUNC,A
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论