单片机程序设计题库及答案 下载本文

1.实现片外数据存储器数据传送(2000H)-->(2100H) MOV DPTR,#2000H MOVX A,@DPTR MOV DPTR,#2100H MOVX @DPTR,A

2.查表法求Y=X2。设X(0≤X≤15)在片内RAM的20H 单元中,要求查表求Y,存入片内RAM 21H单元。 1) ORG 1000H

SQU: MOV DPTR,#3000H ;确定表首地址(基地址) MOV A,20H ;取 X(变量:偏移量) MOVC A,@A+DPTR ;查表求Y=X2 MOV 21H,A ;保存Y(结果) RET ;子程序结束 … ;其它程序段 ORG 3000H ;常数表格首地址 TAB: DB 00,01,04,09,… ,225 ;平方表 END 2)ORG 1000H ;程序起始地址

SQU: MOV A,20H ;取X ADD A,#3 ;修正偏移量 MOVC A,@A+PC ;查表求Y=X2 (PC=1005H) MOV 21H,A ;存结果 RET ;子程序结束 TAB: DB 00,01,04 … ;平方表 DB 09,… ,225

3.分析下面程序

MOV R0, #0C8H;(R0)=200 CLR P1.7;P1.7为低电平

LOOP: CPL P1.7;P1.7变反(1 μs ) NOP;(1 μs ) NOP;(1 μs )

DJNZ R0,LOOP;(R0)≠0 则转 (2μs)

4.设计一个延时10ms的延时子程序,已知单片机使用的晶振为6MHZ。

机器周期数 ORG 0020H

1 MOV R0, #0AH ;外循环10次 1 DL2: MOV R1, #MT ;内循环MT次 1 DL1: NOP

1 NOP ;空操作指令

2 DJNZ R1, DL1 2 DJNZ R0, DL2 RET

内循环DL1到指令DJNZ R1,DL1 的计算:(1+1+2)ⅹ2μsⅹMT=1000μs

MT=125=7DH 总的延时时间: {1+[1+(1+1+2)ⅹ125+2]ⅹ10}ⅹ2μs=10.062ms 5.试计算延时程序的执行时间

DELAY: MOV R6,#64H (=100) 1 I1: MOV R7,#0FFH(=255) 1 I2: DJNZ R7,I2 2 DJNZ R6,I1 2 RET 2 延时时间计算:(设时钟fOSC=12MHz) T=1us

t=(1×1+1×100+2×100×255+2×100+2×1)×T= 51.303 ms 6. DELAY:MOV R6,#100 1 D1:MOV R7,#10 1 D2:NOP 1 DJNZ R7,D2 2 t=6.606 ms DJNZ R6,D1 2 RET 2

计算延时程序的执行时间(设时钟fOSC=6MHz,T=2us) 。 7.十六进制数转换为ASCII码:

HASC:CJNE A,#0AH,N N:JNC N1(C=0跳N1) ADD A,#30H SJMP SE

N1:ADD A,#37H SE: RET

8.设从片内RAM30H单元和40H单元有两个16字节数,把它们相加,结果放于30H单元开始的位置处(设结果不溢出)。 ORG 1000H MOV R0,#30H MOV R1,#40H MOV R2,#16 CLR C

LOOP:MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,LOOP END

9.按下面公式编写程序,x为无符号数,存在20h单元y存放在21h单元

ORG 0030H MOV A, 20H x?40?x CJNE A, #21H, LOOP1 ?y?20?x?40?2xLOOP1: JC NEXT1

?x CJNE A, #40H, LOOP2 x?20?LOOP2: JNC NEXT2

MOV B, #2 MUL AB AJMP NEXT2 NEXT1: CPL A

NEXT2: MOV 21H, A END

从内部RAM 22h单元开始存有一个无符号数数据块,长度n存于21h中。求出数据块中的最小数,存于20h中。 ORG 0030H

MOV R0, #22H ;数据块起始地址

MOV R1, 21H ;数据个数n MOV 20H,#0FFH ; 最大数 LOOP: MOV A, @R0 ; 取新数

INC R0 ; 为取下一个新数作准备 CJNE A, 20H, LOOP1 ; 与原最大数比较 LOOP1:JNC NEXT ; 大,原最小数保留

MOV 20H, A ; 小,改变最小数 NEXT: DJNZ R1, LOOP ;循环 END

10.ASCII码转换为十六进制数: AHEX:CLR C SUBB A,#30H CJNE A,#0AH,N N: JC N1 SJMP AE

N1: SUBB A,#11H CJNE A,#06H,N2 N2: JNC ERR ADD A,#0AH SJMP AE

ERR: MOV A,#0FFH AE: RET

8位二进制转换成BCD码。(用十进制表达的二进制码) BINBCD1: MOV B, #100

DIV AB

MOV @R0, A INC R0

MOV A, #10

XCH A, B ;(A)=原(B),(B)=10 DIV AB

MOV @R0, A INC R0 XCH AB

MOV @R0, A RET

11.要求每次按动按键,使外接发光二极管LED改变一次亮灭状态。 解:INT0输入按键信号,P1.0输出改变LED状态。 1、跳变触发:每次跳变引起一次中断请求。 ORG 0000H ;复位入口 AJMP MAIN ORG 0003H ;中断入口 AJMP PINT0 ORG 0100H ;主程序

MAIN:MOV SP,#40H ;设栈底 SETB EA ;开总允许开关 单片机 SETB EX0 ;开INT0中断 SETB IT0 ;负跳变触发中断 INT0 H: SJMP H ;执行其它任务 ORG 0200H ;中断服务程序 P1.0 PINT0:CPL P1.0 ;改变LED RETI ;返回主程序

2、电平触发:可避免一次按键引起多次中断响应。 1)软件等待按键释放(撤消低电平);(2)硬件清除中断信号(标志位)。 ORG 0000H ;复位入口 AJMP MAIN ORG 0003H ;中断入口 AJMP PINT0 ORG 0100H ;主程序 MAIN:MOV SP,#40H ;设栈底 SETB EA ;开总允许开关 SETB EX0 ;开INT0中断 CLR IT0 ;低电平触发中断 H: SJMP H ;执行其它任务 ORG 0200H ;中断服务程序 PINT0:CPL P1.0 ;改变LED

WAIT: JNB P3.2,WAIT ;等按键释放(P3.2即INT0) RETI ;返回主程序

假设系统时钟为6MHz,编写定时器T0产生1秒定时的程序。 (1)T0工作方式的确定

定时时间较长,采用哪一种工作方式? 由各种工作方式的特性,可计算出: 方式0最长可定时16.384ms; 方式1最长可定时131.072ms; 方式2最长可定时512s。

+5V 1

选方式1,每隔100ms中断一次,中断10次为1s。 (2)计算计数初值

因为:(216-X)×2×10-6 = 10-1 所以:X=15536=3CB0H

因此:TH0=3CH,TL0=B0H (3)10次计数的实现 采用循环程序法。 (4)程序设计

GATE C/T M1 M0 GATE C/T M1 M0 ORG 0000H

RESET: LJMP MAIN ;上电,转主程序入口T1 MAIN

T0 ORG 000BH ;T0的中断入口 LJMP IT0P ;转T0中断处理程序IT0P ORG 1000H MAIN: MOV SP,#60H ;设堆栈指针

MOV B,#0AH ;设循环次数10次 MOV TMOD,#01H ;设T0工作在方式1 MOV TL0,#0B0H ;给T0设初值 MOV TH0,#3CH SETB TR0 ;启动T0 SETB ET0 ;允许T0中断 SETB EA ;CPU开放中断 HERE: SJMP HERE ;等待中断

ITOP: MOV TL0,#0B0H ;T0中断子程序,重装初值 MOV TH0,#3CH ; DJNZ B,LOOP

CLR TR0 ;1s定时时间到,停止T0工作 LOOP: RETI

12.由P1.0输出方波信号,周期为2ms,设fosc=12MHz。

每隔1ms改变一次P1.0的输出状态。用T0非门控方式1定时。 计算时间常数:X=216-t/T=216-1000/1 =FC18H START:MOV TMOD,#01H MOV TL0,#18H MOV TH0,#0FCH SETB TR0 LOOP: JBC TF0,PTF0 SJMP LOOP PTF0: CPL P1.0 MOV TL0,#18H MOV TH0,#0FCH SJMP LOOP ORG 0000H AJMP MAIN ORG 000BH ;T0定时器 AJMP PT0INT

ORG 0100H MAIN: MOV SP,#60H MOV TMOD,#01H MOV TL0,#18H MOV TH0,#0FCH SETB EA SETB ET0 SETB TR0 HERE: SJMP HERE PT0INT: CPL P1.0 MOV TL0,#18H MOV TH0,#0FCH RETI

13.P1.7驱动LED亮1秒灭1秒地闪烁,设时钟频率为6MHz。

本题采用硬件方式:T0定时,定时10ms; T1计数T0的定时跳变信号P1.0的负跳变次数,计满100个跳变为1秒。(查询方法) T=2μs,X=5×105个T,而最大只能65536个T, 不能满足要求,必须借助硬件计数器或软件循环。T0定时初值: (方式1)t=10ms,X=5000D=1388H,C=(1388H)补=EC78H T1计数初值: (方式2) START: MOV TMOD,#61H MOV TL1,#0CDH MOV TH1,#0CDH CLR P1.0 SETB TR1 LOOP1: CPL P1.7

LOOP2: MOV TL0 ,#78H MOV TH0,#0ECH SETB TR0

LOOP3: JBC TF0,LOOP4 SJMP LOOP3

LOOP4: MOV TL0 ,#78H MOV TH0,#0ECH CPL P1.0 JBC TF1,LOOP1 SJMP LOOP2

P1.7LEDP1.0T180C51+5VT0定时20ms1ST1计数

六、设计题

1.某单片机控制系统有8个发光二极管。试画出89C51与外设的连接图并编程使它们由右向左轮流点亮。

答: 图 (5分) 构思 (3分) MOV A,#80H (1分)

UP:MOV P1,A (1分) RR A (2分) SJMP UP (1分)

2.某控制系统有2个开关K1和K2,1个数码管,当K1按下时数码管加1,K2按下时数码管减1。试画出8051与外设的连接图并编程实现上述要求。 答:图 (5分) 构思 (3分) 程序(4分) ORG 0000H LJMP MAIN ORG 0003H LJMP AINT0 ORG 0013H LJMP BINT1

MAIN: MOV IE,#83H SETB IT0 SETB IT1

MOV R0,#00H MOV DPTR,#TAB UP: MOV A,R0

MOVC A,@A+DPTR MOV P1,A SJMP UP

AINT0: INC R0

CJNE R0,#10,AINT01 MOV R0,#0 AINT01: RETI BINT1: DEC R0

CJNE R0,#0FFH,BINT11 MOV R0,#9 BINT11: RETI

1.已知在累加器A中存放一个BCD数(0~9),请编程实现一个查平方表的子程序。 1.SQR:1NC A

MOVC A,@A+PC RET

TAB:DB 0,1,4,9,16 DB 25,36,49,64,81

2.请使用位操作指令实现下列逻辑操作:BIT=(10H∨P1.0)∧(11H∨CY) 2.ORL C,11H

MOV 12H,C MOV C,P1.0 ORL C,/10H ANL C,12H MOV BIT,C RET

3.已知变量X存于VAR单元,函数值Y存于FUNC单元,按下式编程求Y值。

?1x?0?0x?0??Y=??1x?0

3. MOV A,VAR

CJNE A,#0,COMP

SJMP RES ;x=0,Y=0 COMP:JNC POSI ;x>0,Y=1 MOV A,#0FFH ;x<0,Y=-1 SJMP RES

POSI:MOV A,#01H RES:MOV FUNC,A RET

4.已知在R2中存放一个压缩的BCD码,请将它拆成二个BCD字节,结果存于SUM开始的单元中(低位在前)。 4. MOV R0,#SUM MOV A,R2 ANL A,#OFH

MOV @R0,A ;存低字节BCD MOV A,R2 ANL A,#0F0H SWAP A 1NC R0

MOV @R0,A ;存高字节BCD RET

5.将存于外部RAM 8000H开始的50H数据传送0010H的区域,请编程实现。 5. MOV DPTR,#8000H MOV R0,#10H MOV R2,#50H

LOOP:MOVX A,@DPTR ;取数 MOVX @R0,A ;存数 1NC DPTR 1NC R0

DJNZ R2,LOOP RET

1.已知如图,8155的PA口用于输出,PB口用于输入,PC口用于输出,请:

(1)写出8155的各I/O口的口地址和存储器的地址范围。1.(1) (2)编写出8155初始化程序。B155命令字格式: (2)初始化程序:

MOV DPTR,#0100H MOV A,#0DH MOVX @DPTR,A

2.已知如图并给出下列程序,请在读图并理解程序后回答下列问题: (1)程序功能为_巡回采集8个通道的数据 __。

(2)ADC0809的口地址为___ADC0809口地址为7FF0H~7FF7H(或7FF8~7FFFH)__。 (3)EOC的作用是_EOC为A/D转换结束信号,用来引起中断或查询,以便读取A/D的转换结果_。

(4)程序运行结果存于__外部RAM的A0H~A7H。_。 ADC:MOV DPTR,#7FFOH MOV R0,#0A0H MOV R2,#8 MOV A,#0

LOOP:MOVX @DPTR,A JB P3.3,$

MOVX A,@DPTR MOVX @R0,A 1NC DPTR 1NC R0

DJNZ R2,LOOP AJMP ADC

说明MCS—51单片机的下列各条指令中源操作数的寻址方式(可直接在每条指令后面书写) 1.ANL A,20H 直接寻址 2.ADDC A, #20H 立即寻址 3.JZ rel 相对寻址 4.CLR C 位寻址

5.RRA 寄存器寻址

六、使用简单指令序列完成以下操作(12分)

1.请将片外RAM20H—25H单元清零 MoV R0,#20H MOV R7,#06H CLR A

LOOP:MOVX @R0,A INC R0

DJNZ R7,LOOP

2.请将ROM3000H单元内容送R7 MOV DPTR, #3000H CLR A

MOVC A,@A+DPTR

MOV R7,A

1有一长度为10字节的字符串存放在8031单片机内部RAM中,其首地址为40H。要求将该字符串中每一个字符加偶校验位。(以调用子程序的方法来实现。)

源程序如下:

ORG MOV MOV

1000H R0,#40H R7,#10 A, ① @R0

NEXT: MOV

ACALL SEPA MOV INC

@R0,A R0

DJNZ SJMP

② R7 ,NEXT $ A,#00H

SEPA: ADD

③ JNB PSW.0,SRET ORL

A, ④ #80H

SRET: ⑤ RET

2.从内部RAM30H单元开始,有10个单字节数据。试编一个程序,把其中的正数、负数分别送40H和50H开始的内部RAM单元。(10分)

答:

MOV MOV MOV MOV

R0,#30H R1,#40H A,#50H R7,#10 20H,@R0 20H.7,FSHU @ R1,20H R1 NEXT A,R1 @R1,A A,R1 A

R7,LOOP $

LOOP: MOV

JB

ZSHU: MOV

INC SJMP

FSHU: XCH

MOV XCH INC

NEXT: DJNZ

SJMP

七:将内部RAM20H为首的16个单元的8位无符号数排序写出程序,并作适当注释

SORT: MOV R0, #20H MOV R7,#07H

CLR TR0 ;交换标志位复位

LOOP: MOV A,@R0 MOV 2BH, A INC R0

MOV 2AH, @R0 CLR C

SUBB A, @R0;比较前后两个数

JC NEXT ; MOV @R0, 2BH

DEC R0

MOV @R0, 2AH

INC R0

SETB TR0 ;置交换标志位有效 NEXT: DJNZ R7, LOOP

JB TR0, SORT;若交换标志位有效,继续进行 HERE: SJMP $

八、读图题(20分)

阅读下列硬件图,补齐连接线(5分),并回答问题(各5分):

(1、 ALE、PSEN、WR、RD的功能

ALE作地址锁存的选通信号,以实现低八位地址的锁存,PSEN信号作扩展程序存储器的读选通信号

WR、RD作为扩展数据存储器和I/O端口的读写选通信号。 (2、 图中各芯片的功能

74LS373:地址锁存器,用来锁存P0口发送的地址低8位 2764 :容量为8KB的程序存储器(EPROM)用来存储程序 6264 :容量为8KB的数据存储器(RAM)用来存储数据

8031:不含程序存储器的8位单片机芯片,是不带I/O设备的微型计算机。 (3、2764、6264的地址范围(P2.5取”0”)

1.数据块传送,将RAM从30H开始的连续32个单元的内容传递给片内RAM从60H开始的连续32个单元。 ORG 1000H

MOV R7,#20H

MOV R0, #30H MOV R1,#60H

LOOP:MOV A,@R0 MOV R1,A INC R0

INC R1

DJNZ R7, LOOP SJMP $ END

2. 将4个单字节数放片内30H~~33H,它们求和结果放在片内40H,41H单元。

ORG 1000H

MOV R7,#04H MOV R0,30H CLR A

MOV 41H,A

LOOP: ADD A,@R0 JNC NEXT

INC 41H

NEXT:INC R0

DJNZ R7,LOOP MOV 40H,A SJMP $ END

3. RAM中40H单元内存有一个十六进制数,把这个数转换为BCD码的十进制数,BCD

码的十位和个位放在累加器A中,百位放在R2中。 ORG 2200H MOV A,40H MOV B,#64H DIV AB

MOV R2,A MOV A,#0AH XCH A,B DIV AB SWAP A ORL A,B SJMP $ END

4. 编程序将片内40H-46H单元内容的高4位清零,保持低4位不变。 ORG 1000H MOV R7,#07H

MOV R0,#40H

LOOP:MOV A,@R0 ANL A,#0FH MOV @R0,A INC R0

DJNZ R7,LOOP SJMP $

END

《单片机原理及应用》编程题题库参考答案六

1、 内部RAM 30H和31H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM 2300H单元中。

解: ORG 0H LJMP START ORG 30H START: MOV A,30H ANL A,#0FH SWAP A

MOV R0,A MOV A,31H ANL A,#0FH ORL A,R0

MOV DPTR,#2300H MOVX @DPTR,A END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

2、将存放在内部RAM 30H-35H单元的压缩型BCD码转换成相应的ASCII码,依次存放到外部RAM 2100H开始的单元区中。

ORG 0H LJMP START ORG 30H START:MOV R0,#30H MOV R2,#06H MOV DPTR,#2100H LOOP:MOV A,@R0 SWAP A

ANL A,#0FH ORL A,#30H MOVX @DPTR,A INC DPTR MOV A,@R0 ANL A,#0FH ORL A,#30H MOVX @DPTR,A INC DPTR INC R0

DJNZ R2,LOOP SJMP $ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

3、内部RAM 20H和30H开始的单元分别存放着16个16进制数,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM 2000H开始的单元中。

解: ORG 0

LJMP START ORG 30H START: MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H

MOV R2,#08H ;每个单元存放2个16进制数,故16个16进制数占用8个单元

LOOP: MOV A,@R0 ADD A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

4、请编写多字节无符号数减法程序。被减数存放在内部RAM 20H开始的8个单元中,减数存放在内部RAM 30H开始的8个单元,请将差存放到外部RAM 2000H开始的8个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。 ORG 0 LJMP START ORG 30H START: MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H MOV R2,#08H

CLR C

LOOP: MOV A,@R0

SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV OV,C SJMP $ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

5、内部RAM 40H和41H单元中存放着2个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM 2000H单元中。

解: ORG 0H LJMP START ORG 30H START: MOV A,40H ANL A,#0FH SWAP A

MOV R0,A MOV A,41H ANL A,#0FH ORL A,R0

MOV DPTR,#2000H MOVX @DPTR,A END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

6、将存放在内部RAM 20H-2FH单元的压缩型BCD码(高位在前)转换成相应的ASCII码,依次存放到外部RAM 1000H开始的单元区中。

ORG 0H LJMP START ORG 30H START: MOV R0,#20H MOV R2,#10H MOV DPTR,#1000H LOOP: MOV A,@R0 SWAP A

ANL A,#0FH

ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR

MOV A,@R0 ANL A,#0FH

ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR INC R0

DJNZ R2,LOOP SJMP $ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

7、内部RAM 30H和38H开始的单元分别存放着8个压缩BCD码,请将对应单元的内容相加(不考虑溢出),并将和存入外部RAM 1000H开始的单元中。

解: ORG 0

LJMP START ORG 30H START: MOV R0,#30H MOV R1,#38H MOV DPTR,#1000H MOV R2,#08 LOOP: MOV A,@R0 ADD A,@R1 DA A MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

8、请编写多字节无符号数加法程序。被加数存放在内部RAM 20H开始的8个单元中,加数存放在内部RAM 30H开始的8个单元,请将和存放到外部RAM 2000H开始的8个单元中,进位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。 ORG 0 LJMP START ORG 30H START: MOV R0,#20H MOV R1,#30H MOV DPTR,#2000H

MOV R2,#08H

CLR C

LOOP: MOV A,@R0 ADDC A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV F0,C SJMP $ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

9、两个8字节压缩BCD码分别存放在内部RAM 30H和40H开始的连续单元中(低位字节在前),请将二者求和(不考虑溢出情况),并将和存入外部RAM 1000H开始的单元中。 解: ORG 0

MOV R0,#30H

MOV R1,#40H MOV DPTR,#1000H MOV R2,#8 CLR C LOOP: MOV A,@R0 ADDC A,@R1 DA A

MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $ END

10、将存放在内部RAM 20H-2FH单元的十六进制数转换成ASCII码,依次存放到外部RAM 2000H开始的单元中。

解: MOV R0,#20H MOV R2,#16

MOV DPTR,#2000H MOV R3, DPH MOV R4, DPL LOOP: MOV A,@R0 ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPH,R3 MOV DPL,R4

MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL MOV A,@R0 SWAP A

ANL A,#0FH MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPH,R3 MOV DPL,R4 MOVX @DPTR,A INC DPTR MOV R3,DPH MOV R4,DPL INC R0 DJNZ R2,LOOP SJMP $

TAB: DB ‘0123456789ABCDEF’ END

11、内部RAM 30H和外部RAM 2200H开始的单元分别存放着两个8字节十六进制数(低位字节存放在前),请将二者相加(不考虑溢出情况),并将和存入内部RAM 40H开始的单元中。

解: ORG 0

MOV R0,#30H

MOV R1,#40H MOV DPTR,#2200H MOV R2,#8 CLR C LOOP: MOVX A,@DPTR ADDC A,@R0 MOV @R1,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP SJMP $ END

12、请编写多字节无符号数减法程序。被减数存放在内部RAM 30H开始的8个单元中,减数存放在内部RAM 38H开始的8个单元,请将差存放到外部RAM 1000H开始的8个单元中,借位存放到F0标志中。注意:所有数据均按照从低字节到高字节的顺序存放。

解: ORG 0

LJMP START ORG 30H

START: MOV R0,#30H MOV R1,#38H MOV DPTR,#1000H MOV R2,#8 CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV C,F0 SJMP $ END

13、请编写多字节无符号数减法程序。被减数存放在内部RAM 20H开始的16个单元中,减数存放在内部RAM 30H开始的16个单元,请将差存放到外部RAM 2000H开始的16个单元中,借位存放到OV标志中。注意:所有数据均按照从低字节到高字节的顺序存放。

解: ADDR1 EQU 20H ADDR2 EQU 30H LEN EQU 16 ADDR3 EQU 2000H ORG 0 LJMP START ORG 30H

START: MOV R0,#ADDR1 MOV R1,#ADDR2 MOV DPTR,#ADDR3 MOV R2,#LEN CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOVX @DPTR,A INC R0 INC R1 INC DPTR DJNZ R2,LOOP MOV OV,C SJMP $ END

14、将存放在内部RAM 20H-3FH单元的压缩BCD码转换成ASCII码,依次存放到外部RAM 2300H开始的单元中。(注:每个单元均先转换高四位) 解: LEN EQU 20H ADDR1 EQU 20H

ADDR2 EQU 2300H ORG 0 LJMP START ORG 30H

START: MOV R0,#ADDR1 MOV DPTR,#ADDR2 MOV R2,#LEN LOOP: MOV A,@R0 ANL A,#0F0H SWAP A

ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR MOV A,@R0 ANL A,#0FH

ORL A,#30H (或 ADD A,#30H) MOVX @DPTR,A INC DPTR INC R0

DJNZ R2,LOOP SJMP $ END

评分办法:程序设计思路正确可得5分,指令完全写对可得10分。不要求使用伪指令。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

15、将存放在内部RAM 30H-35H单元的十六进制数转换成相应的ASCII码,依次存放到外部RAM 1100H开始的单元区中。(注:每个字节转换时先转换高四位)

解: ORG 0

MOV R0,#30H MOV DPTR,#1100H MOV R2,#6

LOOP: MOV A,@R0 ; 取需要转换的数 ANL A,#0F0H ; 屏蔽低4位 SWAP A PUSH DPH

PUSH DPL ; 保护目的地址 MOV DPTR,#TAB

MOVC A,@A+DPTR ; 查表得ASCII码 POP DPL

POP DPH ; 恢复目的地址

MOVX @DPTR,A ; 存转换后的ASCII码

INC DPTR ; 修改目的地址指针 MOV A,@R0 ; 取需要转换的数 ANL A,#0FH ; 屏蔽高4位 PUSH DPH

PUSH DPL ; 保护目的地址 MOV DPTR,#TAB

MOVC A,@A+DPTR ; 查表得ASCII码 POP DPL

POP DPH ; 恢复目的地址 MOVX @DPTR,A

INC DPTR ; 修改目的地址指针 INC R0 ; 修改源地址指针 DJNZ R2,LOOP ; 未转换完则继续 SJMP $ TAB : DB ‘0123456789ABCDEF’ END

评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

16、内部RAM 30H开始的单元中存放着16个0-9的ASCII码(高位字节在前),请将其转换为压缩BCD码(高位在前)并存入外部RAM 1000H开始的单元中。 解: ORG 0

MOV R0,#30H MOV DPTR,#1000H

MOV R2,#8 ; 16个ASCII码转换为8个压缩BCD码 LOOP: MOV A,@R0

ANL A,#0FH ; 屏蔽高4位得到BCD码 SWAP A MOV R1,A

INC R0 ; 指向下一个ASCII码 MOV A,@R0

ANL A,#0FH ; 屏蔽高4位得到BCD码 ORL A,R1 ; 合成压缩BCD码 MOVX @DPTR,A ; 存压缩BCD码 INC DPTR INC R0

DJNZ R2,LOOP

SJMP $ END

17、设有两个长度为16字节的数组,分别存放在外部RAM 0200H和0300H为首址的存储区域中,试编写程序求其对应项之和(不考虑溢出的情况),结果存放在以0400H为首址的外部RAM中。

解: 参考程序清单如下: ORG 0

MOV R2,#16 ; 数组长度为16个字节 MOV R3,#02H ; 数组1的首地址高8位 MOV R4,#03H ; 数组2的首地址高8位 MOV R5,#04H ; 和数组的首地址高8位 MOV DPL,#0 ; 数据指针低8位清零 LOOP: MOV DPH,R3

MOVX A,@DPTR ; 取被加数 MOV R1,A ; 存被加数 MOV DPH,R4

MOVX A,@DPTR ; 取加数 ADD A,R1 ; 求和 MOV DPH,R5

MOVX @DPTR,A ; 存和

INC DPL ; 指向下一字节 DJNZ R2,LOOP ; 未加完则循环 END

评分办法:程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

18、编程求内部RAM中40H~4FH共16个单元中的内容的和(结果为2字节),并将和放入50H和51H单元中(高8位在50H)。 解: 参考程序清单如下:

ORG 0

LJMP START ORG 30H

START: MOV R0,#40H ; 数据区首地址送R0 MOV R2,#16 ; 单元数送R2

MOV R3,#0 ; 和的高8位清零

CLR A ; 和的低8位清零

LOOP: CLR C

ADD A,@R0 ; 求和

JNC NEXT ; 没有进位则转移

INC R3 ; 和的高8位存储单元内容加1 NEXT: INC R0 ; 指向下一个单元

DJNZ R2,LOOP ; 没加完则循环,和在R3和A中 MOV 51H,A ; 存低8位结果 MOV 50H,R3 ; 存高8位结果 SJMP $

END 19、有一个长度为16字节的ASCII码字符串存放在外部RAM 1000H为首址的存储区域中,字符串中的每一个字符均不相同,试编写程序查找字符串中是否存在ASCII码“9”。如果在字符串中存在ASCII码“9”,则将其存储单元的地址存放到内部RAM 30H和31H单元中(高8位地址在30H单元中),同时将OV标志位清零。否则,将30H和31H单元的内容清零,并将OV标志位置“1”。

解: ORG 0 MOV SP,#60H MOV DPTR,#1000H MOV R2,#16 LOOP: MOVX A,@DPTR CJNE A,#39H,EXIT MOV 30H,DPH MOV 31H,DPL CLR OV SJMP $ EXIT: INC DPTR DJNZ R2,LOOP MOV 30H,#0 MOV 31H,#0 SETB OV SJMP $ END

20、有两个8字节的16进制数a和b,它们分别存放在内部RAM中30H~37H和40H~47H的单元中(高位字节在前)。请编程求a-b,并将差存入30H开始的内部RAM单元中(高位字节在前)。若差小于零则将F0标志位置“1”,否则清零。

解:设计思路:从16进制数的最低位字节(37H和47H)开始相应字节带借位相减,然后修改地址指针在对次低位字节进行相减,一共循环8次完成两个8字节16进制数的相减。最后将Cy标志的内容传送给F0标志位即可。 ORG 0

MOV R0,#37H MOV R1,#47H MOV R2,#8 CLR C LOOP: MOV A,@R0 SUBB A,@R1 MOV @R0,A DEC R0 DEC R1

DJNZ R2,LOOP MOV F0,C SJMP $ END

21、若外部RAM的(3000H)=X,(3001H)=Y,编程实现Z=X*X+2Y,并将结果存到片内RAM的40H单元(设Z<256 ?。

解: X EQU 3000H Y EQU 3001H Z EQU 40H ORG 0

MOV DPTR,#X ; 变量X的地址送DPTR MOVX A,@DPTR ; 取变量X

MOV B,A ; 变量X的值送给B寄存器 MUL AB ; 求X*X,根据题意知积为1字节(在A中)

MOV R0,A ; X*X的结果存入R0中 INC DPTR ; 指向变量Y MOVX A,@DPTR ; 取变量Y MOV B,#2

MUL AB ; 求2*Y,根据题意知积为1字节(在A中)

ADD A,R0 ; 求X*X+2*Y

MOV Z,A ; 和存入40H单元 SJMP $ ; 停机 END

评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

22、设外部RAM 2000H单元为数据块的起始地址,数据块长度为10,试编程求数据块中的最小值,存入内部RAM 30H单元。

解:设计思路:将数据块的第1个数据放入结果单元,然后依次与剩余的9个数据进行比较。如果新的数据比结果单元中的数据还小则将该数据存入结果单元,9次比较完成则结果单元中的数据就是最小值。

ORG 0

MOV DPTR,#2000H

MOVX A,@DPTR ;取数据块的第一个数 MOV 30H,A ;存入结果单元 MOV R2,#9 ; 共比较9次 INC DPTR ;指向第2个数 LOOP: CLR C

MOVX A,@DPTR SUBB A,30H

JNC LP ; 没有借位则说明结果单元的数小,不用更换最小值

MOVX A,@DPTR

MOV 30H,A ; 更换最小值

LP: INC DPTR ; 指向下一个数

DJNZ R2,LOOP ; 没有比较完则继续循环 SJMP $ ; 停机 END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

23、若外部RAM的(1000H)=X,(1001H)=Y,请编程实现Z=2X+Y*Y+5(设Z<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。

解: X EQU 1000H ZH EQU 31H ZL EQU 30H ORG 0

MOV ZH,#0 ;结果单元清零 MOV ZL,#0

MOV DPTR,#1000H

MOVX A,@DPTR ;取X的值 MOV B,#2

MUL AB ;计算2X ADD A,ZL

MOV ZL,A ;存结果低8位 MOV A,B ;取乘积高8位 ADD A,ZH

MOV ZH,A ;存结果高8位 INC DPTR ;指向Y MOVX A,@DPTR ;取Y MOV B,A

MUL AB ;计算Y*Y

ADD A,ZL ;计算结果低8位 MOV ZL,A

MOV A,B ;取乘积的高8位

ADDC A,ZH ;计算结果高8位,注意必须带进位加 MOV ZH,A MOV A,ZL

ADD A,#5 ;计算结果加5 MOV ZL,A

MOV ZH,A ;存结果低8位

ADDC A,#0 ;将低8位进位加到结果高8位,注意必须带进位加

MOV ZH,A ;存结果高8位 END

评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣

1-3分。

24、设外部RAM 1000H单元为数据块的起始地址,数据块长度为60字节,试编程求数据块中所有数据的和,并将其存入内部RAM 30H和31H单元(30H单元存放和的低8位,31H单元存放和的高8位)。 解:

ADDR EQU 100HH ;数据块首地址 LEN EQU 60 ;数据块长度 ZH EQU 31H ;和的高8位地址 ZL EQU 30H ;和的低8位地址 ORG 0

MOV DPTR,#ADDR ;数据块首地址送DPTR MOV R7,#LEN ;数据块长度送R7 MOV ZH,#0 ;结果单元清零 MOV ZL,#0

LOOP: MOVX A,@DPTR ;取数据

ADD A,ZL ;将数据加到结果单元的低8位 MOV ZL,A ;存结果低8位 MOV A,ZH ;取结果高8位

ADDC A,#0 ;将低8位计算的进位加到高8位中 MOV ZH,A ;存高8位

INC DPTR ;修改地址指针,指向下一个数据 DJNZ R7,LOOP ;没有计算完则继续 SJMP $ END

评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

25、若外部RAM的(1000H)=X,内部RAM(30H)=Y,请编程实现Z=X*X+3Y+18(设Z<65536),并将结果保存到片内RAM的40H和41H单元(41H单元存放结果的高8位,40H单元存放结果的低8位)。

解: X EQU 1000H Y EQU 30H ZH EQU 41H ZL EQU 40H ORG 0

MOV ZH,#0 ;结果单元清零 MOV ZL,#0

MOV DPTR,#1000H

MOVX A,@DPTR ;取X的值 MOV B,A

MUL AB ;计算X*X

ADD A,ZL

MOV ZL,A ;存结果低8位 MOV A,B ;取乘积高8位 ADD A,ZH

MOV ZH,A ;存结果高8位 MOVX A,Y ;取Y MOV B,#3

MUL AB ;计算3*Y

ADD A,ZL ;计算结果低8位 MOV ZL,A

MOV A,B ;取乘积的高8位

ADDC A,ZH ;计算结果高8位,注意必须带进位加 MOV ZH,A MOV A,ZL

ADD A,#18 ;计算结果加18 MOV ZL,A ;存结果低8位 MOV A,ZH ;取结果高8位

ADDC A,#0 ;将低8位进位加到结果高8位,注意必须带进位加

MOV ZH,A ;存结果高8位 END

评分办法:不要求写出程序的注释和使用伪指令。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

2

26、若外部RAM的(1000H)=X,请编程实现Y=X+2X+1(设Y<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。

解:

ORG 0

MOV 30H,#0 ;结果单元清零 MOV 31H,#0

MOV DPTR,#1000H

MOV A,@DPTR ;取X的值 MOV B,A

MUL AB ;求X的平方 MOV 30H,A ;存低8位 MOV A,B

MOV 31H,A ;存高8位 MOVX A,@DPTR ;取X的值 MOV B,#2

MOV AB ;求2X

ADD A,30H ; 求低8位和 MOV 30H,A ;存和的低8位 MOV A,B ;取积的高8位 ADDC A,31H ;求高8位和 MOV 31H,A ;存和的高8位 MOV A,30H

ADD A,#1 ;加1

MOV 30H,A ;存和的低8位 MOV A,31H

ADDC A,#0 ;和的高8位加上低8位运算的进位 MOV 31H,A ;存和的高8位 SJMP $ ;停机 END

27、设外部RAM 2000H单元为数据块的起始地址,数据块长度为100字节。假设在数据块中存在唯一的一个ASCII字符“A”,试编程找到它,并将其在外部RAM的存放地址存入内部RAM 30H和31H单元中(30H单元存放地址的高8位,31H单元存放地址的低8位)。 解:

ORG 0

MOV DPTR,#2000H ;数据块首地址送DPTR MOV R2,#100 ;数据块长度送R2 LOOP: MOVX A,@DPTR ;取数据

CJNE A,#41H,NEXT ;数据不是“A”则转移 MOV A,DPH

MOV 30H,A ;存高8位地址 MOV A,DPL

MOV 31H,A ;存低8位地址 SJMP $ ;停机

NEXT: INC DPTR ;修改地址指针 DJNZ R2,LOOP ;没有找到则继续 SJMP $ ;停机

22

28、若内部RAM的(20H)=a,外部RAM(1300H)=b,请编程实现y=a+b+5(设y<65536),并将结果保存到片内RAM的30H和31H单元(31H单元存放结果的高8位,30H单元存放结果的低8位)。 解:

ORG 0

MOV A,20H ;取a MOV B,A

2

MUL AB ;求a

MOV 30H,A ;存和的低8位 MOV A,B

MOV 31H,A ;存和的高8位 MOV DPTR,#1300H

MOVX A,@DPTR ;取b MOV B,A

2

MUL AB ;求b

22

ADD A,30H ;求a+b MOV 30H,A MOV A,B ADDC A,31H MOV 31H,A MOV A,30H

ADD A,#5 ;加5 MOV 30H,A MOV A,31H

ADDC A,#0 ;加上低8位的进位 MOV 31H,A

SJMP $ ;停机 END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

2

29、若内部RAM的(30H)=X,(31H)=Y,请编程实现Z=X+5Y(设Z<65536),并将结果保存到片外RAM的1000H和1001H单元(1001H单元存放结果的高8位,1000H单元存放结果的低8位)。

解: ORG 0

MOV DPTR,#1000H ;结果地址指针赋值 MOV A,30H ;取X MOV B,A

2

MUL AB ;求X

2

MOVX @DPTR,A ;存X低8位

INC DPTR ;指向结果单元高8位 MOV A,B

2

MOVX @DPTR,A ;存X高8位

DEC DPL ;指向结果单元低8位 MOV A,31H ;取Y MOV B,#5

MUL AB ;求5Y MOV R0,A

MOVX A,@DPTR

2

ADD A,R0 ;求X+5Y的低8位和

2

MOVX @DPTR,A ;存X+5Y的低8位和 INC DPTR ;指向结果单元高8位 MOVX A,@DPTR ;取结果单元高8位

2

ADDC A,B ;求X+5Y的高8位和(注意加上低8位的进位)

2

MOVX @DPTR,A ;存X+5Y的高8位和 SJMP $ ;停机 END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

30、设内部RAM 20H单元为数据块的起始地址,数据块长度为32字节。请将整个数据块求和(共32字节的数据求和,设和小于65536),并把和存入外部RAM 1000H和1001H的单元中(和的高8位存入1001H单元)。 解: ORG 0

MOV R0,#20H ;数据块首地址送R0 MOV R2,#32 ;数据块长度送R2 CLR A ;累加器清零 MOV DPTR,#1000H ;指向和的低8位 MOVX @DPTR,A ;和的低8位清零 INC DPTR ;指向和的高8位 MOVX @DPTR,A ;和的高8位清零 DEC DPL ;指向和的低8位 LOOP: MOV A,@R0 ;取数据 MOV R1,A ;暂存在R1 MOVX A,@DPTR ;取和的低8位 ADD A,R1 ;求和

MOVX @DPTR,A ;存和的低8位 INC DPTR ;指向和的高8位 MOVX A,@DPTR ;取和的高8位

ADDC A,#0 ;将和的低8位的进位加到高8位中 MOVX @DPTR,A ;存和的高8位 DEC DPL ;指向和的低8位 INC R0 ;数据块指针加1 DJNZ R2,LOOP ;没有加完则循环 SJMP $ ;停机 END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

22

31、若内部RAM的(20H)=a,(21H)=b,请编程实现y=a+b(设y<65536),并将结果保存到片外RAM的2000H和2001H单元(2001H单元存放结果的高8位,2000H单元存放结果的低8位)。

解: ORG 0

MOV DPTR,#2000H ;结果单元低8位地址送DPTR MOV A,20H ;取a的值 MOV B,A

2

MUL AB ;求a

2

MOVX @DPTR,A ;存a低8位 MOV A,B

INC DPTR ;指向结果单元高8位 MOVX @DPTR,A ;存结果高8位

DEC DPL ;指向结果单元低8位 MOV A,21H ;取b的值 MOV B,A

2

MUL AB ;求b

2

MOV R0,A ;暂存b的低8位 MOVX A,@DPTR ;取结果低8位 ADD A,R0 ;求低8位的和 MOVX @DPTR,A ;存结果低8位

INC DPTR ;指向结果单元高8位 MOVX A,@DPTR ;取结果高8位

2

ADDC A,B ;加上b的高8位和低8位求和的进位 MOVX @DPTR,A ;存结果高8位 SJMP $ ;停机 END 评分办法:不要求写出程序的注释,也不要求使用子程序。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

32、将内部RAM 40H为起始地址的32个连续单元中的十六进制数转换成ASCⅡ码存入外部RAM 3000H开始的存储单元中。 解: ORG 0

MOV R0,#40H ;源数据块首地址送R0 MOV R2,#32 ;数据块长度送R2

MOV DPTR,#3000H ;目的数据块首地址送DPTR LOOP: MOV A,@R0 ;取待转换数据 ANL A,#0F0H ;取高四位数据

SWAP A ;高低四位数据交换 PUSH DPH ;保护目标地址指针 PUSH DPL

MOV DPTR,#TAB ;数据指针指向表格首地址 MOVC A,@A+DPTR ;查表得到ASCII码 POP DPL ;恢复目标地址指针 POP DPH

MOVX @DPTR,A ;存转换结果

INC DPTR ;指向下一个存储单元

MOV A,@R0 ;取待转换数据 ANL A,#0FH ;取低四位数据

PUSH DPH ;保护目标地址指针 PUSH DPL

MOV DPTR,#TAB ;数据指针指向表格首地址 MOVC A,@A+DPTR ;查表得到ASCII码 POP DPL ;恢复目标地址指针 POP DPH

MOVX @DPTR,A ;存转换结果

INC DPTR ;指向下一个存储单元 INC R0 ;指向下一个待转换数据 DJNZ R2,LOOP ;没有转换完则继续 SJMP $ ;停机 TAB: DB ‘0123456789ABCDEF’ END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

33、设内部RAM 20H单元为数据块的起始地址,数据块长度为10H,数据为8位无符号数,试编程找出数据块中的最小值,并将其存入40H单元。 解:

ORG 0

MOV R0,#20H ;数据区首地址送R0 MOV R2,#10H ;数据块长度送R2 MOV 40H,#0FFH ;结果单元送入最大值 LOOP: MOV A,@R0 ;取数据 CLR C ;清进位

SUBB A,40H ;利用减法判断该数据是否比最小值单元的数小?

JNC NEXT ;如果没有借位说明待比较数据比最小值单元的值大则转移

MOV A,@R0 ;取最小值 MOV 40H,A ;存最小值 NEXT: INC R0 ;修改地址指针

DJNZ R2,LOOP ;没有比较完则继续比较。 SJMP $ ;停机 END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

34、比较两个ASCII码字符串是否相等。字符串长度在内部RAM 2FH单元,两字符串的首地址分别为30H、40H。如果两个字符串相等,置CY=1,否则,置CY=0。

解: ORG 0

MOV R0,#30H ;第一个字符串首地址送R0 MOV R1,#40H ;第一个字符串首地址送R1 MOV R2,2FH ;取字符串长度

LOOP: MOV A,@R0 ;取第一个字符串的字符 CLR C

SUBB A,@R1 ;比较两个字符是否相等

JNZ STOP ;结果不为零说明两个字符串不相等 INC R0 ;修改地址指针 INC R1

DJNZ R2,LOOP ;没有比较完则继续

SETB C ;比较完,置两字符串相等标志 SJMP $ ;停机

STOP: CLR C ;两字符串不相等,清进位标志 SJMP $ ;停机 END

评分办法:不要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。 35、将MCS51内部RAM 60H~65H单元存放的12个16进制数变为ASCII码,存放到0100H单元开始的外部RAM中。

解: ADDR1 EQU 60H ADDR2 EQU 0100H LEN EQU 6 ORG 0

MOV R0,#ADDR1 ;待转换数据首地址送R0

MOV DPTR,#ADDR2 ;转换后ASCII码存放首地址送DPTR MOV R2,#LEN ;原数据长度送R2 LOOP: MOV A,@R0 ;取待转换数据

ANL A,#0FH ;取待转换数据低四位 PUSH DPH ;保护目的区地址指针 PUSH DPL

MOV DPTR,#TAB ;码表首地址送DPTR MOVC A,@A+DPTR ;查表

POP DPL ;恢复目的区地址指针 POP DPH

MOVX @DPTR,A ;存转换好的ASCII码 INC DPTR ;目的地址加1

MOV A,@R0 ;取待转换数据 SWAP A ;高低四位交换

ANL A,#0FH ;取待转换高四位数据

PUSH DPH ;保护目的区地址指针 PUSH DPL

MOV DPTR,#TAB ;码表首地址送DPTR MOVC A,@A+DPTR ;查表

POP DPL ;恢复目的区地址指针 POP DPH

MOVX @DPTR,A ;存转换好的ASCII码 INC DPTR ;目的地址加1 INC R0 ;原地址指针加1 DJNZ R2,LOOP ;没有转换完则转移 SJMP $ ;停机 TAB: DB ‘0123456789ABCDEF’

END

评分办法:不要求使用伪指令,也不要求写出程序的注释。程序设计中也可以先转换高四位。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

36、将片外数据存储器的2500H单元与2501H单元中的数据作十进制加法运算,和送入2503H和2502H单元中,即(2500H)+(2501H)→(2503H)(2502H)。 解:

ORG 0

MOV DPTR,#2500H ;指向被加数 MOVX A,@DPTR ;取被加数 MOV R0,A ;存被加数 INC DPTR ;指向加数 MOVX A,@DPTR ;取加数 ADD A,R0 ;求和

DA A ;十进制调整 INC DPTR ;指向和的低8位 MOVX @DPTR,A ;存和的低8位 INC DPTR ;指向和的高8位 ADDC A,#0 ;计算和的高8位 MOVX @DPTR,A ;存和的高8位 SJMP $ ;停机 END

评分办法:要求写出程序的注释。程序设计思路正确可得5分,指令完全写对可得10分。若仅写对少量指令,可酌情给1-3分;若仅有少量指令写错,可酌情扣1-3分。

37、设单片机的晶体震荡频率为12MHz,利用定时器T0编程由P1.2输出

周期为10ms的方波。(要求:T0工作在方式1下,采用中断方式工作)

解:周期为10ms则半周期为5ms,因此T0的定时初值为65536-5000/1=60536=0EC78H

ORG 0

LJMP START ORG 000BH LJMP TS ORG 30H

START: MOV TMOD,#01H MOV TH0,#0ECH MOV TL0,#78H SETB ET0 SETB TR0 SETB EA CLR P1.2 SJMP $ TS: CLR TR0

MOV TH0,#0ECH MOV TL0,#78H SETB TR0 CPL P1.2 RETI END

评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

38、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T0实现在P1.0引脚上输出周期为100mS的方波。(要求:采用中断方式,T0工作在方式1下)

解:输出方波周期为100mS,故半周期为50mS,因此T0的定时初值是65536-50000/1=15536=3CB0H ORG 0H

LJMP START ORG 000BH LJMP TS ORG 30H

START: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB ET0 SETB TR0 SETB EA CLR P1.0

SJMP $ TS: CLR TR0

MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 CPL P1.0 RETI END

评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

39、设8031单片机应用系统的晶振频率为12MHz,请利用T0在P1.0和P1.1引脚上输出频率为20Hz、互补(两个波形互为反相)的方波。要求:采用中断方式,T0工作在方式1。

解:输出频率为20Hz,则周期为1/20=50mS,半周期为50/2=25mS,

T0的定时初值为:65536-25000/1=40536=9E58H

ORG 0H

LJMP START ORG 000BH LJMP TS ORG 30H

START:MOV TMOD,#01H ;T0设定为定时器,工作方式1 MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA SETB TR0 CLR P1.0 SETB P1.1 SJMP $ TS: CLR TR0

MOV TH0,#9EH MOV TL0,#58H SETB TR0 CPL P1.0 CPL P1.1 RETI END

评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

40、8031单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T0编

程实现在P1.7引脚输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1下。

20Hz方波的周期是1/20=50mS,则其半周期为50/2=25mS T0的定时初值为:65536-25000*12/12=40536=9E58H ORG 0H

LJMP START ORG 000BH LJMP TS ORG 30H

START: MOV TMOD,#01H ;T0设定为定时器,工作方式1

MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA SETB TR0 SJMP $ TS: CLR TR0

MOV TH0,#9EH MOV TL0,#58H SETB TR0 RETI END

评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

41、设单片机的晶体振荡频率为12MHz,利用定时器T0编程由P1.0和P1.1输出周期为10ms、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作)

解:周期为10ms则半周期为5ms,因此T0的定时初值为65536-5000*12/12=60536=0EC78H

ORG 0

LJMP START ORG 000BH LJMP TS ORG 30H

START: MOV TMOD,#01H MOV TH0,#0ECH MOV TL0,#78H SETB ET0 SETB TR0 SETB EA CLR P1.0

SETB P1.1 SJMP $ TS: CLR TR0

MOV TH0,#0ECH MOV TL0,#78H SETB TR0 CPL P1.0 CPL P1.1 RETI END

评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

42、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T1实现在P1.0和P1.1引脚上输出互补(互为反相)的周期为100mS的方波。(要求:采用中断方式,T1工作在方式1下)

解:输出方波周期为100mS,故半周期为50mS,因此T1的定时初值是

65536-50000*12/12=15536=3CB0H

ORG 0H LJMP START ORG 001BH LJMP TS ORG 30H

START: MOV TMOD,#10H (或#1XH) MOV TH1,#3CH MOV TL1,#0B0H SETB ET1 SETB TR1 SETB EA CLR P1.0 SETB P1.1 SJMP $ TS: CLR TR1

MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 CPL P1.0 CPL P1.1 RETI END

评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

43、设8031单片机应用系统的晶振频率为12MHz,请利用T0在P1.0引脚上输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1。

解:输出频率为20Hz,则周期为1/20=50ms,半周期为50/2=25ms,

T0的定时初值为:65536-25000*12/12=40536=9E58H

ORG 0H LJMP START ORG 000BH LJMP TS ORG 30H

START: MOV TMOD,#01H ;T0设定为定时器,工作方式1

MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA SETB TR0 CLR P1.0 SJMP $ TS: CLR TR0

MOV TH0,#9EH MOV TL0,#58H SETB TR0 CPL P1.0 RETI END

评分办法:不要求写出程序的注释。T0的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

44、8031单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T1编程实现在P1.6和P1.7引脚输出互补(互为反相)的、频率为20Hz的方波。要求:采用中断方式,T1工作在方式1下。

解:20Hz方波的周期是1/20=50ms,则其半周期为50/2=25ms

T1的定时初值为:65536-25000/1=40536=9E58H

ORG 0H

LJMP START ORG 001BH LJMP TS ORG 30H

START: MOV TMOD,#10H ;T1设定为定时器,工作方式1

MOV TH1,#9EH MOV TL1,#58H

SETB ET1 SETB EA CLR P1.6 SETB P1.7 SETB TR1 SJMP $ TS: CLR TR1

MOV TH1,#9EH MOV TL1,#58H SETB TR1 CPL P1.6 CPL P1.7 RETI END

评分办法:不要求写出程序的注释。T1的方式控制字写对和定时初值计算正确可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

45、设单片机的晶体振荡频率为6MHz,利用定时器T1编程由P1.6和P1.7输出周期为500μs 、互补(互为反相)的方波。(要求:T1工作在方式2下,采用中断方式工作)

解:T1定时器的初值=256-6*250/12=131=83H ORG 0

LJMP START ORG 1BH LJMP TS ORG 30H

START: MOV TMOD,#20H MOV TH1,#131 MOV TL1,#131 SETB ET1

SETB EA (或 MOV IE,#88H) SETB TR1 CLR P1.6 SETB P1.7 SJMP $ TS: CPL P1.6 CPL P1.7 RETI END

评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。

46、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T1

实现在P1.0和P1.1引脚上输出互补(互为反相)的周期为2ms的方波。(要求:采用中断方式,T1工作在方式2下)

解:半周期=1ms 。方式2定时设定为250μs,

其初值=256-250*12/12=6。只要T1中断4次计数即为1ms。

ORG 0

LJMP START ORG 1BH LJMP TS ORG 30H

START: MOV TMOD,#20H MOV TH1,#6 MOV TL1,#6 SETB ET1 SETB EA SETB TR0 CLR P1.0 SETB P1.1 MOV R2,#4 SJMP $

TS: DJNZ R2,TS1 MOV R2,#4 CPL P1.0 CPL P1.1 TS1: RETI END

评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。

47、设8031单片机应用系统的晶振频率为12MHz,请利用T1在P1.0引脚上输出频率为1Hz的方波。要求:采用中断方式,T1工作在方式1。

解:1Hz方波的周期为1s,半周期为500ms。可采用T1定时50ms,并对中断计数10次来实现500ms定时。

50ms定时初值=65536-50000*12/12=15536=3CB0H

ORG 0

LJMP START ORG 1BH LJMP TS ORG 30H

MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0B0H SETB ET1

SETB EA (或 MOV IE,#88H) MOV R2,#10

CLR P1.0 SETB TR1 SJMP $ TS: CLR TR1

MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 DJNZ R2,TS1 MOV R2,#10 CPL P1.0 TS1: RETI

评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。

48、8051单片机应用系统的晶体振荡器频率为6MHz,请利用定时器T1编程实现在P1.0和P1.1引脚输出互补(互为反相)的、频率为20Hz的方波。要求:采用中断方式,T1工作在方式2下。

解:20Hz方波的半周期为25ms,

T1的0.5ms定时初值=256-500*6/12=6

ORG 0

LJMP START ORG 1BH LJMP TS ORG 30H

START: MOV TMOD,#20H MOV TH1,#6 MOV TL1,#6

MOV R2,#50 ; 50*0.5ms=25ms CLR P1.0 SETB P1.1 SETB ET1

SETB EA ; (或 MOV IE,#88H) SETB TR1 SJMP $

TS: DJNZ R2,TS1 MOV R2,#50 CPL P1.0 CPL P1.1 TS1: RETI

评分办法:写对定时器方式字和初值各给1分,设计思路正确给4分,程序编制正确可得满分。若仅写出少量指令,可酌情给1-3分。

49、8751单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T0编程实现在P1.7引脚输出频率为20Hz的方波。要求:采用中断方式,T0工作在方式1下。

解:20Hz方波的周期是1/20=0.05s =50 ms ,则半周期为25ms。

因此只要每隔25ms将P1.7取反即可得到20Hz的方波。 T0的定时初值=65536-25000*12/12=40536=9E58H ORG 0

LJMP START ORG 0BH LJMP TS ORG 30H

START: MOV TMOD,#01H ; 设定T0为定时器,方式1 MOV TH0,#9EH MOV TL0,#58H CLR P1.7 SETB ET0

SETB EA (或两条指令合并为MOV IE,#82H) SETB TR0 ; 启动T0定时 SJMP $

TS: CLR TR0 ; 停止T0定时

MOV TH0,#9EH

MOV TL0,#58H

SETB TR0 ; 启动T0定时 CPL P1.7 RETI

END

评分办法:T0的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。在中断服务程序中可以省略T0的停止与启动指令。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

50、设8051单片机应用系统的晶振频率为12MHz,请利用T1在P1.0和P1.1引脚上输出频率为20Hz、互补(两个波形互为反相)的方波。要求:采用中断方式,T1工作在方式1。

解:20Hz方波的周期是1/20=0.05s =50 ms ,则半周期为25ms。因此只要每隔25ms将P1.0和P1.1取反即可得到互补的20Hz方波。

T1的定时初值=65536-25000*12/12=40536=9E58H ORG 0

LJMP START ORG 1BH LJMP TS ORG 30H

START: MOV TMOD,#10H ; 设定T1为定时器,方式1 MOV TH1,#9EH

MOV TL1,#58H CLR P1.0 SETB P1.1 SETB ET1

SETB EA (或两条指令合并为MOV IE,#88H) SETB TR1 ; 启动T1定时 SJMP $

TS: CLR TR1 ; 停止T1定时

MOV TH1,#9EH

MOV TL1,#58H

SETB TR1 ; 启动T1定时 CPL P1.0 CPL P1.1 RETI END

评分办法:T1的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。在中断服务程序中可以省略T1的停止与启动指令。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

51、已知8051单片机应用系统的晶体振荡频率为12MHz,请利用定时器T0实现在P1.0引脚上输出频率为2kHz的方波。(要求:采用中断方式,T0工作在方式2下)

解:2kHz方波的周期是1/2000=0.5ms =500 μs,则半周期为250 μs。因此只要每隔250 μs将P1.0取反即可得到互补的2kHz方波。 T0的定时初值=256-250*12/12=6 ORG 0

LJMP START ORG 0BH LJMP TS ORG 30H

START: MOV TMOD,#02H ; 设定T0为定时器,方式2 MOV TH0,#6 MOV TL0,#6 CLR P1.0 SETB ET0

SETB EA (或两条指令合并为MOV IE,#82H) SETB TR0 ; 启动T0定时 SJMP $

TS: CPL P1.0 RETI END 评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写

出少量指令可酌情给1-2分。

52、设单片机的晶体振荡频率为12MHz,利用定时器T0编程由P1.0输出周期为1秒的方波。(要求:T0工作在方式1下,采用中断方式工作)

解:周期为1秒的方波只需要每隔0.5秒将P1.0取反即可。将T0设定为50ms定时中断,中断10次即是0.5秒,这时将P1.0取反即可。

T0的定时初值=65536-50000*12/12=15536=3CB0H ORG 0

LJMP START ORG 0BH LJMP TS ORG 30H

START: MOV TMOD,#01H ; 设定T0为定时器,方式1 MOV TH0,#3CH

MOV TL0,#0B0H ; 50ms定时初值送T0 MOV R2,#10 ; 中断10次 SETB ET0

SETB EA ;(或两条指令合并为MOV IE,#82H) SETB TR0 ; 启动定时 SJMP $ ; 等待中断 TS: CLR TR0

MOV TH0,#3CH

MOV TL0,#0B0H ; 50ms定时初值送T0 SETB TR0

DJNZ R2,NEXT MOV R2,#10 CPL P1.0 NEXT: RETI END

评分办法:T0的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

53、设单片机的晶体振荡频率为6MHz,利用定时器T0编程由P1.0和P1.1输出周期为1s、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作)

解:周期为1s则半周期为500ms,只需要每隔500ms将P1.0和P1.1的输出取反即可。可以利用T0定时100ms中断,对T0中断计5次实现500ms定时。

T0的定时初值为65536-100000*6/12=15536=03CB0H

参考程序清单如下: ORG 0

LJMP START ORG 0BH

LJMP TS ORG 30H

START: MOV TMOD,#01H MOV TH0,#03CH MOV TL0,#0B0H

MOV R2,#5 ; 中断5次为500ms SETB ET0 SETB TR0 SETB EA CLR P1.0 SETB P1.1 SJMP $

TS: CLR TR0 ; 该指令可以省略 MOV TH0,#03CH MOV TL0,#0B0H

SETB TR0 ; 该指令可以省略 DJNZ R2,TS1

MOV R2,#5 ; 恢复中断次数初值 CPL P1.0 CPL P1.1 TS1: RETI END

评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

54、8031单片机应用系统的晶体振荡器频率为6MHz,请利用定时器T0编程实现在P1.0引脚输出频率为0.1Hz的方波。要求:采用中断方式,T0工作在方式1下。

解:0.1Hz方波的周期是1/0.1=10s,则其半周期为10/2=5s,每5s将P1.0取反即可。

可以利用T0定时100ms中断,对100ms中断计50次即可实现5s定时。

T0的定时初值为:65536-100000*6/12=15536=3CB0H 参考程序清单如下:

ORG 0H LJMP START ORG 000BH LJMP TS ORG 30H

START: MOV TMOD,#01H ; 设定为定时器,工作方式1 MOV TH0,#3CH MOV TL0,#0B0H MOV R2,#32H SETB ET0 SETB EA

SETB TR0 SJMP $

TS: CLR TR0 ; 此指令可以省略 MOV TH0,#3CH MOV TL0,#0B0H

SETB TR0 ; 此令可以省略 DJNZ R2,NEXT MOV R2,#32H CPL P1.0 NEXT: RETI END

评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

55、设单片机的晶体振荡频率为3MHz,利用定时器T0编程由P1.6和P1.7输出周期为10s、互补(互为反相)的方波。(要求:T0工作在方式1下,采用中断方式工作) 解: 方波周期是10秒,只需要每隔5秒将P1.6和P1.7取反即可。 用T0产生100ms定时中断,对该中断计50次即可得到5秒定时。 T0的定时初值=65536-100000×3÷12=40536=9E58H ORG 0

LJMP START ORG 0BH LJMP TS ORG 30H

START: MOV SP,#60H MOV TMOD,#01H MOV TH0,#9EH MOV TL0,#58H SETB ET0 SETB EA CLR P1.6

MOV R2,#32H (或 MOV R2,#50) SETB TR0 SJMP $

TS: MOV TH0,#9EH MOV TL0,#58H DJNZ R2,TS1

MOV R2,#32H (或 MOV R2,#50) CPL P1.6 CPL P1.7 TS1: RETI END

评分办法:T0方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令

完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

56、89C51单片机应用系统的晶体振荡器频率为12MHz,请利用定时器T1编程实现在P1.0引脚输出频率为2Hz的方波。要求:T1采用中断方式工作,工作在方式1下。 解:2Hz方波其周期为0.5秒,只需要每隔0.25秒将P1.0取反即可。

T1在12MHz晶振下定时时间最大为65.536ms,因此只需要50ms定时中断,然后对中断计5次即可实现0.25秒定时。

T1的50ms定时初值为:65536-50000×12÷12=15536=3CB0H 程序清单如下:

ORG 0

LJMP START ORG 1BH LJMP TS ORG 30H

START: MOV SP,#60H MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0B0H SETB ET1 SETB EA MOV R2,#5 SETB TR1 SJMP $

TS: MOV TH1,#3CH MOV TL1,#0B0H DJNZ R2,TS1 MOV R2,#5 CPL P1.0 TS1: RETI END

评分办法:T1的方式字和定时初值写对可各得1分;程序设计思路正确可得4分,指令完全写对可得满分(10分)。若少量指令写错可酌情扣1-2分;若仅写出少量指令可酌情给1-2分。

57、设单片机的晶体振荡频率为12MHz,P1.0接有一个共阴极驱动方式连接的发光二极管。现要求利用定时器T1编程使该发光二极管每10秒钟点亮一次,每次点亮时间为1秒。(要求:T1工作在方式1下,采用中断方式工作,在中断服务程序中控制发光二极管的亮与灭)

解:共阴极驱动的发光二极管需要高电平点亮,故当P1.0为1时发光二极管点亮。 由于一个周期为10秒,因此需要一个1秒钟的定时,同时需要一个闪烁标志位来表明LED的亮与灭。

T1的定时时间选择50ms,这样中断20次即为1秒钟,其定时初值为: 65536-50000*12/12=15536=3CB0H