51单片机 您所在的位置:网站首页 51单片机驱动显示屏 51单片机

51单片机

2024-07-11 01:04| 来源: 网络整理| 查看: 265

写在前面:本节我们学习了点阵屏的工作原理,学习相关的驱动芯片74HC959,熟悉相关电路,以及取模软件的学习,通过51单片机实现了相关的实验。点阵屏逐行显示,点阵屏显示“♥”型图案以及点阵屏实现流动字幕;

        在前面的实验中,我们直接使用IO口控制了许多外设,这些外围设备占据了许多IO口,而我们知道,51单片机的IO口是十分有限的,如果想要连接更多的外设,就需要对IO口进行扩展实现。本节我们使用一种IO口扩展方式---串转并,使用的芯片是74HC595,连接51单片机的LED点阵屏模块。

实验目录:

1、点阵屏逐行显示;

2、点阵屏显示“♥”型图案;

3、点阵屏实现流动字幕;

目录

一、硬件部分

1.1 LED点阵屏介绍

1.2 74HC595芯片介绍

二、原理图

2.1  LED点阵屏电路图

2.2 74HC595电路图

三、取模软件

四、软件设计

4.1 点阵屏逐行显示

4.2 点阵屏显示“♥”型图案

4.3 点阵屏实现流动字幕;

一、硬件部分 1.1 LED点阵屏介绍

        LED 点阵是由发光二极管排列组成的显示器件,在我们日常生活的电器中随 处可见,被广泛应用于汽车报站器,广告屏等。

        通常应用较多的是 8*8 点阵结构,然后使用多个 8*8 点阵可组成不同分辨率的 LED 点阵显示屏,比如 16*16 点阵可以使用 4 个 8*8 点阵构成。其内部结构图如下所示:

         8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线 的交叉点上,当对应的某一行置 1 电平,某一列置 0 电平,则相应的二极管就亮; 如要将第一个点点亮,则 1 脚接高电平 a 脚接低电平,则第一个点就亮了;如果 要将第一行点亮,则第 1 脚要接高电平,而(a、b、c、d、e、f、g、h )这些 引脚接低电平,那么第一行就会点亮;如要将第一列点亮,则第 a 脚接低电平, 而(1、2、3、4、5、6、7、8)接高电平,那么第一列就会点亮。

1.2 74HC595芯片介绍

            74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三态输出(即高电平、低电平和高阻抗)。    可以用3根线输入串行数据,8根线输出并行数据,可输入16位、24位、32位等,常用于IO口扩展。

74HC595的电路图如上图所示,所包含的引脚功能如下表所示:

引脚功能说明OE芯片开关,低电平有效,输出使能;SRCLR串行清零端,低电平时,串行输入的数据清零;RCLK存储器时钟,上升沿,数据由移位寄存器移至数据存储器中;SRCLK移位时钟,上升沿时串行数据在寄存器的数据移位;SER串行数据输入端;OH'点阵屏扩展连接口;OA-OH并行数据输出端;VCC高电平;GND接地端;

 74HC595工作示意图

74HC595工作流程

         74HC595芯片的工作流程如上图:

        首先由SER端口输入串行数据8位(即连续的,一位跟着一位)。SRCLK时钟初始化后为低电平,当SRCLK受到一个上升沿信号时,串行数据就向移位寄存器中下移移位,直至8个上升沿信号,8位串行数据全部进入移位寄存器。RCLK时钟初始化后为低电平,当RCLK受到一个上升沿信号时,移位寄存器的8位数据全部并行移位至数据存储缓冲器,再经OA-OH进行输出(实现3线8 位串行输入、并行输出);数据输入的时候是高位先输入,低位后输入。

        如果移位寄存器8位填满后,继续进行SRCLK受到一个上升沿信号,数据进行移位,OH’此时若连接下一片芯片的SER,则数据就会移至下一片芯片,从而实现数据多位扩展;

        点阵屏与74HC595在51单片机中的位置。

二、原理图 2.1  LED点阵屏电路图

         8*8 点阵共由 64 个发光二极管组成,且每个发光二极管是放置在行线和列线 的交叉点上。其中64个发光二极管的阴极都是由P0口进行控制的,而64只发光二极管的阳极是由74HC595输出端OA--OH控制。

2.2 74HC595电路图

74HC595的相关内容在上面芯片介绍部分已经详细介绍了。

        从上图中可以看出,74HC595 需要用到的控制管脚 SER、RCLK、SRCLK 直接连 接到 51 单片机的 P3.4-P3.6 IO 口上,输出端则是直接连接到 LED 点阵模块的行端口上,即为 LED 发光二极管的阳极,LED 点阵的列则为发光二极管的阴极。

        要想控制 LED 点阵,可以将单片机管脚按照 74HC595 芯片的通信时序要求来传输数据,这样即可控制 LED 点阵的行数据。根据 LED 发光二极管导通原理,当阳极为高电平,阴极为低电平则点亮,否则熄灭。因此通过单片机 P0 口可控制点阵列,74HC595 可控制点阵行;

三、取模软件

      点亮一个点很简单,可是如何点亮多个点呢?如果需要一次显示多个怎么 办?从原理图上可以看到每一行上都连接着多个 LED 灯,每一列上也都连接着 多个 LED 灯,如果要点亮一个,按照上面原理可以,但是要同时点亮多个怎么 办? 那么就需要用到动态数码管的动态扫描原理。

        首先如何点亮一行上面多个灯 或者一列上面多个灯?明显需要某行或某列有效,同时使多列或多行有效。比如 在第一行有效(输出高电平)的情况下,有效列(输出低电平)与这一行交点上 的 LED 灯就会被点亮。那么实现一行或一列点亮会比较容易。如何实现不同行 不同列上的灯被多个点亮呢? 是否是行有效,列有效就可以?并不是! 要实现行列不同位置亮灯,需要使用动态显示的方法,也要结合扫描的方法。 在第一行亮灯一段时间以后灭掉,点亮第二行一段时间以后灭掉,点亮第三行一 段时间以后灭掉,如此点亮,直到八行全部点亮一次,在第一行点亮到最后一行 灭掉的总时间不能超过人肉眼可识别的时间,即 24 毫秒。在每一行点亮的时候, 给列一个新的数据,此时对应列的数据就可以体现在这行上要点亮的灯上。这样 就和动态数码管的显示一样,只不过数码管的 LED 灯是段值。这里使用 LED 点 阵显示数字,也是多个 LED 同时点亮。   

          要想在点阵上显示数字等字符,首先要获取在 LED 点阵上显示数字字符所需 的数据,即一个数字字符在 LED 点阵上显示,对应的每行每列都会有一些灯点亮 或者熄灭,这样就会构成一组数据,也就是数字字符的显示数据,我们只要将这 些数据通过 74HC595 发送到点阵对应的行或列就能显示数字字符。

        数字字符数据如何获取呢?这里给大家介绍一个非常好用的工具-取字模软件。

链接:https://pan.baidu.com/s/16GOsWbbYZjv2nAmol6toxg  提取码:1022

使用步骤:

1、“基本操作->新建图像”,设置图像的宽度和高 度为8,点击确定后将在显示窗口出现一个8*8的白色格子,这个就类似于8*8LED 点阵.

 

2、上图 8*8 点阵区域非常小,我们可以将其放大,选择“模拟动画”, 后点击“放大格点“

3、 8*8 白色格子里面点击,点击后即会在对应位置出现一 个黑点,表示在 LED 点阵对应位置的 LED 灯点亮,未点击位置(白色)表示 LED 点阵对应位置的 LED 灯熄灭。设置取模数据的取模方式等内容,选择“参数设置”后点击“其他 选项”,

4、 点击“取模方式”,选择 C51 格式选项,然后在点阵生成区自动会 生成数字字符对应的数据(如果是使用汇编编程,那么汇编对应的汉字数据 可选择 A51 格式)。

 

四、软件设计 4.1 点阵屏逐行显示

实现功能:在点阵屏上逐行进行点灯;

代码分享:

main.c

#include #include "delay.h" sbit SRCLK=P3^6;//移位寄存器时钟输入 sbit RCL=P3^5;//存储寄存器时钟输入 sbit SER=P3^4;//串行数据输入 unsigned char xunhuan[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; / /** *@breaf 74HC595写入数据函数,控制LED的行数; *@param data1为写入移位寄存器的数据,逐位写入,先写入高字节,再写入低字节 *@retval 无 */ void __74HC595_write_data(unsigned char data1) { unsigned char i; for(i=0;i>i);//优先传输一个字节中的高位;依次传递8位数据; SRCLK=1; SRCLK=0;//移位寄存器时钟上升沿将端口数据送入寄存器中; } RCL=1;//满8位后进行传递;上升沿将寄存器的数据传递给LED矩阵; RCL=0; } void main () { unsigned char j; SRCLK=0;//初始化 RCL=0; P0=0x00;//列全为低电平; while (1) { for(j=0;ji);//优先传输一个字节中的高位;依次传递8位数据; SRCLK=1; SRCLK=0;//移位寄存器时钟上升沿将端口数据送入寄存器中; } RCL=1;//满8位后进行传递;上升沿将寄存器的数据传递给LED矩阵; RCL=0; } void MatrixLED_Showcolumn(unsigned char column,Data) { __74HC595_write_data(Data); P0=(~0x80>>column); //Delay1ms(20); Delay10us(10); //Delay100ms(1); P0=0XFF; } void main () { unsigned char j; SRCLK=0;//初始化 RCL=0; // P0=0x00;//列全为低电平; while (1) { for(j=0;j>column); Delay1ms(1);//延迟显示 P0=0XFF;//消隐,段选消隐; } void main ()//定义主函数 { unsigned char i,j,count=0; _74HC595_Init_();//74HC595初始化; while (1) { for(i=0;i10) { count=0; j++;//运行十次后,切换下一帧 if(j>40)//切换至超过所有运行次数;进行清零,从头开始运行循环; j=0; } } }

delay.c

#include //头文件,延时函数中含有_nop_,必须包含相应的头文件 /** *@breaf 延时函数,用于软件延时,延时的基本单位为1ms; *@param unsigned char t 用于确定延时的时间,基本单位是1ms; *@retva 无 */ void Delay1ms(unsigned char t) //@11.0592MHz,1ms { unsigned char i, j; while(t--) { _nop_(); i = 2; j = 199; do { while (--j); } while (--i); } }

delay.h

#include "delay.c" void Delay1ms(unsigned char t) ;

74HC595.c

#include sbit SRCLK=P3^6;//移位寄存器时钟输入 sbit RCL=P3^5;//存储寄存器时钟输入 sbit SER=P3^4;//串行数据输入 /** *@breaf 对74HC595进行初始化包括移位寄存器与进位寄存器的初始化 *@param无 *@retval无 */ void _74HC595_Init_() { SRCLK=0;//初始化,未初始化前,单片机默认端口为高电平; RCL=0; } /** *@breaf 74HC595写入数据函数,控制LED的行数; *@param data1为写入移位寄存器的数据,逐位写入,先写入高字节,再写入低字节 *@retval 无 */ void __74HC595_write_data(unsigned char data1) { unsigned char i; for(i=0;i>i);//优先传输一个字节中的高位;依次传递8位数据; SRCLK=1; SRCLK=0;//移位寄存器时钟上升沿将端口数据送入寄存器中; } RCL=1;//满8位后进行传递;上升沿将寄存器的数据传递给LED矩阵; RCL=0; }

74HC595.h

#include "74HC595.c" void _74HC595_Init_(); void __74HC595_write_data(unsigned char data1);

实验现象:

LED点阵屏显示动画

总结:我们通过本节认识了点阵屏的工作原理,学习了相关的驱动芯片74HC959,熟悉了相关电路,以及取模软件的学习,通过51单片机实现了相关的实验。大家在学习完后,一定一定要自己多加练习,熟能生巧!!!

创作不易,还请大家多多点赞支持👍!!!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有