1.设在内RAM 40H开始的存储区有若干个字符和数字,已知最后一个为字符“$“(并且只有一个,试统计这些字符数字的个数,结果存入30H单元中。
参考程序:
            ORG 0000H
        START:    MOV R1,#40H                R1作为地址指针
                CLR A                        A作为计数器
        LOOP:    CJNE @R1,#24H,NEXT        ;与“$”号比较,不等转移
                SJMP NEXT1                    ;到“$“结束循环
        NEXT:    INC A                        ;计数器加1
                INC R1                        ;指针加1
                SJMP LOOP                    ;循环
        NEXT1:    INC A                        ;再加入”$”这个字符
                MOV 30H,A                    ;存结果
                END
2.试编一程序,分别统计在内部RAM30H~50H单元的数据区中奇数和偶数的个数,并将奇数和偶数的个数分别存放在51H52H单元中。
参考程序:
            ORG 0000H
            MOV 51H #0H
            MOV 52# #0H
            MOV R1 #30H
            MOV R0 #20H
            MOV A@R1
            INC R1
            ANL A , #01H
            JZ LOOP1
            INC 51H
            SJMP LOOP2
    LOOP1:    INC 52H
    LOOP2:    DJNZ R0 , LOOP3
            RET
3.用8XX51P1口接8LED发光二极管,由    INT0接一消抖按键开关,开始的LED亮,以后由INT0按键每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。
请编制程序。
参考程序:   
ORG 0000H
                AJMP MAIN
                ORG 0003H
                RL A ;中断服务
                MOV P1,A
                RETI
        MAIN:    MOV A,#0FFH
                MOV P1,A ;第一灯亮
                SETB EA
                SETB EX0 ;允许INT0外部中断
                SETB IT0 ;中断触发方式为下降沿触发
                SJMP $ ;等待中断
4.设有100个有符号数,连续存放在以2000H为首地址的存储区中,试编程统计其中正数、负数、零的个数并分别存放在30H31H32H单元中。
MOV 30H,#0
MOV 31H,#0
MOV 32H,#0
MOV DPTR ,#2000H
MOV R1,#100
        L4:    MOVX A,@DPTR
            INC DPTR
                CJNE A,#0,L1
                INC 32H
                SJMP L2
        L2:        JC L3
                INC 30H
                SJMP L2
        L3:        INC 31H
        L2:        DJNZ R1,L4
                SJMP $
5.编程将内部数据存储器20H~24H单元压缩的BCD码转换成ASCⅡ存放在于25H开始的单元。
参考程序:注意压缩的BCD码为一个字节占两位BCD码。
    ORG 0000H
                MOV R7,#05H R7为转换字节数
                MOV R0,#20H R0为源操作数地址
                MOV R1,#25H R1为目的操作数地址
        NE:        MOV A,@R0
                ANL A,#0FH ;先取低位BCD
                ADD A,#30H ;将BCD码转换成ASCⅡ码
                MOV @R1,A
                INC R1
                MOV A,@R0
                ANL A,#0F0H ;取高位BCD
                SWAP A ;半字节交换
                ADD A,#30H ;将高位BCD码转换成ASCⅡ码
                MOV @R1,A
                INC R0
                INC R1
                DJNZ R7,NE
                SJMP $
                END
编程题,另外加上第4章课件上的例子。
三、程序解释(每小题5分,共10分)
1
ORG 0200H
                MOV DPTR,#1000H
            MOV R0,#20H
LOOP:    MOVX A,@DPTR
            MOV @R0,A
            INC DPTR
                    INC R0
            CJNE R0,#71H,LOOP
            SJMP $
程序功能:把片外数据存储器1000H~1050H中的内容传送到片内数据存储器 20H~70H中。
2            ORG 0200H
MOV AR0
                ANL A#0FH
                MOV DPTR#TAB
                MOVC A@A+DPTR
                MOV R0,A
                SJMP $
        TAB:    DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H; 0~9ASCⅡ码
                DB 41H,42H,43H,44H,45H,46H ;A~FASCⅡ码
程序功能:利用查表的方法实现RO中的十六进制数转换为ASCⅡ码
对每小题程序中划线的指令含义(或指令作用)进行解释,并说明程序的作用。
*********************************
1. 程序解释
          ORG      100H
    MOV      AR0          R0的内容送A       
    ANL      A#0FH
    MOV      R1A
        MOV      AR0
单片机编程100例详解    SWAP      A              A的内容高低4位交换
        ANL      A#0FH
    MOV      R2A             
    SJMP      $                ;等待           
          END
该程序的作用是:将原R0中数据按照高低4位分成两个字节,低位字节保存在R1中,高位字节保存到R2中。
2. 程序解释
              ORG      30H
MOV      R0#data1    data1R0           
    MOV      R1#data2
    MOV    R2#2
    CLR    C
LOOP    MOV    A@R0
SUBB      A@R1      ;(A-C-((R1))→A
    MOV      @R0A
    INC      R0
    INC      R1
DJNZ    R2LOOP    ;(R2-1不等于零,跳LOOP
    SJMP      $
    END
该程序的作用是:data1中的双字节数据减去data2中的双字节数据,结果
保存到data1
3. 程序解释
ORG    30H
VARDATA  30H
FUNC    DATA  31H
    MOV AVAR  30单元的内容送A
    JZ      DONE        A为零转移   
    JNB  POSI  A的最高位为0(正数)转移   
    MOV  A#0FFH    ;提示:0FFH表示-1           
    SJMP  DONE       
POSI    MOV  A #01H   
DONE    MOV  FUNCA