单片机数码管动态显示原理解析

1.头文件和定义,代码还使用了 sbit 定义来声明了两个变量 duan 和 wei,它们实际上是 P2.6 和 P2.7 端口的别名,用于控制数码管的段选和位选信号。这种方法可以使代码更具可读性,并提高代码的可维护性。定义无符号整数便于后面应用。

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar a,b,c,d,e
sbit duan=P2^6;		//段选信号的锁存器控制
sbit wei=P2^7;		//位选信号的锁存器控制

2.使用一个 16 个元素的数组 table,该数组包含了 0-15 的数字在数码管中对应的段码值。

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
						//0-F的码表

3.延时函数部分
(数码管的显示主要依靠于人的视觉暂存和数码管的余辉),前面亮灯灭灯里面提到过 单片机控制一盏灯的亮与灭程序解释

void delay(uint k)
 {
 uint i,j;

 for(i=0;i<k;i++)
 {
 for(j=0;j<113;j++)
 {
 ;
 }
 }
 }

4.利用取余操作,将要显示的数据拆分开

void culi()		//假设d=123;
 {
  a=d/100;	    //a=123/100=1,其它的不要,只要1,存进变量a中
  b=d/10%10;	//b=123/10=12%10=2,只要2,其它的不要,存进变量b中
  c=d%10;		//c=123%10=3,只要3,其它的不要,存进变量c中
  }

5.进行位选和段选,也就是显示操作

11110111对应16进制就是0xf7, 所以设置P0口味0xf7进行位选操作,最后将百位发送给P0进行段选,然后延时,完成百位上的数据的显示。十位和个为依次类推。

void pro()
 {
	

 	 
	
	 P0=0xf7;	  //选择数码管 
	 wei=1;		  //选择数码管开启
	 wei=0;		  //选择数码管关闭
					  
     P0=table[a]; //送段码百位
	 duan=1;	  //段位开
	 duan=0;	  //段位关
	 delay_ms(5);//延时


	 P0=0xef;
	 wei=1;
	 wei=0;
	 P0=table[b]; //送段码十位
	 duan=1;
	 duan=0;
	 delay_ms(5);


	 P0=0xdf;
	 wei=1;
	 wei=0;
	 P0=table[c]; //送段码个位
	 duan=1;
	 duan=0;
	
	 delay_ms(5);
	 e++;
 }

6.主函数部分
d是数码管要显示的数字,e在这里的作用是实现自加操作,当加至一定数量的时候,d变也会自加,于是可以看到数码管上的数字逐渐增大。主程序就是先对d进行拆分,进入循环之后,进行数码管显示(数码管显示里面包括了e自加),e自加到一定数量后d自加,e置零,d拆分,之后在while死循环中进行显示,下一个流程也是这样的。关于为什么e自加到50,代码中在pro()函数中使用e变量计数,是为了控制数码管显示的速度和循环显示的次数。每次进入pro()函数后,会将当前数码管的值显示出来,并将e的值自加1,表示等待下一次显示的时间。当e的值累计到50时,if(e==50)语句会触发执行一些特定的操作,即将变量d自加1,并调用culi()函数将d分解为百位、十位和个位数,以便在下一轮循环中显示出来。这是因为在该代码中,每50个计数周期后需要切换到下一个数字进行显示,即在一个特定的时间间隔内更新数码管的显示值,以达到流畅的显示效果。如果不进行分解操作,就无法在下一轮循环中显示下一个数字。需要注意的是,这个特定的时间间隔(50个计数周期)是通过实验调整得出的,具体的数值可以根据具体的需求和实际情况进行调整。例如,如果需要加快数码管的显示速度,可以减小时间间隔;如果需要减缓数码管的显示速度,可以增大时间间隔。同时,为了保证数码管显示的稳定性和可靠性,时间间隔也不能太小或太大,需要根据具体的硬件设备和程序实现进行适当的调整。

void main()
{  d=0;			//要显示的变量
   e=0;		    //自加的速度标志。
   culi();	
    while(1)
	{
	 pro();		   //数码管显示。
	 if(e==50) 	  //e测试等于50就执行下面的语句。
	  {
	   e=0;		  //e=0
	   d++;		  //d自加1
	   culi();	  //处理d,就是把d分成百位,十位,个位。
	   }

	 }
}
物联沃分享整理
物联沃-IOTWORD物联网 » 单片机数码管动态显示原理解析

发表评论