11-串口通信

微控制器与外部设备的数据通信,分为并行通信和串行通信
并行:数据的各位同时发送或接受,每个数据位使用一条导线
串行:数据一位接一位地顺序发送或接收

串行通信有SPI,IIC,UART多种,最常见的是UART
串行通信有单工、半双工、全双工三种。
单工:两个设备之间只有一个方向
半双工:可以接收可以发送,但在一个时刻只能有一种状态,即只能发送或只能接收。
全双工:可以同时进行接收和发送。

串行通信主要方式:同步、异步
同步串行通信:需要使用同一个时钟,以数据块为单位传送数据
异步串行通信:每个设备都有自己的时钟信号,通信中双方的波特率要保持一致,以字符为单位进行数据帧传送,一次传送一个帧。

波特率:串口每秒传输的位数。
一个数据帧有起始位、停止位、8位数据位。

51单片机串口通信有4种模式,模式1和模式3波特率可变,波特率的变化取决于定时器1的溢出率,也就是说定时器1每溢出1次,串口就发送一次数据。

通常使用定时器1的工作模式2(8位自动重装)来产生波特率,TL1作为脉冲技术寄存器,TH1作为自动重装寄存器,当计数到最大值溢出时,TH1的值会自动装到TL1中。

SMOD寄存器
12M晶振情况下,要产生9600BPS的波特率,SMOD=0,TH1参数为0xfd

串行口中有两个缓冲寄存器SBUF,虽然是一个名字,但是是2个寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的(是两个独立的内存),是字节寻址的。地址是99H。
靠读/写指令区分:
串行发送时,CPU向SBUF中写入数据,此时99H表示发送缓存SBUF
串行接收时,CPU向SBUF

数据发送时,把数据扔进SBUF后,内核会自动把数据发出去,然后把TI置1.
SUBF = 数据/变量

接收数据时,内核从串口接收到一个完整数据后,会把RI置1,用户用SBUF直接读取即可。
变量 = SBUF

不管是数据接收还是发送,都会进入中断。

SCON是个对于串口通信来说比较重要的寄存器
对串口初始化就是对SCON寄存器做一些操作。
在这里插入图片描述
最前面的SM0 SM1 是控制模式。大部分情况下都是用01.
REN是比较重要的,它为1时,允许接收。前四位通常是0101

TB8和RB8是奇偶校验时用的。

TI和RI时中断标志位,一般不用去操作它。

异步8位UART并允许接收:SCON=0x50;

利用串行接口与上位机建立传输信道进行数据的收发,采用8位UART模式,即模式1.波特率为9600 数据发送采用查询方式,数据接受采用中断方式。
系统上电初始化后,单片机向上位机发送两个字节:0x5a,0xa5,然后等待接收上位机的数据,每接收到一个字节后,在该字节的基础上加1然后返回给上位机。

#include "reg52.h"
//====================串口函数===============
unsigned char urdat;
void SendByte(unsigned char dat); 
void InitUart()
{
  TMOD = 0x20;   //定时器1产生波特率,对于TMOD寄存器来说有高4位是控制定时器1的,后四位是定时器0的。
  TH1 = 0xfd;
  TL1 = 0xfd; // 重装模式的话 TL1和TH1是一样的

  TR1=1; // 打开定时器 ,产生波特率

  SCON = 0x50;	  //定义串口的工作方式,一般都是这样的,记住就行。(8位的ur模式,允许接收)

  ES=1;
  EA=1;
}

void ServiceUart() interrupt 4
{
  if(RI == 1)
  {
      RI=0;     //接收标志位要人工清零
	  urdat = SBUF;   //接收到的数据在SBUF里面 
	  SendByte(urdat + 1);
  }
  if(TI == 1)
  {
    
  }
}
void SendByte(unsigned char dat)	 //发送
{
  SBUF = dat;
  while(TI ==0);
  TI = 0;
}

//=============================================
void main()
{
  InitUart();
  SendByte(0x5a);
  SendByte(0xa5);
  while(1)
  {
    
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值