理论概念
不同型号的单片机使用的串口不同,根据需求选择相应的单片机,在有些场合如果单片机如果没有需要的串行通信接口,则可以通过单片机的i/o口进行模拟。
全双工uart(异步串行通信接口)
uart有两种工作状态:
同步串行通信状态:速率高,硬件电路复杂,需要同时使用两条信号线,所以只能使用单工方式或半双工方式工作。
异步串行通信状态:方式简单,传输速率不高,应用广泛,方便与其他通信标准进行衔接。
异步传输工作方式:
传输效率较低,起始位,校验位,停止位占用的位较多
数据格式:
同步传输工作方式:
双方同时使用两条通信线:
一条用于产生时钟并要求发送和接受的双方必须保持完全同步(一般情况下,时钟信号由发送端提供)。另一条用于传送数据。如果需要双向数据传输,需要再多添加两条通信线(mcs-51不支持同时的双向数据同步传输,只能使用分时复用)。除了用于通信外,同步方式还可以用于i/o口的扩展,与74ls164联合使用时扩展成输出口,与74ls165联合使用时扩展成输入口。因为没有附加起始位和停止位,所以传输效率较高,一旦发现数据出错,所有的数据都需要重新传输,大量数据一次性传输时错误的概率较高。远距离通信时,通过调试解调从数据流中提取同步信号,用锁相的技术使接收方得到与发送方相同的时钟信号。时钟信号线与数据线分离可以实现高效率、大容量的数据通信。
数据格式:
使用方式
使用的寄存器:
串行接口寄存器 scon:规定了串行通信的方式和功能,可以选择通信模式/允许接收/检查状态位
电源控制寄存器 pcon
smod = 0 波特率为原值;
smod为1 波特率提高一倍。
只有smod位对串口通信有影响
注:该寄存器不能进行位寻址,只能整字节操作。
工作方式:
p.s.:uart有一个接收数据缓冲区,当上一个字节未被处理时下一个字节收入缓冲区。但如果在下一个字节接收完毕时前一字节还未处理,则上一个字节会被覆盖掉。因此软件必须在下一个字节接收完毕之前处理上一个字节(当连续发送字节时也是如此)。
用途:可以用来和某些具有8位串行口的eeprom器件通信
原理:
rxd从低位开始收发数据,txd从发送同步移位脉冲。
向sbuf写入字节时开始发送数据,发送完毕后ti位置位。
置位ren时,开始接收数据,接收完8位数据后ri位置位。
方式1:10位数据的异步通信口,波特率可变(与t1的溢出率有关)。rxd为数据接收,txd为数据发送。
数据帧格式:
原理:
软件置ren为1时,接收器选择波特率为16倍速率采样rxd引脚电平,当检测到rxd引脚输入电平发生负跳变(1-》0)说明起始位有效,移入输入移位寄存器并开始接收这一帧信息的其余位。需要手动清零
接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当ri=0且sm2=0(或接收到的停止位为1)时,接收到的9位数据的前8位装入接收sbuf,第9位(停止位)进入rb8并置ri=1,向cpu请求中断。ri需要手动清零
波特率计算装入th1的初值:
p.s. smod=0时,k=1;smod=1时,k=2;
代码示例:
1 #include 2 main() 3 { 4 tmod = 0x20; 5 sm0 = 0; 6 sm1 = 1; 7 ren = 1; 8 pcon = 0; 9 th1 = 0xfd; //253=256-(1*11.0592*10^6)/(384*9600) 10 tl1 = 0xfd; 11 tr1 = 1; 12 p1 = sbuf; 13 while(!ri); 14 ri = 0; 15 sbuf = p1; 16 while(!ti); 17 ti = 0; 18 }
数据帧格式:起始位1位,数据9位(第9位在发送时为tb8,接收时为rb8)
原理:
发送开始时,先把起始位0输出到txd引脚,然后发送移位寄存器的输出位d0到txd引脚,每一个移位脉冲都使输出移位寄存器的各位向右移一位,并由txd引脚输出。第一次移位时,停止位“1”移入输出移位寄存器的第9位,以后每次移位左边都移 入0。当停止位移至输出位时,左边其余位全为0,当检测到这一条件时,控制电路进行最后一次移位并置ti=1,请求中断。需要手动清零
接收数据时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当ri=0且sm2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器sbuf和rb8(接收数据的第9位),置ri=1,向cpu请求中断。如果条件不满足,则数据丢失且不置位ri,继续搜索rxd引脚的负跳变。
代码示例:多机互联
1 tmod = 0x20; 2 th1 = 0xfd; 3 tl1 = 0xfd; 4 pcon = 0x00; 5 tr1 = 1; 6 scon = 0xf8; 7 sbuf = 0x01; 8 while(!ti); 9 ti = 0; 10 p3_5 = 0; 11 sm2 = 0; 12 while(!ri); 13 ri = 0; 14 p2 = sbuf; 15 sm2 = 1; 16 p3_5 = 1;
波特率的计算:
当t1用作波特率发生器时,最典型的用法是使t1工作再自动重装8位定时器方式(方式2),溢出率取决于th1中的计数值
常见波特率对照表
中创新航蓄力万亿储能赛道攻势
陶大程:机器人商业化大势所趋但基础很重要
中国芯片巨头台积电市值突破4.2万亿
海信电视亮相阿那亚实验电影周,超级影像嘉年华即将开启
丝印反查怎么看?这些数字和字母都是什么意思?
串口工作原理知识点汇总
小米MIX2什么时候上市?小米MIX2最新消息:小米MIX2历史最大屏占比?性价比依旧?
芯片封测的主要工艺流程有哪些
不好理解的「继电器线圈电压」,本文都说清楚了
董明珠的银隆能成功吗? 能否在格力连任决定其生死
中国最幸运的城市,拥有一家绝顶聪明的公司,或许成下一个杭州
贵州省委书记在航天电器调研军民融合发展
荣湃数字隔离器的特点及在72V额定电压BMS中的应用
三星推出980 Pro M.2 NVMe SSD 增加了对PCIe 4.0的支持
用Rust编写核心组件!独家揭露阿里云开源GraphScope如何成为全球最快图计算引擎
创客中国携国际柔性与印刷电子大会助力智慧中国
塑料激光焊接设备怎么选
巨头眼里的存储技术路线图
浅谈医疗器械产品数字化的未来发展
什么是拉电流和灌电流?