本实验操作平台 KEIL5MDK AT89S51/52
1、在内部数据存储器BLOCK为首地址的缓冲区中存放有一组带符号数,数的个数已在LEN单元中,请编程实现:统计其中的正数和负数的个数并存入NUM和NUM+1单元中。
BLOCK EQU 30H
LEN EQU 20H
NUM EQU 21H
ORG 0000H
CLR NUM
CLR LEN
MOV R1, #BLOCK
MOV 30H, #67
MOV 31H, #-4
MOV 32H, #5
MOV 33H, #-1
MOV 34H, #9
MOV 35H, #10
MOV LEN, #6 ;数的个数
LOOP:CLR A
MOV A, @R1
JB ACC.7,FUNC1 ;位是1,则跳到FUNC1 负数
INC NUM
M1:INC R1
DJNZ LEN, LOOP ;(LEN-1)->LEN
SJMP $
FUNC1:INC NUM+1
SJMP M1
;SJMP $
END
2、设自变量X为一无符号数,存放在内部数据存储器的VAX单元,函数Y存放在FUNC单元,请编写满足如下关系的程序:
当x>=50时 y=x;
当50>x>=20时 y=5x;
当x<20时 y=2x。
VAX EQU 30H
FUNC EQU 40H
ORG 0000H
MOV VAX, #30 ;x为无符号数
MOV A, VAX
CJNE A, #50,FUNC1 ;若A即X不等于50则跳转到FUNC1
FUNC1:JC FUNC2 ;小于50则跳到FUNC2
SJMP FUNC4 ;转移到FUNC4
FUNC2:CJNE A, #20,NEXT
NEXT:JC FUNC3 ;小于20则跳到FUNC3
MOV B, #5
MUL AB
SJMP FUNC4
FUNC3:MOV B, #2
MUL AB ;A存数的低8位,足够大不会溢出
FUNC4:MOV FUNC, A ; y的结果
SJMP $
END
3、在外部数据存储器从2000H到2010H地址单元中存放有一数据块,请将它们分别传送至2100H单元到2110H单元中。
LEN EQU 20H ;单片机型号AT89S51/52
ORG 0000H
CLR A
MOV LEN, #17
MOV DPTR, #2000H
MOV A, #2
LOOP0:MOVX @DPTR, A
INC A
INC DPTR
DJNZ LEN, LOOP0
CLR A
MOV LEN, #17
MOV DPTR, #2100H ;默认为DPTR0指针,指向2100h
ORL 0A2H, #01 ;AUXR1寄存器的DPS位为1,选择DPTR1
MOV DPTR, #2000H ;DPTR1
LOOP1:MOVX A, @DPTR ;取2000H中的数据
INC DPTR ;DPTR1加一
ANL 0A2H, #0FEH ;DPTR0->2100H
MOVX @DPTR, A ;数据传到2100H
INC DPTR ;DPTR0加一
ORL 0A2H, #01H ;DPTR1
DJNZ LEN, LOOP1
SJMP $
END
4、在内部数据存储器以BLOCK为始址的10个单元中,找出其最小值并把它送入MIN单元。
BLOCK EQU 30H
MIN EQU 21H
LEN EQU 20H
ORG 0000H
MOV LEN, #10
CLR A
MOV R0, #BLOCK ;数据首地址
MOV R1, #22H
MOV DPTR, #30H
LOOP0:MOV @R1, A
MOVC A, @A+DPTR
MOV @R0, A
INC R0
MOV A, @R1
INC A
DJNZ LEN, LOOP0
MOV A, 30H
MOV R0, #BLOCK
MOV LEN, #10
LOOP1:CLR C
SUBB A, @R0 ;带进位减法
JB ACC.7, M1 ;最高位符号位,是1,负数,A<R0 则跳到M1
MOV A, @R0 ;大于初始值,调换位置
SJMP M2
M1:ADD A, @R0 ;恢复原来的小值
M2:INC R0
DJNZ LEN, LOOP1
MOV MIN, A
SJMP $
ORG 30H
DB 5,9,23,54,4,4,02H,2,56,32
END
5、将8051片内的数据存储器20H单元、21H单元中存放的单字节二进制数,转化为ASCII码,存放在30H~33H单元中,(要求将ASCII码转换部分设计为子程序)。
ORG 0000H
MOV 20H, #2AH ;ASCII从低到高 41(A) 32(2) 35(5) 42(B)
MOV 21H, #0B5H
MOV A, 20H
ANL A, #0FH ;取a的低四位
ACALL ASC1
MOV 30H, A ;把A中的ASCII码传给30h
MOV A, 20H
ANL A, #0F0H ;取高四位
SWAP A ;低四位和高四位交换位置
ACALL ASC1
MOV 31H, A
MOV A, 21H
ANL A, #0FH
ACALL ASC1
MOV 32H, A
MOV A, 21H
ANL A, #0F0H
SWAP A
ACALL ASC1
MOV 33H, A
SJMP $
ASC1:CJNE A, #10, FUNC1 ;ASCII码转换子程序
FUNC1:JC FUNC2
ADD A, #7H ;大于等于10执行此操作
FUNC2:ADD A, #30H ;30~39h 41~46h对应0~9 A~F
RET
END
6*、设8051单片机外部数据存储器从1000H单元开始存放有10个无符号8位二进制数,要求编一子程序将他们从大到小依次存入片内数据存储器从10H开始的存储区。
7*、在内部数据存储器以BLOCK开始的存储区中有10个单字节十进制数(每个字节有两个BCD数),请编程求BCD数的和(和为三位的BCD数),并把和存放在SUM和SUM+1单元(SUM为低字节)。(待做)