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

📄 daohang.asm

📁 pic876采集车轮信号
💻 ASM
字号:
 title"深圳导航"
;
; Simulated PIC16F876 Running at 20 MHz
;
; 龙元
; 04.08.08
;
  LIST P=16F876
  INCLUDE "p16f876.inc"

;  Register Usage
 CBLOCK 0x021		    	;Start Registers at End of the Values
  count_hh                  ;0x21 32BYTE counter 
  count_hl
  count_lh
  count_ll
  
  adc_data_0_l_buf            ;0x25
  adc_data_0_h_buf            ;0x26
  
  adc_data_1_l_buf            ;0x27
  adc_data_1_h_buf            ;0x28
  
  adc_data_2_l_buf            ;0x29
  adc_data_2_h_buf            ;0x2a
  
  adc_data_3_l_buf            ;0x2b
  adc_data_3_h_buf            ;0x2c
  
  adc_data_4_l_buf            ;0x2d
  adc_data_4_h_buf            ;0x2e
  
  adc_data_5_l_buf            ;0x2f
  adc_data_5_h_buf            ;0x30
  
  adc_data_6_l_buf            ;0x31
  adc_data_6_h_buf            ;0x32
  
  adc_data_7_l_buf            ;0x33
  adc_data_7_h_buf            ;0x34
  
  adc_data_8_l_buf            ;0x35
  adc_data_8_h_buf            ;0x36
  
  adc_data_9_l_buf            ;0x37
  adc_data_9_h_buf            ;0x38
     
  adc_count
  adc_data_count
  adc_data_lsb_flag
  adc_data_msb_flag
  send_flag
  
  count
  count_flag_h
  count_flag_l
  dela0
  dela1
  dela2
  dela3
  
  
  int_flag         	;中断标志
  PCLATH_STK		;现场保护寄存器
  XHOSTS    			
  HOSTF	    
  XW_TEMP
  
  ENDC
  
  	org    0
   	goto Main
;////////////////中断矢量//////////////////////////////////////////////  
 	org  	0x0004
INTER	
	MOVWF	XW_TEMP		;保存W的值
	SWAPF	STATUS,W
	clrf	STATUS
	MOVWF	XHOSTS		;暂存STATUS的值
	MOVF	PCLATH,W	
	MOVWF	PCLATH_STK
	clrf	PCLATH
	MOVF	FSR,W
	MOVWF	HOSTF		;保存FSR的值。以上程序为中断现场
    btfss   PIR1,TMR1IF
   	goto	INT_ADC 
    goto    INT_TMR1
  	

;////////////////主程序/////////////////////////////////////////////////  
  	org	0x0020
Main 	 					;a,b,c口初始化
	clrwdt                  ;clear wdt		 	
	clrf	INTCON          ;关中断
	clrf	PIR1
	
		clrf adc_data_0_l_buf           
        clrf adc_data_1_l_buf 
        clrf adc_data_2_l_buf
        clrf adc_data_3_l_buf
        clrf adc_data_4_l_buf
        clrf adc_data_5_l_buf
        clrf adc_data_6_l_buf
        clrf adc_data_7_l_buf
        clrf adc_data_8_l_buf
        clrf adc_data_9_l_buf      
  
        clrf adc_data_0_h_buf         
        clrf adc_data_1_h_buf          
        clrf adc_data_2_h_buf
        clrf adc_data_3_h_buf
        clrf adc_data_4_h_buf
        clrf adc_data_5_h_buf
        clrf adc_data_6_h_buf
        clrf adc_data_7_h_buf
        clrf adc_data_8_h_buf
        clrf adc_data_9_h_buf
        movlw  0xaa
        movwf  adc_data_lsb_flag
        movlw  0xbb
        movwf  adc_data_msb_flag
        movlw  0xcc
        movwf  count_flag_h
        movlw  0xdd
        movwf  count_flag_l
		movlw  0x00
		movwf  count_hl
		movlw   0xa
        movwf   adc_count 
        movwf   adc_data_count  ;AD数据计数初值=10
		movlw	0x00            ;A口赋初值
	 	movwf	PORTA
 		movlw	0x00            ;C口赋初值
 		movwf	PORTC
        bsf     STATUS,RP0      ;更改RAM体 因为ADCON1等下列将用到得寄存器位于体1中
 		movlw	0X01     		
 		movwf	TRISA^0x0080    ;设置A口数据方向
	 	movlw	0x01       		;RC0  车轮计数输入
	 	movwf	TRISC^0x0080
 		bcf     STATUS,RP0
 	
	 	call	TRM1init		;TRM1初始化 		
        
        call    ADCinit
		call	RS232init
		bsf  	T1CON,TMR1ON     ; TRM1开始工作 
star	clrwdt
        bsf     ADCON0,GO        ; 开始AD转换
		btfsc   ADCON0,GO
		goto    $-1
		call    delay50ms
        

		goto    star

;////////////TRM1初始化/////////////////////////////////////////
TRM1init		
	bcf	STATUS,RP0
	movlw	0x06               ;1:1的分频比,禁止TMR1振荡器起振,外部与系统时钟不同步,选择外部时钟源,
	movwf	T1CON
	movlw	0x00				;附初值
	movwf	TMR1H
	movwf	TMR1L
	bcf		PIR1,TMR1IF            ;清中断标志
	bsf		STATUS,RP0
	bsf		PIE1^0x0080,TMR1IE     ;开放TRM1的中断
	bcf		STATUS,RP0		
	
	return
	
;/////////////////ADC初始化///////////////////////////////////
ADCinit
        movlw   b'10000001'			;选择系统时钟频率为fosc/32,选择RA0/AN0为模拟通道,A/D转换开关开
        movwf   ADCON0
        bsf     STATUS,RP0          ;更改RAM体 因为ADCON1等下列将用到得寄存器位于体1中
        movlw	b'10000000'	        ;陀螺仪模拟输入 转换结果右对齐	
		movwf	ADCON1^0x0080       ;参考电压 VDD VSS
	
        bsf     PIE1,ADIE			;开中断
		bcf     STATUS,RP0			
		bcf     PIR1,ADIF
		bsf     INTCON,PEIE
		bsf     INTCON,GIE
		return
	
       
;/////////////串口初始化////////////////////////////////
RS232init
	BSF	STATUS,RP0	
	BSF	TRISC^0x0080,7		;将RC6、RC7设置为输入方式,断绝与外接电路的连接
	BSF	TRISC^0x0080,6		
	MOVLW	0x19			;将传输的波特率设为约 9600 bps
	MOVWF	SPBRG^0X0080
	MOVLW	0X04
	MOVWF	TXSTA^0X0080
	BCF	STATUS,RP0
	MOVLW	0X80			;允许异步串行口工作
	MOVWF	RCSTA
	bsf	RCSTA,CREN			;接收允许
	BSF	STATUS,RP0
	bsf     TXSTA,TXEN		;
	bcf	PIE1^0x0080,RCIE	;中断关闭
	BCF	STATUS,RP0
        
     
    MOVF    RCREG,W	
	

	return

;////////////////////////////////////////////////////
convert_l                                 ;查表法获得数据寄存器对应地址
        movf    adc_data_count,0
        addwf   PCL,1
table   nop
       
        retlw   25H
        retlw   27H
        retlw   29H
        retlw   2bH
        retlw   2dH
        retlw   2fH
        retlw   31H
        retlw   33H
        retlw   35H
        retlw   37H 
convert_h
        movf    adc_data_count,w
        addwf   PCL,1
table2  nop
       
        retlw   26H
        retlw   28H
        retlw   2aH
        retlw   2cH
        retlw   2eH
        retlw   30H
        retlw   32H
        retlw   34H
        retlw   36H
        retlw   38H

;////////////////中断处理///////////////////////////////////
INT_ADC
	
	bcf	PIR1,ADIF               
	call    store_data
	decfsz  adc_data_count,1         ;若陀螺仪数据满10个,则将这10个数和当前计数值发送至PC
	goto    intend                                
   
send_Dat
    movf    adc_data_lsb_flag,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1
	
	movf    adc_data_0_h_buf,0
	movwf	TXREG
	btfss   PIR1,TXIF
    goto    $-1

	movf    adc_data_5_h_buf,0
	movwf	TXREG
    btfss   PIR1,TXIF
    goto    $-1	
    movf    adc_data_0_l_buf,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1
	movf    adc_data_5_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
        
	movf    adc_data_1_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_6_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_1_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
        
	movf    adc_data_6_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_2_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_7_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_2_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_7_l_buf,0
	movwf	TXREG
	btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_3_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_8_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
	
	movf    adc_data_3_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
	
	movf    adc_data_8_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
	
	movf    adc_data_4_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
	
	movf    adc_data_9_h_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1
        
	movf    adc_data_4_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

	movf    adc_data_9_l_buf,0
	movwf	TXREG
        btfss   PIR1,TXIF
        goto    $-1

        decfsz  send_flag,1
        goto    send_Data
        
        movf    adc_data_msb_flag,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1
	 
		movf    count_flag_h,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1
	
	movf    TMR1H,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1
	
	movf    count_flag_l,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1	
	
	movf    count_hl,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1
	
	movf    TMR1L,0
	movwf   TXREG
	btfss   PIR1,TXIF
	goto    $-1

	
	movf    adc_count,0
	movwf   adc_data_count          ;重新为adc_data_count赋值=10 开始新一帧数据
        movlw   0x02
        movwf   send_flag
intend
 	                                ;不满10个,则将该次转换结果存放到ADC数据寄存器中
 	clrf	STATUS	
	MOVF	HOSTF,W			;以下为中断现场恢复
	MOVWF	FSR			;恢复间接寻址指针FSR的值
	MOVF	PCLATH_STK,w
	MOVWF	PCLATH
	SWAPF	XHOSTS,W
	MOVWF	STATUS			;恢复STATUS的值
	SWAPF	XW_TEMP,1	
	SWAPF	XW_TEMP,W		;恢复W的值
	RETFIE

;//////////////////////////////////////////////////////////
store_data
        call    convert_l
        movwf   FSR
        bsf     STATUS,RP0
        movf    ADRESL,0  
        bcf     STATUS,RP0
        movwf   0                ;低字节数据存储
        call    convert_h
        movwf   FSR
        movf    ADRESH,0  
        movwf   0
                 ;高字节数据存储
        return  



delay0.05ms
	bsf	STATUS,RP0
	movlw	0xfa
	movwf	dela0^0x0080
	decfsz	dela0^0x0080,1
	goto	$-1
	bcf	STATUS,RP0
	return
delay0.5ms
	bsf	STATUS,RP0
	movlw	0x08
	movwf	dela1^0x0080
	call	delay0.05ms
	bsf	STATUS,RP0
	decfsz	dela1^0x0080,1
	goto	$-3
	bcf	STATUS,RP0
	return
delay5ms
	bsf	STATUS,RP0
	movlw	0x08
	movwf	dela2^0x0080
	call	delay0.5ms
	bsf	STATUS,RP0
	decfsz	dela2^0x0080,f
	goto	$-3
	bcf	STATUS,RP0
	return
delay50ms
	bsf	STATUS,RP0
	movlw	0x08
	movwf	dela3^0x0080
	call	delay5ms
        bsf	STATUS,RP0
	decfsz	dela3^0x0080,1
	goto	$-3
	bcf	STATUS,RP0
	return
;////////////////////////////////////////
INT_TMR1
        bcf     PIR1,TMR1IF
        incfsz  count_hl   	
		RETFIE	
        END
	
	

        
        

⌨️ 快捷键说明

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