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

📄 软件模拟usart.txt

📁 单片机开发源代码集锦 31例
💻 TXT
📖 第 1 页 / 共 2 页
字号:
rxStartChk ;check for START bit
skp0 RX_PIN ;test RX pin for START bit
goto rxEnd ;not found
;start bit found. do following
movlw .8
movwf RX_bcnt ;count for 8 bits incoming data
movlw .4
movwf RX_SLICE ;wait 4 time-slice for 1st data bit
movlw .1
movwf RX_STA ;switch to STATE 1 for 1st data bit sampling
goto rxEnd
rxReceiveBit ;receive DATA bit
decfsz RX_SLICE,f ;wait of bit timing
goto rxEnd
;time to sample incoming data bit
rrf RX_BUFF,f ;right shift for new bit space
bcf RX_BUFF,7 ;pre-set to 0
skp0 RX_PIN ;incoming data bit test
bsf RX_BUFF,7 ;set if data bit = 1
movlw .3 ;3 slice for data bit timing
movwf RX_SLICE ;bit timing for next data bit
decfsz RX_bcnt,f ;see if 8-bit completed
goto rxEnd
;bit receive completed, do follwoing
movlw .2
movwf RX_STA ;set to STATE 2 for idle waiting
bsf RXBF ;set receive buffer full
movf RX_BUFF,w ;display data on PORTB
movwf PORTB
goto rxEnd
rxIdle ;wait for idle
skp0 RX_PIN ;try to find STOP bit
clrf RX_STA ;back to STATE 0 for next byte
goto rxEnd
;====== End of RX =========
rxEnd
;====== start of TX =======
;do TX, if transmit is engaged
skp1 TXEN ;skip if TXEN set, do TX
goto tmr0IntEnd ;not in transmit mode
movf TX_SLICE,f ;see if in bit-timing delay
skpnz ;
goto txDo ;bit-timing completed
decfsz TX_SLICE,f ;keep bit-timing delay
goto txEnd
txDo
;Transmit STATE-MACHINE control
movlw high($)
movwf PCLATH ;set PCLATH before PCL change
movf TX_STA,w ;get current state
andlw 0x03 ;make sure in range
addwf PCL,f ;switch to TX STATE
goto txStartBit ;send START bit
goto txDatBit ;send DATA bit
goto txStop ;send STOP bit
goto txIdle ;set transtim IDLE
txStartBit ;TX_STA=0, send START bit here
bsf TXBUSY ;set TX busy flag
movlw .8
movwf TX_bcnt ;count for 8 bit transmitting
bcf TX_PIN ;start bit
movlw .3
movwf TX_SLICE ;set bit timing
movlw .1
movwf TX_STA ;set transmit STATE-MACHINE
goto txEnd
txDatBit ;TX_STA=1, send DATA bit here
;time for next bit sending
rrf TX_BUFF,f ;rotate bit to C
skpnc ;test C
goto $+3
bcf TX_PIN ;0 out
goto $+2
bsf TX_PIN ;1 out
movlw .3
movwf TX_SLICE ;wait 3 time-slices
decfsz TX_bcnt,f
goto txEnd ;8 bit serial not end
movlw .2
movwf TX_STA ;set transmit STATE-MACHINE
goto txEnd
txStop ;TX_STA=2, send STOP bit here
bsf TX_PIN ;send STOP bit
movlw .3
movwf TX_SLICE ;set bit timing
movlw .3
movwf TX_STA ;set transmit STATE-MACHINE
goto txEnd
txIdle ;TX_STA=3, reset transmission to IDLE
bcf TXBUSY ;not busy
bcf TXEN ;not in transmission
clrf TX_STA ;reset transmit STATE-MACHINE
goto txEnd
;====== End of TX =========
txEnd
;add more TMR0 related code here
tmr0IntEnd
movlw TMR0CONST
addwf TMR0,f
goto int_end

int_end
banksel pclath_temp
movf pclath_temp,w ; retieve copy of PCLATH register
movwf PCLATH
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt


;=======================================
;Code wriiten for test purpose
MAIN
banksel TRISA ;select respective bank
movlw b'00000100' ;RA2-input, RA3-output
movwf TRISA
clrf TRISB
movlw b'10001000' ;TMR0 in timer mode
movwf OPTION_REG
clrf STATUS ;make sure in bank 0

call USART_INIT

movlw TMR0CONST
movwf TMR0

movlw 0xff
movwf PORTB

bsf INTCON,T0IE
bsf INTCON,GIE

LOOP ;test code
skp1 RXBF ;wait for data received
goto $-1
bcf RXBF ;clear data flag
movf RX_BUFF,w
movwf TX_BUFF ;send back received data
bsf TXEN
skp0 TXEN ;wait for transmit completion
goto $-1
goto LOOP ;


;=======================================
;Initializtion of software USART
USART_INIT
clrf USART_F ;clear all flag bit
clrf RX_STA ;reset STATE MACHINE
clrf TX_STA
bsf TX_PIN ;TX is in Idle
return


END ;

 

⌨️ 快捷键说明

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