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% 的工作效率,不妨小额【赞助】我一下,让我有动力继续写出更多好文章。

  • 相关阅读:
    EBS SQL > Form & Report
    oracle sql 优化分析点
    MRP 物料需求计划
    MRPII 制造资源计划
    Barcode128 应用实务
    Oracle SQL语句优化技术分析
    APPSQLAP10710 Online accounting could not be created. AP Invoice 无法创建会计分录
    Oracle数据完整性和锁机制
    ORACLE Responsibility Menu Reference to Other User
    EBS 常用 SQL
  • 原文地址:https://www.cnblogs.com/khldragon/p/1626130.html
Copyright © 2011-2022 走看看