📄 实验.asm
字号:
;*************************************
;道尺行走控制和数据采集程序 用AD7705采集AD
;*************************************
List p=16F874
INCLUDE"P16F874.inc"
;--------------自定义-------------------------
WBUFFER EQU 20H ;WBH
STATBUFFER EQU 21H ;STATUSBH
FSRBUFFER EQU 22H ;FSRBH
TIME0 EQU 23H ;TIME GAUGE 50ms
TIME1 EQU 24H ;TIME GAUGE 500ms
TIME2 EQU 25H ;TIME GAUGE 1s
DSBZ EQU 26H ;定时标志
GNBZ EQU 27H ;功能标志
CCBZ EQU 28H ;出错标志
DSCBZ EQU 29H ;定时测标志
RXBUF EQU 2AH ;通讯接受首址
ADCOM EQU 2BH ;7705 命令字
COUNT EQU 2CH
PXCOU1 EQU 2DH
PXCOU2 EQU 2EH
ACCAHI EQU 2FH
ACCALO EQU 30H
ACCBHI EQU 31H
ACCBLO EQU 32H
ACCCHI EQU 33H
ACCCLO EQU 34H
ACCDHI EQU 35H
ACCDLO EQU 36H
ADBUF EQU 37H ;AD 接受地址
ADDR EQU 38H
VALUE EQU 39H
NUL3 EQU 3AH
NUL2 EQU 3BH
NUL1 EQU 3CH
;3D--4E 用于发送缓存
;70--76 用于接受缓存
;42--69 用于AD采样暂存
;-------------中断处理保护程序------------------
PUSH MACRO
MOVWF WBUFFER
SWAPF WBUFFER
BCF STATUS,RP0
SWAPF STATUS,W
MOVWF STATBUFFER
MOVF FSR,W
MOVWF FSRBUFFER
ENDM
POP MACRO
MOVF FSRBUFFER,W
MOVWF FSR
SWAPF STATBUFFER,W
MOVWF STATUS
SWAPF WBUFFER,W
ENDM
;***********************************************
; 主程序
;-----------------------------------------------
ORG 00H
GOTO MAIN ;Skip over interrupt vecter
ORG 04H ;Interrupt Vector
GOTO INTZ
ORG 10H ;Begining of Program space
;------------清寄存器程序---------------------------------
MAIN
BCF STATUS,RP0 ;BANK0
BCF PORTC,2
BCF PORTC,3 ;小车停
MOVLW 20H ;CLEAR 20H-7FH
MOVWF FSR
CLEAR1 CLRW
MOVWF INDF
INCF FSR
MOVF FSR,W
SUBLW 80H
BTFSS STATUS,2 ;ADD=80H?
GOTO CLEAR1
BSF STATUS,RP0 ;BANK1
MOVLW 0A0H ;CLEAR A0H-FFH
MOVWF FSR
CLEAR2 CLRW
MOVWF INDF
INCF FSR
MOVF FSR,W
SUBLW 0FFH
BTFSS STATUS,2 ;ADD=0FFH?
GOTO CLEAR2
;-----------初始化程序-----------------------------*
START
BCF STATUS,RP0 ;BANK0
CALL INITPORTS ;端口初始化
BSF PORTC,1 ;LED ON
BCF PORTC,2
BCF PORTC,3 ;小车停
CALL INITTIMERS ;定时器1初始化
CALL INITSCI ;串行异步通信初始化
BSF INTCON,GIE ;START INTZ
MOVLW B'00000001'
MOVWF T1CON
BCF INTCON,0 ;清B口变化中断标志位
;-------------主执行程序------------------------------
NEWLOOP
BCF STATUS,RP0 ;BANK0
CLRWDT ;Clear WDT
CALL D_SUB
NOP
MOVLW 40H
MOVWF ADDR
MOVWF VALUE
CALL WEEROM
NOP
CALL REEROM
NOP
MOVF CCBZ,W ;ERR?
SUBLW 0H
BTFSS STATUS,2
GOTO MAIN ;XTFW
BTFSS GNBZ,0 ;JIE SHUO BIAO ZHI WEI
GOTO NEWMS
BCF GNBZ,0
CALL MLYM ;处理命令
NEWMS NOP
; BTFSC STATUS,4 ;WDT RESET
GOTO BEGLOOP ;实验用
BTFSS GNBZ,7 ;等待接受小车启动命令
GOTO NEWLOOP
WHLPAN BCF GNBZ,7 ;判命令类型
BTFSS GNBZ,1 ;开始
GOTO PAUSE
BCF GNBZ,1
BSF PORTC,2
BSF PORTC,3 ;START DIAN JI
GOTO BEGLOOP
PAUSE BTFSS GNBZ,2 ;暂停
GOTO CONNECT
BCF GNBZ,2
BSF PORTC,1 ;LED ON
BCF PORTC,2
BCF PORTC,3
GOTO PAULOOP
CONNECT BTFSS GNBZ,3 ;继续
GOTO WEND
BCF GNBZ,3
BSF PORTC,2
BSF PORTC,3
GOTO BEGLOOP
WEND BTFSS GNBZ,4 ;退出
GOTO WDSC
BCF GNBZ,4
BCF PORTC,2
BCF PORTC,3
BCF PORTC,1 ;LED OFF
GOTO ENDLOOP
WDSC BTFSS GNBZ,5 ;适时测试
GOTO ERR
BCF GNBZ,5
BSF PORTC,0 ;LED ON
GOTO DSCLOOP
ERR BCF STATUS,RP0 ;接受命令出错
CLRWDT
CALL TXER
GOTO NEWLOOP
;---------WRITE DATA TO EEPROM OF PIC16F873-----------
WEEROM BSF STATUS,RP1
BSF STATUS,RP0 ;BANK3
BTFSC EECON1,WR ;等待上一次写操作完成
GOTO $-1
BCF STATUS,RP1 ;BANK0
BCF STATUS,RP0
MOVF ADDR,W
BSF STATUS,RP1 ;BANK2
BCF STATUS,RP0
MOVWF EEADR ;将写入地址写入EEADR积存器
BCF STATUS,RP1 ;BANK0
BCF STATUS,RP0
MOVF VALUE,W
BSF STATUS,RP1 ;BANK2
BCF STATUS,RP0
MOVWF EEDATA ;将写入数据写入EEDATA积存器
BSF STATUS,RP0 ;BANK3
BCF EECON1,EEPGD ;指向数据存储器
BSF EECON1,WREN ;允许写
BCF INTCON,GIE ;ALL INT OFF
MOVLW 55H
MOVWF EECON2 ;将55H写入到EECON2中
MOVLW 0AAH
MOVWF EECON2 ;将AAH写入到EECON2中
BSF EECON1,WR ;写控制位置1,开始写入
BSF INTCON,GIE ;ALL INT ON
BCF EECON1,WREN ;禁止写操作
RETURN
;-------READ DATA FROM EEPROM OF PIC16F873---------
REEROM BSF STATUS,RP1
BCF STATUS,RP0 ;BANK2
MOVF ADDR,W ;写地址
MOVWF EEADR
BSF STATUS,RP0 ;BANK3
BCF EECON1,EEPGD ;指向数据存储器
BSF EECON1,RD ;开始读
BCF STATUS,RP0 ;BANK2
MOVF EEDATA,W ;数据存储器中的值送W
BCF STATUS,RP1 ;BANK0
MOVWF 40H
RETURN
;-------------适时测试-----------------------------
DSCLOOP
BCF STATUS,RP0 ;BANK0
CLRWDT ;Clear WDT
BTFSS GNBZ,0 ;JIE SHUO BIAO ZHI WEI
GOTO DSCMS
BCF GNBZ,0
CALL MLYM
GOTO WHLPAN ;WHLWHL
DSCMS BTFSS DSCBZ,0
GOTO NODSC
BCF DSCBZ,0
BCF INTCON,GIE ;INTZ OFF
CALL AD162 ;采集16位模拟量
CALL AD161
CALL TX0 ;发送数据
BSF INTCON,GIE ;START INTZ
NODSC BTFSS DSBZ,3 ;1S MS
GOTO DSCMS2
BCF DSBZ,3
BTFSS PORTC,1
GOTO DSCMS1
BSF PORTC,1
GOTO DSCMS2
DSCMS1 BSF PORTC,1
DSCMS2 GOTO DSCLOOP
;------------暂停----------------------------------
PAULOOP
BCF STATUS,RP0 ;BANK0
CLRWDT ;Clear WDT
BTFSS GNBZ,0 ;JIE SHUO BIAO ZHI WEI
GOTO PAUMS
BCF GNBZ,0
CALL MLYM
GOTO WHLPAN ;WHLWHL
PAUMS BTFSS DSBZ,3 ;1S MS
GOTO PAUMS2
BCF DSBZ,3
BTFSS PORTC,1
GOTO PAUMS1
BSF PORTC,1
GOTO PAUMS2
PAUMS1 BSF PORTC,1
PAUMS2 GOTO PAULOOP
;------------退出----------------------------------
ENDLOOP
BCF STATUS,RP0 ;BANK0
CLRWDT ;Clear WDT
BCF PORTC,1 ;LED OFF
BCF PORTC,2
BCF PORTC,3
GOTO ENDLOOP
;------------开始OR继续--------------------------
BEGLOOP
BSF PORTC,2
BSF PORTC,3
BCF STATUS,RP0 ;BANK0
CLRWDT ;CLEAR WDT
BTFSS GNBZ,0 ;JIE SHUO BIAO ZHI WEI
GOTO BEG1
BCF GNBZ,0
CALL MLYM
GOTO WHLPAN
BEG1 BTFSS DSBZ,1 ;50MS
GOTO BEG2
BCF DSBZ,1
BCF INTCON,GIE ;INTZ OFF
CLRWDT
; CALL AD16 ;采集16位模拟量 第2路
BSF INTCON,GIE ;INTZ ON
BEG2 BTFSS DSBZ,2 ;500MS
GOTO BEG3
BCF DSBZ,2
BTFSS PORTC,1
GOTO BEG02
BCF PORTC,1
GOTO BEG3
BEG02 BSF PORTC,1
BEG3 BTFSS DSBZ,3 ;1 S
GOTO BEGLOOP
BCF DSBZ,3
BCF INTCON,GIE ;INTZ OFF
CLRWDT
CALL PXPJ
; CALL AD161 ;采集16位模拟量 第1路
CALL TX0 ;发送数据
BSF INTCON,GIE ;START INTZ
GOTO BEGLOOP
;-------------------------------------------------
; Interrup service subroutine
;-------------------------------------------------
INTZ BCF STATUS,RP0 ;BANK0
PUSH
BTFSS PIR1,RCIF ;RC INT?
GOTO INT1
BSF GNBZ,0 ;SET JSBZ0
BCF INTCON,GIE ;OFF ZZD
RCLOOP BTFSS RCSTA,OERR ;ERR
GOTO RCWAIT
MOVF RCREG,W
MOVF RCREG,W
BSF CCBZ,0 ;SET SCIJS SJYC
BCF RCSTA,1
BCF RCSTA,4
BSF RCSTA,4
RCWAIT BTFSS PIR1,RCIF
GOTO RCWAIT
MOVF RXBUF,W
MOVWF FSR
MOVF RCREG,W
MOVWF INDF
INCF RXBUF
SUBLW 0DH
BTFSS STATUS,2
GOTO RCLOOP
MOVLW 70H
MOVWF RXBUF
BSF INTCON,GIE ;ON ZZD
INT1 BTFSC PIR1,TMR1IF ;TNR1 INT?
CALL SERVICETMR1
POP
RETFIE
;-----------------------------------------------*
SERVICETMR1
BSF DSBZ,0 ;SET 10MS DSBZ
DECFSZ TIME0
GOTO DS1
BSF DSBZ,1 ;SET 50MS DSBZ
MOVLW D'5'
MOVWF TIME0
DECFSZ TIME1
GOTO DS1
BSF DSBZ,2 ;SET 500MS DSBZ
MOVLW D'10'
MOVWF TIME1
DECFSZ TIME2
GOTO DS1
BSF DSBZ,3 ;SET 1S DSBZ
MOVLW D'2'
MOVWF TIME2
DS1 MOVLW 0B8H
MOVWF TMR1H
CLRF TMR1L
BCF PIR1,TMR1IF ;CLEAR TMR0 INT
RETURN
;-----------采集16位模拟量 第2路 ( 20 次 )-----------
AD16 BSF PORTA,0 ;AD_CS
BSF PORTA,2 ;AD_SCK
MOVLW B'00100001' ;向通讯积存起写数据,选择通道1将下一操作设为时钟积存器的写
MOVWF ADCOM
CALL OUTBYT
MOVLW B'00000100' ;对时钟寄存器写,设置CLKDIV位,更新率为50HZ
MOVWF ADCOM
CALL OUTBYT
MOVLW B'00010001' ;向通讯积存起写数据,选择通道1将下一操作设为设置积存器的写
MOVWF ADCOM
CALL OUTBYT
MOVLW B'01000000' ;向设置寄存器写数据,增益为1,双极性,非缓冲模式,清除滤破器同步,开始自校验
MOVWF ADCOM
CALL OUTBYT
LP16 BTFSC PORTA,1 ;等待DRDY=0
GOTO LP16
MOVLW B'00111001' ;SET THE NEXT OPERATION FOR 16 BIT READ FROM THE DATA REGISTER
MOVWF ADCOM
CALL OUTBYT
CALL INBYT20 ;采样AD
RETURN
;------------接受16位AD数据-----------
INBYT20
MOVF ADBUF,W
MOVWF FSR
WAD20 BCF PORTA,0 ;AD_CS
NOP
NOP
MOVLW 08H
MOVWF COUNT ;一字节8位
INBY20 CALL ADSK
BTFSS PORTA,5 ;AD_Dout
BCF STATUS,0
BTFSC PORTA,5
BSF STATUS,0
RLF 7AH
DECFSZ COUNT
GOTO INBY20
MOVF 7AH,W
MOVWF INDF
NOP
INCF ADBUF
MOVF ADBUF,W
MOVWF FSR
MOVLW 08H
MOVWF COUNT ;一字节8位
INBY21 CALL ADSK
BTFSS PORTA,5 ;AD_Dout
BCF STATUS,0
BTFSC PORTA,5
BSF STATUS,0
RLF 7AH
DECFSZ COUNT
GOTO INBY21
MOVF 7AH,W
MOVWF INDF
INCF ADBUF
NOP
BSF PORTA,0 ;AD_CS
NOP
RETURN
;-----------采集16位模拟量 第1路 ( 1 次 )-----------
AD161 BSF PORTA,0 ;AD_CS
BSF PORTA,2 ;AD_SCK
MOVLW B'00100000' ;向通讯积存起写数据,选择通道1将下一操作设为时钟积存器的写
MOVWF ADCOM
CALL OUTBYT
MOVLW B'00000100' ;对时钟寄存器写,设置CLKDIV位,更新率为50HZ
MOVWF ADCOM
CALL OUTBYT
MOVLW B'00010000' ;向通讯积存起写数据,选择通道1将下一操作设为设置积存器的写
MOVWF ADCOM
CALL OUTBYT
MOVLW B'01000000' ;向设置寄存器写数据,增益为1,双极性,非缓冲模式,清除滤破器同步,开始自校验
MOVWF ADCOM
CALL OUTBYT
LP161 BTFSC PORTA,1 ;等待DRDY=0
GOTO LP161
MOVLW B'00111000' ;SET THE NEXT OPERATION FOR 16 BIT READ FROM THE DATA REGISTER
MOVWF ADCOM
CALL OUTBYT
CALL INBYT1 ;采样AD
RETURN
;------------接受16位AD数据-----------------------
INBYT1 MOVLW 42H
MOVWF FSR
WADIN1 BCF PORTA,0 ;AD_CS
NOP
NOP
MOVLW 08H
MOVWF COUNT ;一字节8位
INBY1 CALL ADSK
BTFSS PORTA,5 ;AD_Dout
BCF STATUS,0
BTFSC PORTA,5
BSF STATUS,0
RLF 7AH
DECFSZ COUNT
GOTO INBY1
MOVF 7AH,W
MOVWF INDF
INCF FSR
NOP
NOP
BSF PORTA,0 ;AD_CS
NOP
NOP
MOVF FSR,W
SUBLW 43H
BTFSS STATUS,2
GOTO WADIN1
NOP
NOP
RETURN
;-----------采集16位模拟量 第2路 ( 1 次 )-----------
AD162 BSF PORTA,0 ;AD_CS
BSF PORTA,2 ;AD_SCK
MOVLW B'00100001' ;向通讯积存起写数据,选择通道1将下一操作设为时钟积存器的写
MOVWF ADCOM
CALL OUTBYT
MOVLW B'00000100' ;对时钟寄存器写,设置CLKDIV位,更新率为50HZ
MOVWF ADCOM
CALL OUTBYT
MOVLW B'00010001' ;向通讯积存起写数据,选择通道1将下一操作设为设置积存器的写
MOVWF ADCOM
CALL OUTBYT
MOVLW B'01000000' ;向设置寄存器写数据,增益为1,双极性,非缓冲模式,清除滤破器同步,开始自校验
MOVWF ADCOM
CALL OUTBYT
LP162 BTFSC PORTA,1 ;等待DRDY=0
GOTO LP162
MOVLW B'00111001' ;SET THE NEXT OPERATION FOR 16 BIT READ FROM THE DATA REGISTER
MOVWF ADCOM
CALL OUTBYT
CALL INBYT2 ;采样AD
RETURN
;------------接受16位AD数据-----------
INBYT2 MOVLW 44H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -