[code="asm"]
;實驗目的:熟悉USART通信
;通過“串口調試助手”協助工作,波特率設置為19200
;串口調試助手發(fā)送數據給877,877收到后再轉發(fā)回串口助手
;硬件要求:撥碼開關S7全置ON,其他撥碼開關置OFF
#INCLUDE<P16F877A.INC> ;調用芯片頭文件,省去特殊寄存器等的定義
__CONFIG _DEBUG_OFF&_CP_ALL&_WRT_HALF&_CPD_ON&_LVP_OFF&_BODEN_OFF&_PWRTE_ON&_WDT_OFF&_HS_OSC
;調試模式關閉,寫保護,一半ROM可在線改寫,EEPROM加密,低壓編程關閉,掉電檢測關閉,上電延時開,看門狗關,4M晶振HS振蕩
VAL_US EQU .249 ;短延時定時參數
VAL_MS EQU .200 ;長延時定時參數
COUNT EQU 25H
COUNT_MS EQU 26H
ORG 00H
NOP
GOTO MAIN
ORG 04H ;中斷入口地址
BTFSS PIR1,RCIF ;判斷是否是串口接收中斷
GOTO EXIT ;否,轉中斷結束程序
MOVF RCREG,0 ;讀取接收寄存器的數據
MOVWF TXREG ;保存到發(fā)送寄存器,隨后發(fā)送出去
EXIT
RETFIE
MAIN
USART
BANKSEL TRISC ;選擇體1
BSF TRISC,7 ;斷開RC模塊與USART TX引腳的聯系
BSF TRISC,6 ;斷開RC模塊與USART RX引腳的聯系
MOVLW 0CH ;裝載波特率發(fā)生器,為19.2kbd
MOVWF SPBRG
MOVLW 24H ;勢能USART,設置波特率發(fā)生器為高速方式
MOVWF TXSTA
BSF PIE1,RCIE ;使能接收中斷
CLRF STATUS ;返回體0
MOVLW 90H
MOVWF RCSTA ;使能USART連續(xù)接收
BSF INTCON,GIE ;使能全局中斷使能位
BSF INTCON,PEIE ;使能外設中斷使能位
USART_1
CALL DELAY_MS ;調用2次延時程序
CALL DELAY_MS
GOTO USART_1 ;返回!
;*************************200ms延時程序***********************
DELAY_MS
MOVLW VAL_MS
MOVWF COUNT_MS
LOOP_MS
CALL DELAY_US
DECFSZ COUNT_MS,1
GOTO LOOP_MS
RETURN
;*************************100us延時程序***********************
DELAY_US
MOVLW VAL_US
MOVWF COUNT
LOOP_US
NOP
DECFSZ COUNT,1
GOTO LOOP_US
RETURN
DELAY_S
MOVLW 0FFH
MOVWF 50H
CALL DELAY_MS
DECFSZ 50H,1
GOTO $-2
RETURN
END
[/code]