单片机控制数码管

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/snyanglq/article/details/50112215
一、什么是数码管
led数码管
(LED Segment Displays)由多个发光二极管封装在一起组成"8"字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。
数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母a,b,c,d,e,f,g,dp来表示,目前led数码管广泛用于仪表,时钟,车站,家电等场合。

二、数码管的结构原理

led数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位"+1"型。位数有半位,1,2,3,4,5,6,8,10位等等....

led数码管根据LED的接法不同分为共阴共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是有些微的不同。下图是共阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。颜色有红,绿,蓝,黄等几种选择。




三、数码管驱动原理
数码管的驱动说到底就是二极管的点亮过程,上面已经说过了数码管的结构原理,大家应该有所了解
在单片机的驱动中把数码管的驱动切割为段码和位码两种,段码就是数码管要显示数字要点亮的段条

位码就是要选择点亮的数码管是第几个数码管。以4位一体数码管点亮左边第一个数码管并显示字符"1"

         为例 如下图:


显示"1"需要b,c两个段亮,要左边第一位亮则要选择"1"脚,所以单片机驱动段码时应如下
共阳:
段码:b和c脚给0电平,其他a,d,e,f,g,dp给1电平
位码:1脚给1电平,2,3,4脚给0电平
共阴:
段码:b和c脚给1电平,其他a,d,e,f,g,dp给0电平

位码:1脚给0电平,2,3,4脚给1电平

        注意在驱动段码时只要算出一种的段码即可,如算出共阳段码,则共阴段码为共阳的~


四、数码管驱动电路

数码管的驱动电路有很多种,共阴和共阳的数码管又有些微的区别,驱动芯片也很多像74LS47,CD4511等
在不考虑成本、功耗、位置等其他因素的情况下,我觉得下面的这个数码管驱动电路是比较经典的,
不需要初学者检测什么电平才是点亮又或者是三极管选型,驱动电流大小等因素而且是直接输出控制,
且共阴和共阳都能使用,单片机输出0输出就是0,单片机输出1就是1。驱动电路如下:

五、数码管静态驱动程序

#include <reg52.h>

sbit smgEA=P2^3;
unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void main()
{
 smgEA = 1;	//没有也可以,因为AT89S52单片机的管脚不进行输出输入处理时默认为高电平
 P1=table[1];   //显示数字0
 while(1); 
}

六、数码管动态扫描驱动程序

#include <reg52.h>
sbit smgEA=P2^3;
//段码
unsigned char table1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//位码
unsigned char table2[]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70};

 

void delay(unsigned int n)
{
 while(n--)
 {
	;
 }
}

void main()
{
 unsigned char i;
 while(1)
 {
  for(i=0;i<8;i++)   <span style="white-space:pre">		</span> //由于只有8个数码管因此循环8次
  { 				 //显示数字01234567
	P2=table2[i];
	smgEA=1;
	P1=table1[i];
	delay(200);
  }
 }  
}


猜你喜欢

转载自blog.csdn.net/snyanglq/article/details/50112215