单片机七段数码管

2013-10-30 09:24:42 Flower195 阅读数 4810

共阳极芯片 如:7SEG-MPX4-CA  其中 CA: Common Anode

单片机LED共阳极段码表【0-F】
DB          0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H       [0-7]
DB          80H,90H,88H,83H,0c6H,0a1H,86H,8eH          [8-F]

共阴极芯片 如:7SEG-MPX4-CC  其中 CA: Common Cathode
单片机LED共阴极段码表【0-F】
DB         3FH,06H,5BH,4FH,66H,6DH,7DH,07H          [0-7]
DB         7FH,6FH ,77H,7CH,39H,5EH,79H,71H,76H     [8-F]



2017-06-03 10:52:16 yang889999888 阅读数 2682

串行控制七段数码管  
ORG	00H                           
START:
MOV	30H,#1	; 低位七段数码管DS0显示数据
MOV	31H,#5	; 高位七段数码管DS1显示数据
MOV     	R0,#30H	; R0=30H
MOV     	R1,#40H	; R1=40H
MOV     	R2,#2	; R2=2
DP10:   
MOV      DPTR,#TABLE   	; 装表
MOV     	A,@R0	; 将R0所指的数据载入A
MOVC    	A,@A+DPTR      	; 取表
MOV     	@R1,A	; 把数据暂时保存在R1所指的地址中
INC	R1	; R1自增1
INC	R0	; R0自增1
DJNZ	R2,DP10	; 如果R2不等于0,说明没有取完两个段码,跳回DP10循环
MOV     	R0,#40H       	; R0=40H,指向刚才保存段码的空间
MOV     	R1,#2          	; R1=2,段码共有2个字节数
DP11:   
MOV     	R2,#8          	; R2=8,每位显示数据共有8个段码,R2作计数器 
MOV     	A,@R0         	; 把R0指向的段码数据载入A
DP12:   
RLC	A              	; 段码数据向左移动一位
MOV	P2.0,C          	; 串行输出一位段码数据
CLR	P2.1            	; 发送位移脉冲
SETB	P2.1	; 形成上升沿
DJNZ	R2,DP12	; 判断是否输出8位段码
INC	R0	; R0自增1
DJNZ	R1,DP11	; 判断是否输出两个显示数据
JMP	$
 
TABLE:	;七段数码管显示数据表(段码)
DB	40H,79H,24H,30H,19H ;0,1,2,3,4
DB	12H,02H,78H,00H,10H ;5,6,7,8,9
END
 
 


2017-03-04 14:19:37 electrocrazy 阅读数 12243

       7段数码管价格低廉驱动简单,能够显示数字0~9、字符AbCdE FPqL等,被广泛应用于电子产品的简单数据的显示。比如温控仪的温度及设置参数的显示、电子钟的时间显示、电梯的楼层显示等。

      前感觉7段数码管的驱动电路很简单,而且项目从来没用过,因此没有深入分析思考。最近为单片机教材《单片机原理及应用—基于Proteus Keil C》做了一块配套的单片机课程实验板,实验板上有22位共阴7段数码管用于简单信息显示。刚开始设计电路如下:

      

         电路焊接完成后测试时发现动态显示时数码管的亮度很低。怀疑电阻的取值可能不太合适,在网上查阅了很多资料后更换了电阻值,问题解决。现在把电阻值的估算过程总结如下。

       51单片机I/O口的驱动能力有限,因此在P0口和数码管段码之间增加了74LS245来增加端口驱动能力。R1~R7R11~R17起到限流的作用,用以保护数码管。数码管点亮时,公共端电流很大,如果直接把公共端连接到单片机引脚,大电流将会灌入单片机引脚,容易导致引脚损坏,因此增加三极管Q1Q2Q3Q4。三极管作为开关管,导通时数码管驱动电流大部分从CE通道流入电源地,小部分灌入单片机引脚。三极管作为开关管工作在饱和区和截止区。当三极管导通时数码管点亮,三极管工作在饱和区。

         首先计算最大字电流。4个数码管,每一个包含8段,每一段工作时平均电流是3mA的话,则最大电流为4*8*3=96mA,约等于100mA。从集电极电流和放大倍数之间的关系图可知Ic= 100mA时,Hfe>200。理论上Ib=0.5mA就可以使三极管饱和导通。饱和导通时三极管压降Vbe=0.7VR=(5-0.7)/Ib=4.3K。为了使三极管可靠导通,一般取基极保护电阻R=1~2K



       接下来计算数码管段限流电阻取值。首先计算段电流,一般红色LED压降约为1.6V,绿色LED压降约为1.8V。静态显示时段电流约为3mA4个数码管轮流动态显示,为了使显示亮度和静态显示时一样,驱动电流需要提高4倍,于是动态显示时段驱动电流需要达到3*4=12mAR=(Vcc-1.6)/(3*4)=0.28K,因此用300Ω的电阻就差不多了。这个电阻的取值直接影响数码管的显示亮度。

      按照上边的推导,更换电阻后,数码管的亮度增加了很多。


2019-07-08 12:02:19 weixin_42048463 阅读数 498

 在轮流显示0~7程序的基础上, 将delay()函数提供的时延大幅缩小, 以达到视觉短暂的停留效果. 在该种情况下的数码管亮度和对比度较轮流显示时有一定幅度的降低. 另外, 如果想感知到动态扫描的存在, 可从拍摄视频中观察(到像波浪一样的光浪).

#include <STC89C5xRC.H>

void delay()//提供时延
{
	int i, j;
	for(i = 0; i < 15 ; i++)
		for(j = 0; j < 15; j++) ;
}

void f1_3_4_3()//在8个数码管上轮流显示0~7
{
	unsigned char code DIG_CODE[8] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07};
	int i;
	while(1)
	{
		for(i = 0; i < 8; i++)
		{
			P2 = i << 2;
			// i = 1 -> P2 = 0000 0001 ->(左移2位后) P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二片亮
			// i = 2 -> P2 = 0000 0010 ->(左移2位后) P2 = 0000 1000 -> (P24, P23, P22) = (0, 1, 0) -> 右数第三片亮
			// i = 3 -> P2 = 0000 0011 ->(左移2位后) P2 = 0000 1100 -> (P24, P23, P22) = (0, 1, 1) -> 右数第四片亮
			// ......
			// i = 7 -> P2 = 0000 0111 ->(左移2位后) P2 = 0001 1100 -> (P24, P23, P22) = (1, 1, 1) -> 右数第八片亮
			P0 = DIG_CODE[i];
			delay();
		}
	}
}

int main()
{
	f1_3_4_3();	
	return 0;
}

 

2018-11-19 15:17:24 Ernest_YN 阅读数 2648

进制转换

十进制 二进制 十六进制
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
10 1010 a
11 1011 b
12 1100 c
13 1101 d
14 1110 e
15 1111 f

七段LED数码管与十六进制代码的对应关系

七段LED数码管 二进制 十六进制代码
0 0011 1111 0x3f
1 0000 0110 0x06
2 0101 1011 0x5b
3 0100 1111 0x4f
4 0110 0110 0x66
5 0110 1101 0x6d
6 0111 1101 0x7d
7 0000 0111 0x07
8 0111 1111 0x7f
9 0110 1111 0x6f
. 1000 0000 0x80

实现代码

#include <reg52.h>
#define SEG P0		//定义七段LED数码管位置
char code TAB[10] = {	0x3f, 0x06, 0x5b, 0x4f, 0x66,		
						0x6d, 0x7d,	0x07, 0x7f, 0x6f};	
					//显示数字0~9
void delay(int);	//声明延迟函数

//主程序
main()
{
	unsigned char i;
	while(1)
	{
		for(i=0;i<10;i++)
		{	
			SEG = TAB[i];		//显示数字i
			delay(1000);		//延迟1000×1ms=1s
		}
	}
}

//延迟函数
void delay(int n)
{
	int i,j;
	for(i=0;i<n;i++)
	for(j=0;j<120;j++);
}

七段数码管显示

阅读数 1025