视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
51单片机汇编程序2
2025-09-25 14:09:42 责编:小OO
文档
§2.3.2 软件结构及程序设计

一、主程序及其说明

                ORG     0000H

                AJMP    MAIN            ;主程序

                ORG     0003H

                AJMP    X0S                ;外部中断入口

                ORG     000BH

                LJMP    T0S                ;定时器T0中断入口

                ORG     001BH

                AJMP    T1S                ;定时器T1中断入口

                ORG     0023H

                LJMP    SSV                ;串行中断入口

                ORG     0030H

MAIN:       CLR EA

                MOV SP, #50H

                MOV A,  48H                ;48H、49H单元为冷热启动标志单元

                CJNE A, #0AAH,  LRE        ;如等于0AAH、55H,则说明为热启动

                MOV A,  49H             ;否则,为冷启动,则进行自检

                CJNE A, #55H,   LRE

                SJMP    HRE

LRE:        LCALL ZJ                ;冷启动,则自检

SETD:       MOV 48H,#0AAH            ;自检完后,设置为热启动标志字节

                MOV 49H,#55H

HRE:        MOV A,  P1                ;读判采样周期档位

                ANL A,  #0FH

                XRL A,  #09H        

                JZ  M17                    ;数据掉电保护故不进行采样,分析原数据          

                SJMP M18

M17:        CLR P3.5

                AJMP M19

M18:        MOV R7, #00H            ;非掉电保护方式,则将所有采样数据单元

                MOV DPTR,#8020H            ;清0

                MOV R6, #00H

                MOV A,  R6

M20:        MOVX @DPTR,A

                INC R7

                INC DPTR

                CJNE R7,#00H,   M20

M21:        MOV  R7,#19H

                MOV DPTR, #8000H

                MOV A,  #14H

M1:         MOVX @DPTR, A

                INC  DPTR

                DJNZ R7,M1

                SETB IT0

                CLR P3.5

                MOV TMOD,#11H

M0:         MOV A,  P1

                ANL A,  #0FH

                JNZ M2

                MOV TH0,#0FFH            ;由T0设置采样周期

                MOV TL0,#0F6H

                MOV 3EH,#02H

                AJMP M10

M2:         JB ACC.3,M10

                JB ACC.2,M8

                JB ACC.1,M7

                MOV TH0,#0FFH

                MOV TL0,#0CEH

                MOV 3EH,#00H

                AJMP M9

M8:         JB ACC.1,M6

                JB ACC.0,M5

                MOV TH0,#0FCH

                MOV TL0,#18H

                MOV 3EH,#10H

                AJMP M9

M7:         JB ACC.0,M4

                MOV TH0,#0FFH

                MOV TL0,#9CH

                MOV 3EH,#01H

                AJMP M9

M6:         JB ACC.0,M3

                MOV TH0,#0ECH

                MOV TL0,#78H

                MOV 3EH,#13H

                AJMP M9

M5:         MOV TH0,#0F8H

                MOV TL0,#30H

                MOV 3EH,#12H

                SJMP M9

M4:         MOV TH0,#0FEH

                MOV TL0,#0CH

                MOV 3EH,#03H

                SJMP M9

M3:         MOV TH0,#0D8H

                MOV TL0,#0F0H

                MOV 3EH,#11H

                SJMP M9

M10:        LCALL ERR

                AJMP M0

M9:         MOV 3CH,TL0

                MOV 3DH,TH0

                MOV A,  3EH

                MOV DPTR,#8019H

                MOVX @DPTR,A

                MOV IE, #8BH

                MOV IP, #02H

                CLR 00H            ;等待INT0采样中断

M11:        JNB 00H,M11

                MOV IE, #88H

M23:        MOV DPTR,#0E000H

                MOVX A, @DPTR

                MOV A,  P1

                ANL A,  #0F0H

                MOV DPTR,#801AH

                MOVX @DPTR,A

M19:        MOV IE, #88H

                ACALL ST2          ;建立TB2显示内容表

                ACALL CALS               ;计算信号峰值、均值、脉宽  

                LCALL TRS         ;工程量转换

M12:        MOV DPTR,#0F000H

                MOVX A, @DPTR

                MOV A,  P1               ;读显示方式开关

                JB ACC.4, M13

                ACALL SD               ;固定显示

                SJMP M12

M13:        JB ACC.5, M14

                LCALL XPD               ;分页显示

                SJMP M12

M14:        JB ACC.6, M15

                LCALL SLD               ;滑移显示

                SJMP M12

M15:        JB ACC.7, M16

                ACALL DCH               ;字符显示,将分析结果显示在示波器上

                SJMP M12

M16:        JB P3.4, M12           ;是否通信?=0,说明要通信            

                JB P3.3, M16           ;开始通信?=0,说明开始通信     

;数据通信,以便在上位机上进行数据硬拷贝、FFT分析等

                LCALL SENT             ;数据向上位机发送通信

                SJMP M12 

外部中断INT0中断服务程序清单如下:

X0S:        MOV DPTR, #2000H    ;启动A/D转换

            MOVX @DPTR, A

            SETB TR0            ;启动T0定时

            MOV 3AH, #20H        ;存储区首地址0020H

            MOV 3BH, #00H

            MOV R7, #00H        ;存储计数器送初值1024

            MOV R6, #04H

            CLR 70H                ;系统自检标志清除,即为正常的工作程序而非自检

X0S0:    CLR 01H

X0S1:    JNB 01H, X0S1        ;等待T0定时中断

            CJNE R6, #00H, X0S0    ;1024个数据全部采样完成?

            CJNE R7, #00H, X0S0    ;否,则继续采集

            CLR TR0                ;是,则停T0

            CLR EX0                ;关外中断INT0

            SETB 00H

            RETI

定时器TIMER0中断服务程序清单如下:

T0S:        JNB 70H, T0S1        ;判是否为系统自检(其中的中断系统)

            CLR 70H                ;是,则清标志后直接返回

            RETI

T0S1:    SETB 01H        

            CLR TR0                ;停止T0

            MOV TH0, 3DH        ;送T0原时间常数

            MOV TL0, 3CH

            SETB TR0            ;启动T0定时

            MOVX A, @DPTR        ;读入A/D结果

            MOV DPH, 3BH        ;按指针存储

            MOV DPL, 3AH

            MOVX @DPTR, A

            INC DPTR            ;指向下一个单元

            MOV 3BH, DPH        ;指针保护

            MOV 3AH, DPL

            MOV DPTR, #2000H    ;指向A/D接口

            DEC R7                ;存储计数器减1

            CJNE R7, #0FFH, T0S2

            DEC R6

T0S2:    RETI

2.显示字符与汉字的程序实现

;***********************************************************************

;显示字符示例子程序,程序中的TB1、TB2、TB3三表分别为

;TB1:各字符的显示点阵在字库中的首地址表,在内部EEPROM中

;TB2:各字符的代码表,在外部RAM中,由子程序建立,例如:0AH代表“峰”

;TB3:各字符的位置坐标,在内部EEPROM中

;***********************************************************************

DCH:    MOV R0,    #00H            ;当前显示字符序号指针

DCH1:    MOV DPTR, #0000H        ;查TB2表得当前显示字符的代码

      MOV A,    DPL        

      ADD A,    R0

      MOV DPL,A

      JNC DCH2

      INC DPH

DCH2:    MOVX A,    @DPTR        ;送存30H单元

      MOV 30H,A

      CJNE A,    #14H,    DCH3    ;非空格码转DCH3

      AJMP DCH7                ;是空格码转DCH7

DCH3:    MOV A,    R0                ;查TB3表得显示字符的位置坐标

      ADD A,    0E0H

      PUSH ACC

      MOV DPTR, #0630H

      MOVC A,    @A+DPTR

      MOV 31H,A                ;位置X坐标送存31H

      POP ACC

      INC ACC

      MOVC A,    @A+DPTR

      MOV 32H,A                ;位置Y坐标送存32H

      MOV A,    30H                ;查TB1表得字符点阵在字库中的地址

      ADD A,    30H

      PUSH ACC

      MOV DPTR, #0600H

      MOVC A,    @A+DPTR

      MOV 33H,A                ;地址高字节送33H

      POP ACC

      INC ACC                

      MOVC A,    @A+DPTR

      MOV 34H,A                ;地址低字节送34H

      MOV DPH,33H            ;取本字符光点数送R1

      MOV DPL,34H

      MOV A,    #00H

      MOVC A,    @A+DPTR

      MOV R1,    A

DCH4:    INC DPTR                ;取光点坐标数据

      MOV A,    #00H

      MOVC A,    @A+DPTR    ;光点X坐标送R7

      ANL A,    #0F0H

      SWAP A

      ADD A,    31H

      MOV R7,    A

      MOV A,    #00H            ;光点Y坐标送R6

      MOVC A,    @A+DPTR

      ANL A,    #0FH

      ADD A,    32H

      MOV R6,    A

      PUSH DPH

      PUSH DPL

      MOV DPTR, #4000H        ;输出光点X坐标

      MOV A,    R7

      MOVX @DPTR,A

      MOV DPTR, #6000H        ;输出光点Y坐标

      MOV A,    R6

      MOVX @DPTR,A

      MOV DPTR, #8000H        ;X、Y同时输出至CRT

      MOVX @DPTR, A

      DEC R1                    ;光点计数器减1

      CJNE R1, #00H,    DCH5    ;本字符显示完未成,转显示下个点

      SJMP DCH6

DCH5:    POP DPL

      POP DPH

      AJMP DCH4

DCH6:    POP DPL                    ;恢复指针

      POP DPH

DCH7:    INC R0                    ;序号指针增1

      CJNE R0, #19H,    DCH8    ;一帧未完成转显示下个字符

      RET                        ;一帧完成,则返回

DCH8:    AJMP DCH1

5.程序设计示例

;*************************************************************************

;滑移显示子程序,具有暂停功能,在CRT右上角显示对应页号.

;*************************************************************************

SLD:    MOV DPTR,#0020H    ;数据指针初值0020H

    MOV TH1, #0FFH        ;送T1时间常数,每点50us

            MOV TL1, #0EEH

        MOV 46H, #0FFH

        MOV 45H, #0EEH

            SETB ET1            ;开放T1中断

SLD0:    MOV R7,#00H        ;每帧点数计数器清零

    PUSH DPH            ;保护数据指针

            PUSH DPL

        SETB TR1            ;启动T1

SLD1:    CLR 02H            

SLD2:    JNB 02H,SLD2        ;等待T1中断

            MOVX A,@DPTR        ;按指针取数

        PUSH DPH

            PUSH DPL

        MOV DPTR,#6000H    ;向Y轴输出

            MOVX @DPTR, A

        MOV A, R7

            MOV DPTR, #4000H    ;向X轴输出

        MOVX @DPTR, A

            MOV DPTR, #8000H    ;同时联合输出到CRT

        MOVX @DPTR, A

            POP DPL

        POP DPH

            INC DPTR            ;指向下个数据

        INC DPTR            ;计数器减1

            INC R7

            CJNE R7, #00H, SLD1    ;本帧(256个数据)未完成则循环

SLD3:    POP DPL                ;恢复数据指针

        POP DPH

            MOV A, DPL            ;判是否已到数据末地址(即最后一个数据)

        CJNE A, #20H, SLD4    ;未到,修改数据指针初值转显示下帧

            MOV A,    DPH

        CJNE A, #04H, SLD4

            CLR ET1                ;滑移显示完成,关T1

        LR TR1

            RET

SLD4:    JNB P3.0, SLD0        ;是暂停?是则转SLD0

            INC DPTR            ;否则继续滑移显示

        SJMP SLD0

    

串行通信中断服务子程序清单及其说明如下:

SSV:    CLR TI                ;清发送中断标志

            DEC R7                ;计数器减1

            CJNE R7, #0FFH, SSV1

            DEC R6

SSV1:    CJNE R6, #00H, SSV2    ;计数器非0,则转SSV2

            CJNE R7, #00H, SSV2

            CLR ES                ;为0,则发送完成,关串行中断

            SJMP SSV3

SSV2:    INC DPTR            ;指向下一个数据

            MOVX A, @DPTR    ;取数

            LCALL XSS            ;补校验位后发送

SSV3:    RETI

补校验位并发送子程序清单:

XSS:    ADD A, #00H            ;加入校验位

            MOV C, P

            MOV TB8, C

            MOV SBUF, A        ;发送

            RET

 下载本文

显示全文
专题