51单片机数码管

1.1单个数码管


1.2 数码管的工作原理

        (1)数码管的亮灭是由发光二极管的亮灭实现的。

        (2)一位数码管内部有八个发光二极管,利用其亮和灭让数码管显示不同的数字。


1.3 数码管的接线方式

 1.3.1 位选

         每一个数码管内部的8个二极管是独立驱动的。共阴极数码管和共阳极数码管的区别主要在于位选接线方式的不同。我们把8个发光二极管的公共端称之为位选。

   (1)共阳极数码管

         8个发光二极管的正极一起接到VCC上,这种接法就叫共阳极。写入代码时,我们要给公共端高电平,即给位选为“1”。

 (2)共阴极数码管

          如果8颗LED负极一起然后接到GND上,则为共阴极。写入代码时,我们要给公共端低电平,即给位选为“0”。

1.3.2 段选

        当我们确定单片机是共阴极或者共阳极数码管时,我们即可以对他的段选端进行赋值。

        对于单个数码管,我们对会发光的每个段进行命名。我们采用顺时针的方法进行命名,分别是ABCDEFG DP。

        如果我们的数码位选给的是高电平1,那么段选时应该给低电平0可以使数码管发光。反之,如果位选为低电平0,那么段选时即给高电平1,能使数码管发光。

1.4 显示程序

1.4.1静态显示和动态显示的区别

       静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。

        动态显示的特点是将所有的数码管的段选线并接在一起,用一个IO接口控制,公共端是通过相应的IO接口控制,例如138译码器。以共阳极极为例,假设4个数码管工作过程为:第一步使最右边一个数码管的公共端为1,其余数码管公共端为0,这时候只有右边的第一个数码管显示,其余不显示;第二部使右边第二个数码管的公共端为1,其余的公共端为0,同时发送右边第二个数码管的段码,这时候,只有右边第二个数码管显示,其余不显示,以此类推,直到最后一个,每一个数码管轮流显示相应的信息,这就是数码管的动态显示。

(1)数码管静态显示6

        以共阳极为例,首先给位选端赋值为1,后对段选端进行赋值,需要其亮的端口把他赋值为0,后用二进制表示出来。

#include <REGX52.H>

sbit LED1=P2^4;

void main()
{
  while(1)
	{
		LED1=1;//位选赋值
		P0=0x82;//段选赋值
	}
}

(2)数码管动态显示1314

        首先写出数码管从0-9显示的二进制数,然后用switch函数进行判断,确定当进入不同语句时,数码管亮不同的位置(该步为给位选位赋值),然后使段选位P0等于数组内段码,即可动态显示数字1314。

        case 1指第一个数码管,若switch语句只触发了第一句,而后续数码管显示也只会在第一位,以此类推。

unsigned char Diaplay_[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码表
void Diaplay (unsigned char Location,number)
{
   switch(Location)
	 {
		 case 1:LED1=0;LED2=1;LED3=1;LED4=1;break;//第一位亮
		 case 2:LED1=1;LED2=0;LED3=1;LED4=1;break;//第二位亮
		 case 3:LED1=1;LED2=1;LED3=0;LED4=1;break;//第三位亮
		 case 4:LED1=1;LED2=1;LED3=1;LED4=0;break;//第四位亮
	 }
		P0=Diaplay_[number]; 

        主要代码: 

#include <REGX52.H>
#include <INTRINS.H>

sbit LED1=P2^4;//定义位选位
sbit LED2=P2^5;
sbit LED3=P2^6;
sbit LED4=P2^7;

void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
  while(xms)
	{
		_nop_();
		_nop_();
		i = 12;
		j = 168;
		do
		{
			while (--j);
		} while (--i);
		xms--;
	}
	
}

unsigned char Diaplay_[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段码表
void Diaplay (unsigned char Location,number)
{
   switch(Location)
	 {
		 case 1:LED1=0;LED2=1;LED3=1;LED4=1;break;//第一位亮
		 case 2:LED1=1;LED2=0;LED3=1;LED4=1;break;//第二位亮
		 case 3:LED1=1;LED2=1;LED3=0;LED4=1;break;//第三位亮
		 case 4:LED1=1;LED2=1;LED3=1;LED4=0;break;//第四位亮
	 }
		P0=Diaplay_[number]; 

}	
void main()
{
   while(1)//显示1314
	 {
	    Diaplay(1,1);
		  Delay(500);
		 Diaplay(2,3);
		  Delay(500);
		 Diaplay(3,1);
		  Delay(500);
		 Diaplay(4,4);
		  Delay(500);
	 }
}

         

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值