51单片机点阵开发

news2024/11/16 1:56:31

一.LED点阵屏

LED点阵屏通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片、动画、视频等,LED点阵显示屏制作简单,安装方便,被广泛应用于各种公共场合,如汽车报站器、广告屏、银行窗口屏叫号屏以及停车系统等等。
LED点阵屏在生活中的应用:
在这里插入图片描述

二.点阵原理分析

我们今天实验的是8*8点阵屏,其原理图如下所示:
在这里插入图片描述
直接看右边的原理图,它有8行8列的LED灯构成,其共有16个引脚,对于的左边的实物16个引脚位置如图所示。
假设我们现在要点亮右边原理图的第一个引脚,根据二极管的特性是不是需要把引脚9姐高电平,引脚13接低电平,才能使第一个LED灯亮起来。那么如何像生活中那样多个位置的LED灯同时亮起来呢?比如现在要让第一个LED灯和二行二列的那个LED灯同时亮起来,是不是引脚9和14都接高电平,而引脚13和3都接低电平就行了呢?
其实不然,如果同时让引脚引脚9和14都接高电平,而引脚13和3都接低电平,那么你分析以下第二个引脚也就是一行二列的那个引脚,它也是要亮起来的,从而达不到我们的要求。其实这个数码管的动态显示的原理是一样的,也是借助人的视觉效果看起来像是同时亮的,其实它是分两次传输,第一次只有引脚9接高电平,引脚13接低电平从而让第一个灯亮起,而第二次传输只有引脚24接高电平,而引脚3接低电平从而让其对应的灯亮起来。也就是说实际上它是分两次亮起来的,而人眼却无法区分代码运行时这二者的效果,从而实际看起来是同时亮起来的。

三.74HC595芯片

74HC595芯片是一种串入并出的芯片,在电子显示屏制作当中有广泛的应用。 74HC595是8位串行输入/输出或者并行输出移位寄存器。

1.原理图

为什么要在这里说这个芯片呢,原因是我们刚刚知道一个88的点阵屏有16的引脚,而我们的51单片机总共才32个引脚,如果需要同时满足两个或三个点阵屏工作其单片机引脚远远是不够的,但是不可能为此再购买另一个单片机,成本高昂。所以就有了74HC595芯片,它的作用就是可以节省点阵屏占用的引脚数,只需要3个引脚就可以控制一个88的点阵屏,大大节省了引脚资源。
74HC595芯片原理图如下:
在这里插入图片描述

2.引脚说明

符号引脚描述
Q0~Q7第15脚、第1-7脚8位并行数据输出
GND第8脚接地
Q7’第9脚串行数据输出
MR第10脚主复位(低电平)
SHCP第11脚数据输入时钟线
STCP第12脚输出存储器锁存时钟线
OE第13脚输出有效(低电平)
DS第14脚串行数据输入
VCC第16脚电源

3.使用方法

  • DS(14脚):串行数据输入端,级联的话接上一级的Q7
  • Q7'(9脚): 级联输出端。将它接下一个595的DS
  • SHCP(11脚):上升沿时数据从DS(14脚)串行输入。
  • Q0->Q1->...->Q7:移位寄存器的数据移位。
  • STCP(12脚):上升沿时数据从Q0---Q7并行输出
  • MR(10脚):低电平时将移位寄存器的数据清零,通常将它接VCC
  • OE(13脚):高电平时禁止输出(高阻态),通常将它接GND

4.过程分析

串行输入并行输出的过程,首先我们要明白595芯片内部有Q0->Q7八个并行输出端口,每个输出端口与一个移位寄存器相连,总共8个移位寄存器,他们是以类似于“栈”的方式存储的,比如现在我们要输入1001 1011的8位数据,首先它是在SHCP(11脚)和Q7'(9脚)的共同作用下串行输入的,我们在芯片SHCP接收到的第一个上升沿时从Q7'传输最低位的1,然后在下一次的上升沿传输其次的1,在8个上升沿后完成串行输入。
其中第一次传入的1本来是存在Q7端口对应的寄存器,但是在下一位1传入后,第一次的1被挤入Q6对应的寄存器,类似于进栈操作理解,最后的结果是最低位的1存在Q0端口对应的寄存器,最高位的1存在Q7端口对应的寄存器。
那么如何并行输出呢,当输入完成后,如果STCP(12脚)再检测到一个上升沿,那么寄存器对应的内容就会通过对应的输出端口再这个上升沿时全部输出完毕。

5.电路图

74HC595芯片与我们8*8点阵连接的电路图如图所示:
在这里插入图片描述

四.实践编程

1.点亮一颗灯

练习从点亮一颗灯开始:

#include <reg52.h>
#define uchar unsigned char
sbit DIO=P3^4;     //串行输入端口
sbit S_CLK=P3^5;   //移位寄存器时钟,即输入时钟
sbit R_CLK=P3^6;   //输出锁存器时钟,即输出时钟

void main(){
	//ROW 0x80 ,COL 0xfe
	uchar i,date;
	//先发列数据,再发行数据,这是由电路决定的
	date=0xfe;
	for(i=0;i<8;i++)
	{
		S_CLK=0;
		R_CLK=0;
		if(date & 0x01)     //求最低位,为1就发1,为0就发0
			DIO=1;
		else
			DIO=0;
		S_CLK=1;            //产生上升沿,发送数据
		date=date>>1;       //这里有人可能会记得上回的_cror_()函数,注意它是循环右移函数,而不是算术右移函数
	}

	date=0x80;
	for(i=0;i<8;i++)
	{
		S_CLK=0;
		R_CLK=0;
		if(date & 0x01)     //求最低位,为1就发1,为0就发0
			DIO=1;
		else
			DIO=0;
		S_CLK=1;            //产生上升沿,发送数据
		date=date>>1;
	}	
	
	R_CLK=1;    //并行输出数据
	while(1);
	
}

2.显示一个简单的汉字

#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
sbit DIO=P3^4;     //串行输入端口
sbit S_CLK=P3^5;   //移位寄存器时钟,即输入时钟
sbit R_CLK=P3^6;   //输出锁存器时钟,即输出时钟

uchar code table[8]={0xEF,0x01,0x6D,0x01,0x6D,0x01,0xEE,0xE0};

//把发送一次8位数据封装为一个函数
void send_byte(uchar date){
	uchar i;
	S_CLK=0;
	R_CLK=0;
	for(i=0;i<8;i++)
	{
		if(date & 0x01)     //求最低位,为1就发1,为0就发0
			DIO=1;
		else
			DIO=0;
		S_CLK=1;            //产生上升沿,发送数据
		date=date>>1;       //这里有人可能会记得上回的_cror_()函数,注意它是循环右移函数,而不是算术右移函数
		S_CLK=0;
	}
	
}

void main(){
	//0xEF,0x01,0x6D,0x01,0x6D,0x01,0xEE,0xE0 电
	//ROW 0x80 ,COL 0xfe
	uchar j,ROW;
	while(1){
		ROW=0x80;
		for(j=0;j<8;j++)
		{
			send_byte(table[j]);
			send_byte(ROW);
			R_CLK=1;
			R_CLK=0;
			ROW=_cror_(ROW,1);
		}
	}
}

五.课后作业

循环显示几个汉字。

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

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

相关文章

牛客(JZ36 二叉搜索树与双向链表)

题目链接 思路1&#xff1a;使用中序遍历&#xff0c; 创建一个cur记录当前结点&#xff0c;prev记录上一个结点&#xff0c;这样cur->left prev&#xff0c;prev->right cur&#xff0c; 这样就链接 成功了。 难点&#xff1a;需要使用引用来控制prev。 /* struct T…

C# IOC 容器实战:KeyedService和生命周期

文章目录 前言KeyedServiceKey缺少Key值覆盖 KeyedService.AnyKey生命周期测试代码 总结 前言 我之前写过一篇Ioc容器的使用&#xff0c;用的是微软的IOC容器。这次我们再去深入了解一下IOC 和控制反转 .NET Core 依赖注入 Microsoft.Extensions.DependencyInjection ASP.NET …

js 实现拖动按钮添加布局

效果&#xff1a; h布局生成左右布局&#xff0c; v布局生成上下布局 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, ini…

【MATLAB源码-第104期】基于matlab的MPSK和MQAM调制解调方式仿真,输出误码率曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 MPSK&#xff08;多相位键控&#xff09; MPSK是一种基于载波相位变化的数字调制技术。它的核心原理是通过改变载波的相位来表示不同的数字信息。这种技术可以分为几个不同的级别&#xff0c;其中最常见的包括&#xff1a; 1…

用sql计算两个日期的间隔天数 ,去除周末

快递行业&#xff0c;经常需要计算2个节点的时效&#xff0c;有的计算自然日&#xff0c;有时候需要计算去掉周末的时效&#xff0c;计算自然日很简单&#xff0c;用函数datediff 就可以了&#xff0c;计算工作日时效&#xff0c;我的实现方法如下&#xff0c;借助了一个日期维…

GSTAE

缺失数据的流量预测:一种多任务学习方法 摘要:基于真实交通数据的交通速度预测是智能交通系统(ITS)中的一个经典问题。大多数现有的交通速度预测模型都是基于交通数据完整或具有罕见缺失值的假设而提出的。然而,由于各种人为和自然因素,在现实场景中收集的此类数据往往是…

NUS CS1101S:SICP JavaScript 描述:二、使用数据构建抽象

原文&#xff1a;2 Building Abstractions with Data 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 我们现在来到数学抽象的决定性步骤&#xff1a;我们忘记符号代表什么。…[数学家]不需要闲着&#xff1b;他可以用这些符号进行许多操作&#xff0c;而无需看它们所代…

Elasticsearch 7.8.0从入门到精通

安装Elasticsearch 7.8.0 官网&#xff1a;Elasticsearch 7.8.0 | Elastic 大家下载所需要的安装包即可。然后解压缩&#xff1a; Elasticsearch是通过java编写的&#xff0c;所以自带jdk。多好&#xff0c;下载Elasticsearch赠送jdk 0.0&#xff0c;不过一般我们用自己的jdk…

C++学习笔记——输入、输出和文件

目录 一、标准输入输出 2.1下面是它们的基本用法 解释 二、格式化输入输出 2.2下面是一个示例 解释 三、文件读写 3.3下面是一个文件读写的示例 解释 四、异常处理和错误检测 4.1下面是一个示例 解释 五、一个实例代码 5.1如何读取 CSV 文件&#xff0c;并计算每…

QToolBar、QStatusBar和QDockWidget的使用

1. 工具栏 QToolBar 1.1 创建工具栏 1.1.1 工具栏的基本函数 设置工具栏的停靠区域 参数 Qt::LeftToolBarArea //左边 Qt::RightToolBarArea //右边 Qt::TopToolBarArea //顶部 Qt::BottomToolBarArea //底部 Qt::AllToolBarAreas //所有区域 Qt::NoToolBarArea //没有QMa…

基于NLP的恶意网页识别

基于NLP的恶意网页识别 基于NLP的恶意网页识别引言项目目录回顾优化HTML标签提取结果使用预训练模型Fine-tune数据处理和模型训练模型训练与评估模型导出部署与预测总结 基于NLP的恶意网页识别 引言 欢迎阅读《 基于NLP的恶意网页识别》&#xff0c;在前三篇中&#xff0c;我…

如何保证数据库和缓存双写一致性-----一篇足以

保证数据库和缓存双写一致性的必要性和优点在于确保系统数据的准确性和可靠性。通过双写一致性机制&#xff0c;系统可以防止因为缓存数据与数据库数据不一致而导致的业务错误。这种做法有效降低了系统的脆弱性&#xff0c;提高了数据的完整性。同时&#xff0c;通过缓存加速读…

AI智能分析网关V4烟火检测算法解决方案

一、背景需求 根据国家消防救援局公布的数据显示&#xff0c;2023年共接报处置各类警情213.8万起&#xff0c;督促整改风险隐患397万处。火灾危害巨大&#xff0c;必须引起重视。传统靠人工报警的方法存在人员管理难、场地数量多且分散等问题&#xff0c;无法有效发现险情降低…

部署Tomcat及其负载均衡

简介 在前面已经学习了Nginx服务器的安装配置&#xff0c;本章主要采用案例课的形式介绍Tomcat及NginxTomcat负载均衡群集。Tomcat案例首先介绍其应用场景&#xff0c;然后重点介绍Tomcat的安装配置&#xff0c;NginxTomcat负载均衡群集案例是应用于生产环境下的一套可靠的Web站…

牛仔行头目标检测竞赛 李沐老师Kaggle(有代码有注释)

一、比赛地址 CowBoy Outfits Detection | Kaggle 二、数据介绍 这次比赛的数据集一共有4879个image&#xff0c;需要自己划分训练集和验证集。annotation的格式是json&#xff0c;因此如果用yolo系列的算法会涉及到json2txt这一步。当然如果不用yolo系列的就不要这段代码了。…

[vivado ] report_utilization -name

可以Open Synthesiezed或 Implementation 后的Design使用下面的命令&#xff0c;一定要加-name这个option, 后面的utilization_1可以可以自定义。 report_utilization -name utilization_1

【Python机器学习】分类器的不确定估计——预测概率

predict_proba的输出是每个类别的概率&#xff0c;通常比decision_function的输出更容易理解&#xff0c;对于二分类问题&#xff0c;它的形状始终是(n_samples,2)。 import mglearn.tools from sklearn.ensemble import GradientBoostingClassifier from sklearn.datasets im…

从DETR到Mask2Former(3):masked attention的attention map可视化

Mask2Former的论文中有这样一张图&#xff0c;表示masked attenion比cross attention效果要好 那么这个attention map是怎么画出来的&#xff1f; 在mask2attention的源代码中 CrossAttentionLayer这个类中&#xff0c;在forward_post函数中做如下修改&#xff1a; def forwar…

轴组【CAN】

如果有126个轴&#xff0c;你程序里挨个添加轴很麻烦。 可以用轴组批量添加。【数组】 CAN驱动器 0x164 就是下个驱动器 p_CAN主站地址:ADR(IoConfig_Globals.CANopen_Manager_SoftMotion);p_CAN从站地址1:ADR(IoConfig_Globals.DMA882_CAN);p_CAN从站地址2:ADR(IoConfig_Gl…

重磅!OpenAI正式发布,自定义ChatGPT商店!

1月11日凌晨&#xff0c;OpenAI在官网正式发布了&#xff0c;自定义GPT商店&#xff0c;可以帮助用户找到目前最好用、流行的自定义ChatGPT助手。 在2024年第一季度&#xff0c;OpenAI将启动GPT 开发者收入计划。首先&#xff0c;美国地区的开发者将根据用户对其 GPT 的使用情…