zoukankan      html  css  js  c++  java
  • 我的第一篇日志基于AT89S52的单片机的LED点阵显示屏的设计

    第一章 概述

    LED点阵显示屏是通过PC机将要显示的汉字字模提取出来,并发送给单片机,然后显示在点阵屏上,主要适用于室内外汉字显示。

    第二章 硬件设计

    2.1 主要器件介绍

    LED 点阵显示屏是由20 个8*8 的LED 点阵块组成,形成16*80 矩形点阵,以Atmel 公司的AT89S52单片机为控制核心。显示屏的其他主要硬件有:①带锁存输出的8位移位寄存器74HC595,作为LED的列线驱动输入;②三八译码器74LS138,作为LED行线的译码选择;③三极管C9012,连接两个三八译码器的十六个输出端,作为开关使用,驱动LED 的行线

    2.2 主要器件详细连接说明

    clip_image002

    Atmel的AT89S52芯片相关器件连接的接脚如下:P00-P03连接3-8译码器的输入口A,B,C,~G2A

    clip_image004P20-P23连接74HC595的输入口RCK, SI,SCK,SCLR

    三八译码器74LS138的16 个输出端连接16 个C9012的三极管的基极B,发射极E 连接16 个行线控制端,集电极C连接到GND。

    点阵的80 列数据线驱动由10 片74HC595 级联组成,前一片74HC595 的Q’H 引脚连接

    下一片的SI引脚,各片的RCK、SCK、SCLR 分别并联。

    2.3 LED点阵块

    8*8的LED点阵为单色行共阳模块,单点的工作电压为正向(Vf)=1.8 v ,正向电流(IF)= 8-10 mA 。静态点亮器件时(64 点全亮)总电流为640mA,总电压为1.8 v,总功率为1.15W。动态时取决于扫描频率(1/8或1/16秒),单点瞬间电流可达80-160 mA。16*16点阵静态时16*16*10mA,动态时单点电流80-160mA。

    接线方式:

    当某一行线打高时,某一列线为低时,其行列交叉的点就被点亮;

    某一列线为高时,其行列交叉的点为暗;

    当某一行线打低时,无论列线如何,对应这一行的点全部暗。

    clip_image006

    列线:13—20控制点阵的列接低电平

    行线:1-4 21-24控制点阵的行接高电平

    2.4 AT89S52

    clip_image010clip_image008

    (1)P0.0【39 脚】,P0.1【38 脚】,P0.2【37 脚】,P0.3【36 脚】接两片3-8译码器的A,B,C和第一片的~G2A 与第二片的G1,用来选择LED的行线

    (2) P2.0【21 脚】:接74HC595的RCK脚。

    P2.1【22 脚】:接74HC595的SCK脚。

    P2.2【23 脚】:接74HC595的SI脚。

    P2.3【24 脚】:接74HC595的SCLR脚。

    (3) 其他

    VCC 【40 脚】:接电源

    EA/VPP【31 脚】:接电源

    RST 【9脚】:复位脚。过10K电阻接GND,过10uF的电容C3接VCC;复位按钮接到电容C2两端。

    2.5 移位寄存器74HC595

    74HC595是带锁存输出的8位移位寄存器,其管脚见下图,其中SI是串行数据的输入端;

    VCC、GND分别为电源和地;RCK是存储寄存器的输入时钟,SCK是移位寄存器的输入时钟,SCLR是移位寄存器的输入清除,Q’H是串入数据的输出,G是对输入数据的输出使能控制,QA~QH串入数据的并行输出。从SI口输入的数据在移clip_image012

    位寄存器的SCK脚上升沿的作用下输入到74HC595中,在RCK脚的上升沿作用下将输入的数据锁存在74HC595中,当G为低电平时时,数据并行输出。SCLR为移位寄存器的输入清除端。

    74HC595与AT89S52的连接:SI【14脚】,SCK【11脚】,RCK【12脚】, SCLR【10脚】分别接到AT89S52的P2.2【23脚】,P2.1【22脚】,P2.0【21脚】,P2.3【24脚】上。

    其他脚连接:OE【13脚】接地,使其始终输出;

    Q’H【9脚】是连接下一片74HC595的SI脚;QA,QB到QH分别连接到LED点阵的1至8列的列线脚上.

    2.6 三八译码器74LS138

    clip_image014

    图所示的是将两片74LS138译码器扩展为4线-16线译码器的连接图。其接线特点为:将四个输入信号~G2A,C,B,A中的低三位C,B,A同时接至两个芯片的地址输入端。输入信号的最高位~G2A接至两个芯片的使能端,使两个芯片不能同时工作。~G2A,C,B,A作为地址输入变量构成二进制代码,Y0~Y7、Y0~Y7作为输入信号,每个输出表示一个二进制代码的含义,即能实现4线-16线译码器的功能。

    第三章 软件设计

    3.1 单片机的程序设计

    单片机在LED点阵显示系统中主要负责数据的接收、存储和扫描显示LED点阵屏三大主要功能。

    /***************************************************************************************************
    * Name:                        khldragon                                                                
    * Date:                          09/12/2009										
    * Description:                This program controls 16*80LED and implements  dynamic scan.
    ****************************************************************************************************/
    
    #include <AT89X52.h>
    #include <intrins.h>
    
    #define CONIO P0									//行选信号
    #define NUMOFWORDS	(6)								//显示的字数
    #define SPEED					(30)					//扫描周期  SPEED越大,扫描越慢;
    #define MAXWORDS			(5)						//屏幕最大固定显示字数
    #define BLANK					(4)					//填充空数
    #define MAXROW				(16)						//最大行数
    
    static sbit OE		=	P0^4;							//控制74LS138,低电平有效
    static sbit RCK	=	P2^0;								// 上升沿时数据输出
    static sbit SCK	=	P2^1;								//上升沿时数据移位
    static sbit SI		    =	P2^2;							//74hc595串行输入
    static sbit SCLK	=	P2^3;							//低电平移位寄存器清零,通常接VCC
    
    static void send_in(unsigned char Data);				                //串行数据输入
    static void send_out(void);								//并行数据输出
    
    static unsigned int row	=	0;							//行选信号
    static int j		=	0;
    static int k		=	0;
    static int m		=	0;
    static int s		=	0;							//与SPEED匹配
    static int count	=	0;							//当为5时达到最大字数MAX
    
    const static unsigned char code zimo[][32]={
    {0x20,0x08,0x13,0xFC,0x12,0x08,0x02,0x08,0xFE,0x08,0x0A,0x08,0x12,0x08,0x3B,0xF8,
     0x56,0xA8,0x90,0xA0,0x10,0xA0,0x11,0x20,0x11,0x22,0x12,0x22,0x14,0x1E,0x18,0x00},//祝
    {0x00,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x88,0x24,0x98,0x3E,0xA0,0x20,0xC0,
    0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x82,0x26,0x82,0x38,0x82,0x60,0x7E,0x00,0x00},//比
    {0x01,0x00,0x7F,0xFE,0x44,0x42,0x9F,0xF4,0x04,0x40,0x1F,0xF0,0x04,0x40,0x7F,0xFC,
    0x08,0x20,0x1F,0xF0,0x28,0x2E,0xC9,0x24,0x09,0x20,0x01,0x00,0x06,0xC0,0x18,0x30},//赛
    {0x00,0x80,0x00,0xA0,0x00,0x90,0x3F,0xFC,0x20,0x80,0x20,0x80,0x20,0x84,0x3E,0x44,
    0x22,0x48,0x22,0x48,0x22,0x30,0x2A,0x20,0x24,0x62,0x40,0x92,0x81,0x0A,0x00,0x06},//成
    {0x00,0x80,0x00,0x80,0x08,0x80,0xFC,0x80,0x10,0x84,0x17,0xFE,0x10,0x84,0x10,0x84,
    0x10,0x84,0x10,0x84,0x1D,0x04,0xF1,0x04,0x41,0x04,0x02,0x44,0x04,0x28,0x08,0x10},//功
    {0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0x80,
    0x01,0x80,0x01,0x80,0x00,0x00,0x01,0x80,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00},//!
    };
    
    void main()
    {
    	//初始化引脚
    	CONIO = 0X00;
    	P2  = 0X08;
    
    /**********************************动态扫描左移显示不限字数***************************************/
    	while(1)
    	{
    		for(k = 0; k < NUMOFWORDS; k++)
    		{//扫描NUMOFWRODS遍
    
    			for(s = 0; s < SPEED; s++)
    			{
    				for(row = 0; row < MAXROW; row++)
    				{
    					count = 0;
    					//将要显示的字,送入74HC595的SI端,即单片机的P2^2引脚
    					for(j = k; j >= 0; j--)
    					{
    						count++;
    						if(count > MAXWORDS)
    							break;
    						send_in(zimo[j][2*row+1]);
    						send_in(zimo[j][2*row]);
    					}
    					//填充空白
    					for(m = BLANK-k; m > 0; m--)
    					{
    						send_in(0);
    						send_in(0);
    					}
    					send_out();
    					CONIO=row;
    				}
    			}
    		}
    //下面程序逻辑同上,只是换下位置
    		for(k = 1; k <= MAXWORDS; k++)
    		{
    			for(s = 0; s < SPEED; s++)
    			{
    				for(row = 0; row < MAXROW; row++)
    				{
    					for(m = k; m > 0; m--)
    					{
    						send_in(0);
    						send_in(0);
    					}
    
    					for(j = 1; j <= MAXWORDS - k; j++)
    					{
    						send_in(zimo[NUMOFWORDS-j][2*row+1]);
    						send_in(zimo[NUMOFWORDS-j][2*row]);
    					}
    					send_out();
    					CONIO=row;
    				}
    		    }
    		}
    	}
    }
    
    /*****************************************************************
    ** 函数名:void send_in(unsigned char data)
    ** 输 入:unsigned char data
    ** 输 出: void
    ** 功能描述: send data to 74hc595
    ** 全局变量: SCK SI
    ** 调用模块:main()
    ** 作 者:khldragon
    ** 日 期:09/12/2009
    ** 版本version1.0
    ****************************************************************/
    
    void send_in(unsigned char data)
    {
    	unsigned char i;
    	
    	for(i = 0; i < 8; i++)    			
    	{	//循环8次,刚好移完8位
    		
    		SCK = 0;          				  //先将移位寄存器控制引脚置为低
    		SI = Data & 0x01;			          //取数据的最低位,form: little endian
    		Data >>= 1;				          //将数据的次高位移到最高位
    		SCK = 1;					  //再置为高,产生移位时钟上升沿,上升沿时数据寄存器的数据移位
    		_nop_();
    	}
    }
    
    
    /*****************************************************************
    ** 函数名:void send_out(void)
    ** 输 入:void
    ** 输 出: void
    ** 功能描述: send data to led
    ** 全局变量: RCK
    ** 调用模块:main()
    ** 作 者:khldragon
    ** 日 期:09/12/2009
    ** 版本version1.0
    ****************************************************************/
    void send_out(void)
    {
    	RCK = 0;						//先将存储寄存器引脚置为低
    	_nop_();
    	_nop_();
    	RCK = 1;						//再置为高,产生移位时钟上升沿,上升沿时移位寄存器的数据进入数据存储寄存器,更新显示数据。
    	_nop_();
    	_nop_();
    	RCK = 0;					       //先将存储寄存器引脚置为低
    }
    
    
    

    第四章 总结

    在 LED 点阵汉字显示屏的设计过程中,学到了很多东西,基本了解了整个嵌入式开发的流程。

    例如,在焊接电路板的时候,应该从最基本的最小系统开始,分模块,逐个进行焊接测试。在对各个硬件模块进行测试时,要保证软件正确的情况下去测试硬件,要不然发生错误时,不知道到底是哪一方出错了。当然,在设计的过程中也存在着失误和不足。例如,在进行搭试点阵块的时候,因为电压过高,导致点阵块损坏。这次设计开发,本人受益非浅,在以后的开发过程中一定吸取教训。


    作者:khldragon
    出处:http://www.cnblogs.com/khldragon/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。


    俗话说,投资效率是最成功的投资。 如果您感觉我的文章质量不错,读后收获很大,感觉能为您提高 10% 的工作效率,不妨小额【赞助】我一下,让我有动力继续写出更多好文章。

  • 相关阅读:
    微软软件
    绘图软件安装出错解决方法
    Windows平台 Faster-RCNN 制作自己的数据集
    POJ2456 Agressive Cows
    P1030 求先序排列
    Luogu P2015二叉苹果树
    P2234 [HNOI2002]营业额统计
    Luogu P1347排序
    Luogu P1038神经网络
    Luogu P1006传纸条
  • 原文地址:https://www.cnblogs.com/khldragon/p/1626130.html
Copyright © 2011-2022 走看看