嵌入式技术学习——c51——串口

一、串口介绍。

串口是一个 通讯接口。成本低,容易使用,通信线路简单,可实现两个设备的相互通信

单片机的串口可以实现单片机于单片机,单片机与电脑,单片机与其他模块相互通信。

51单片机内部自带UART,通用异步手法器,实现单片机的串口通信。

二、硬件电路

1、简单双向串口通信有两根通信线(发送端TXD和接收端RXD)

TXD和RXD要交叉连接,

当电平标准不一致时,需要加电平转换芯片。

通信必须需要txd和rxd和gnd三根线

三、电平标准

电平标准时数据1和数据0的表达式,时传输线缆中人为规定的电平与数据的对应关系,串口常用的标准三种:

TTL电平:-+5表述1,0V表示0                                     

RS232电平:-3~-15V表示1,+3~+15V表示0

RS485电平:两线压差+2~+6V表示1,-2~-6V表示0(差分信号)

TTL和RS232z最多可以输出十多米

RS485可以达到1000米

四、通信接口

(1)c51的单片机串口

名称:UART           引脚定义:TXD RXD          通信方式:全双工、异步        特点:点对点通信

(2)串行通信模式

        全双工:通信双方可以在同一时刻互相传输数据。

         半双工:通信双方可以互相传输数据,但必须分时复用一根数据线

         单工:通信只能一方发送给另一方。

(3)传输数据方式

        异步:通信双方各各自约定通信速率

       同步:通信双方靠一根时钟线来约定通信速率

(4)其他

总线:连接各个设备的数据传输线路(类似于一条马路,把路边各住户连接起来,让住户相互交流)

 波特率:串口通信的速率,单位时间内发送的比特率(bits\s)

 检验位:用于数据验证(奇校验与偶校验)

 停止位:用于数据帧间隔

 时序图

五、51单片机的UART

c51中只有1个UART

其有4种工作模式:

(1)模式0:同步移位寄存器

(2)模式1:8位UART,波特率可变(常用)

(3)模式2:9位UART, 波特率固定

(4)模式3:9位UART,波特率可变

六、串口模式图

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

        在总线上接受数据和发送数据,靠定时器计数,T1的溢出率经过二分频或16分频控制收放的速率,通过SBUF写入发送数据。将数据放在SBUF,单片机自动读写数据,发送之后会申请TI这个发送中断,接收数据会生成RI接受中断。

七。寄存器

还有定时器,中断的寄存器看前面的文章。

七、课堂练习

发送数字,数码管输出相应的数字。

       uart.c

#include "reg51.h"
#include "utils.h"
#include "ledNum.h"
void uartInit(void)
{
  SCON |= 0x01<<6;  //选择uart 工作方式1 8位的uart 
  SCON |= 0x01<<4;  //开启接收
  PCON |= 0x01<<7;  //波特率设置翻倍
  TH1  = 243;
  TL1  = 243;
  TMOD |= 0x01<<5;
  TCON |= 0x01<<6;  //开启定时器 

  //串口中断相关 
  IE |= 0x01<<7 | 0x01 << 4; // 开启总中断 和 串口中断
}

void sendOneByte(unsigned char ch)
{
 	SBUF=ch;	
    while (SCON&(0x01<<1) == 0)
	;
    SCON &= ~(0x01<<1); //软件清零 
}

void sendStr(const  char *s)
{
	int i = 0;
	while (s[i])
	{
		sendOneByte(s[i]);
		++i;
		delay(30000);
	}
}


void uartHandler(void) interrupt 4
{
    if (SCON&0x01)//接收中断 
	{
		P2 = ~P2;
		displayNum(1,SBUF);
		SCON &= ~0x01<<0;
	}
}

                  uart.h

#ifndef _UART_H_
#define _UART_H_
void uartInit(void);
void sendOneByte(unsigned char ch);
#endif 

延迟 utils.c

void delay(unsigned int n )
{
	while(n)
	--n;
}

延迟   utils.h

#ifndef _UTILS_H_
#define _UTILS_H_

void delay(int n);
#endif

       ledNum.c

#include <reg51.h>
 
void displayNum(unsigned int dig,int n)
{
	unsigned char num[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d,
	                       0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c,
						   0x39, 0x5e, 0x79, 0x71, 0x00};
						   
	//位的选择 
	P1 = 0x01 << (dig-1); //1 2 3 4 
		
	//显示数据 --段的选择
	P0 = num[n];
}

void display(int num)
{
	//1234 
	unsigned int k = 0;
	unsigned int i = 1;
	while(num)
	{
		k = num % 10; //
		displayNum(i,k);
		num = num/10; //123
		i++;
	//	delay(500);
	}
}

main.c

#include "reg51.h"
#include "uart.h"
#include "utils.h"
#include <stdio.h>


void main(void)
{
	uartInit();
	while (1)
	{		
		sendOneByte(SBUF);
		delay(10000);
	    
	}
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/718514.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

16.RedHat认证-Ansible自动化运维(中)

16.RedHat认证-Ansible自动化运维(中) 部署Ansible Ansible的Inventory文件 Inventory文件定义了ansible管理的主机&#xff0c;说白了就是Inventory文件中的内容是记录被管理的主机。 Inventory文件分为两种&#xff0c;一种是静态的Inventory文件&#xff0c;一种是动态的…

mcms-5.2.8环境部署

1 数据库 1.1 新建数据库 1.2 导入数据表 2 tomcat配置 2.1 在IDEA中tomcat环境并配置 首先添加tomcat服务器并配置 配置Artifacts&#xff08;这里配置不正确的话&#xff0c;在运行时会报错&#xff1a;Error during artifact deployment. See server log for details.&am…

一文理解多模态大模型 MLLM

简介 最近&#xff0c;多模态大型语言模型&#xff08;LLMs&#xff09;因其理解和生成多种数据类型内容的能力&#xff0c;受到了研究界和科技行业的广泛关注。 这些多模态模型基于单模态模型&#xff08;如Chat-GPT&#xff09;的基础原理&#xff0c;整合了视觉、听觉和文…

计算机网络:1概述、2物理层

目录 概述因特网网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系因特网发展的三个阶段因特网服务提供者&#xff08;Internet Service Provider&#xff0c;ISP&#xff09;因特网的标准化工作因特网的管理结构 三种交换电路交换分组交换报文交换 计算机网络性…

RocketMQ源码学习笔记:NameServer启动流程

这是本人学习的总结&#xff0c;主要学习资料如下 马士兵教育rocketMq官方文档 目录 1、Overview2、NameServer启动流程2.1、总结2.2、NamesrvController2.2.1、主要职责2.2.2、关键的成员变量2.2.3、核心代码2.2.4、值得注意的点 1、Overview NameServer主要就做三件事 Nam…

胡说八道(24.6.12)——数字电子技术以及Modelsim

上回书说到数电中的最常用的表达式——逻辑表达式(由布尔代数组成)以及常用的两种图表——真值表(真值表表示的是所有的输入可能的线性组合以及输出)和卡诺图(卡诺图则是一种化简工具&#xff0c;排除冗余项&#xff0c;合并可合并项)。 今天&#xff0c;先来看看昨天说的基本逻…

AI写代码,CS还有前途吗?加州大学伯克利分校:CDSS申请人数激增48%!

目录 01 CS入学人数暴涨 02 人类Coder可堪大任 03 AI还没有学会创新 04 编程与农耕不同 AI写了这么多代码&#xff0c;你还应该学习计算机科学吗&#xff1f; 新的数据显示&#xff0c;学生们仍然热衷于选修计算机科学&#xff1a;加州大学伯克利分校&#xff08;UCB&#…

AI训练Checkpoint对存储的影响

检查点&#xff08;Checkpoints&#xff09;是机器学习和深度学习训练过程中的一个重要机制&#xff0c;旨在定期保存训练状态&#xff0c;以便在训练过程中遇到失败或中断时能够从中断处恢复训练&#xff0c;而无需从头开始。 随着模型参数量的剧增&#xff0c;Checkpoint文件…

Linux_理解程序地址空间和页表

目录 1、进程地址空间示意图 2、验证进程地址空间的结构 3、验证进程地址空间是虚拟地址 4、页表-虚拟地址与物理地址 5、什么是进程地址空间 6、进程地址空间和页表的存在意义 6.1 原因一&#xff08;效率性&#xff09; 6.2 原因二&#xff08;安全性&#xff09; …

项目实战中学透Spring-业务场景驱动-Spring01(IOCDI)

软件环境 JDK1.8 Maven3.6 IDEA2022.3(Ultimate Edition) Spring5.3.29 主要知识点大纲 1.Spring简介 2.Spring整体架构 3.业务场景中理解Spring IOC(控制反转)和DI(依赖注入) 4.业务场景中理解IOC容器&#xff0c;实例化容器&#xff0c;实例化Bean的几种方式 5.业务…

【数据结构与算法 刷题系列】判断链表是否有环(图文详解)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​ ​ 目录 一、问题描述 二、解题思路 1.解题思路: 2.快慢指针的移动分三个…

【C++】:list容器的基本使用

目录 &#x1f680;前言一&#xff0c;list的介绍二&#xff0c;list的基本使用2.1 list的构造2.2 list迭代器的使用2.3 list的头插&#xff0c;头删&#xff0c;尾插和尾删2.4 list的插入和删除2.5 list 的 resize/swap/clear &#x1f680;前言 list中的接口比较多&#xff…

Android Calculator2源码分析与修改

private CalculatorDisplay mDisplay; private Symbols mSymbols new Symbols(); -41,6 44,7 class Logic { private int mLineLength 0; private static final String INFINITY_UNICODE “\u221e”; private static final String ZMS_NUMBER “55555”; public stat…

Windows系统下制作Windows Server系统U盘启动及安装指导

Windows系统下制作Windows Server系统U盘启动及安装指导 一、准备工作 U盘不得小于8G(推荐使用usb3.0接口)&#xff1b;下载好对应的系统镜像&#xff1b;下载RUFUS或者软通碟U盘制作启动软件&#xff1b; 二、Windows操作系统下制作U盘启动&#xff08;这里以使用RUFUS软件…

VirtualBox 安装UOS统信服务器操作系统

1、准备 1.1安装VirtualBox 由于过程简单&#xff0c;不做赘述&#xff01; 1.2下载UOS服务器版本 下载免费版本即可 服务器与云计算操作系统-统信软件 (uniontech.com)https://uniontech.com/os-serverCloud.html 2、安装 2.1新建虚拟机 2.2选择虚拟机模式&#xff0c;这…

day63 单调栈part02 42. 接雨水 84.柱状图中最大的矩形

42. 接雨水 1.首先单调栈是按照行方向来计算雨水&#xff0c;如图&#xff1a; 2.使用单调栈内元素的顺序 从大到小还是从小到大呢&#xff1f; 从栈头&#xff08;元素从栈头弹出&#xff09;到栈底的顺序应该是从小到大的顺序。 因为一旦发现添加的柱子高度大于栈头元素…

【MATLAB】- 随笔 :如何检测一个字符串数组中是否包含自己想要的序列

1. 问题重述 比如我现在有一个 strArray [“a”, “1”, “2”, “b”]; 我想确定里面是否包含[“1”, “2”]; &#xff0c;由于MATLAB基础库中没有现成的函数可以直接检查连续子数组或连续多个元素的序列&#xff0c;下面给出自定义函数来实现这一功能。 2. 自定义函数 2…

部分CVE复现Web(1)

Apache HTTP Server 路径穿越漏洞CVE-2021-41773 ​ 首先&#xff0c;先来看一下这个漏洞的官方描述&#xff1a; ​ CVE-2021-41773 是在 Apache HTTP Server 2.4.49 中对路径规范化所做的更改中发现了一个缺陷。攻击者可以使用路径遍历攻击将 URL 映射到预期文档根目录之外的…

【Linux 12】进程控制

文章目录 &#x1f308; Ⅰ 进程创建01. fork 函数介绍02. 写时拷贝03. fork 常规用法04. fork 调用失败的原因 &#x1f308; Ⅱ 进程终止01. 进程退出场景02. 常见退出方法 &#x1f308; Ⅲ 进程等待01. 进程等待必要性02. 进程等待的方法2.1 wait 方法2.2 waitpid 方法 03.…