SJMP CLEAR END
实验二 BCD码求和
实验源代码: ORG MOV MOV MOV MOV MOV MOV MOV MOV MOV BCDA: MOV MOV
ADD MOV MOV ADD MOV CLR C DEC DEC MOV ADDC DA MOV DJNZ SJMP END
00H R7,#03H R0,#30H R1,#34H 30H,#68H 31H,#55H 32H,#98H 34H,#55H 35H,#23H 36H,#64H A,R7 ;取字节数至R2中 R2,A A,R0 R0,A A,R2 A,R1 R1,A
;初始化数据指针
BCD1:
;高位字节相加
R0 R1 A,@R0 A,@R1 A @R0,A R2,BCD1 $
;调整数据指针
;按字节相加 ;十进制调整 ;和存回[R0]中 ;处理完所有字节
实验三 多路开关状态指示
1. 实验内容
AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。(开关闭合,对应的灯亮,开关断开,对应的灯灭)。 2. 电路原理图
C230pFC1C330pFU119XTAL1P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD3938373635343332212223242526272810111213141516171uF18XTAL2C4910uFRSTR110k293031PSENALEEAR2R3R4R5220D1D2D3D4R6R7R8R9LED-YELLOW24681U2:AA0A1A2A3OE74LS240Y0Y1Y2Y31816141222022012345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51220K1K2K3K44.7k4.7k4.7k4.7k 3. 系统板上硬件连线
(1. 把“单片机系统”区域中的P1.0-P1.3用导线连接到“八路发光二极管指示模块”区
域中的L1-L4端口上; (2. 把“单片机系统”区域中的P1.4-P1.7用导线连接到“四路拨动开关”区域中的K1
-K4端口上; 4. 程序设计内容
(1. 开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。 (2. 输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
5.汇编源程序
方法一 ORG 00H
START: MOV A,P1 ANL A,#0F0H RR A RR A RR A RR A
ORl A,#0F0H MOV P1,A SJMP START END 方法二 ORG 00H
START: JB P1.4,NEXT1 CLR P1.0 SJMP NEX1
NEXT1: SETB P1.0 NEX1: JB P1.5,NEXT2 CLR P1.1 SJMP NEX2
NEXT2: SETB P1.1 NEX2: JB P1.6,NEXT3 CLR P1.2 SJMP NEX3
NEXT3: SETB P1.2 NEX3: JB P1.7,NEXT4 CLR P1.3 SJMP NEX4
NEXT4: SETB P1.3 NEX4: SJMP START END
实验四 子程序设计----BCD码转换为二进制
单字节可存放两位压缩BCD码(0—99) B=D1×10+D0(D1,D0为0—9) 十位 个位
单字节BCD码转换为二进制子程序
入口:(R0)= 压缩BCD码的地址 出口:(A)= 转换结果 DSFR::MOV A,@R0 ANL A,#0F0H ;取十位数 SWAP A ;变为标准BCD码 MOV B,#10 MUL AB ;(A)=D1×10 MOV R7,A ;D1×10暂存R7 MOV A,@R0
ANL A,#0FH ;取个位
ADD A,R7 ;A=D1×10+D0 RET
1、实验内容
四位压缩BCD码存在20H21H单元D=D3D2D1D0
D=D3×1000+D2×100+D1×10+D0
=(D3×10+D2) ×100+D1×10+D0
结果存放30H31H
R0,R1赋初值
调用DSFR子程序 ;求D3×10+D2
A×100结果存30H31H
INC R0 ACALL DSFR 结果加到30h31H
DSFR子程序 子程序设计要点:
子程序一般为多次返复使用的程序段,一般应说明入口条件,DSFR子程序的入口条件是:被转换为二进制的单字节BCD码为间接寻址,间接寻址寄存器为R0。要调用DFSR子程序必需先将压缩BCD码的存放地址赋与R0。而出口条件是指最后结果在哪儿存放。本子程序转换结果在ACC内。主程序调用子程序,在调试时一般要先调试子程序、再调试主程序。
2、实验步骤
1)打开PV32编程序。汇编正确进入调试界面。否则修改程序重新汇编直到通过。 2)打开DATD窗口给20H、21H、R6、R7赋值
3)单步调试DSFR子程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。
4) 设断点调试主程序观察并记禄寄存器、内存的变化。判断程序是否正确。若发现问
题重返编辑界面,修改、存盘、汇编。返回调试界面调试通过。 3.实验报告
1)写出主程序流程图、子程序流程图、程序清单 2)根据记渌数据给程序加注解 3)调试心得
实验五 数制转换子程序
单字节二进制数转换为三位数的BCD码 B=D2×100+D1×10+D0
单字节二进制数应转换为BCD子程序 入口: (A)= 二进制数
出口: (R0)= 十位数和个位数的地址
DRFS:MOV B,#100
DIV AB ;(A)= 百位数 MOV @R0,A ; 存入RAM单元 INC R0 MOV A,#10 XCH A,B
DIV AB ;(A)= 十位、(B)= 个位 SWAP A
ADD A,B ;个位、十位拼字 MOV @R0,A ;存入RAM RET END
1、实验内容 将FFH转换为压缩BCD码存入内部 RAM 20H.21H单元(高位在前) FFH送ACC R0赋初值20H 调用DRFS SJMP $ DRFS子程序
2、实验步骤
1)打开PV32编程序。汇编正确进入调试界面。否则修改程序重新汇编直到通过。