电工基础

电工基础知识_电工技术-电工最常见电路

单片机C语言之串口通信协议(4)

时间:2024-04-10 11:57来源:[db:来源] 作者:admin 点击:
片上串口 以上说的是虚拟串口,上文中谈到与串口相关的引脚P3.0与P3.1,事实上51单片机自带片上串口,那这个串口又该怎么使用呢? 片上串口支持同步模

  片上串口

  以上说的是虚拟串口,上文中谈到与串口相关的引脚P3.0与P3.1,事实上51单片机自带片上串口,那这个串口又该怎么使用呢?

  片上串口支持同步模式与异步模式。简单来说同步模式就是指有时钟线,而异步模式无时钟线。这里的时钟线是指在同步通信时,用一根线专门传输时钟信号,这个信号用来与要发送的每一位保持同步,这样就避免了例如异步通信中因为采用定时器而引入的时间误差。

  片上串口还支持8位模式和9位模式。如下图所示

单片机C语言之串口通信协议

  其中D0-D7是一个字节的8个位。9位模式只是多了一个位TB8,这个TB8的作用是奇偶校验或多机通信。奇偶校验原理这不加分析。多机通信时比如主机只发送数据给网络中的一台地址为0x02的设备,这时候先让TB8为1,前面的D0-D7则为地址即0x02,之后再让TB8为0,前面的D0-D7则为数据了。

  上面设置了片上串口的模式,另外还要设置串口的波特率。

  片上串口的波特率等于定时器1工作在方式2时溢出率的32分频。如果要定时器1工作在方式2,那么TMOD=0x20。另外要保证为32分频,我们还必须设置计数器初值。设晶振为11.0592Mhz,则定时器的计数脉冲为F=f/12,则定时器每计一个脉冲的时间为T=12/f。又令计数器的起点为x,则溢出一次要计的脉冲数为(256-x)。所以在计数起点为x时,溢出一次的时间为t=12/f*(256-x)。则对应的溢出率为1/t=f/(12*(256-x))。对应的波特率就为b=f/(384*(256-x))。

  x=256-f/(384*b)

  其中f为晶振频率,b为希望的波特率,x为定时器的计数起点TH1的值。

  例如当晶振为11.0592M,希望波特率为9600bit/s,则TH1=253。题外话,我们同样可以演算出在其他常用波特率情况下,TH1始终为一个整数。这里也就解释了为什么51里面选用了11.0592M的晶振而不是12M,这样就保证了串口的时序更加准确,虽然牺牲了定时器的准确度。

  实验二,片外串口发送一个字节。

  好了现在开始我们的实验之旅。直接看代码吧。

  #include “reg51.h”

  #define u16 unsigned int

  #define u8 unsigned char

  void delay(u16 x)

  {

  while(x--);

  }

  void Uart_Init() //串口初始化

  {

  SCON=0x50; //8位异步模式

  TMOD|=0x20; //定时器1工作方式2

  TH1=253;//9600bit/s

  TR1=1;
(责任编辑:admin)

织梦二维码生成器
相关文章
------分隔线----------------------------
栏目列表
推荐内容