• 06:串口通信一


    1、串口的基本认识

    • 串口也就是接口,称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。用来进行数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(全双工)(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。

    • 分类:按电气标准及协议来分包括RS-232-C、RS-422、RS485等。

    • RS232:常见的9针串口,最高速率为20Kb/s,传输最大距离15m。如下图所示。
      在这里插入图片描述

    • RS422:最多可接10个节点。即一个主设备,其余为从设备,从设备之间不能通信。最大传输距离为1219m,最大传输速率为10Mb/s。

    • RS485:就是RS422的拓展,可以连接更多的设备

    2、串口的电平

    • UART:异步串行,指主设备和从设备之间进行传输数据的频率是不同的,比如单片机向模块发送数据的频率 ≠ 模块向单片机接收数据的频率。这就是所说的波特率,一般我们需要配置波特率

    串口电平:

    • RS232电平:1为-3~-15V的电压, 逻辑0为3~15V的电压
    • TTL电平:输出高电平>=2.4V,输出低电平<=0.4V;
      输入高电平>=2.0V,输入低电平<=0.8V,上官一号使用的是TTL电平。

    笔记本怎样和上官一号之间进行通信喃?

    • 通过只用CH340芯片将USB转TTL。TX发送线,RX接收线。

    3、接线方式

    • RXD:数据接收引脚,数据读取;STC89系列对应P3.0口,
      TXD:数据发送引脚,数据写入;STC89系列对应P3.1口,
      在这里插入图片描述
      如图,交叉连接,单片机的输入引脚连接模块的输出引脚,这样双方才能相互接收和发送数据。而单片机的RX和TX是设置了固定引脚,如下图。
      在这里插入图片描述

    4、通过单片机向PC发送每隔1s发送一个字符A

    一、

    • 数据缓冲器SBUF:主要用来缓存数据的,分为接收数据缓冲器和发送数据缓冲器,都是独立8位寄存器。
    • 单片机想要发送数据:则给SBUF写入数据,SBUF = data;
    • 单片机想要接收数据:则读取SBUF里面的数据,让data = SBUF;
    • 具体思路图如下:
      在这里插入图片描述

    二、

    • 不仅要配置SBUF寄存器,还需要配置波特率,要2个设备之间的波特率一样,才能进行数据的传输

    • PC机的接收方波特率我们配置位9600,无校验位和停止位。
      在这里插入图片描述

    • 而单片机的波特率的配置,代码比较麻烦,我们先用软件自动生成,然后参考它配置了那些东西在进行学习。
      -

    生成的代码如下:

    void UartInit(void)		//9600bps@11.0592MHz
    {
    	PCON &= 0x7F;		//波特率不倍速
    	SCON = 0x50;		//8位数据,可变波特率
    	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//清除定时器1模式位
    	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    	TL1 = 0xFD;		//设定定时初值
    	TH1 = 0xFD;		//设定定时器重装值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    }
    

    2给设备都配置好后,我们开始编写剩余代码向PC机发送数据

    #include 
    #include "intrins.h"//nop()函数的头文件
    
    sfr AUXR = 0X8E;//reg52.h里面没有定义AUXR的地址,所以我们自己查看手册定义
    
    void Delay1000ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    	_nop_();
    	i = 8;
    	j = 1;
    	k = 243;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    
    void UartInit(void)		//9600bps@11.0592MHz
    {
    	PCON &= 0x7F;		//波特率不倍速
    	SCON = 0x50;		//8位数据,可变波特率
    	AUXR &= 0xBF;		//定时器1时钟为Fosc/12,即12T
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//清除定时器1模式位
    	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    	TL1 = 0xFD;		//设定定时初值
    	TH1 = 0xFD;		//设定定时器重装值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    }
    
    void main()
    {
    	int data_sj = 'A';
    	UartInit();
    	while(1)
    	{
    		Delay1000ms();
    		SBUF = data_sj;//给SBUF写入数据,完成了数据的发送,这行代码主要体现的是将SBUF里面的数据输出
    	}
    }
    
    SBUF = data_sj;主要表达的如下图是输出SBUF的这一过程。而不是写入SBUF这一过程,
    

    在这里插入图片描述
    在这里插入图片描述
    如图:PC机每隔1s接收到一个字符A。

  • 相关阅读:
    Centos7 yum方式安装mysql8
    2个比较经典的PHP加密解密函数分享
    最短路径问题
    应届生必读:Java真实项目的开发流程和常用工具
    客户关系管理系统(CRM)开发的意义
    大话超越菜鸟C#的实践入门进阶必知点,深入浅出解析 33 算法逻辑入门 抽象现实世界之大佬打一眼看不明白的代码,才是够技术含量的代码类
    AI中文版怎么用,版本分享,GPT官网入口
    天津化工杂志天津化工杂志社天津化工编辑部2022年第3期目录
    ES6新特性详解
    【LeetCode】234. 回文链表
  • 原文地址:https://blog.csdn.net/qq_51284092/article/details/140407458