51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计
STC89C52R基于C51嵌入式点阵广告屏的设计
- 1 概述
- 2 LED点阵介绍
- 2.1 特点和优势
- 2.2 工作原理:
- 2.3 使用方法:
- 3 LED点阵原理
- 3.1 Led点阵内部电路
- 3.2 原理图电路
- 3.3 74HC595
- 4 软件实现点阵图案的滑动
- 4.1 软件工程代码
- 4.2 Protues仿真
- 5 总结
配套示例程序
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
- 74HC595 概述
74HC595 是一款常用的 8 位串行输入并行输出移位寄存器。它可以将串行输入的数据转换为并行输出,广泛应用于 LED 显示、数码管驱动等场合。74HC595 具有 8 个并行输出接口,可以通过串行方式控制多个 74HC595 级联使用。 - 74HC595 引脚配置
74HC595 总共有 16 个引脚,每个引脚的功能如下:
Q0 ~ Q7(引脚 15, 1-7):并行输出位。
DS(引脚 14):数据输入(串行输入)。
OE(引脚 13):输出使能(低电平有效)。
STCP(引脚 12):存储寄存器时钟输入(上升沿触发)。
SHCP(引脚 11):移位寄存器时钟输入(上升沿触发)。
MR(引脚 10):主复位(低电平复位)。
Q7’(引脚 9):串行输出。
Vcc(引脚 16):电源正极。
GND(引脚 8):电源负极。 - 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 Clockvoid 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 83HNAME ?C_STARTUP?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATARSEG ?STACKDS 1EXTRN CODE (?C_START)PUBLIC ?C_STARTUPCSEG AT 0
?C_STARTUP: LJMP STARTUP1RSEG ?C_C51STARTUPSTARTUP1:IF IDATALEN <> 0MOV R0,#IDATALEN - 1CLR A
IDATALOOP: MOV @R0,ADJNZ R0,IDATALOOP
ENDIFIF XDATALEN <> 0MOV DPTR,#XDATASTARTMOV R7,#LOW (XDATALEN)IF (LOW (XDATALEN)) <> 0MOV R6,#(HIGH (XDATALEN)) +1ELSEMOV R6,#HIGH (XDATALEN)ENDIFCLR A
XDATALOOP: MOVX @DPTR,AINC DPTRDJNZ R7,XDATALOOPDJNZ R6,XDATALOOP
ENDIFIF PPAGEENABLE <> 0MOV PPAGE_SFR,#PPAGE
ENDIFIF PDATALEN <> 0MOV R0,#LOW (PDATASTART)MOV R7,#LOW (PDATALEN)CLR A
PDATALOOP: MOVX @R0,AINC R0DJNZ R7,PDATALOOP
ENDIFIF IBPSTACK <> 0
EXTRN DATA (?C_IBP)MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIFIF XBPSTACK <> 0
EXTRN DATA (?C_XBP)MOV ?C_XBP,#HIGH XBPSTACKTOPMOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIFIF PBPSTACK <> 0
EXTRN DATA (?C_PBP)MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIFMOV 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 0LJMP ?C_STARTEND
#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 总结
- LED点阵广告牌作为一种现代化、高效能的广告展示工具,已经成为城市景观、商业广告和活动展示中不可或缺的一部分。其高亮度、高清晰度和多功能性使其在各种场合中展现出色彩斑斓的效果,吸引眼球、传递信息。
- 商业广告牌:用于商业广告、品牌宣传、产品推广等。
- 交通指示牌:用于道路交通指示、公共交通站点显示等。
- 活动场馆广告:用于体育场馆、演艺场所、会展中心等的广告宣传和信息展示。
- 城市景观工程:用于城市建筑、广场、公园等的景观照明和信息展示。
- 活动现场背景:用于大型活动现场的背景布置和互动展示。
配套示例程序