详解51单片机静态数码管的原理及编程实现

1.数码管原理图

单个数码管有8个LED灯,通过输入电平点亮a~g可显示数字,以下为原理图:

 数码管原理图分为共阴极与共阳极两种

共阴极:a~dp位于发光二极管的阳极(即高电平的一端)部分,左接GND端

共阳极:a~dp位于发光二极管的阴极(即低电平的一端)部分,右接VCC电源

例如:点亮共阴极数码管显示数字1,对应输入二进制数为

a,    b,    c,    d, e,    f,    g ,   dp
0     1      1     0 0     0    0      0

原理:a,e,f,g,dp输入为0时,由于0,1分别表示低电平、高电平,以a端为例:左右两边为低电平,二极管未接通,不发光。

同理:点亮共阳极数码管显示数字1,输入二进制为:1001 1111(0表示低电压,对应的管脚即为接通状态,二极管点亮)

二.代码部分讲解

void Nixie_tube(unsigned char location,Number)// 定义无符号char类型变量 location,Number
//location:数码管显示的位置,Number:数码管显示位置上对应的数字

{
  switch(location)				  //选择数码管位数
  
  {
   case	1:P2_4=1,P2_3=1,P2_2=1;break;
   case	2:P2_4=1,P2_3=1,P2_2=0;break;
   case	3:P2_4=1,P2_3=0,P2_2=1;break;
   case	4:P2_4=1,P2_3=0,P2_2=0;break;
   case	5:P2_4=0,P2_3=1,P2_2=1;break;
   case	6:P2_4=0,P2_3=1,P2_2=0;break;
   case	7:P2_4=0,P2_3=0,P2_2=1;break;
   case	8:P2_4=0,P2_3=0,P2_2=0;break;
   }
	P0=Nixie_Table[Number];
}

原理:

 P22~P24控制LED1~LED8显示

P24 为高位   P23为中位  P22为低位

例如:P24 P23 P22

输入: 1      1      1   二进制转十进制为:7,表示Y7显示,Y7与LED8连通

即LED1  LED2 LED3 LED4 LED5 LED6 LED7 LED8对应的电平为

     1          1        1       1      1         1         1         0

可以理解为:P24~P22输入3位二进制数可表示LED1~LED8的显示

原理为:输入3位二进制后转化为十进制即表示对应的LED显示位

unsigned char Nixie_Table[]= 
  {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x71,0x00};
//   0   1     2   3    4    5    6    7    8    9    A    B    C    D    F     空  
//unsigned char Nixie_Table[]    全局定义 Nixie_Table(数码管显示数字表)

由于单片机采用16进制存储格式,数码管显示位上数字显示用16位进制存储

如显示1:在单片机存储中格式为0x3f;

三.整体代码

#include <REGX52.H>
//定义函数体--达到单次编写可多次产生不同的值(显示数码管位数,显示数值)
//主体函数中包括定义函数体,填写数字返回到定义函数体中

unsigned char Nixie_Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x71,0x00};                 
void Nixie_tube(unsigned char location,Number)// nixie_show_subfunction(数码管显示函数)
{
  switch(location)				  //选择数码管位数
  
  {
   case	1:P2_4=1,P2_3=1,P2_2=1;break;
   case	2:P2_4=1,P2_3=1,P2_2=0;break;
   case	3:P2_4=1,P2_3=0,P2_2=1;break;
   case	4:P2_4=1,P2_3=0,P2_2=0;break;
   case	5:P2_4=0,P2_3=1,P2_2=1;break;
   case	6:P2_4=0,P2_3=1,P2_2=0;break;
   case	7:P2_4=0,P2_3=0,P2_2=1;break;
   case	8:P2_4=0,P2_3=0,P2_2=0;break;
   }
	P0=Nixie_Table[Number];//显示数字
}


void main()		//main 主函数

	{
		 Nixie_tube(6,2);//调用函数Nixie_tube(数码管)6:表示第6个数码管显示数字 
                          //2:表示第6个数码管上显示的数字为2
	while(1)
	{
	
	}
	}
物联沃分享整理
物联沃-IOTWORD物联网 » 详解51单片机静态数码管的原理及编程实现

发表评论