【单片机】串口通信/LED点阵

news2024/10/7 14:33:43


目录

一、串口介绍

1、双向串口通信

2、电平标准

3、常用通信协议

4、时序图

二、串口收发数据(模式1)

1、串行控制(模式选择)寄存器SCON(可位寻址)

2、串行口数据缓冲寄存器SBUF

3、电源控制(波特率配置)寄存器PCON(不可位寻址)

4、串行口中断相关寄存器IE、IPH、IP

5、串口通信的模式选择/定时器的模式选择

6、单片机每隔1秒向电脑发送数据

7、电脑向单片机发送数据控制LED,单片机回传相同文本

三、LED点阵

1、LED点阵的原理

2、LED点阵的消影

3、使用LED点阵绘制爱心

4、使用LED点阵播放流水文字


一、串口介绍

串口是一种应用广泛的通讯接口,成本低廉,可以实现两个设备之间的互相通信。

单片机的串口可以使单片机与单片机、电脑、各式模块进行互相通信。

51单片机内部自带UART(通用异步收发器),实现单片机串口通信功能。

1、双向串口通信

1、简单的双向串口通信必须要有TXD、RXD、GND,而VCC看情况,如果是模块设备,则需要VCC;

2、TXD与RXD交叉链接;

3、仅需单向数据传输时,可以仅使用一根通信线;

4、当电平标准不一致时,需要加电平转换芯片(比如设备1串口输出电压12V,而设备2的串口标准电压为5V,会烧坏设备2)

2、电平标准

电平标准是数据1和数据0的表达方式,是传输线缆中人为规定的电压与数据的对应关系。

串口常用的电平标有三种:

TTL电平

低电平

输出电平小于0.8V或输入电平小于1.2V

高电平

输出电平大于2.4V或输入电平高于2V

RS232

低电平

0V

高电平

-3~-15V

RS485

低电平

两线压差-2~-6V(差分信号)

高电平

两线压差+2~+6V(差分信号)

3、常用通信协议

常见通信接口还有CAN和USB等。

全双工(双行道)

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

半双工(单行道)

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

单工 (单向道)

只能单向传输

异步(近似同步)

通信双方各自约定好通信速率

同步

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

总线

连接各个设备的数据传输线路(类似马路,连接路边住户,使用户交流)

4、时序图

检验位有奇校验、偶校验、0校验、1校验等。例如发送数据位0000 0011,进行偶校验,那么发送数据位0000 0011 1,发送时从低位到高位进行发送,对方接收数据后拿着这个校验位进行校验,如果1的个数为奇数,那么传输的数据有误。当然这种方式是检测不出接收数据为0000 0101 1的错误的(这种方法1的数量为偶数,但是所处位置不同,是测不出异常的)。

二、串口收发数据(模式1)

串行口相关寄存器:

1、串行控制(模式选择)寄存器SCON(可位寻址)

51系列单片机UART的工作模式:

模式0

SM0、SM1

00

同步移位寄存器

模式1

01

8位UART,波特率可变(发送和接收各数据位的时间间隔)(常用)

模式2

10

9位UART,波特率固定

模式3

11

9位UART,波特率可变

2、串行口数据缓冲寄存器SBUF

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

3、电源控制(波特率配置)寄存器PCON(不可位寻址)

PCON本质是电源控制寄存器,因为比特位还有空余,放了两个和串口通信有关系的位SMOD和SMOD0。对于串口通信来说,PCON是波特率配置寄存器。

4、串行口中断相关寄存器IE、IPH、IP

PS

PSH

优先级

0

0

串口1中断为最低优先级中断(优先级0)

1

0

串口1中断为较低优先级中断(优先级1)

0

1

串口1中断为较高优先级中断(优先级2)

1

1

串口1中断为最高优先级中断(优先级3)

5、串口通信的模式选择/定时器的模式选择

此处串口使用模式1。

注意51系列单片机不能使用定时器0进行定时。这里使用定时器1+模式二:8位自动重装模式实现串口通信。

8位自动重装模式只有低8位TL1参与计数(定时范围0~255)。当TL1溢出时,单片机自动把存在TH1中的值赋给TL1,继续进行定时计数。该模式与模式一:16为定时器/计数器相比,不需要在中断程序中重新对TH1和TL1重新赋值,减少了中断程序的代码条数,使时间更加精准。

6、单片机每隔1秒向电脑发送数据

void UART_Init()
{
	SCON=0X40;//模式配置
	PCON|=0;//波特率配置,波特率不加倍
	
	TMOD&=0X0F;
	TMOD|=0X20;//设置定时器模式为8位自动重装
	
	TL1=0XFA;//设置定时器初值
	TH1=0XFA;//设置自动重装值,自动重装值和波特率有关
	
	ET1=0;//禁止定时器1中断
	TR1=1;//允许定时器开始计数
	
}
//发送函数
void UART_SendByte(unsigned char byte)
{
	SBUF=byte;//SUBF在等号左边,表示写入,这个SBUF表示发送寄存器
	while(TI==0);//TI是SCON的一位,空循环直到TI等于1,说明发送结束
	TI=0;//需要软件置0
}
unsigned char num;
void main()
{
	UART_Init();
	
	while(1)
	{
		UART_SendByte(num++);//如果在循环中发送的数据有误差,可以延时
		delay_ms(1000);//如果延时太短,发送的数据会有误差
	}
}

7、电脑向单片机发送数据控制LED,单片机回传相同文本

void UART_Init()
{
	SCON=0X50;//模式配置,需要打开接收
	PCON|=0;//波特率配置,波特率不加倍
	
	TMOD&=0X0F;
	TMOD|=0X20;//设置定时器模式为8位自动重装
	
	TL1=0XFA;//设置定时器初值
	TH1=0XFA;
	
	ET1=0;//禁止定时器1中断
	TR1=1;//允许定时器开始计数
	
	EA=1;//配置电路中断打开
	ES=1;
	PS=0;
}
//发送函数
void UART_SendByte(unsigned char byte)
{
	SBUF=byte;//SUBF在等号左边,表示写入,这个SBUF表示发送寄存器
	while(TI==0);//TI是SCON的一位,空循环直到TI等于1,说明发送结束
	TI=0;//需要软件置0
	
}
void main()
{
	UART_Init();
	
	while(1)
	{
		
	}
}
//中断服务函数
void UART_Routine() interrupt 4
{
	if(RI==1)//RI是SCON的一位,RI等于1,说明是发送中断
	{
		P2=~SBUF;
		UART_SendByte(SBUF);
		RI=0;//需要软件置0
	}
}

1、使用串口时,需要禁止定时器中断;

2、当TI或RI等于1时,进入中断服务函数;

3、在中断函数中,如果RI等于1,说明电脑有发送数据给单片机,那么就会进入if循环,执行if循环中代码。

三、LED点阵

1、LED点阵的原理

LED点阵结构类似数码管,有共阴和共阳两种接法,使用时进行逐行或逐列扫描,才能使所有LED同时显示。当然,点阵也需要消影。

SEC是数据排队的入口。SERCLK给高电平,一个bit数据就会进入左侧,当左侧存满时,先进来的数据会被送入QH’,QH’连接在下一个74HC595上。RCLK是接收时钟,会将各个级联的数据从左侧数据传入右侧。

74HC595是串行输入并行输出的移位寄存器,可用3根线输入串行数据,8根线输出并行数据,多片级联后,可输出16位、32位等常用于IO口的扩展。

2、LED点阵的消影

和数码管一样,LED点阵也存在残影问题。在不断“段选位选、段选位选、段选位选”的过程中,下一次的段选完毕后,由于位选代码还没有执行,所以会出现位已变,而段还没来得及改变的鬼影现象。所以可以采用“段选位选延时位清零、段选位选延时位清零、段选位选延时位清零”的方法。(因为位已经清零了,窜位也没事)

3、使用LED点阵绘制爱心

#include <REGX52.H>
#include "delay.h"
#define MXTRIX_LED_PORT P0
sbit RCK=P3^5;//RCLK,高电平将数据搬到引脚
sbit SRCLK=P3^6;//SRCLK,给高电平进一个bit数据
sbit SER=P3^4;//SER,数据进入的地方

//将字节数据写入引脚
void _74HC595_WriteByte(unsigned char byte)
{
	unsigned char i=0;
	for(;i<8;++i)
	{
		SER=(byte>>(7-i))&0X01;//高位先进SER,取出高位
		SRCLK=1;//进数据
		SRCLK=0;//重新置为0
	}
	RCK=1;//将数据送入IO口
	RCK=0;
}
void MatrixLED_ShowColumn(unsigned char Column,unsigned char Data)
{
	_74HC595_WriteByte(Data);//把数据放进来,填充引脚
	MXTRIX_LED_PORT=~(0x80>>Column);//选择哪一列LED,P0中引脚只要是低电平,就有机会亮,高电平肯定不亮
	delay_ms(1);//延时
	MXTRIX_LED_PORT=0XFF;//位清零
}
void main()
{
	SRCLK=0;//初始是高电平,需要先置0
	RCK=0;//初始是高电平,需要先置0
	while(1)
	{
		MatrixLED_ShowColumn(0,0X38);
		MatrixLED_ShowColumn(1,0X44);
		MatrixLED_ShowColumn(2,0X82);
		MatrixLED_ShowColumn(3,0X61);
		MatrixLED_ShowColumn(4,0X61);
		MatrixLED_ShowColumn(5,0X82);
		MatrixLED_ShowColumn(6,0X44);
		MatrixLED_ShowColumn(7,0X38);
	}
}

4、使用LED点阵播放流水文字

unsigned char code Animation[]={//加code变为只读存储,但是储存量大
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0x10,0x10,0x10,0x10,0xFF,0x00,0x00,
0xFF,0x91,0x91,0x91,0x91,0x00,0x00,0xFF,
0x01,0x01,0x01,0x01,0x00,0x00,0xFF,0x01,
0x01,0x01,0x01,0x00,0x00,0x7E,0x81,0x81,
0x81,0x7E,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//加0X00是为了对齐
};
void main()
{
	unsigned char i=0,flag=0,count=0;
	unsigned char num=sizeof(Animation);
	SRCLK=0;//初始是高电平,需要先置0
	RCK=0;//初始是高电平,需要先置0
	while(1)
	{
		while(flag+7<num)
		{
			for(i=0;i<8;++i)
			{
				MatrixLED_ShowColumn(i,Animation[flag+i]);  
			}
			++count;
			if(count==10)
			{
				count=0;
				flag+=1;
			}		
		}
		flag=0;
	}
}

2e11157dcaf05d315e9568d35d374f27.gif

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

引擎入门 | Unity UI简介–第2部分(7)

本期我们继续为大家进行Unity UI简介&#xff08;第二部分&#xff09;的后续教程 本篇内容 12.在菜单场景中添加音乐 13.开启和关闭音乐 文章末尾可免费获取教程源代码 本篇本篇Unity UI简介&#xff08;第二部分&#xff09;篇幅较长&#xff0c;分为八篇&#xff0c;本…

对称加密算法(三)(DES)

文章目录DES EncryptionDES DecryptionExampleThe Avalanche EffectThe Strength of DESThe Use of 56-Bit KeysThe Nature of the DES AlgorithmReferences在 2001 年引入 AEC&#xff08;Advanced Encryption Standard&#xff09;之前&#xff0c;最为普遍使用的加密机制就是…

Python里面的xlrd模块详解

那我就一下面积个问题对xlrd模块进行学习一下&#xff1a; 1.什么是xlrd模块&#xff1f; 2.为什么使用xlrd模块&#xff1f; 3.怎样使用xlrd模块&#xff1f; 1.什么是xlrd模块&#xff1f; ♦python操作excel主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读excel&…

SQL 入门篇之什么是别名?

SQL 入门篇之什么是别名&#xff1f; &#x1f4d2;博客主页&#xff1a; ​​开心档博客主页​​ &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐留言&#x1f4dd; &#x1f4cc;本文由开心档原创&#xff01; &#x1f4c6;51CTO首发时间&#xff1a;&#x1…

计算机研究生就业方向之考公

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

一篇文章带你了解Linux内核进程上下文切换

&#xff11;&#xff0e;进程上下文的概念 进程上下文是进程执行活动全过程的静态描述。我们把已执行过的进程指令和数据在相关寄存器与堆栈中的内容称为进程上文&#xff0c;把正在执行的指令和数据在寄存器与堆栈中的内容称为进程正文&#xff0c;把待执行的指令和数据在寄…

【SpringMVC】HiddenHttpMethodFilter 转换请求方式

由于浏览器只支持发送get和post方式的请求&#xff0c;那么该如何发送put和delete请求呢&#xff1f; SpringMVC 提供了 HiddenHttpMethodFilter 帮助我们将 POST 请求转换为 DELETE 或 PUT 请求 HiddenHttpMethodFilter 处理put和delete请求的条件&#xff1a; 当前请求的请求…

软考《系统集成项目管理工程师》必备100题(1)

新一轮软考备考来啦~为了帮助大家提高备考效率&#xff0c;将2023上半年软考《系统集成项目管理工程师》必备100题&#xff0c;分享给大家&#xff0c;快来跟着一起打卡学习吧&#xff01; 有电子版的&#xff0c;可以打印下来背诵~ 1.项目管理过程组有哪些? 启动过程组:定…

aspose win/linux WORD转PDF(及其解决乱码方式)

aspose win/linux WORD转PDF&#xff08;及其解决乱码方式&#xff09;1.工具类2.控制台3.解决乱码4.JAR包之前自己用的docm4j 本地进行转换是ok 在服务器中就异常了&#xff1b; 后来在网上查询之后 do4j无法支持liunx系统&#xff1b; 1.工具类 package com.aostar.ida.fra…

LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计2

LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计2 这部分是< LabVIEW在面向对象编程中利用硬件抽象层(HAL)设计1>的下半部分。 一体化项目 因此&#xff0c;部署为打包库&#xff0c;实际上有多种方法来开发代码:首先&#xff0c;将查看all-in-one项目方法。父类和子…

python numpy 的输出控制

示例代码&#xff1a; import numpy as np #precision: xnp.array([3.1415926]) print(x) np.set_printoptions(precision4) print(x)#threshold: xnp.arange(0,12,1) print(x) np.set_printoptions(threshold7) print(x)#edgeitems: xnp.arange(0,12,1) print(x) np.set_prin…

【大数据】clickhouse 常用语法规则优化策略详解

一、前言 在之前的文章中&#xff0c;我们了解到clickhouse作为一款列式存储数据库 &#xff0c;查询性能非常高效&#xff0c;一方面与其自身的存储引擎设计有关&#xff0c;另一方面&#xff0c;在执行查询语句时&#xff0c;底层做了大量的语法规则的优化&#xff0c;本文将…

一体化闸门控制机如何使用

一体化闸门控制机是一款集水位采集、流量计算、图片视频采集、远程通讯、远程控制、本地控制于一体的闸门自动化、信息化测控设备&#xff0c;能够在监控中心远程启闭以及闸门手/自动控制;并通过实时图像监控可以直观了解闸门的运行工况以及周边环境。 1、设备介绍 闸门自动化…

Windows11 Docker镜像存储路径更改(非C盘路径)

Windows11 Docker镜像存储路径更改&#xff08;非C盘路径&#xff09; 基于WSL2安装docker后&#xff0c;在使用过程中会发现大量的docker镜像文件&#xff0c;使系统C盘容量激增&#xff0c;对电脑后续使用造成不便&#xff0c;所以需要在安装的时候&#xff0c;手动修改dock…

已开发多款原型,或明年发布新品,三星XR专利布局大揭秘

近期据韩媒Naver新闻爆料&#xff0c;三星电子或将于明年面向开发者推出XR头显&#xff0c;以构建XR生态系统。据悉&#xff0c;三星计划通过打造XR生态系统&#xff0c;来整合元宇宙、软件、内容、元件开发和科研等上下游领域。据称&#xff0c;为了开发XR设备&#xff0c;三星…

数据仓库电商业务简介完整使用 (第二章)

电商业务简介一、电商业务简介1、电商业务流程2、电商常识1&#xff09;SKU和SPU2&#xff09;平台属性和销售属性1&#xff09;平台属性2&#xff09;销售属性二、业务数据介绍1、电商系统表结构1、活动信息表&#xff08;activity_info&#xff09;2、动规则表&#xff08;ac…

【Docker】解决Docker创建Tomcat容器实例后访问Tomcat主页时报HTTP状态404-未找到的错误

专栏精选文章 《Docker是什么&#xff1f;Docker从介绍到Linux安装图文详细教程》《30条Docker常用命令图文举例总结》《Docker如何构建自己的镜像&#xff1f;从镜像构建到推送远程镜像仓库图文教程》《Docker多个容器和宿主机之间如何进行数据同步和数据共享&#xff1f;容器…

LeetCode HOT 100 —— 215.数组中的第K个最大元素

题目 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路 一.暴力法&#xff1a; cla…

计算机研究生就业方向之去大厂做人工智能

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

ARM32汇编逆向分析基础

寄存器和指令基本格式 寄存器 寄存器名称寄存器描述R0函数的第1个参数, 以及保存函数返回的结果R1 - R3保存函数的第2~4个参数R4 – R8通用寄存器&#xff0c;其中R7在系统调用时存储调用号R9平台相关R10通用寄存器, 可用于保存局部变量R11/FP栈帧指针, 用于记录栈帧R12过程间…