1 双字节无符号数加法例1: 双字节无符号数加法(R0 R1)+(R2 R3) → (R4 R5),R0、 R2、 R4存放16位数的高字节, R1、 R3、 R5存放低字节。
已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h)假设其和不超过16位。
请编程。
org 0000hLjmp startorg 0050hstart:mov R0,#93hmov R1, #79hmov R2,#25hmov R3, #0a4hmov A,R1ADD A,R3mov R5,Amov A,R0ADDC A,R2mov R4,Ass: jmp ssend2双字节无符号数减法例2: 双字节无符号数相减(R0 R1)-(R2 R3) → (R4 R5)。
R0、 R2、R4存放16位数的高字节, R1、 R3、 R5存放低字节,已知(R0 R1)=(93h,79h);(R2 R3)=(25h,a4h);请编程。
同学自己可以设置被减数与减数数值org 0000hLjmp startorg 0050hstart:mov R0,#93hmov R1,#79hmov R2,#25hmov R3,#0a4hmov A,R1CLR CSUBB A,R3mov R5,Amov A,R0SUBB A,R2mov R4,Ass: jmp ssend3双字节数乘以单字节数例3: 利用单字节乘法指令,进行双字节数乘以单字节数运算。
若被乘数为16位无符号数, 地址为M1(30H) 和M1+1(31H)(低位先、高位后), 乘数为8位无符号数, 地址为M2(32H), 积由高位到低位存入R2、 R3和R4三个寄存器中。
30H,31H,32H内容 12H,34H,56H ;org 0000hLjmp startorg 0050hstart:mov 30h,#12hmov 31h,#34hmov 32h,#56hmov a,(30h)mov b,(32h)mul abmov R3,bmov R4,amov a,(31h)mov b,(32h)mul abadd A,R3mov R3,Amov A,bADDC A,#00hmov R2,Ass: jmp ssend4. 把8位二进制数转换为3位BCD例4: 利用除法指令把累加器A中的8位二进制数转换为3位BCD 数, 并以压缩形式存放在地址M1、 M2单元中。
设A中放A8H ,M1、 M2单元地址是 30H,31Horg 0000hLjmp startorg 0050hstart:mov A ,#0A8hmov b,#64hdiv Abmov (30h),Amov A,bmov b,#0Ahdiv Abswap Aadd A,bmov (31h),Ass: jmp ssend5双字节压缩BCD码加法例6: 双字节压缩BCD码加法。
设R5(高)、 R4(低)为被加数; R3(高)、 R2(低)为加数, 相加和的结果存入: R6(万)、 R5(千、百)、 R4(十、个)。
被加数98H,76H;加数 54H,32Horg 0000hLjmp startorg 0050hstart:mov R5,#98h ;R5mov R4,#76h ;R4mov R3,#54h ;R3mov R2,#32h ;R2mov A,R4add A,R2DA Amov R4,Amov A,R5ADDC A,R3DA Amov R5,Amov A,#0hmov R6,#0haddc a,R6mov R6,Ass: jmp ssend6 利用DPTR取数据,并保持DPTR原数不变例6: 若在外部ROM/EPROM中2000H单元开始依次存放0~9的平方值, 原来数据指针(DPTR)=3A00H, 请用查表指令取出2003H单元的数据后, 要求保持DPTR中的内容不变。
org 0000hLjmp startstart:mov DPTR,#3a00hpush DPHmov DPTR,#TABLEmov a, #03hmovc a,@A+DPTRpop DPHss: jmp ssorg 2000hTABLE: DB 0,1,4,9,16,25,36,49,64,81End7 16 位数的算术左移16 位数的算术左移。
16位数在内存中低 8 位存放在M1单元, 高 8 位存放在M1+1单元。
16位数是1234H ,M1为30H,M2为31Horg 0000hljmp startorg 0050hstart:mov (30h),#34Hmov (31h),#12hmov a,30hmov b,#02hmul abmov 30h,amov r1,bmov a,31hmov b,#02hmul abadd a,r1mov 31h,ass:jmp ssend8 比较内部RAM I、J单元中A、B两数的大小例 3: 比较内部RAM I、 J单元中A、 B两数的大小,设A、 B数均为带符号数, 以补码数存入I、 J中, 若A=B, 则使内部RAM的位K 置 1; 若A≠B, 则大数存M单元, 小数存N单元。
设内部RAM I、 J 是30H,40H;(A)=58H,(B)=97HM单元=50H,N单元=60H,位K=00H该带符号数比较子程序的比较过程示意图如图 3 ― 9 所示。
org 0000hljmp startorg 0050hstart:mov (30h),#58hmov (40h),#58hmov a,30hanl a,#80hjnz m ;a<0mov a,40hanl a,#80hjnz m2 ;b<0mov a,(40h) ;两个数字都大于0的情况subb a,(30h)jz m3jnc m1jc m2n1: ;两个数字都小于0的情况 mov a,(40h)subb a,(30h)jz m3jnc m2jc m1m: mov a,40hanl a,#80hjnz n1 ;b<0m1: mov (50h),(40h)mov (60h),(30h)jmp ssm2: mov (50h),(30h)mov (60h),(40h)jmp ssm3: mov (00h),#1ss:jmp ssend9 双字节压缩BCD码转换成二进制码例 2: 双字节压缩BCD码转换成二进制码子程序。
提示: 该转换的算法为: (d3d2d1d0)BCD=(d3×10+d2)×100+(d1×10+d0)实现该算法的参考子程序如下:入口: R5(千位、百位)、R4(十位、个位)为BCD码。
出口: R5R4(16 位无符号二进制整数)。
org 0000hljmp startorg 0050hstart:mov r5,#10hmov r4,#10hljmp BCD2Borg 2000hBCD2B:mov a,r5anl a,#0F0hswap amov b,#0ah;b>>10mul abmov r3,a ;暂存相乘结果 mov a,r5anl a,#0fhadd a,r3mov b,#64h;b>>100mul abmov r5,bmov r3,amov a,r4anl a,#0F0hswap amov b,#0ah;b>>10mul abmov r2,a ;暂存相乘结果 mov a,r4anl a,#0fhadd a,r2add a,r3mov r4,ass: ljmp ssend10 冒泡排序有8个数据存放在20H为首地址的内部RAM,进行升序排列编程,原始数据:39,27,13,44,78,22,6,51;设R7 为比较次数计数器,初始值为07H,F0为标志位,F0=0表明无互换发生,F0=1表明有互换发生org 0000hljmp startorg 0050hstart:mov (20h),#39;27hmov (21h),#27 ; 1Bhmov (22h),#13 ;0DHmov (23h),#44 ;2CHmov (24h),#78 ;4EHmov (25h),#22 ; 16Hmov (26h),#6 ; 06Hmov (27h),#51 ;33Ha0: mov r0,#20hmov r1,#1fhmov r7,#07hclr f0clr ca1:mov a,@r0inc r0inc r1mov b,asubb a,@r0jc a3a2: mov a,bxch a,@r0 mov @r1,a setb f0a3: djnz r7,a1 jb f0, a0ss: ljmp ssEnd11中断方式下定时器应用设计设单片机的晶振为12MHz,,定时器0方式0工作,产生1ms定时,在P1.0引脚上输出周期为2ms的方波,中断方式完成,试设计程序。
org 000BHLJMP INTorg 2000Hljmp startstart:mov TMOD ,#00Hmov th0 , #1chmov tl1 ,#18hsetb EAsetb ET0setb TR0sjmp $INT: CPL p1.0 ;输出方波MOV TH0,#1ch ;重新装入计数初值,如果是方式2就不需要重装。
MOV TL0,#18hRETIss:jmp ssend12查询方式下定时器应用设计设单片机的晶振为12MHz,,定时器0方式0工作,产生1ms定时,在P1.0引脚上输出周期为2ms的方波,查询方式完成,试设计程序。
org 2000Hljmp startstart:mov TMOD ,#00Hmov th0 , #1chmov tl1 ,#18hmov a,#00hmov IE ,#00Hsetb TR0loop: jbc tf0 ,loop1sjmp looploop1:clr tf0CPL p1.0 ;输出方波inc aMOV TH0,#1ch ;重新装入计数初值,如果是方式2就不需要重装。
MOV TL0,#18hsjmp loopss:jmp ssEnd13中断方式下定时器应用设计设片内RAM的70H单元的初值为01H,要求每1秒钟将其内容左环移一位,采用定时器T1,采用定时方式1,晶振频率为6MHz。
中断方式完成,试设计程序。
ORG 0000HLJMP MAINORG 001BH ;T1中断入口LJMP INT ;转至INT处ORG 2000H ;主程序MAIN:MOV TMOD,#10H ;T1工作于方式1MOV TH1,#3CH ;设置计数初值MOV TL1,#0B0HSETB EA ;CPU开中断SETB ET1 ;允许T1中断SETB TR1 ;启动T1定时MOV 70h,#01H ;将初值送入70H单元中MOV R0,#0AH ;设置软件计数器HALT: SJMP HALT ;等待中断INT: DJNZ R0,NEXT ;中断服务程序MOV A,70H ;时间已到,将70H单元内容送ARL A ;左环移一位MOV 70H,A ;回送MOV R0,#0AH ;重新设置软件计数器NEXT:MOV TH1,#3CH ;重新设置计数初值 MOV TL1,#0B0HRETI ;中断返回ss:jmp ssEND。