⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 light control.asm

📁 基于16F877A的路灯控制系统的设计
💻 ASM
📖 第 1 页 / 共 5 页
字号:
        MOVLW  'H'
        CALL   PUTCLCD
        MOVLW  'O'
        CALL   PUTCLCD
        MOVLW  'O'
        CALL   PUTCLCD
        MOVLW  'S'
        CALL   PUTCLCD
        MOVLW  'E'
        CALL   PUTCLCD
        MOVLW  ' '
        CALL   PUTCLCD
        MOVLW  'M'
        CALL   PUTCLCD
        MOVLW  'O'
        CALL   PUTCLCD
        MOVLW  'D'
        CALL   PUTCLCD
        MOVLW  'E'
        CALL   PUTCLCD
        MOVLW  ' '
        CALL   PUTCLCD
        MOVLW  '3'
        CALL   PUTCLCD
        MOVLW  ' '
        CALL   PUTCLCD
        CALL   PUTCLCD
        MOVLW  30H
        ADDWF  STATE,W
        CALL   PUTCLCD
        RETURN


;**********************************
;BIN2到BCDT的变换子程序
;入口参数:M_INPUT
;出口参数:OUTPUT1: 个位的ASCII,OUTPUT2:十位的ASCII
;**********************************
BIN2BCDT
        CLRF   OUTPUT1
        MOVF   M_INPUT,W
        MOVWF  OUTPUT2
TTENCH
        MOVLW  0AH
        SUBWF  OUTPUT2,W
        BTFSS  STATUS,C
        GOTO   OVER0
        MOVWF  OUTPUT2
        INCF   OUTPUT1,F
        GOTO   TTENCH
OVER0   
        MOVLW  30H
        IORWF  OUTPUT2,F
        IORWF  OUTPUT1,F
        RETURN


;*****************************************************
;数学运算子程序部分
;*****************************************************
;*****************************************************
;****************************************
;乘法子程序
;入口参数:MULTIPLY1H,MULTIPLT1L,MULTIPLY2H,MULTPLY2L
;出口参数:RESULTHH,RESULTH,RESULTL分别存放
;乘法运算后的高8位和低8位
;****************************************
M_MULTIPLY
   GLOBAL  M_MULTIPLY
   MOVF    MULTIPLY1,W
   MOVWF   MMIDL
   CLRF    MMIDH
   CLRF    MRESULTH
   CLRF    MRESULTL
   BCF     STATUS,C
   BTFSC   MULTIPLY2,0
   CALL    ADD16
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD1
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD1
   BTFSC   MULTIPLY2,1
   CALL    ADD16
   RLF     MMIDH,F
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD2
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD2
   BTFSC   MULTIPLY2,2
   CALL    ADD16
   RLF     MMIDH,F
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD3
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD3
   BTFSC   MULTIPLY2,3
   CALL    ADD16
   RLF     MMIDH,F
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD4
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD4
   BTFSC   MULTIPLY2,4
   CALL    ADD16
   RLF     MMIDH,F
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD5
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD5
   BTFSC   MULTIPLY2,5
   CALL    ADD16
   RLF     MMIDH,F
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD6
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD6
   BTFSC   MULTIPLY2,6
   CALL    ADD16
   RLF     MMIDH,F
   RLF     MMIDL,F
   BTFSS   STATUS,C
   GOTO    MMADD7
   MOVLW   01H
   ADDWF   MMIDH,F
   BCF     STATUS,C
MMADD7
   BTFSC   MULTIPLY2,7
   CALL    ADD16
   RETURN

ADD16
;完成乘法程序中,移位后的数据和移位前的数据
;求和的运算
   MOVF    MMIDH,W
   ADDWF   MRESULTH,F
   MOVF    MMIDL,W
   ADDWF   MRESULTL,F
   BTFSS   STATUS,C
   GOTO    OVERADD16
   MOVLW   01H
   ADDWF   MRESULTH,F
OVERADD16
   BCF     STATUS,C
   RETURN
;****************************************

;**********************************************
;除法程序,完成的是16位除16位的程序
;入口参数,DIVIDEDH,DEVIDEDL,存放被除数
;          DIVIDEH,DIVIDEL 存放除数
;出口参数,DRESULTH,DRESULTL,存放商
;          DIVIDEDH,DEVIDEDL,存放余数
;程序说明:先测试出除数第一位不是0的位的位置。并用DCOUNT存放,如果是高位的第N位
;则作为整个被除数的第8+N位处理。例如DIVIDEH的D3位,为整个除数的D10位。同时给16位辅助变量
;XORCOUNT辅值。它的特点是只有一位是1,其余的都是0。它的初值为1的位就是除数第一位为一的位。
;两个变量的值根据不同的除数确定以后,开始把除数向移位。直到高字节的D7位为1。移动用循环控制
;控制变量是DCOUNT的复制品DCOUNT1,两个变量值相等,DCOUNT1是为了保护DCOUNT值,以便以后使用
;最后是正式的运算。用被除数减移位后的除数。先减高字节,高字节相等,再减低字节。如果被除数
;高字节大则商1,小则再移位比较。如果高字节不相等,有两种情况:一是被除数高字节小,则直接
;则直接移位再减。如果被除数高字节大,则先减低字节,如果有借位则高字节减一,再减高字节。
;减后的结果存放到中间变量DMIDH,DMIDL中。防止高字节也有借位(说明不能除,商0)。如果高字节无
;借位,则说明对应的位应该商1。则将DMIDH,DMIDL的值存到DIVIDEH,DIVIDEL中,已进行下次运算。
;同时用XORCOUNT与结果异或,就可以将相应应该商1的位置1。最后将循环控制变量DCOUNT1减1,XORCOUNT
;右移。监测是否进行下次循环。先减高字节的方法防止了先减低字节的情况下,如果高字节相等而且被除数
;低字节小时,先减低字节其会向高字节借位使高字节
;在减之前发生变化,计算出错。
;**********************************************
M_DIVIDE
   CLRF    XORCOUNTH
   CLRF    XORCOUNTL
   CLRF    DRESULTH
   CLRF    DRESULTL
   MOVF    DIVIDEH,W
   MOVWF   DMIDH
   MOVF    DIVIDEL,W
   MOVWF   DMIDL
   BTFSC   DMIDH,7
   GOTO    REMOVE0
   BTFSC   DMIDH,6
   GOTO    REMOVE1
   BTFSC   DMIDH,5
   GOTO    REMOVE2
   BTFSC   DMIDH,4
   GOTO    REMOVE3
   BTFSC   DMIDH,3
   GOTO    REMOVE4
   BTFSC   DMIDH,2
   GOTO    REMOVE5
   BTFSC   DMIDH,1
   GOTO    REMOVE6
   BTFSC   DMIDH,0
   GOTO    REMOVE7
   BTFSC   DMIDL,7
   GOTO    REMOVE8
   BTFSC   DMIDL,6
   GOTO    REMOVE9
   BTFSC   DMIDL,5
   GOTO    REMOVE10
   BTFSC   DMIDL,4
   GOTO    REMOVE11
   BTFSC   DMIDL,3
   GOTO    REMOVE12
   BTFSC   DMIDL,2
   GOTO    REMOVE13
   BTFSC   DMIDL,1
   GOTO    REMOVE14
   BTFSC   DMIDL,0
   GOTO    REMOVE15

REMOVE0
   MOVLW   00H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,0
   GOTO    TARTREMOVE
REMOVE1
   MOVLW   01H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,1
   GOTO    TARTREMOVE
REMOVE2
   MOVLW   02H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,2
   GOTO    TARTREMOVE
REMOVE3
   MOVLW   03H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,3
   GOTO    TARTREMOVE
REMOVE4
   MOVLW   04H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,4
   GOTO    TARTREMOVE
REMOVE5
   MOVLW   05H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,5
   GOTO    TARTREMOVE
REMOVE6
   MOVLW   06H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,6
   GOTO    TARTREMOVE
REMOVE7
   MOVLW   07H
   MOVWF   DCOUNT
   BSF     XORCOUNTL,7
   GOTO    TARTREMOVE
REMOVE8
   MOVLW   08H
   MOVWF   DCOUNT
   BSF     XORCOUNTH,0
   GOTO    TARTREMOVE
REMOVE9
   MOVLW   09H
   MOVWF   DCOUNT
   BSF     XORCOUNTH,1
   GOTO    TARTREMOVE
REMOVE10
   MOVLW   0AH
   MOVWF   DCOUNT
   BSF     XORCOUNTH,2
   GOTO    TARTREMOVE
REMOVE11
   MOVLW   0BH
   MOVWF   DCOUNT
   BSF     XORCOUNTH,3
   GOTO    TARTREMOVE
REMOVE12
   MOVLW   0CH
   MOVWF   DCOUNT
   BSF     XORCOUNTH,4
   GOTO    TARTREMOVE
REMOVE13
   MOVLW   0DH
   MOVWF   DCOUNT
   BSF     XORCOUNTH,5
   GOTO    TARTREMOVE
REMOVE14
   MOVLW   0EH
   MOVWF   DCOUNT
   BSF     XORCOUNTH,6
   GOTO    TARTREMOVE
REMOVE15
   MOVLW   0FH
   MOVWF   DCOUNT
   BSF     XORCOUNTH,7
   GOTO    TARTREMOVE

TARTREMOVE
   MOVF    DCOUNT,W
   MOVWF   DCOUNT1
TARTREMOVE1
   MOVLW   00H
   XORWF   DCOUNT1,W
   BTFSC   STATUS,Z
   GOTO    TARTREMOVER
   BCF     STATUS,C
   RLF     DIVIDEL,F      ;由于是带进位左移,因而在先移位低字节时可以连续移
   RLF     DIVIDEH,F
   DECF    DCOUNT1,F
   GOTO    TARTREMOVE1
TARTREMOVER
   MOVF    DCOUNT,W
   MOVWF   DCOUNT1
TOSTART
   MOVLW   0FFH
   XORWF   DCOUNT1,W
   BTFSC   STATUS,Z
   GOTO    DDOOVER
   MOVF    DIVIDEH,W
   SUBWF   DIVIDEDH,W
   MOVWF   DMIDH
   BTFSS   STATUS,Z
   GOTO    HNOTE
   MOVF    DIVIDEL,W
   SUBWF   DIVIDEDL,W
   MOVWF   DMIDL
   BTFSS   STATUS,C
   GOTO    ASAMEDO1
   MOVF    DMIDH,W
   MOVWF   DIVIDEDH
   MOVF    DMIDL,W
   MOVWF   DIVIDEDL
   MOVF    XORCOUNTH,W
   XORWF   DRESULTH,F
   MOVF    XORCOUNTL,W
   XORWF   DRESULTL,F
   GOTO    ASAMEDO1
HNOTE
   MOVF    DIVIDEH,W
   SUBWF   DIVIDEDH,W
   MOVWF   DMIDH
   BTFSS   STATUS,C
   GOTO    ASAMEDO1
   MOVF    DIVIDEL,W
   SUBWF   DIVIDEDL,F                                                                                                                                                                                                                                                 
   BTFSS   STATUS,C    ;如果没有借位则跳转,开始减高位
   CALL    DSUB     ;如果有借位则将高位先减一,然后继续减  
   MOVF    DIVIDEH,W
   SUBWF   DIVIDEDH,F
   MOVF    XORCOUNTH,W
   XORWF   DRESULTH,F
   MOVF    XORCOUNTL,W
   XORWF   DRESULTL,F
ASAMEDO1
   BCF     STATUS,C
   RRF     XORCOUNTH,F
   RRF     XORCOUNTL,F
   BCF     STATUS,C
   RRF     DIVIDEH,F
   RRF     DIVIDEL,F
   DECF    DCOUNT1,F
   GOTO    TOSTART

DDOOVER
   RETURN
   
DSUB
   MOVLW   01H
   SUBWF   DIVIDEDH,F
   RETURN
;******************************************************





;********************************************
;功计算子程序
;********************************************
WCALCULATE       
         BTFSS  IFCOUNT,0
         GOTO   TESTI1
         MOVF   ADVSTOREH,W    ;可以通过这个公式计算电压有效值。
                               ;U=55*AD/512*9
         MOVWF  DIVIDEDH
         MOVF   ADVSTOREL,W
         MOVWF  DIVIDEDL
         CLRF   DIVIDEL
         CLRF   DIVIDEH
         BSF    DIVIDEH,1      ;先除以512
         CALL   M_DIVIDE
         CLRF   ADVSTOREH
         CLRF   ADVSTOREL
         MOVF   DRESULTL,W     ;结果会小于256,因而只考虑商的低字节
         MOVWF  MULTIPLY1
         MOVLW  37H
         MOVWF  MULTIPLY2
         CALL   M_MULTIPLY     ;商乘以55
         MOVF   MRESULTH,W
         MOVWF  DIVIDEDH
         MOVF   MRESULTL,W
         MOVWF  DIVIDEDL
         CLRF   DIVIDEH
         MOVLW  09H
         MOVWF  DIVIDEL        ;再除以9
         CALL   M_DIVIDE
         BTFSS  WHICHV,0       ;由于考虑到单片机的运行效率,电压和电流采样达到20
                               ;次的时间不同步,相差10MS,因而计算好的平均电压用两个
                               ;变量交替存放,用WHICHV区别用哪一个
         GOTO   WHICH0  
         MOVF   DRESULTL,W
         ADDWF  STOREV1L,F
         BTFSS  STATUS,C
         GOTO   TEST501
         MOVLW  01H
         ADDWF  STOREV1H,F
TEST501   
         INCF   VCOUNT,F
         MOVLW  32H
         XORWF  VCOUNT,W
         BTFSS  STATUS,Z       ;是不是达到50次,是则在一秒内求电压的平均
         GOTO   KEYBEGIN1
         CLRF   VCOUNT
         BCF    WHICHV,0
         MOVF   STOREV1H,W
         MOVWF  DIVIDEDH
         MOVF   STOREV1L,W
         MOVWF  DIVIDEDL
         CLRF   DIVIDEH
         MOVLW  32H
         MOVWF  DIVIDEL
         CALL   M_DIVIDE
         CLRF   STOREV1L
         CLRF   STOREV1H
         MOVF   DRESULTL,W    ;一秒的平均值存到SECONDV里
         MOVWF  SECONDV
         GOTO   KEYBEGIN1
WHICH0
         MOVF   DRESULTL,W
         ADDWF  STOREV2L,F
         BTFSS  STATUS,C
         GOTO   TEST502
         MOVLW  01H
         ADDWF  STOREV2H,F
TEST502   
         INCF   VCOUNT,F
         MOVLW  32H
         XORWF  VCOUNT,W
         BTFSS  STATUS,Z
         GOTO   KEYBEGIN1
         CLRF   VCOUNT
         BSF    WHICHV,0
         MOVF   STOREV2H,W
         MOVWF  DIVIDEDH
         MOVF   STOREV2L,W
         MOVWF  DIVIDEDL
         CLRF   DIVIDEH
         MOVLW  32H
         MOVWF  DIVIDEL
         CALL   M_DIVIDE
         CLRF   STOREV2L
         CLRF   STOREV2H
         MOVF   DRESULTL,W
         MOVWF  SECONDV
         

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -