单片机程序题 下载本文

ADD A,DPL ;2*元素序号低字节 +DPL MOV DPL,A ;存入DPL MOV A,DPH

ADDC A,R5 ;2*元素序号高字节+DPL MOV DPH,A ;存入DPH CLR A ;清零A

MOVC A,@A+DPTR ;查表的元素高字节 MOV R5,A ;存入R5 MOV A,#01H

MOVC A,@A+DPTR ;查表的元素低字节 MOV R4,A ;存入R4 RET ;返回主程

DTATAB: DW --- ;元素表格,高字节在前 DW---- - - . END

4.16 设MDA和MDB内有两数a和b,请编写球c=a^2+b^2并把c送入MDC的程序。设a和b均为小于10整数。

程序如下:

ORG 1000H MDA DATA 20H MDB DATA 21H MDC DATA 22H

MOV A,MDA ;入口参数a送A ACALL SQR ;求b^2

ADD A, R1 ;a^2+b^2送A MOV MDC,A ;存入MDC SJMP $ ;结束

SQR : ADD A,#01H ;地址调整 MOVC A,@A+PC ;查平方表 RET ;返回 SQRTAB: DB 0,1,4,9,16

DB 25,36,49,64,81 END

4.17 在HEX单元中存有两个十六进制数,试通过编程分别把它们转化成ASCII码存入ASC和ASC+1单元。

程序如下:

ORG 1200H

PUSH HEX ;入口参数压栈

ACALL HASC ;求十六进制数地位的ASCII码 POP ASC ;出口参数存入ASC MOV A,HEX ;十六进制数送A

SWAP A ;十六进制数高位送累加器A的低4位 PUSH ACC ;入口参数压栈

ACALL HASC ;求十六进制数高位的ASCII码 POP ASC+1 ;出口参数送ASC+1单元 SJMP $ ;结束

HASC:DEC SP DEC SP ;入口参数地址送SP POP ACC ;入口参数送A

ANL A,#0FH ;取出入口参数低4位 ADD A, #07H ;地址调整

MOVC A,@A+PC ;查表的相应ASCII码 PUSH ACC ;出口参数压栈 INC SP

INC SP ;SP指向断点地址高8位 RET ;返回主程序 ASCTAB: DB '0','1','2','3','4','5','6','7' DB '8','9','A','B','C','D','E','F' END

课后4.8 已知,从内部RAM BLOCK单元开始存放有一组带符号数,数的个数存放在LEN单元,请编写可以统计其中正数和负数个数并分别存入NUM和NUM+1单元的程序。

程序如下:

ORG 0200H LEN DATA 20H NUM DATA 21H BLOCK DATA 23H

MOV NUM ,#00H ;清零NUM单元 MOV NUM+1,#00H ;清零NUM+1单元 MOV R0,#BLOCK ;R0<--块起始地址 LOOP: MOV A,@R0 ;A<--源数

JNB ACC.7,POSI ;若正,则POSI INC NUM+1 ;负数个数加1 SJMP NEXT

POSI: INC NUM ;正数个数加1 NEXT: INC R0 ;原指针加1

DJNZ LEN,LOOP ;若未完,则LOOP SJMP $ END

4.9 设自变量X 为一无符号数,存放在内部RAM的VAX单元,函数Y存放在FUNC单元。请编写满足如下关系的程序:

X X≥50 Y= 5X 50>X≥20 2X X<20

程序如下:

ORG 0200H VAR DATA 20H FUNC DATA 21H

MOV A,VAR ;A<--(20H) CJNE A,#50H ,NEXT1 ;建立Cy

NEXT1: JNC DONE ;若X>=50,则DONE CJNE A,#20H,NEXT2 ;建立Cy

NEXT2: JC NEXT3 ;若X<20,则NEXT3 RL A ;若X>19,则A=5X RL A

ADD A,20H ;A<--5X SJMP DONE

NEXT3: RL A ;A<--2X

DONE: MOV FUNC ,A ;21H<--A SJMP $ END 实验程序: 1.存储块清零

Block equ 4000h

mov dptr, #Block ; 起始地址 mov r0, #0 ; 清 256 字节 clr a Loop:

movx @dptr, a

inc dptr ; 指向下一个地址 djnz r0, Loop ; 记数减一 ljmp $ end

1,二进制到ASCII码转换

将 A 拆为二个 ASCII 码, 并存入 Result 开始的二个单元 Result equ 20h org 0 ljmp Start ASCIITab:

db '0123456789ABCDEF' ; 定义数字对应的ASCII表 BinToHex:

mov dptr, #ASCIITab

mov b, a ; 暂存 A swap a

anl a, #0fh ; 取高四位 movc a, @a+dptr ; 查ASCII表 mov Result, a

mov a, b ; 恢复 A

anl a, #0fh ; 取低四位 movc a, @a+dptr ; 查ASCII表 mov Result+1, a ret Start:

mov sp, #40h mov a, #1ah call BinToHex ljmp $ End 2.程序跳转表

org 0 ljmp Start Func0: mov a, #0 ret

Func1: mov a, #1 ret

Func2: mov a, #2 ret

Func3: mov a, #3 ret FuncEnter:

add a, acc mov dptr, #FuncTab jmp @a+dptr FuncTab:

ajmp Func0 ajmp Func1 ajmp Func2 ajmp Func3 Start:

mov a, #0 call FuncEnter mov a, #1 call FuncEnter mov a, #2 call FuncEnter mov a, #3 call FuncEnter ljmp $ end

3.数据排序

Size equ 10 ; ajmp 为二字节指令, 调用号 X 2 ; 数据个数