论坛新老朋友们。祝大家新年快乐。在新的一年开始的时候,给大家一点小小的玩意。工程师经常碰到需要多个串口通信的时候,而低端单片机大多只有一个串行口,甚至没有串口。这时候无论是选择高端芯片,还是更改系统设计都是比较麻烦的事。我把以前搞的用普通IO口模拟串行口通讯的程序拿出来,供大家参考,希望各位兄弟轻点拍砖。基本原理:我们模拟的是串行口方式1就是最普通的方式。一个起始位、8个数据位、一个停止位。模拟串行口最关键的就是要计算出每个位的时间。以波特率9600为例,每秒发9600个位,每个位就是19600秒,约104个微秒。我们需要做一个精确的延时,延时时间对IO口置位的时间104微秒。起始位是低状态,再延时一个位的时间。停止位是高状态,也是一个位的时间。数据位是8个位,发送时低位先发出去,接收时先接低位。了解这些以后,做个IO模拟串口的程序,就是很容易的事。我们开始。先上简单原理图:就一个MAX232芯片,没什么好说的,一看就明白。使用单片机普通IO口,232数据输入端使用51单片机P32口(外部中断1口,接到普通口上也可以,模拟中断方式的串行口会有用。呵呵)。数据输出为P04(随便哪个口都行)。
下面这个程序,您只需吧P04和P32当成串口直接使用即可,经过测试完全没有问题
2、底层函数代码如下:
sbitTXD1P04sbitRXD1P32定义模拟输出脚定义模拟输入脚
bdatau
sig
edcharSBUF1sbitSBUF1_bit0SBUF10
定义一个位操作变量
fsbitSBUF1_bit1SBUF11sbitSBUF1_bit2SBUF12sbitSBUF1_bit3SBUF13sbitSBUF1_bit4SBUF14sbitSBUF1_bit5SBUF15sbitSBUF1_bit6SBUF16sbitSBUF1_bit7SBUF17
voiddelay_bpsu
sig
edcharifori0i29i_
op__
op_波特率9600模拟一个9600波特率
u
sig
edchargetchar2whileRXD1
模拟接收一个字节数据
_
op__
op__
op__
op__
op__
op__
op__
op_delay_bpsSBUF1_bit0RXD10delay_bpsSBUF1_bit1RXD11delay_bpsSBUF1_bit2RXD12delay_bpsSBUF1_bit3RXD13delay_bpsSBUF1_bit4RXD14delay_bpsSBUF1_bit5RXD15delay_bpsSBUF1_bit6RXD16
fdelay_bpsSBUF1_bit7RXD17delay_bpsretur
SBUF1返回读取的数据
voidputchar2u
sig
edchari
putSBUF1i
putTXD10起始位
模拟发送一个字节数据
delay_bpsTXD1SBUF1_bit0delay_bpsTXD1SBUF1_bit1delay_bpsTXD1SBUF1_bit2delay_bpsTXD1SBUF1_bit3delay_bpsTXD1SBUF1_bit4delay_bpsTXD1SBUF1_bit5delay_bpsTXD1SBUF1_bit6delay_bpsTXD1SBUF1_bit7delay_bpsTXD11delay_bps停止位76r