文档库

最新最全的文档下载
当前位置:文档库 > 单片机编程题整理

单片机编程题整理

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