[code="asm"]
;实验目的:熟悉USART通信
;通过“串口调试助手”协助工作,波特率设置为19200
;串口调试助手发送数据给877,877收到后再转发回串口助手
;硬件要求:拨码开关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 ;保存到发送寄存器,随后发送出去
EXIT
RETFIE
MAIN
USART
BANKSEL TRISC ;选择体1
BSF TRISC,7 ;断开RC模块与USART TX引脚的联系
BSF TRISC,6 ;断开RC模块与USART RX引脚的联系
MOVLW 0CH ;装载波特率发生器,为19.2kbd
MOVWF SPBRG
MOVLW 24H ;势能USART,设置波特率发生器为高速方式
MOVWF TXSTA
BSF PIE1,RCIE ;使能接收中断
CLRF STATUS ;返回体0
MOVLW 90H
MOVWF RCSTA ;使能USART连续接收
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]