proteus51单片机控制led原理图(基于proteus的51单片机开发实例26-8)

图1 8*8LED点阵显示电路本实例通过驱动8*8LED点阵显示数字和字符,使我们了解点阵的原理、电路设计、编程方法,今天小编就来说说关于proteus51单片机控制led原理图?下面更多详细答案一起来看看吧!

proteus51单片机控制led原理图(基于proteus的51单片机开发实例26-8)

proteus51单片机控制led原理图

1. 基于proteus的51单片机开发实例26-8*8LED点阵显示1.1. 实验目的

图1 8*8LED点阵显示电路

本实例通过驱动8*8LED点阵显示数字和字符,使我们了解点阵的原理、电路设计、编程方法。

1.2. 设计思路

使用51单片机,控制8*8LED点阵,使其实现数字的显示。

1.3. 基础知识

日常生活中,使用最多、最常见的是8*8LED点阵。其实物图如下图所示,8*8点阵是其它多种组合的基础,市面上绝大多数的LED点阵都是由8*8点阵作为基本单位的。因此本实例中我们主要来了解8*8点阵。

图2 8*8LED点阵实物图

从图中可以看出,8*8LED点阵是由64个点状发光二极管组成的,从8*8的字面含义就能看出,这64个LED是按照8行、8列的形式组合的。每一行中的8个二极管的正极连在一起,负极连在一起,这样每行引出一条公用线,每列引出一条公用线,一共有16根线。其内部结构如下图所示。

图3 8*8LED点阵原理

当点阵需要显示某个数字或者汉字时,需要根据点阵组合方式得到相应的字形编码,这个字形编码的目的是确定需要点亮点阵中发光二极管的位置,然后将二极管所处位置对应的行线和列线加上合适的电压,从而点亮该二极管。这样依次点亮所有需要显示的二极管,就在点阵上显示出我们设计好的形状了。

我们知道,单片机I/O口的驱动能力有限,而8*8点阵有多达64和LED,所以一般情况下需要使用驱动电路,驱动电路可以使用三极管搭建,也可以专用的驱动电路。

假如我们要在8*8LED点阵上显示数字2,根据8*8点阵的组合结构,只需要将图中用黑色表示的二极管全部点亮即可。

如图4所示。

图4 8*8LED点阵显示“2”

由8*8LED点阵原理图中可以看出,每一条行线是这一行中8个二极管的共用线,每一条列线是这一列中8个二极管的的共用线,当某个二极管所在的行和列的电压能够导通该二极管时,此二极管才会点亮。而一个数字或汉字对应需要点亮的二极管分布在不同的行和列,无法同时点亮,但可以同时对同一行中的若干个二极管进行操作,因此需要采用循环扫描的方式逐行点亮相应位置的二极管,对于每一行而言,每过一段时间(一般为几个毫秒)扫描一次,并使本行中被点亮的发光二极管持续一段时间(一般不能超过50毫秒),这样虽然每一时刻只有一行中的几个二极管被点亮,但是在“视觉暂留”效应(一般为100ms)下,人眼看到的就是一个完整的字形。

1.4. 电路设计

本实例电路图如图1所示。本电路中为了提高单片机I/O口的驱动能力,使用了74LS245。

74LS245常用来驱动LED或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。74LS245还具有双向三态功能,既可以输出,也可以输入数据。当8051单片机的P0总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器

1.5. 程序设计

关于字形显示编码的生成,简单介绍如下:

用行线来表示行选端口(低电平有效),当某一行为低电平,表示这一行的8个二极管被选中;

用列线表示数据,当某一行有效,8条列线上的数据就会表现在这一行中的8个二极管上,即数据线上为高电平时,对应的二极管点亮,数据线上为低电平时,对应的二极管不亮。如果把8条列线上的数据组合在一起,就是8个二进制位,正好组成个字节。这样,对应于每个要显示的数字或字符、汉字,每一行的行选有效时,均可获得一个字节数据,最终8行可以得到8个对应的字节数据。这个字节的数据就组成了一个字形码表。

所示根据图4,显示数字“2”的时候,依照上述方法得到的8个数据分别是:0000 0000,0011 1100,0000 0100,0011 1100,0010 0000,0011 1100,0000 0000,00000000。对应的十六进制为:0x00,0x3b,0x04,0x3b,0x20,0x3b,0x00,0x00。

这种方式称为行扫描方式。

当然,如果以列线作为列选,以行线作为数据就是列扫描方式,两者原理一样。

#include <AT89X51.H> #include<intrins.h> //包含_crol_函数的库函数 //8*8LED点阵字形码表 unsigned char code Table_of_Digits[]= { 0x00,0x3e,0x41,0x41,0x41,0x3e,0x00,0x00, //0 0x00,0x00,0x00,0x21,0x7f,0x01,0x00,0x00, //1 0x00,0x27,0x45,0x45,0x45,0x39,0x00,0x00, //2 0x00,0x22,0x49,0x49,0x49,0x36,0x00,0x00, //3 0x00,0x0c,0x14,0x24,0x7f,0x04,0x00,0x00, //4 0x00,0x72,0x51,0x51,0x51,0x4e,0x00,0x00, //5 0x00,0x3e,0x49,0x49,0x49,0x26,0x00,0x00, //6 0x00,0x40,0x40,0x40,0x4f,0x70,0x00,0x00, //7 0x00,0x36,0x49,0x49,0x49,0x36,0x00,0x00, //8 0x00,0x32,0x49,0x49,0x49,0x3e,0x00,0x00 //9 }; //全局变量定义 unsigned char i=0,t=0,Num_Index; void main() { P3=0x80; Num_Index=0; //从0开始显示 TMOD=0x00; //定时器工作方式设定,方式0 TH0=(8192-2000)/32; //定时器定时2ms,初值设定 TL0=(8192-2000)2; IE=0x82; TR0=1; //开启定时器 while(1); } //定时器中断服务函数 void LED_Screen_Display() interrupt 1 { TH0=(8192-2000)/32; //重装初值 TL0=(8192-2000)2; P0=0xff; //输出位码和段码 P0=~Table_of_Digits[Num_Index*8 i]; P3=_crol_(P3,1); //循环左移 if( i==8) i=0; // if( t==250) //每个数字刷新显示一段时间 { t=0; if( Num_Index==10) Num_Index=0; //显示下一个数字 } }

1.6. 实例仿真

编写程序代码,编译生成HEX文件,将HEX文件装载到proteus电路的单片机中,开始仿真,观察8*8LED点阵的显示,体会动态扫描的效果。

1.7. 总结

通过本实例,我们学习了8*8LED点阵的显示原理、电路设计、编程控制。又多了解了一种显示技术,并且更加深了动态扫描和“视觉暂留”的编程方法。

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页