专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

单板机监控程序简介

作者:佚名   来源:本站原创   点击数:  更新时间:2007年10月02日   【字体:

(二)        单板机监控程序简介

1.      什么是监控程序?

单板机的底层管理程序,直接面向硬件,接受键盘命令,执行基本操作,并向用户提供子程序模块。

*                        研究监控程序,才能深入了解单板机的工作原理。

*                        监控程序是运用汇编语言的良好实例,分析监控程序可以学到许多基本的编程方法和软硬结合的系统设计技术。

*                        了解监控程序,以便调用其中的子程序,提高编程效率,

 

2.      单板机监控程序的基本功能

*                        系统初始化。

*                        提供人机对话界面,接受键盘命令,显示操作结果。

*                        执行键盘命令:

1)  状态设置

2)  检查、修改存储器的内容或I/O端口的输出。

3)  与上位机进行串行通信,传送数据或下载程序。

4)  存储器数据块传送。

5)  运行用户程序,可单步调试。

*                        提供常用运算、A/D转换及打印驱动等子程序。

 

3.  监控程序占用的资源

*                        监控程序存放在2764的前4k,0000H-0FFFH。

*                        工作寄存器用0区

*                        监控状态标志使用内部2FH单元。

*                        数据缓冲区使用30H-3FH

*                        堆栈栈底 40H

*                        显示缓冲区7EH-79H。

*                        使用INT0及T1中断。

4.      监控主程序分析

 

ORG    0000H

0000  00       NOP

0001  0130     AJMP   START

0003  C2A8    CLR  EX0                  ;INT0入口,用于单步执行。

0005  02039C        LJMP   PUSH_REG   ;转去单步现场保护。

                              ORG    000BH                ;T0中断入口

000B  02200B   LJMP  200BH         ;转至200BH,向用户开放。

                              ORG    0013H                ;INT1入口

0013  022013   LJMP   2013H              ;转至2013H,向用户开放。

                          ORG      001BH            ;T1中断入口

001B  020BB2  LJMP   0BB2H           ;监控占用,转去打印控制。

               ORG 0023H                ;串行口中断入口

0023  022023   LJMP   2023H             ;转至2023H,向用户开放。

;*****************  监控程序初始化  *********************

                            ORG  0030H

0030  7879  START: MOV  R0,#79H       ;监控初始化程序段

0032  7601             MOV  @R0,#01H   ;送“CPU-51”显示代码。

0034  08               INC    R0

0035  7605             MOV  @R0,#05H

0037  08        INC    R0

0038  7614            MOV  @R0,#14H

003A  08              INC    R0

003B  761C          MOV  @R0,#1CH

003D  08              INC    R0

003E  7610            MOV  @R0,#10H

0040  08        INC    R0

0041  760C            MOV  @R0,#0CH

0043  758140          MOV  SP,#40H        ;堆栈指针初值设为40H。

0046  7400             MOV  A,#00H         ;监控用的存储单元清零。

0048  F52F            MOV  2FH,A           ;状态标志单元2FH清零。

004A  7830            MOV  R0,#30H       ;30H—3FH单元清零。

004C  7910            MOV  R1,#10H

004E  F6    START0: MOV   @R0,A

004F  08               INC    R0

0050  D9FC           DJNZ R1,START0

;****************   监控开始,等待键命令  *******************

0052  1204AF  MONITOR: LCALL    KEY_SCAN ;扫描键盘。

0055  7005              JNZ   KEY_PROC         ;有键则转键处理。

0057  1204D0          LCALL    DISPLAY           ;维持显示。

005A  0152                 AJMP    MONITOR

005C  120340  KEY_PROC: LCALL   OFF_DISP    ;键命令处理程序。

005F  120460   K_P1:LCALL      KEY_GET

0062  20E40D                JB ACC.4,COMMAND;功能键,转命令处理。

0065  857D7E             MOV  7EH,7DH                 ;数字键,送显示。

0068  857C7D            MOV  7DH,7CH

006B  857B7C            MOV  7CH,7BH

006E  F57B               MOV  7BH,A

0070  015F                AJMP K_P1

0072  5407   COMMAND:  ANL   A,#07H           ;命令分析。

0074  F8                  MOV  R0,A        ;命令功能参见附录五。

0075  23                   RL    A

0076  28                   ADD  A,R0

0077  90007B             MOV  DPTR,#FUNCTION

007A  73                  JMP   @A+DPTR ;用散转指令转相应分支。

007B  02024E  FUNCTION:  LJMP MOV         ;转MOV命令分支。

007E  0200A0             LJMP DOWN            ;转MON命令分支。

0081  0201B1             LJMP WRIT         ;转WRI命令分支。 

0084  020161              LJMP READ          ;转RDS命令分支。

0087  0200AF             LJMP EXEC        ;转EXE命令分支。

008A  0200E6             LJMP EXAM             ;转EXA命令分支。

008D  020209             LJMP F                ;转 [F] 命令分支。

0090  0201FB             LJMP UP                 ;转USE命令分支。

 

;*********************  MON 命令分支  *********************

                               ORG  00A0H

00A0  11A5       DOWN:   ACALL    DOWND         

00A2  020052             LJMP MONITOR

00A5  120340     DOWND: LCALL    OFF_DISP        

00A8  757E10             MOV  7EH,#10H      

00AB  752F00            MOV  2FH,#00H    ;监控标志置待命状态0。

00AE  22                  RET                  ;即 78H位 = 0 。

;*************  EXE 命令分支  *****************

00AF  307803  EXEC:   JNB   78H,EXECD ;待命方式0,转连续执行。

00B2  020520             LJMP STEP       ;待命方式1,转单步执行。

00B5  11BE   EXECD:   ACALL    EXECS        

00B7  020052             LJMP MONITOR

转载须保留地址:http://www.51hei.com/mcu/291.html

;***************  USE 命令分支  ***********************

01FB  5100       UP:  ACALL    UPS

01FD  020052             LJMP MONITOR

0200  D278       UPS:     SETB 78H

0202  120340              LCALL    OFF_DISP

0205  757E1B             MOV  7EH,#1BH

0208  22                   RET

 

;***************  取键值子程序  ************************


           ORG  0460H

KEY_GET:ACALL   KEY_SCAN

    JNZ      K_G1

    LCALL      DISPLAY

    AJMP    KEY_GET

K_G1:      LCALL    DISPLAY

    LCALL    DISPLAY

    LCALL    KEY_SCAN

    JNZ     K_G2

    LCALL  DISPLAY

    AJMP    KEY_GET

K_G2:      MOV  R2,#0FEH

     MOV   R4,#00H

K_G3:      MOV  DPTR,#6000H

    MOV     A,R2

    MOVX  @DPTR,A

    MOV     A,P1

    JB  ACC.0,LINE1

    MOV     A,#00H

    AJMP    K_G_END

LINE1:  JB     ACC.1,LINE2

    MOV     A,#08H

    AJMP    K_G_END

  LINE2:JB  ACC.2,NEXT_COL

          MOV    A,#10H

K_G_END:     ADD  A,R4

           PUSH ACC

KEY_FREE:   LCALL    DISPLAY

          ACALL KEY_SCAN

          JNZ     KEY_FREE

          POP     ACC

          RET

NEXT_COL:   INC   R4

          MOV    A,R2

      JNB   ACC.7,KEY_NEXT

          RL       A

          MOV    R2,A

          AJMP   K_G3

KEY_NEXT:   AJMP KEY_GET

KEY_SCAN:   MOV  DPTR,#6000H

          MOV    A,#00H

          MOVX @DPTR,A

          MOV    A,P1

          CPL     A

          ANL     A,#07H

          RET


;***************    显示扫描子程序  ******************

DIS0000: MOV A,#0FFH          ;显示准备

MOV DPTR,#8000H

MOVX @DPTR,A

MOV  R0,#79H

MOV  R3,#01H

AJMP DIS0001

                           ORG 04D0H

DISPLAY:  AJMP  DIS0000

DIS0001:  MOV   A,R3

DISPLAY1: MOV   DPTR,#6000H

04D6  F0                   MOVX  @DPTR,A

04D7  E6                  MOV   A,@R0

04D8  2419                    ADD   A,#19H

04DA  83                  MOVC  A,@A+PC

04DB  908000             MOV   DPTR,#8000H

04DE  F0                  MOVX  @DPTR,A

04DF  91EB               ACALL  DELAY

04E1  08                   INC    R0

04E2  EB                  MOV   A,R3

04E3  20E504              JB     ACC.5,DISPLAY2

04E6  23                   RL        A

04E7  FB                  MOV   R3,A

04E8  81D3                AJMP   DISPLAY1

04EA  22      DISPLAY2: RET

;*****  延时子程序

04EB  7F02       DELAY: MOV    R7,#02H

04ED  7EFF      DELAY1: MOV      R6,#0FFH

04EF  DEFE      DELAY2: DJNZ    R6,DELAY2

04F1  DFFA                DJNZ     R7,DELAY1

04F3  22                   RET

;*******字形码表

DB     0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H

DB     90H,88H,83H,0C6H,0A1H,86H,8EH,8CH,0DEH

DB     0F3H,91H,0BFH,7FH,0FFH,00H,0AFH,0A3H,00H

DB     0CH,0C1H,40H,79H,24H,30H,19H,12H,02H,78H,00H,10H

关闭窗口

相关文章