51单片机入门_江协科技_19~20_OB记录的笔记

2024-04-05 06:28

本文主要是介绍51单片机入门_江协科技_19~20_OB记录的笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

19. 串口通讯

  • 19.1. 串口介绍:
    •串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
    •单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
    •51单片机内部自带UART(Universal Asynchronous Receiver Transmitter,通用异步收发器),可实现单片机的串口通信。
    在这里插入图片描述

  • 19.2. 串口硬件电路
    •简单双向串口通信有两根通信线(发送端TXD和接收端RXD)
    •TXD与RXD要交叉连接,TXD Transmit Exchange Data;RXD Receive Exchange Data
    •当只需单向的数据传输时,可以直接一根通信线
    •当电平标准不一致时,需要加电平转换芯片
    在这里插入图片描述

  • 19.3. 电平标准
    •电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系,串口常用的电平标准有如下三种:
    •TTL电平:+5V表示1,0V表示0
    •RS232电平:-3-15V表示1,+3+15V表示0
    •RS485电平:两线压差+2+6V表示1,-2-6V表示0(差分信号)

  • 19.4. 接口及引脚定义
    在这里插入图片描述

  • 19.5. 常见通讯接口比较:
    在这里插入图片描述

  • 相关的术语有:
    •全双工:通信双方可以在同一时刻互相传输数据
    •半双工:通信双方可以互相传输数据,但必须分时复用一根数据线
    •单工:通信只能有一方发送到另一方,不能反向传输
    •异步:通信双方各自约定通信速率
    •同步:通信双方靠一根时钟线来约定通信速率
    •总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,使住户可以相互交流)

  • 19.6. 51单片机的UART
    •STC89C52有1个UART
    •STC89C52的UART有四种工作模式:
    模式0:同步移位寄存器
    模式1:8位UART,波特率可变(常用)
    模式2:9位UART,波特率固定
    模式3:9位UART,波特率可变
    在这里插入图片描述

  • 19.7. 串口参数及时序图
    •波特率:串口通信的速率(发送和接收各数据位的间隔时间)
    •检验位:用于数据验证,奇校验,偶数个1的时,校验位补1,奇数个1的时候,校验位补0;
    •停止位:用于数据帧间隔
    在这里插入图片描述

  • 19.8. 串口模式图
    在这里插入图片描述

    •SBUF:串口数据缓存寄存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器,读操作时,读出的是接收寄存器

  • 19.9. 串口和中断系统
    在这里插入图片描述

  • 19.10. 串口相关寄存器
    在这里插入图片描述

  • 19.11. 数据显示模式
    •HEX模式/十六进制模式/二进制模式:以原始数据的形式显示
    •文本模式/字符模式:以原始数据编码后的形式显示

20. 串口向电脑发送数据&电脑通过串口控制LED

  • 20.1. STC89C52手册中的串口介绍如下:

  • STC89C52系列单片机内部集成一个功能很全双工串行通信口,与传统8051单片机的串口完全兼容。设2个互相独立的接收、发送缓冲器,可以同时发送和接收数据。发送缓冲器只能写而不能读出,接收缓冲器只能读出而不能写入,因而两个缓冲器可以共用一个地址码(99H)。两个缓冲器统称串行通信特殊功能寄存器SBUF。

  • 串行通信设有4种工作方式,其中两种方式的波特率是可变的,另两种是固定的,以供不同应用场合选用。波特率由内部定时器/计数器产生,用软件设置不同的波特率和选择不同的工作方式。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。

  • STC89C52系列单片机串行口对应的硬件部分对应的管脚是P3.0/RxD和P3.1/TxD。

  • STC89C52系列单片机的串行通信口,除用于数据通信外,还可方便地构成一个或多个并
    行I/O口,或作串—并转换,或用于扩展串行外设等。
    在这里插入图片描述

  • 20.2. 串口通讯程序初始化(新建工程8-1 串口向电脑发送数据),需要增加之前的模块程序“delay_xms.h”
    在这里插入图片描述

  • 20.3. 串口相关寄存器的配置:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • SM0=0, SM1=1, 适配当前学习环境

  • SM2=0;

  • REN=1单片机接受数据,测试程序REN=0先给0用于测试;

  • TB8=0, RB8=0;

  • TI=0必须用软件复位;标志位,发送后必须软件复位置0;

  • RI=0;

  • 综上SCON=0100 0000B=0x40;

在这里插入图片描述

  • SBUF初始化无需配置;

  • PCON初始化配置借助STC-ISP进行波特率的配置;

  • 除此以外还需要配置定时器,这里配置的是定时器1,因为定时器配置中涉及波特率计算,作者借助STC-ISP的工具直接进行配置,配置中的各项参数设置如图:
    在这里插入图片描述

  • 初始化函数如下

void Uart_Init(void)	//4800bps@12.000MHz
{PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差SCON = 0x50;	//8位数据,可变波特率//AUXR &= 0xBF;	//定时器时钟12T模式//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器TMOD &= 0x0F;	//设置定时器模式TMOD |= 0x20;	//设置定时器模式TL1 = 0xF3;		//设置定时初始值TH1 = 0xF3;		//设置定时重载值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}
  • 20.4. 测试发送数据0x66;
#include <REGX52.h>
#include "delay_xms.h"void Uart_Init(void)	//4800bps@12.000MHz
{PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差SCON = 0x50;	//8位数据,可变波特率//AUXR &= 0xBF;	//定时器时钟12T模式//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器TMOD &= 0x0F;	//设置定时器模式TMOD |= 0x20;	//设置定时器模式TL1 = 0xF3;		//设置定时初始值TH1 = 0xF3;		//设置定时重载值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);//判断是否发送TI=0;		//发送后置0
}void main()
{Uart_Init();Uart_SendByte(0x66);while(1){}}
  • Proteus中测试验证无误;
    在这里插入图片描述

  • STC-ISP中显示结果无误
    在这里插入图片描述

  • 20.5. 一个问题,如果程序稍微修改一下,重复快速发送数据0x66,有概率实际开发板接收数据为96(作者视频中演示),需要在发送语句后面加入1ms延时,以减少出错概率,main函数修改为如下:

void main()
{Uart_Init();while(1){Uart_SendByte(0x66);//重复发送数据66delay_xms(1);//1ms的延时用于防止发送数据错误}}
  • 20.6. 测试每隔1s发送一个数字,数字累加,程序如下:
#include <REGX52.h>
#include "delay_xms.h"
unsigned char sec;
void Uart_Init(void)	//4800bps@12.000MHz
{PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差SCON = 0x50;	//8位数据,可变波特率//AUXR &= 0xBF;	//定时器时钟12T模式//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器TMOD &= 0x0F;	//设置定时器模式TMOD |= 0x20;	//设置定时器模式TL1 = 0xF3;		//设置定时初始值TH1 = 0xF3;		//设置定时重载值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1
}void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);//判断是否发送TI=0;		//发送后置0
}void main()
{Uart_Init();while(1){Uart_SendByte(sec);sec++;delay_xms(1000);}}

模拟仿真结果如下:
在这里插入图片描述

  • 20.7. 示例程序STC-ISP中借用串口助手发送数据,开发板接受到相关的数据后在P2的8个LED灯中显示LED灯的相应状态:
#include <REGX52.h>
#include "delay_xms.h"
#include "Uart.h"void main()
{Uart_Init();while(1){}}void Uart_Routine() interrupt 4 //函数名任意,主要是interrupt 4定义中断
{if(RI==1) //判断接收数据中断P2=~SBUF; //接收到的数据取反后赋值P2口RI=0; //RI置0,等待下次接收数据判断}
  • 模块化程序的Uart.c程序如下:
#include <REGX52.h>
/*** @brief 串口初始化4800bps@12.000MHz* @param 无* @retval 无*/void Uart_Init(void)	//4800bps@12.000MHz
{PCON |= 0x80;	//使能波特率倍速位SMOD,加倍波特率减少误差SCON = 0x50;	//8位数据,可变波特率,可接收数据//AUXR &= 0xBF;	//定时器时钟12T模式//AUXR &= 0xFE;	//串口1选择定时器1为波特率发生器TMOD &= 0x0F;	//设置定时器模式TMOD |= 0x20;	//设置定时器模式TL1 = 0xF3;		//设置定时初始值TH1 = 0xF3;		//设置定时重载值ET1 = 0;		//禁止定时器1中断TR1 = 1;		//启动定时器1EA=1;			//启动所有中断ES=1;			//启动串口中断
}/*** @brief 串口发送一个字节数据* @param Byte 要发送的一个字节数据* @retval 无*/void Uart_SendByte(unsigned char Byte)
{SBUF=Byte;while(TI==0);//判断是否发送TI=0;		//发送后置0
}
  • 模块化程序的Uart.h如下:
#ifndef _UART_H_ 
#define _UART_H_  void Uart_Init();
void Uart_SendByte(unsigned char Byte);#endif
  • STC-ISP中发送数字11(0001 0001 B)有2个灯亮起,测试没有问题;;

在这里插入图片描述
在这里插入图片描述

这篇关于51单片机入门_江协科技_19~20_OB记录的笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877847

相关文章

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

从入门到精通详解LangChain加载HTML内容的全攻略

《从入门到精通详解LangChain加载HTML内容的全攻略》这篇文章主要为大家详细介绍了如何用LangChain优雅地处理HTML内容,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录引言:当大语言模型遇见html一、HTML加载器为什么需要专门的HTML加载器核心加载器对比表二

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Zabbix在MySQL性能监控方面的运用及最佳实践记录

《Zabbix在MySQL性能监控方面的运用及最佳实践记录》Zabbix通过自定义脚本和内置模板监控MySQL核心指标(连接、查询、资源、复制),支持自动发现多实例及告警通知,结合可视化仪表盘,可有效... 目录一、核心监控指标及配置1. 关键监控指标示例2. 配置方法二、自动发现与多实例管理1. 实践步骤

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的