📄 daohang.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 + -