教程:用8051单片机实现七段数码管的循环显示

458 阅读4分钟

前言

在嵌入式系统或微控制器项目中,我们经常需要控制数码管来显示数字或字符。本文的目标是实现在八个七段数码管(共阳极类型)上循环显示数字12345678。接下来,我将详细讲解实现的思路。

正文

首先,我们需要明确功能。下面是具体将要实现的功能:

现在,让我们打开仿真软件和编程软件。再次明确我们的目标,即实现数字在数码管上的循环显示。然后,我们可以根据目标画出相应的仿真图,确保硬件连接和软件编程的正确性。

接下来就可以准备编程了。

首先,我们需要通过xdata关键字定义一些与硬件直接映射的变量,这些变量分别对应8255芯片的控制端口和三个数据端口。8255芯片在这里用作I/O扩展,以控制数码管的各个段和选择当前要显示的数码管。

#include <reg52.h>  
#include <stdio.h>  
  
xdata unsigned char COM8255  _at_ 0x8006;  
xdata unsigned char PA8255   _at_ 0x8000;  
xdata unsigned char PB8255   _at_ 0x8002;  
xdata unsigned char PC8255   _at_ 0x8004;

接着,再定义两个关键的数组。tab[]数组存储数字0到F(十六进制)在七段数码管上的编码。这些编码是根据数码管的引脚连接和共阳极特性来确定的,用于控制数码管的各个段是否亮起,从而显示出对应的数字。buff[]数组则用于存储当前要显示的数字序列,初始化为12345678。

unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};//0-f  
unsigned char buff[8]={1,2,3,4,5,6,7,8} ;

为了控制显示的持续时间,我们还需要实现一个delay()函数。这个函数通过两层循环来产生延迟,外层循环控制延迟的总体长度,内层循环则提供具体的延迟时间。参数z用于控制外层循环的次数,从而控制延迟的长度。

void  delay(unsigned int z)  
{  
   unsigned int x,y;  
   for(x=z;x>0;x--)  
      for(y=255;y>0;y--);  
}

为了实现数字序列的循环滚动,需要定义dataFlow()函数。这个函数接收一个字符c作为参数,并将其添加到buff[]数组的末尾,同时将数组中的其他数字向前移动一位。这样,每次调用dataFlow()函数时,buff[]数组中的数字序列都会更新。

void dataFlow(unsigned char c)  
{  
   unsigned char h,s;  
   h=buff[0];  
   for(s=0;s<7;s++)  
   {  
      buff[s]=buff[s+1];  
   }  
   buff[7]=c;  
}

display()函数则负责将buff[]数组中的数据显示到数码管上。它通过循环依次将每个数字对应的编码发送到PA8255数据端口,同时控制PB8255数据端口来选择当前要显示的数码管。在每个数码管上显示数字时,都会调用delay()函数来控制显示时间。

void display()  
{    
  unsigned char site=0x01,d;    
  for(d=0;d<8;d++)  
  {  
     PA8255=tab[buff[d]];  
     PB8255=site;  
     delay(300);  
     site<<=1;  
  }  
}

最后,在main()函数中,首先设置COM8255控制端口为0x80,以初始化8255芯片的工作模式。然后,代码进入一个无限循环,在这个循环中,通过dataFlow()display()函数的配合,实现数字序列12345678在数码管上的循环显示。外层循环控制数字序列的整体更新(从0到9循环),而内层循环则控制每个数字的显示时间。

void main(void)  
 {   
	 unsigned char  j;  
   COM8255=0x80;  
   while(1)  
	 {  
		 for(i=0;i<10;i++)  
		 {  
			 for(j=0;j<8;j++)  
			   display();  
			 dataFlow(i);  
		 }  
	 }  
 }

结语

这样,我们通过精确地控制8255芯片的数据端口和控制端口,以及合理地安排延迟和时间循环,最终实现了在八个七段数码管上循环显示数字12345678的功能。希望这个讲解能帮到你,如果你有任何疑问,欢迎留言!