1.试编写程序,查找在内部RAM的30H~50H单元中是否有0AAH这一数据。若有,则将51H单元置为“01H”;若未找到,则将51H单元置为“00H”。 START:MOV R0,#30H
MOV R2,#20H
LOOP: MOV A,@R0
CJNE A,#0AAH,NEXT
MOV 51H,#01H
LJMP EXIT
NEXT: INC R0
DJNZ R2,LOOP
MOV 51H,#00H
EXIT: RET
2. 试编写程序,查找在内部RAM的20H~40H单元中出现“00H”这一数据的次数,并将查找到的结果存入41H 单元。
START: MOV 41H,#0
MOV R0,#20H
MOV R2,#20H
LOOP: MOV A,@R0
JNZ NEXT
INC 41H
NEXT: INC R0
DJNZ R2,LOOP
RET 3. 一批单字节无符号数,以R0为首地
址,R2中为字节数,将这批数进行升
序排列。
SORT: MOV A,R0
MOV R1,A
MOV A,R2
MOV R5,A
CLR F0
DEC R5
MOV A,@R1
LOOP: MOV R3,A
INC R1
CLR C
MOV A,@R1
SUBB A,R3
JNC LOOP1
SETB F0
MOV A,R3
XCH A,@R1
DEC R1
XCH A,@R1
INC R1
LOOP1: MOV A,@R1
DJNZ R5,LOOP
JB F0,SORT
RET
4. 以AT89S51为核心的温度控制器,
温度传感器输出的电压与温度为非线
性关系,传感器输出的电压已由A/D
转换为10位二进制数。测得的不同温
度下的电压值数据构成一个表,表中温
度值为y(双字节无符号数),x(双字
节无符号数)为电压值数据。设测得电
压值x放入R2R3中,根据电压值x,
查找对应的温度值y,仍放入R2R3中。
LTB2:MOVDPTR,#TAB2
MOV A,R3
CLRC
RLCA
MOVR3,A
XCHA,R2
RLCA
XCHR2,A
ADDA,DPL
MOVDPL,A
MOV A,DPH
ADDC A,R2
MOVDPH,A
CLRA
OVC A,@A+DPTR
MOVR2,A
CLRA
INCDPTR
MOVC A,@A+DPTR
MOVR3,A
RET
TAB2:DW…,… ,…
5. 片内RAM中存放一批数据,查找出最大值并存放于首地址中。设R0中存放首地址,R2中存放字节数。SORT:MOV A,R0
MOV R1,A
MOV A,R2
MOV R5,A
CLR F0
DEC R5
MOV A,@R1
LOOP: MOV R3,A ;
INC R1
CLR C
MOV A,@R1
SUBB A,R3
JNC LOOP1
SETB F0
MOV A,R3
XCH A,@R1
DEC R1
XCH A,@R1
INC R1
LOOP1:MOV A,R1
DJNZ R5,LOOP
JB F0,SORT
RET 6. 求符号函数的值。X存放在40H单
元,Y存放在41H单元。符号函数定
义如下:
0X
10X 00
X 1Y
SLGNFUC: MOV A 40H
CJNE
A,#00H,NZEAR
AJMP NEGT
NZEAR: JB
ACC,7,POSI
MOV A,#01H
AJMP NEGT
POSI: MOV A,#81H
NEGT: MOV 41H,A
END
7. 求n个单字节无符号数xi的和,xi
按i顺序存放在AT89S51单片机内部
RAM从50H开始的单元中,n放在R2
中,和(双字节)放在R3R4中。
ADD1:MOV R2,#n
MOV R3,#0
MOV R4,#0
MOV R0,#50H
LOOP:MOV A,R4
ADD A,@R0
MOV R4,A INC R0
CLR A
A DDC A,R3
MOV R3,A
DJNZ R2,LOOP
END
8. 假设系统时钟频率采用6MHz,采用
中断方式编制程序,在P1.0引脚上输
出一个周期为2ms的方波,如图所示。
ORG 0000H
RESET: LJMP MAIN
ORG 000BH
LJMP IT0P
ORG 1000H
MAIN: MOV SP,#60H
MOV B,#0AH
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB ET0
SETB EA
SETB TR0
HERE: SJMP HERE
IT0P: MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ B,RTURN
CLR TR0
SETB F0
RTURN: RETI
9. 当T0(P3.4)引脚上发生负跳变时,作为P1.0引脚产生方波的启动信号。开始从P1.0脚上输出一个周期为1ms 的方波,如图所示(系统时钟6MHz)。ORG 0000H
LJMP MAIN
ORG 000BH
LJMP I T0P
ORG 1000H
MAIN:
MOV SP,#60H
MOV B,#0AH
MOV TMOD,#01H
MOV TL0,#0B0H
MOV TH0,#3CH
SETB ET0
SETB EA
SETB TR0
HERE:
LJMP H ERE
IT0P:
MOV TL0,#0B0H
MOV TH0,#3CH
DJNZ B,RTURN
CLR TR0
SETB F0
RTURN:
RETI 10. 利用定时器T1的方式2计数,每
计满100个数,将P1.0取反。
ORG 0000H
RESET: LJMP MAIN
ORG 001BH
CPL P1.0
RETI
ORG 0100H
MAIN : MOV TMOD,#60H
MOV TL1,#9CH
MOV TH1,#9CH
SETB TR1
HERE: SJMP HERE
11. 内部RAM单元从30H开始连续存
放了10个数据试编程把这10个数据传
送至外部RAM 2000H开始的连续10
个单元中。 12. 把片外RAM 中的
3000H单元的内容和片内RAM 中的
30H单元的内容交换
13. 找出片内30H~3FH中的最大
值 BIG:
MOV B, #0
MOV R0, #30H
LOOP: MOV A,@R0
CLR C
SUBB A, B
JC NEXT
MOV B, @R0
NEXT: INC R0
CJNE R0, #40H, LOOP
RET
END
14. 片内RAM 30H 中存放两位BCD码,
将其转换成ASCLL码并存入40H,41H
MOV A,30H
ANL A,#0FH
ADD A,#30H
MOV 41H,A
MOV A,30H
SWAP A
ANL A,#0FH
ADD A,#30H
MOV 40H,A
15. 设计子程序,计算RAM 30H~3FH
中的和,结果为16位,存放于R3 R4(R3
为高)
MOV R3, #0
MOV R4, #0
MOV R0, #30H
MOV R2, #16
LOOP: MOV A, R4
ADD A, @R0
MOV R4, A
MOV A, R3
ADDC A, #0
MOV R3, A
INC R0
DJNZ R2, LOOP
RET
END
16. 请将片外RAM20H-25H单元清零。
MOV R0,#20H
MOV R1,#6
MOV A,#00
LOOP:
MOVX @R0,A
INC R0
DJNZ R1,LOOP
RET
17. 如果(A)=0,则将P1.0清零,否
则P1.0置1。
JNZ ASDF
CLR P1.0
SJMP QWER
ASDF:
SETB P1.0
QWER:
RET
END