📄 sudu.asm
字号:
;***************************************************************************
;定时器0定时100ms,计数器T1计数外部脉冲个数,查寻方式
;****************************************************************************
LIST P=18F458
INCLUDE "P18F458.INC"
data1 equ 20h ;定义一个延时变量寄存器
data2 equ 21h ;定义另一个延时变量寄存器
data3 equ 22h ;定义一个延时变量寄存器
A_H EQU 30H ;除数高8位
A_L EQU 31H ;除数低8位
B1_L EQU 32H ; 被除数的最高8位
B_H EQU 33H ;被除数高8位(商的高8位)
B_L EQU 34H ;被除数低8位(商的低8位)
C1_L EQU 35H ;余数的最高8位
C_H EQU 36H ;余数高8位
C_L EQU 37H ;余数低8位
D1_L EQU 38H
D_H EQU 39H
D_L EQU 3AH
TEMP EQU 3BH
DUAN EQU 3CH ;分段值
SREG EQU 3DH
ACCBLO EQU 23H ;存放被转换的双字节整数低8位
ACCBHI EQU 24H ;存放被转换的双字节整数高8位
ACCCHI EQU 26H ;存放高8位BCD码
ACCCLO EQU 27H ;存放中8位BCD码,最终结果高
ACCDHI EQU 28H ;存放中8位BCD码,最终结果低
COUNT EQU 2FH ;临时寄存器
T1L EQU 2AH ;存放T1定时器初值低8位
T1H EQU 2BH ;存放T1定时器初值高8位
XW_TEMP EQU 40H ;暂时存放W值
XHOSTS EQU 41H ;暂时存放STATUS
HOSTF EQU 41H ;暂时存放FSR0L
;*****************************************************************************
ORG 0000H
NOP
GOTO MAIN
ORG 0008H;中断矢量入口
NOP
GOTO INTSERVE
;################测速子程序#################################
JISHU
NOP
MOVWF XW_TEMP
SWAPF STATUS,0
MOVWF XHOSTS
MOVF FSR0L,0
MOVWF HOSTF
MOVLW 65H ;158.50ms初值,4分频158.50ms
MOVWF TMR0H
MOVLW 37H
MOVWF TMR0L
MOVLW 00H
MOVWF TMR1H
MOVLW 00H
MOVWF TMR1L
BSF T0CON,7
BSF T1CON,0
JISHU1
BTFSS INTCON,2
GOTO JISHU1
BCF INTCON,2
BCF T1CON,0
BCF T0CON,7
JISHUFAN
MOVF HOSTF,0
MOVWF FSR0L
SWAPF XHOSTS,0
MOVWF STATUS
SWAPF XW_TEMP,1
SWAPF XW_TEMP,0
NOP
RET
;###################################################################
;**************************系统初始化**************
INITIAL
NOP
MOVLB 0FH;寄存器体切换
;MOVLW 0FFH
; MOVWF TRISC,1;将C口定义为输入
MOVLW 00H
MOVWF TRISD,1;将D口定义为输出
MOVLW 19H;
MOVWF SPBRG;波特率9600
MOVLW 04H;
MOVWF TXSTA ;异步高速传输8位数据
MOVLW 80H
MOVWF RCSTA ;允许同步串行口工作
MOVLW 80H ;RC7RC6设为输入
MOVWF TRISC;
BSF TXSTA,TXEN ;允许发送
BSF RCSTA,CREN ;接收数据允许
BSF PIE1,RCIE ;接收中断使能
BCF PIR1,RCIF
MOVLW 0C0H
MOVWF INTCON ;总中断和外围中断允许
RETURN
;***********************************
;**********************T0初始化**************
TOINIT
NOP
MOVLW 00H;(1)禁止T0(0)16位(0)内部时钟(0)上升沿(0)前分频(001)4分频
MOVWF T0CON;定时器T0初始化
MOVLW 86H;(1)16位操作(0)未使用(00)不分频(0)禁止振荡器(1)不与外部输入同步(1)计数RC0入(0)禁止TR1
MOVWF T1CON;定时器T0初始化
BCF INTCON,TMR0IF;T0溢出标志清零
RETURN
;***********************************
;*******************长延时*************************
ldelay ;子程序名,也是子程序入口地址
movlw 0fh ;将外层循环参数值送到DATA1
movwf data3
llp0 movlw 0ffh ;将内层循环参数值送到DATA2
movwf data2
llp1 movlw 0ffh ;将内层循环参数值送到DATA2
movwf data1
llp2 nop
;CLRWDT ;清狗
decfsz data1,1 ;变量DATA2内容递减,若为0则跳跃
goto llp2 ;跳转到LP1
decfsz data2,1 ;变量DATA1内容递减,若为0则跳跃
goto llp1 ;跳转到LP0
decfsz data3,1 ;变量DATA1内容递减,若为0则跳跃
goto llp0 ;跳转到LP0
return ;返回主程序
;****************************************************
;################通信中断子程序###########################
INTSERVE
NOP
BTFSS PIR1,RCIF
GOTO ERR_RE
MOVF RCREG,0;读一下接收缓冲器使标志位清零
MOVLW 0AAH
MOVWF TEMP
ERR_RE
NOP
RETFIE
;*********************主程序**********************************************
MAIN
NOP
CALL INITIAL ;系统初始化
CALL TOINIT ;T0初始化
MAIN0
NOP
CALL JISHU
NOP
MOVF TMR1L,0
MOVWF B_L;将定时器低位送B_L,被除数中间8位
MOVF TMR1H,0
MOVWF B_H;将定时器高位送B_H,被除数低8位
NOP
MOVF TEMP,0
XORLW 0AAH ;判断是否有CAN信号
BNZ MAIN0 ;不相等无CAN信号,跳转
NOP
MOVF B_L,0
MOVWF TXREG
MOVF B_H,0
MOVWF TXREG
NOP
MOVLW 00H
MOVWF TEMP
;CALL ldelay
GOTO MAIN0
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -