51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计

配套示例程序

在这里插入图片描述

1 概述

LED点阵广告牌是利用LED点阵技术制作的大型显示屏,通常用于户外广告、商业宣传、活动展示等场合。

2 LED点阵介绍

8x8 LED点阵是一种常见的LED显示器件,通常由64个LED灯组成,排列成一个8行8列的矩阵。每个LED灯可以独立控制,因此可以通过控制不同的灯来显示各种图案、数字和字母。

2.1 特点和优势

灵活性:每个LED灯都可以独立控制,使得点阵显示器具有很高的灵活性,可以显示各种自定义图案和动画效果。
低功耗:LED点阵采用LED作为发光元件,功耗低,适合长时间工作。
易于控制:通过微控制器或驱动芯片,可以方便地控制整个点阵的显示内容。
广泛应用:LED点阵广泛应用于计时器、温度计、电子钟、信息显示牌、小型游戏等领域。

2.2 工作原理:

每列LED的阳极连接在一起,形成一组,每行LED的阴极连接在一起,形成一组。
控制时,逐行输出低电平,同时将要点亮的列输出高电平。循环扫描这些行和列,就能实现LED的点亮和熄灭。

2.3 使用方法:

通过微控制器(比如51单片机、Arduino等)来控制LED点阵的显示内容。
编写控制程序,根据需要显示的图案、字母或数字,设置每个LED的状态,实现所需的显示效果。

3 LED点阵原理

3.1 Led点阵内部电路

8x8LED点阵内部结构图如下,这两种图片只是接法不同,要点亮LED,左图需要行置为高电平,列置为低电平;右图则需要行置为低电平,列置为高电平。

8x8LED点阵内部结构图

8x8点阵共由64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一行置高电平,某一列置低电平,则相应的二极管将点亮。

比如对于左图,如果要将第一个点点亮,则将第一行的⑨脚接高电平,第一列的13脚接低电平,第一个点就会点亮;如果要将第一行点亮,则第一行的⑨脚接高电平,所有列(13、3、4、10、6、11、15、16脚)接低电平,第一行就会点亮;如果要将第一列点亮,则第一列的13脚接低电平,所有行(9、14、8、12、1、7、2、5脚)接高电平,第一列就会点亮;如果要将对角线点亮,可以动态显示,首先点亮第一个点,然后点亮第2行第2列的点…这样依次循环点亮,就可以显示对角线的点。

在这里插入图片描述

如果要显示数字或字符,在需要的位置点亮,比如显示0(如下),可以循环点亮如下位置的LED。

3.2 原理图电路

仿真电路:

在这里插入图片描述

我们调整点阵的位置使其横着摆放。

在这里插入图片描述

3.3 74HC595

  1. 74HC595 概述
    74HC595 是一款常用的 8 位串行输入并行输出移位寄存器。它可以将串行输入的数据转换为并行输出,广泛应用于 LED 显示、数码管驱动等场合。74HC595 具有 8 个并行输出接口,可以通过串行方式控制多个 74HC595 级联使用。
  2. 74HC595 引脚配置
    74HC595 总共有 16 个引脚,每个引脚的功能如下:
    Q0 ~ Q7(引脚 15, 1-7):并行输出位。
    DS(引脚 14):数据输入(串行输入)。
    OE(引脚 13):输出使能(低电平有效)。
    STCP(引脚 12):存储寄存器时钟输入(上升沿触发)。
    SHCP(引脚 11):移位寄存器时钟输入(上升沿触发)。
    MR(引脚 10):主复位(低电平复位)。
    Q7’(引脚 9):串行输出。
    Vcc(引脚 16):电源正极。
    GND(引脚 8):电源负极。
  3. 74HC595 工作原理
    74HC595 包含两个寄存器:移位寄存器和存储寄存器。数据首先被写入移位寄存器,然后通过锁存操作将移位寄存器的内容传输到存储寄存器,以实现并行输出。
    数据输入
    数据通过 DS 引脚串行输入,每当 SHCP 引脚收到一个上升沿时,移位寄存器中的数据会左移一位,新数据位被移入 Q0。通过连续的时钟脉冲,可以依次将 8 位数据写入移位寄存器。
    数据锁存
    完成数据输入后,通过在 STCP 引脚上产生一个上升沿脉冲,将移位寄存器的数据传输到存储寄存器,从而更新并行输出的状态。
    输出使能
    OE 引脚用于控制并行输出的使能状态。当 OE 为低电平时,并行输出有效;当 OE 为高电平时,并行输出被禁用。

在这里插入图片描述

通讯时序图:

在这里插入图片描述

一个驱动74HC595的标准函数:

sbit DS = P1^0; // Data Input 
sbit SHCP = P1^1; // Shift Clock 
sbit STCP = P1^2; // Store Clock 
void HC595SendByte(unsigned char dat) 
{ 
unsigned char i; 
for(i = 0; i < 8; i++) 
{ 
DS = dat & 0x80; // 从高位到低位发送数据 
SHCP = 0; 
dat = dat << 1; 
SHCP = 1; 
} 
STCP = 0; 
STCP = 1; 
}

4 软件实现点阵图案的滑动

4.1 软件工程代码

//main.c文件

#include "includes.h"



/******************************************************************/
/*                    微秒延时函数  //10us                         */
/******************************************************************/
void delay_us(unsigned int us)//delay us
{
	while(us--)
	{
	}
}

/******************************************************************/
/*                    微秒延时函数                                */
/******************************************************************/
void delay_ms(unsigned int Ms)//delay us
{
	while(Ms--)
	{
		delay_us(100);
	}
}


sbit DS = P2^6;  // Data Input
sbit SHCP = P2^7;  // Shift Clock
sbit STCP = P2^5;  // Store Clock

void HC595SendByte(unsigned char dat) {
    unsigned char i;
    for(i = 0; i < 8; i++) {
        DS = dat & 0x80;  // 从高位到低位发送数据
        SHCP = 0;
        dat = dat << 1;
        SHCP = 1;
    }
    STCP = 0;
    STCP = 1;
}

//	P2 = 0xFF;	//代表列 发光二级管的负端
//	P0 = 0x00;	//代表行 发光二级管的正端
//	
#define rowp P0
#define colp P2
//0-9字模
code unsigned char disp[][8]={
{0x0c,0x12,0x22,0x44,0x22,0x12,0x0c,0x00},//?
{0x00,0x00,0x3e,0x41,0x41,0x3e,0x00,0x00},//0
{0x00,0x40,0x44,0x7e,0x7f,0x40,0x40,0x00},//1
{0x00,0x00,0x66,0x51,0x49,0x46,0x00,0x00},//2
{0x00,0x00,0x22,0x41,0x49,0x36,0x00,0x00},//3
{0x00,0x10,0x1c,0x13,0x7c,0x7c,0x10,0x00},//4
{0x00,0x00,0x27,0x45,0x45,0x45,0x39,0x00},//5
{0x00,0x00,0x3e,0x49,0x49,0x32,0x00,0x00},//6
{0x00,0x03,0x01,0x71,0x79,0x07,0x03,0x00},//7
{0x00,0x00,0x36,0x49,0x49,0x36,0x00,0x00},//8
{0x00,0x00,0x26,0x49,0x49,0x3e,0x00,0x00},//9
};

// 定义字符模式数组
code unsigned char charPatterns[8] = {
    0x0c,0x12,0x22,0x44,0x22,0x12,0x0c,0x00//0x18, 0x24, 0x42, 0x81, 0x42, 0x24, 0x18, 0x00
};

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
    unsigned char i, j,m,n;
    unsigned char displayData[88] = {0}; // 初始化显示数据
	

	for (i = 0; i < 88; i++) //行的数组更新
	{
		displayData[i] = disp[i/8][i%8];
	}


	delay_ms(2);
	P20 = 0;
	P21 = 0;
	P22 = 0;
	P23 = 0;
	while (1)
	{
	// 滚动效果
        for (j = 0; j < 88; j++) 
		{
            for (i = 0; i < 88; i++) //行的数组更新
			{
				n = i+1;
				if(n>=88)
				{
					n -= 88;
				}
				displayData[i] = displayData[n];
            }
            // 逐行扫描点阵屏
			for(m=0;m<20;m++)
			{
				
				for (i = 0; i < 32; i++)
				{
					P2 &= 0xF0;
					P2 |= ~(1<<(i/8));
					HC595SendByte(~(1 << (i%8)));
					P0 = displayData[i]; // 发送数据
				}
			}
			for (i = 0; i < 32; i++)
			{
				P2 &= 0xF0;
				P2 |= ~(1<<(i/8));
				HC595SendByte(~(1 << (i%8)));
				P0 = 0x00; // 发送数据
			}
        }
	}
}


/*
	// 滚动效果
        for (j = 0; j < 8; j++) 
		{
            for (i = 0; i < 8; i++) 
			{
                displayData[i] = (displayData[i] << 1) | (charPatterns[i] >> (7 - j));
            }
            // 逐行扫描点阵屏
			for(m=0;m<20;m++)
			{
				
				for (i = 0; i < 8; i++)
				{
					//P2 = ~(1 << i); // 控制点阵屏的行
					HC595SendByte(~(1 << i));
					P0 = displayData[i]; // 发送数据
					delay_ms(1); // 延时
					//P0 = 0x00; // 清空数据
				}
				//delay_ms(500); // 控制滚动速度
			}
			for (i = 0; i < 8; i++)
			{
				//P2 = ~(1 << i); // 控制点阵屏的行
				HC595SendByte(~(1 << i));
				P0 = 0x00; // 发送数据
				delay_ms(1); // 延时
				//P0 = 0x00; // 清空数据
			}
        }
	}
*/

//includes.h文件

#ifndef __INCLUDES_H__
#define __INCLUDES_H__

//#include<reg52.h> 

#include<intrins.h> //汇编指令_nop_
#include<stdio.h> 	//标准输入输出

//_nop_(); 产生一条NOP指令
//作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。
//NOP指令为单周期指令,可由晶振频率算出延时时间。

//8051 为每个机器周期 12 时钟
//对于12M晶振,延时1uS。
//11.0592M晶振,延时1.0851uS。

//对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。


//包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "STC89C5xRC_RDP.h"

//应用层头文件
//#include "c51_gpio.h"
//#include "c51_ledtube.h"
//#include "c51_key.h"
//#include "c51_timer.h"
//#include "c51_exit.h"
//#include "c51_lcd1602.h"
//#include "c51_iic.h"
//#include "c51_tx1838.h"
//#include "c51_uart.h"
//#include "c51_28byj48.h"
//#include "c51_ds1302.h"





extern void delay_us(unsigned int us);//delay us;
extern void delay_ms(unsigned int Ms);//delay Ms;




#endif
$NOMOD51
;------------------------------------------------------------------------------
;  This file is part of the C51 Compiler package
;  Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
;------------------------------------------------------------------------------
;  STARTUP.A51:  This code is executed after processor reset.
;
;  To translate this file use A51 with the following invocation:
;
;     A51 STARTUP.A51
;
;  To link the modified STARTUP.OBJ file to your application use the following
;  BL51 invocation:
;
;     BL51 <your object file list>, STARTUP.OBJ <controls>
;
;------------------------------------------------------------------------------
;
;  User-defined Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
;               ; the absolute start-address of IDATA memory is always 0
IDATALEN        EQU     80H     ; the length of IDATA memory in bytes.
;
XDATASTART      EQU     0H      ; the absolute start-address of XDATA memory
XDATALEN        EQU     0H      ; the length of XDATA memory in bytes.
;
PDATASTART      EQU     0H      ; the absolute start-address of PDATA memory
PDATALEN        EQU     0H      ; the length of PDATA memory in bytes.
;
;  Notes:  The IDATA space overlaps physically the DATA and BIT areas of the
;          8051 CPU. At minimum the memory space occupied from the C51 
;          run-time routines must be set to zero.
;------------------------------------------------------------------------------
;
;  Reentrant Stack Initilization
;
;  The following EQU statements define the stack pointer for reentrant
;  functions and initialized it:
;
;  Stack Space for reentrant functions in the SMALL model.
IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
IBPSTACKTOP     EQU     0FFH+1  ; set top of stack to highest location+1.
;
;  Stack Space for reentrant functions in the LARGE model.      
XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
XBPSTACKTOP     EQU     0FFFFH+1; set top of stack to highest location+1.
;
;  Stack Space for reentrant functions in the COMPACT model.    
PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
PBPSTACKTOP     EQU     0FFFFH+1; set top of stack to highest location+1.
;
;------------------------------------------------------------------------------
;
;  Page Definition for Using the Compact Model with 64 KByte xdata RAM
;
;  The following EQU statements define the xdata page used for pdata
;  variables. The EQU PPAGE must conform with the PPAGE control used
;  in the linker invocation.
;
PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
;
PPAGE           EQU     0       ; define PPAGE number.
;
PPAGE_SFR       DATA    0A0H    ; SFR that supplies uppermost address byte
;               (most 8051 variants use P2 as uppermost address byte)
;
;------------------------------------------------------------------------------

; Standard SFR Symbols 
ACC     DATA    0E0H
B       DATA    0F0H
SP      DATA    81H
DPL     DATA    82H
DPH     DATA    83H

                NAME    ?C_STARTUP


?C_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATA

                RSEG    ?STACK
                DS      1

                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP

                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP

STARTUP1:

IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF

IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF

IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF

IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)

                MOV     ?C_IBP,#LOW IBPSTACKTOP
ENDIF

IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)

                MOV     ?C_XBP,#HIGH XBPSTACKTOP
                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF

IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
                MOV     ?C_PBP,#LOW PBPSTACKTOP
ENDIF

                MOV     SP,#?STACK-1
; This code is required if you use L51_BANK.A51 with Banking Mode 4
; EXTRN CODE (?B_SWITCH0)
;               CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
                LJMP    ?C_START

                END

#ifndef STC89C5xRC_RDP_H

#define __STC89C5xRC_RDP_H__

/

//包含本头文件后,不用另外再包含"REG51.H"

sfr         P0          =           0x80;
    sbit    P00         =           P0^0;
    sbit    P01         =           P0^1;
    sbit    P02         =           P0^2;
    sbit    P03         =           P0^3;
    sbit    P04         =           P0^4;
    sbit    P05         =           P0^5;
    sbit    P06         =           P0^6;
    sbit    P07         =           P0^7;

sfr         SP          =           0x81;
sfr         DPL         =           0x82;
sfr         DPH         =           0x83;
sfr         PCON        =           0x87;

sfr         TCON        =           0x88;
    sbit    TF1         =           TCON^7;
    sbit    TR1         =           TCON^6;
    sbit    TF0         =           TCON^5;
    sbit    TR0         =           TCON^4;
    sbit    IE1         =           TCON^3;
    sbit    IT1         =           TCON^2;
    sbit    IE0         =           TCON^1;
    sbit    IT0         =           TCON^0;

sfr         TMOD        =           0x89;
sfr         TL0         =           0x8A;
sfr         TL1         =           0x8B;
sfr         TH0         =           0x8C;
sfr         TH1         =           0x8D;
sfr         AUXR        =           0x8E;

sfr         P1          =           0x90;
    sbit    P10         =           P1^0;
    sbit    P11         =           P1^1;
    sbit    P12         =           P1^2;
    sbit    P13         =           P1^3;
    sbit    P14         =           P1^4;
    sbit    P15         =           P1^5;
    sbit    P16         =           P1^6;
    sbit    P17         =           P1^7;
    
    sbit    T2EX        =           P1^1;
    sbit    T2          =           P1^0;

sfr         SCON        =           0x98;
    sbit    SM0         =           SCON^7;
    sbit    SM1         =           SCON^6;
    sbit    SM2         =           SCON^5;
    sbit    REN         =           SCON^4;
    sbit    TB8         =           SCON^3;
    sbit    RB8         =           SCON^2;
    sbit    TI          =           SCON^1;
    sbit    RI          =           SCON^0;

sfr         SBUF        =           0x99;

sfr         P2          =           0xA0;
    sbit    P20         =           P2^0;
    sbit    P21         =           P2^1;
    sbit    P22         =           P2^2;
    sbit    P23         =           P2^3;
    sbit    P24         =           P2^4;
    sbit    P25         =           P2^5;
    sbit    P26         =           P2^6;
    sbit    P27         =           P2^7;
    
sfr         AUXR1       =           0xA2;

sfr         IE          =           0xA8;
    sbit    EA          =           IE^7;
    sbit    EC          =           IE^6;
    sbit    ET2         =           IE^5;
    sbit    ES          =           IE^4;
    sbit    ET1         =           IE^3;
    sbit    EX1         =           IE^2;
    sbit    ET0         =           IE^1;
    sbit    EX0         =           IE^0;
    
sfr         SADDR       =           0xA9;

sfr         P3          =           0xB0;
    sbit    P30         =           P3^0;
    sbit    P31         =           P3^1;
    sbit    P32         =           P3^2;
    sbit    P33         =           P3^3;
    sbit    P34         =           P3^4;
    sbit    P35         =           P3^5;
    sbit    P36         =           P3^6;
    sbit    P37         =           P3^7;

    sbit    RD          =           P3^7;
    sbit    WR          =           P3^6;
    sbit    T1          =           P3^5;
    sbit    T0          =           P3^4;
    sbit    INT1        =           P3^3;
    sbit    INT0        =           P3^2;
    sbit    TXD         =           P3^1;
    sbit    RXD         =           P3^0;

sfr         IPH         =           0xB7;
sfr         IP          =           0xB8;
    sbit    PT2         =           IP^5;
    sbit    PS          =           IP^4;
    sbit    PT1         =           IP^3;
    sbit    PX1         =           IP^2;
    sbit    PT0         =           IP^1;
    sbit    PX0         =           IP^0;

sfr         SADEN       =           0xB9;
    
sfr         XICON       =           0xC0;
    sbit    PX3         =           XICON^7;
    sbit    EX3         =           XICON^6;
    sbit    IE3         =           XICON^5;
    sbit    IT3         =           XICON^4;
    sbit    PX2         =           XICON^3;
    sbit    EX2         =           XICON^2;
    sbit    IE2         =           XICON^1;
    sbit    IT2         =           XICON^0;

sfr         T2CON       =           0xC8;
    sbit    TF2         =           T2CON^7;
    sbit    EXF2        =           T2CON^6;
    sbit    RCLK        =           T2CON^5;
    sbit    TCLK        =           T2CON^4;
    sbit    EXEN2       =           T2CON^3;
    sbit    TR2         =           T2CON^2;
    sbit    C_T2        =           T2CON^1;
    sbit    CP_RL2      =           T2CON^0;
    
sfr         T2MOD       =           0xC9;
sfr         RCAP2L      =           0xCA;
sfr         RCAP2H      =           0xCB;
sfr         TL2         =           0xCC;
sfr         TH2         =           0xCD;

sfr         PSW         =           0xD0;
    sbit    CY          =           PSW^7;
    sbit    AC          =           PSW^6;
    sbit    F0          =           PSW^5;
    sbit    RS1         =           PSW^4;
    sbit    RS0         =           PSW^3;
    sbit    OV          =           PSW^2;
    sbit    F1          =           PSW^1;
    sbit    P           =           PSW^0;

sfr         ACC         =           0xE0;

sfr         WDT_CONTR   =           0xE1;
sfr         ISP_DATA    =           0xE2;
sfr         ISP_ADDRH   =           0xE3;
sfr         ISP_ADDRL   =           0xE4;
sfr         ISP_CMD     =           0xE5;
sfr         ISP_TRIG    =           0xE6;
sfr         ISP_CONTR   =           0xE7;

sfr         P4          =           0xE8;
    sbit    P40         =           P4^0;
    sbit    P41         =           P4^1;
    sbit    P42         =           P4^2;
    sbit    P43         =           P4^3;
    sbit    P44         =           P4^4;
    sbit    P45         =           P4^5;
    sbit    P46         =           P4^6;
    sbit    P47         =           P4^7;

sfr         B           =           0xF0;

/

#endif

4.2 Protues仿真

Led点阵屏上数字一直扫描移动,在实际应用时也是扫描移动显示。

在这里插入图片描述

配套示例程序

5 总结

  1. LED点阵广告牌作为一种现代化、高效能的广告展示工具,已经成为城市景观、商业广告和活动展示中不可或缺的一部分。其高亮度、高清晰度和多功能性使其在各种场合中展现出色彩斑斓的效果,吸引眼球、传递信息。
  2. 商业广告牌:用于商业广告、品牌宣传、产品推广等。
  3. 交通指示牌:用于道路交通指示、公共交通站点显示等。
  4. 活动场馆广告:用于体育场馆、演艺场所、会展中心等的广告宣传和信息展示。
  5. 城市景观工程:用于城市建筑、广场、公园等的景观照明和信息展示。
  6. 活动现场背景:用于大型活动现场的背景布置和互动展示。

配套示例程序

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值