单片机普通I/O口做串口模拟接收 zhuan
2400波特率,关键是对时序的模拟,;*****************接收子程序*****************************************
RXD
BCF STATUS,RP0 ;Bank 0
MOVLW08H
MOVWFCOUNT1 ;读8次
NOP
NOP
NOP
NOP
NOP
NOP
NOP
RX1 CALL DEL417 ;417uS延时
BTFSSGPIO,0 ;读bit
GOTO RX2 ;为0时跳到RX2
BSF STATUS,C ;置C=1
RRF RX_SUBF ;右移
GOTO RX3
RX2 BCF STATUS,C ;置C=0
RRF RX_SUBF ;右移
RX3 DECFSZ COUNT1 ;1个字节是否读完?
GOTO RX1 ;否,继续读
CALL DEL417 ;完了,判断数据/地址?
BTFSSGPIO,0 ;读bit
GOTO RX4 ;为0时跳到RX4
BSF STATUS,C ;置C=1
GOTO RX5
RX4 BCF STATUS,C ;置C=0
RX5 ;CALL DEL417
BTFSSGPIO,0 ;判断是否有停止位出现
GOTO RX5 ;为0继续查寻
;为1时返回继续
RETURN ;返回
;****************************************************************************
;**************发送子程序****************************************************
TXD BCF STATUS,RP0 ;Bank 0
MOVLW08H
MOVWFCOUNT1 ;发8次
BSF GPIO,2 ;使MAX487处于发送状态
BCF GPIO,1 ;发送起始位
TXD1 CALL DEL417 ;417uS延时
RRF TX_SUBF ;右移
BTFSSSTATUS,C ;判断=1?
GOTO TXD2 ;C=0时,跳到TXD2
BSF GPIO,1 ;C为1时,置GP1=1
GOTO TXD3
TXD2 BCF GPIO,1 ;C为0时,置GP1=0
TXD3 DECFSZ COUNT1 ;1个字节是否读完?
GOTO TXD1 ;未完,继续到TXD1
CALL DEL417
BTFSSSIGN_R,0 ;判断=1?
GOTO TXD4 ;数据/地址位=0时,跳到TXD4
BSF GPIO,1 ;数据/地址位=1时,置GP1=1
GOTO TXD5
TXD4 BCF GPIO,1 ;数据/地址位=0时,置GP1=0
TXD5 CALL DEL417
BSF GPIO,1 ;发送停止位
CLRF TX_SUBF
MOVLW03H ;把"000011"送入GPIO口
MOVWFGPIO ;使能MAX487处于接收状态
CALL DEL417
RETURN ;返回
页:
[1]