- ;型号:AT89C52 晶振频率:11.0592Mhz 波特率9600 无校验位 停止位1位
- ;软串口与硬串口不同,软串口通过移位运算以及操作I/O口电平实现。
- ;硬串口由配置特殊功能寄存器由硬件发出,此程序针对没有硬串口的IC使用。
- ;软串口波特率不宜过高,否则误码率会增加。
- START:
- CALL RXD_DATA
- MOV P1,A ;将A寄存器接收到的数据送给P1口,确保收到的数据没有错误
- CALL TXD_DATA ;将接收到的数据发回
- JMP START
- TXD_DATA: ;将A寄存器里的值通过软串口送出
- PUSH B ;B寄存器压入堆栈
- PUSH PSW ;PSW压入堆栈
- ACALL DELAY_PORT ;延迟1/9600s
- CLR TXD ;发送起始位 低电平
- MOV B,#8 ;1字节有8位,所以这里发8个位
- TXD_BIT: ;发1比特数据
- ACALL DELAY_PORT
- MOV C,ACC.0 ;A寄存器第0位送C标志
- MOV TXD,C ;C标志送TXD(P3.1)
- RR A ;A寄存器循环右移1位,发下1位
- DJNZ B,TXD_BIT ;寄存器B减1,不为0继续发位
- ACALL DELAY_PORT
- SETB TXD ;发送停止位,高电平
- POP PSW ;PSW弹出堆栈
- POP B
- RET
- RXD_DATA: ;串口接收数据,如果没有数据则一直等待,结果存入A寄存器
- PUSH B
- PUSH PSW
- CLR A ;A寄存器清0
- MOV B,#8 ;1字节有8位,将8送B寄存器
- WAIT_RXD_START:
- MOV C,RXD ;RXD(P3.0)电平送C
- JC WAIT_RXD_START ;C为1(RXD为高电平) 则一直等待,低电平进行下一步操作
- RXD_BIT: ;收1比特数据
- ACALL DELAY_PORT
- MOV C,RXD ;接收电平送C标志
- MOV ACC.0,C ;C标志送A寄存器第0位
- RR A ;A寄存器循环右移1位,收下1位数据
- DJNZ B,RXD_BIT ;B减1,不为0继续接收
- ;数据接收完毕
- ;ACALL DELAY_PORT
- WAIT_RXD_END: ;等待收到停止位(高电平)
- MOV C,RXD ;RXD(P3.0)电平送C
- JNC WAIT_RXD_END ;C为0(RXD为低电平) 则一直等待
-
- POP PSW
- POP B
- RET
- DELAY_PORT: ;11.0592Mhz@9600Bps@AT89C52 延迟104.166667Us
- MOV R6,#0DH
- DL0:
- MOV R5,#02H
- DJNZ R5,$
- DJNZ R6,DL0
- RET
- END
复制代码 |