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

📄 实验.asm

📁 8051开发的电机侍服控制程序.控制电机走到长度
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*************************************
;道尺行走控制和数据采集程序   用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 + -