STC8H系列单片机入门教程之UART串口基础知识(八)

目录

一、并行通信与串行通信

二、串行通信方式

2.1 同步通信

2.2 异步通信

三、串行通信方向

四、UART

 五、波特率

六、示例代码 


一、并行通信与串行通信

MCU与外部设备进行通信的两种方式:并行通信和串行通信。

并行通信:数据的各个位用多条数据线同时进行传输(一位数据占据一条数据线)。

串行通信:将数据分成一位一位的形式在一条传输线上逐个传输。

二、串行通信方式

串行通信有两种通信方式:同步通信和异步通信。

2.1 同步通信

数据传输时带有时钟同步信号,发送端与接收端在同一时钟的约束下进行数据传输,比如发送端与接收端均在时钟信号的上升沿进行数据的发送/接收。

2.2 异步通信

数据传输时不带时钟同步信号,发送端有自己的时钟CLK1,接收端有自己的时钟CLK2。发送端和接收端通过波特率来进行同步 。比如波特率为9600时,发送端需要在1s内发送9600比特数据,接收端需要在1s内接收9600比特数据。至于发送/接收这9600比特的数据对于发送端/接收端来说需要多少个时钟周期,就不重要的。

三、串行通信方向

串行通信的方向包括:单工、半双工、全双工。

单工:数据只能按照指定方向沿着一个方向传输(类似单行道,不可以逆行);

半双工:数据传输可以沿着两个方向,但是需要分不同的时间进行(类似潮汐车道,道路是唯一的,但是可以根据不同的时间规定不同的传输方向);

全双工:数据可以同时进行双向传输(一条马路上既有从A向B的车道,又有从B向A的车道,可以同时通行,两条车道互不干扰)。

四、UART

UART是一种采用异步串行通信方式的通用异步收发传输器。

UART数据格式是指UART传输的数据包的组成和结构,包括起始位、数据位、校验位和停止位。UART数据格式如下:

起始位:标志数据传输的开始,一般为0。

数据位:传输的实际数据,长度可以是5到9位。

校验位:用于检测数据是否有误,可以是奇校验或偶校验,也可以无校验。数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验资料传送的正确性。

停止位:标志数据传输的结束,一般为1,长度可以是1到2位。

UART数据格式的示意图如下:

数据线在未发送数据之前,处于空闲状态。当 准备要发送数据时,先拉低一位,作为起始位。之后,接收端就能知道在起始位之后的n位数据就是数据位了(事先约定好了数据位是几位,8bit常用)。之后紧接着跟着一位校验位、一位停止位。对于校验位,分为奇校验和偶校验。

 五、波特率

传输速率(波特率):表示每秒传输二进制数据的位数,单位是bps(位/秒)。

常用的为:9600,19200,38400,57600,115200等。

假设波特率为115200,波特率为115200就是指在1S内传输115200bit数据,1s等于10的9次方ns。所以传输1bit的数据需要10的9次方/115200=8680ns;

六、示例代码 

以下代码为stc8H系列单片机串口2初始化子函数及串口2发送一个字节子函数。

/****************************************************************************************
* @名称 		void uart2_init(long baud)
* @功能 		串口二初始化
* @输入参数 	baud - 串口波特率
* @返回 		none
****************************************************************************************/ 
void uart2_init(long baud)
{
	timer2_init(65536UL - (MAIN_FOSC/4)/baud);

	S2CON &= ~(1<<7);   // 8位数据, 1位起始位, 1位停止位, 无校验
	IE2   |= 1;         //允许中断
	S2CON |= (1<<4);    //允许接收
	P_SW2 &= ~0x01; 
	P_SW2 |= 0;         //UART2 switch to: 0: P1.0 P1.1,  1: P4.6 P4.7
}

/****************************************************************************************
* @名称 		void uart2_send_char(unsigned char dat)
* @功能 		串口二发送一个字节
* @输入参数 	dat - 待发送的数据
* @返回 		none
****************************************************************************************/ 
void uart2_send_char(unsigned char dat)
{
	S2BUF = dat;	
	while(!(S2CON & 2));
	S2CON &= ~2;;
}

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

芯航路IOT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值