原创 基于51单片机的LED数码管动态显示

2010-5-24 10:22 14617 7 7 分类: MCU/ 嵌入式

基于51单片机的LED数码管动态显示<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


LED数码管动态显示就是一位一位地轮流点亮各位数码管,对于每一位LED数码管来说,每隔一段时间点亮一次,利用人眼的“视觉暂留"效应,采用循环扫描的方式,分时轮流选通各数码管的公共端,使数码管轮流导通显示。当扫描速度达到一定程度时,人眼就分辨不出来了。尽管实际上各位数码管并非同时点亮,但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,认为各数码管是同时发光的。若数码管的位数不大于8位时,只需两个8IO口。


 


 1  硬件设计


利用51单片机的P0口输出段码,P2口输出位码,其电路原理图如下所示。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />点击看大图


在桌面上双击图标9f440635-b5dd-40b9-9f0b-f80256be0488.jpg,打开ISIS 7 Professional窗口(本人使用的是v7.4 SP3中文版)。单击菜单命令“文件”→“新建设计”,选择DEFAULT模板,保存文件名为“DT.DSN”。在器件选择按钮703d39ed-13ff-4ad3-a854-0273ff563ebb.jpg中单击“P”按钮,或执行菜单命令“库”→“拾取元件/符号”,添加如下表所示的元件。



51单片机AT89C51    一片


晶体CRYSTAL 12MHz   一只


瓷片电容CAP 22pF    二只


电解电容CAP-ELEC 10uF   一只


电阻RES 10K         一只


电阻RES 4.7K 四只


双列电阻网络 Rx8 300R(Ω)   一只


四位七段数码管7SEG-MPX4-CA   一只


三极管 PNP          四只


 


若用Proteus软件进行仿真,则上图中的晶振和复位电路以及U131脚,都可以不画,它们都是默认的。


ISIS原理图编辑窗口中放置元件,再单击工具箱中元件终端图标17372b86-1761-4edc-91e6-ad439a222a09.jpg,在对象选择器中单击POWERGROUND放置电源和地。放置好元件后,布好线。左键双击各元件,设置相应元件参数,完成电路图的设计。


 


 2  软件设计


LED数码管动态显示是一位一位地轮流点亮各位数码管的,因此要考虑每一位点亮的保持时间和间隔时间。保持时间太短,则发光太弱而人眼无法看清;时间太长,则间隔时间也将太长(假设N位,则间隔时间=保持时间XN-1)),使人眼看到的数字闪烁。在程序中要合理的选择合适的保持时间和间隔时间。而循环次数则正比于显示的变化速度。


LED数码管动态显示的流程如下所示。



8c608367-3e93-491c-8c74-2916011c6b00.jpg


LED数码管动态显示的详细C51程序如下。


/*****************************************    


*通过P0P2口控制四只数码管 12M晶振


*****************************************/


#include "reg51.h"


 


#define uchar unsigned char


#define uint unsigned int


uchar code ddata[]={


    0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,


    0x88,0x83,0xc6,0xa1,0x86,0x8e,0xc0,0xf9,0xa4


    }; //0,1,2,3,4....F,0,1,2,3的段码


 


/****延时函数*******************************/


void delayms(uint t)


{


uint i,j;


    for(i=0;i<t;i++)


         for(j=0;j<120;j++)


           ;


}


 


main()


{


    while(1)


    {


    uint i,j,k;


         for(k=1;k<17;k++)         //16个字符


         {


                for(j=0;j<50;j++)//反比于字符显示变化速度                  


                {


                    for(i=1;i<5;i++)      //4


                    {


                          P0=ddata[k+i-2];


                          switch(i)


                          {


                                case 1:P2=0XFE;break;      //点亮第1


                                case 2:P2=0XFD;break;      //点亮第2


                                case 3:P2=0XFB;break;      //点亮第3


                                case 4:P2=0XF7;break;       //点亮第4


                          }


                          delayms(5);


                          P2=0XFF;          //  熄灭   


                    }


               }


         }       


    }


}


 


打开Keil程序(本人使用的是Keil8.05中文版),执行菜单命令“工程”→“新建工程”创建“动态”项目,并选择单片机型号为AT89C51。执行菜单命令“文件”→“新建”创建文件,输入C语言源程序,保存为“DT.C”。在Project Workspace窗口中右击源代码组1,选择“添加文件到组‘源代码组 l’”将源程序“DT.C”添加到项目中。


Keil中执行执行菜单命令“工程”→“创建目标”(或点击“创建目标”快捷按钮),编译源程序。如果编译成功,则在“Output Window”的“创建”窗口中显示没有错误,并创建了“DT.HEX”文件。


 


3  仿真与调试


关于ProteusKeil的联合仿真调试,可参见我以前所写的博文或其它参考资料。


启动ProteusISIS,并将其放在屏幕的右上角(可将原理图放大到合适大小);再启动KeilμVision3,并将其放在屏幕的左下角。


    Keil中执行菜单命令“调试”→“启动/停止调试”,或直接单击图标f7880bc8-666c-477b-9025-43a997397ee8.jpg进入Keil调试环境。同时,在Proteus ISIS的窗口中可看出Proteus也进入了程序调试状态。


    Keil代码编辑窗口中设置相应断点,断点的设置方法:在需要设置断点语句前双击鼠标左键,可设置断点;再次双击,可取消该断点。


Keil中按F5键(或点击“运行”快捷按钮)运行程序。四位LED数码管显示012312342345……CdEFdEf0EF01F012……如此循环。或可以点击单步、运行到光标处、全速运行等快捷按钮,以及同时观察工程窗口寄存器页面、存储器窗口等,来进行仿真调试。


 


    本人邮箱:txxyc104@163.com,欢迎来信讨论.


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条