单片机与各类设备进行数据传输需要用到串口(如电脑连接单片机需安装USB转串口驱动)简单的双向串口通信有两根通信线
一些截图
全双工:双方可以同时发送和接受
半双工:双方可以发送和接受,但不能同时
单工:只能由一方发送到另一方
异步:双方各自约定速率
例如
第一个脉冲约定读取时间短,第二个脉冲读取约定时间长,读出来数据就不一样
同步:双方靠一根时钟线(SCL)来约定速率
例如直接设定如果上升沿就是1,下降沿就是0再读取
总线:连接各个设备的数据传输总线路
我用的是89C52RC,从原理图上看只有一个UART(通信接口名称,上面表格有说)
波特率为串口通信速率,双方通信时约定一个间隔时间,例如:第一个脉冲约定读取时间短,第二个脉冲读取约定时间长,读出来数据就不一样
校验位,例如使用9位UART就是在8位后跟一位,多一位可以用来校验(奇偶校验就是如假设发送0011 1 靠后面的来检查前面的1的个数是否为奇数)
一个串口内部的图
SBUF这里是寄存器
很明显,中间这部分电路是控制约定速率的
上面则是发送,下面则是接受
发送数据和接受数据都会有相应的中断
如何配置串口
这里有两个控制寄存器
串行控制寄存器SCON和波特率选择控制寄存器PCON
SM0决定了是否检查错误
SM1决定了波特率是否可变
REN决定串口是否可以接收
TI请求中断用,方式0时因为是同步的,所以八位结束后自动置1请求中断,之后需自行复位为0,其他方式也同理
RI与发送同理,请求中断用,需自行复位
配置
例如方式1
SM0=0;//8位
SM1=1;//波特率可变
SM2=0;//方式一不需要用
REN=0;//不允许串口接受
TB8=0;//清0第9位
RB8=0;//接收到的停止位
TI=0;
RI=0;
实际应用可以直接配置SCON
SMOD 为1时方式1.2.3波特率加倍,为0时全部波特率加倍
SMOD0为1时开启帧错误检查,为0时关闭
所以这里这样配置
最后仍然是用软件配置
再利用给SBUF写数据来发送数据
启动后电脑就会接收到
直接把函数放入循环后会出现一个问题
发送的为66接收却为99
这可能是因为波特率的误差导致的
可以在后面加上Delay(1)
虽然发送的速度会变慢,但数据达到了精确
发送其它数值都可以通过改数据实现,同理
接收
这里的逻辑是只要电脑发送数据就进中断函数
这里因为要接收后进中断所以要打开
再设置一个中断函数
里面先判断是否为接收状态
如果是则点亮P2为接收的数据
然后把中断标志位复位
发送0xf2
如果想同时把接收的数据值返回
可以加上这部操作