基于51单片机的点阵显示的proteus仿真(附源码)


一、 前言

上一篇我们学习了独立按键和矩阵按键扫描,今天我们讲点阵。

那点阵是个什么东西呢?led大家都知道,其实点阵也是led,不信大家看下面的原理图。
在这里插入图片描述
点阵和LED之间的关系类似于矩阵按键和独立按键之间的关系,点阵由多个LED灯组成,可以按照特定的排列方式组织成图像或文字。而LED则是点阵的基本组成单元,通过控制LED的亮灭来实现图像或文字的显示。实物如下图所示:

在这里插入图片描述


二、点阵显示

74HC595(8位串行输入、并行输出的缓存器)

这里为什么会提到74HC595,当我们的单片机的IO口资源比较紧张的时候,就会用到它,它常常用于需要扩展输出端口的场景,例如微控制器与多个LED、数码管或其他数字输出设备的连接,以节省微控制器的IO资源。

工作原理

在这里插入图片描述

这里引脚就不一一说明了,简单说下它的工作原理。

时序图:(这里的时序图和我找的引脚名称不一样,应该是不同厂家命名不一样而已,作用是一样的。)

在这里插入图片描述

真值表:
在这里插入图片描述
通过上面的时序图和真值表,我们知道它的工作原理是

  1. 通过DS数据输入引脚,将要传输的位数据输入到595上;
  2. 在SH_CP(也就是移位寄存器时钟输入)为上升沿的时候,将数据移入到74HC595的移位寄存器上,这里注意先送高位;
  3. 在ST_CP(也就是锁存器时钟输入)为上升沿的时候,将移位寄存器的数据输出到存储寄存器上,也就是输出端Q0~Q7。
  4. 当MR为高电平,数据在SHCP上升沿进入移位寄存器,在STCP上升沿输出到并行端口,OE为使能端,低电平有效,当OE为低时,输出使能,为高关闭使能,并不影响其他输入端。

一句话概括就是在正常使用时ST_CP为低电平, /OE为低电平。从DS每输入一位数据,串行输入时钟SH_CP上升沿有效一次,直到八位数据输入完毕,输出时钟ST_CP上升沿有效一次,此时,输入的数据就被送到了输出端。

级联

如果一片595不够用,想要用多片且没有多余IO口呢,这时候就可以采用级联的方式来使用。这是因为一般情况是使用for循环一次性输入8个数据,当超过8个数据,多余的数据会从QH’输出。

级联的具体连接方式是将上一个74HC595的QH’输出端口连接到下一个74HC595的串行输入端口SER上,这样就可以通过移位寄存器时钟和锁存器将数据从一个74HC595移位到下一个74HC595,并最终输出到扩展的输出端口上。

在这里插入图片描述

仿真图

前期准备

一开始以为Proteus仿真里面没有点阵,得自己画led灯搭建一个,没想到还是可以找到的。在这里插入图片描述
在查找元器件里输入MATRIX就会出来4种颜色的8*8点阵,选择你喜欢的颜色即可,这里以蓝色点阵为例。

在这里插入图片描述
因为没标正负,也不确认哪个是控制行,哪个是控制列,但是知道它是led,所以直接接电进去,如果接反不会亮。

在这里插入图片描述

点阵显示一个点

这里采用两片74HC595级联的方式,第一片74HC595的输出口连接到点阵的行控制(高电平),第二片的74HC595的输出口连接到点阵的列控制(低电平)。

在这里插入图片描述

点阵显示数字0

在这里插入图片描述

点阵显示汉字小

在这里插入图片描述

仿真程序

需要显示什么,只需要更改ledduan[]即可,这是段选数据,用于控制行显示的。

这里简单说明下ledduan[]如何更改,以显示数字0为例,0x1c为0001 1100,行是高电平点亮。所以0x1C就是点亮最下往上数的第一行的中间3个点,以此类推,就可以推断出显示0需要点亮哪几个点了。

///**************************************************************************************
//*		              8*8LED点阵———点亮实验												  *
//实现现象:下载程序后点阵显示对应图形
//			
//注意事项:要显示什么,需要更改ledduan[] 段选数据																				  
//***************************************************************************************/
#include "reg51.h"
#include <intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit SER = P3^4; // 定义595的数据输入引脚
sbit RCLK = P3^5; // 定义595的移位寄存时钟引脚
sbit SRCLK = P3^6; // 定义595的存储寄存时钟引脚

//u8 ledduan[] = {0x1C, 0x22, 0x22, 0x22, 0x22, 0x22, 0x1C, 0x00}; // 段选数据,用于行控制 显示数字0
//u8 ledduan[] = {0x08, 0x0c, 0x08, 0x49, 0x2a, 0x08, 0x08, 0x08}; // 段选数据,用于行控制  显示汉字小
u8 ledduan[] = {0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};  // 段选数据,用于行控制  显示一个点
u8 ledwei[] = {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE}; // 位选数据,用于列控制

/*******************************************************************************
* 函数名       : Hc595SendByte
* 函数功能	   : 向74HC595发送一个字节的数据
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
    u8 a;
    SRCLK = 0;
    for(a = 0; a < 8; a++)
    {
        SER = dat >> 7; // 发送数据,高位先发送
        dat <<= 1;

        SRCLK = 1;
        _nop_();
        _nop_();
        SRCLK = 0;	
    }
}

/*******************************************************************************
* 函数名       : Hc595Send2Byte
* 函数功能	   : 向两片74HC595级联发送两个字节的数据
*******************************************************************************/
void Hc595Send2Byte(u8 dat1, u8 dat2)
{
    Hc595SendByte(dat1); // 发送给连接列的74HC595
    Hc595SendByte(dat2); // 发送给连接行的74HC595

    RCLK = 1; // 更新数据到输出寄存器
    _nop_();
    _nop_();
    RCLK = 0;
}

/*******************************************************************************
* 函数名       : main
* 函数功能	   : 主函数
*******************************************************************************/
void main()
{			
    u8 i;
    while(1)
    {
        Hc595Send2Byte(0xFF, 0xFF); // 初始化状态,点阵全灭
        for(i = 0; i < 8; i++)
        {
            Hc595Send2Byte(ledwei[i], ledduan[i]); // 同时发送列和行数据
        }	
    }		
}

三、总结

今天主要讲了基于51单片机的点阵显示的proteus仿真。

感谢你的观看!

在这里插入图片描述

  • 41
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaobuding_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值