51单片机之数码管

“Then we can always regroup on the moon, silly!“

                                                                                                —— Johnny 《To the Moon》

目录


前言

        在前面的文章中介绍了LED灯,今天介绍单片机的数码管,这篇文章将介绍数码管的显示其中包含了动态数码管和静态数码管两种。


一、数码管是什么?

        数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮这些发光二极管时就可以组成不同的数字显示出来。

二、数码管原理图

        下图我们可以知道8个数码管通过了一个74HC245芯片和单片机的P00-P07相连接。74HC138译码器通过P22-P24输出的相对于的电平选择控制哪个具体的数码管。d57720877e5140388275185368ecd81f.png

   2.1  数码管之位选码

        74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL)系列。   

         74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),并当使能时,提供8个互斥的低有效输出(Y0至Y7)。
这样我们就可以只通过3个引脚就可以选择控制8个数码管了。
        下面是74138译码器的真值表,当P22-P24都输出0时就选择了第一个数码管,P22为1时P23-P24输出0时选择第二个数码管,以此类推。

c061bfdf9eb64ef9858d63b9d9a675b0.png

        由于 74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),则对P2.1,P2.2,P2.3输入一组三位的二进制编码,可以选择相应的数码管,而这一组编码称为位选码。顾名思义,这一组编码就是用来选择8个数码管中的其中一个。动态数码管模块图中的 LED8、LED7、LED6、LED5、LED4、LED3、LED2、LED1 网络标签都是数码管的公共端口 COM,位选指的就是这里。 以普中A3开发板为例,8个数码管的位选码如下表:

P2.2P2.3P2.4选择的数码管
000LED1
001LED2
010LED3
011LED4
100LED5
101LED6
110LED7
111LED8

2.2 数码管之段选码

        从图可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。注意 dp 这个段,它是表示一个小数点!我们看一下数码管内部结构的示意图:

数码管分为共阳和共阴两种:

        共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。
        同理共阳数码管就是阳极接在一起。两者的区别在于点亮LED灯是高电平亮(共阴极)还是低电平亮(共阳极),灭灯则为LED灯是高电平灭(共阳极)还是低电平灭(共阴极)。如下表:

共阳极共阴极LED灯状态
01
10


看到这里不难猜出,所谓的段选就是选择要点亮数码管中 a、b、c、d、e、f、g、dp 哪些段。

        下面以共阴极数码管为例,分析0~F的显示:

  • 显示数字“0”,abcdef亮,状态值00111111——>0x3f
  • 显示数字“1”,bc亮,状态值00000110——>0x06
  • 显示数字“2”,abdeg亮,状态值01011011——>0x5b
  • 显示数字“3”,abcdg亮,状态值01001111——>0x4f
  • 显示数字“4”,bcfg亮,状态值01100110——>0x66
  • 显示数字“5”,acdfg亮,状态值01101101——>0x6d
  • 显示数字“6”,acdefg亮,状态值01111101——>0x7d
  • 显示数字“7”,abc亮,状态值00000111——>0x07
  • 显示数字“8”,abcdefg亮,状态值01111111——>0x7f
  • 显示数字“9”,abcdfg亮,状态值01101111——>0x6f
  • 显示字母“A”,abcefg亮,状态值01110111——>0x77
  • 显示字母“B”,cdefg亮,状态值01111100——>0x7c
  • 显示字母“C”,adef亮,状态值00111001——>0x39
  • 显示字母“D”,bcdeg亮,状态值01011110——>0x5e
  • 显示字母“E”,adefg亮,状态值01111001——>0x79
  • 显示字母“F”,aefg亮,状态值01110001——>0x71

        共阴极数码的段选,用表格展示如下:

显示字符段选码
03FH
106H
25BH
34FH
466H
56DH
67DH
707H
87FH
96FH
A77H
B7CH
C39H
D5EH
E79H
F71H

        同理,下面对共阳极数码管分析0~F的显示:

  • 显示数字“0”,abcdef亮,状态值1100  0000——>0xC0
  • 显示数字“1”,bc亮,状态值1111  1001——>0xF9
  • 显示数字“2”,abdeg亮,状态值1010  0100——>0xA4
  • 显示数字“3”,abcdg亮,状态值1011  0000——>0xB0
  • 显示数字“4”,bcfg亮,状态值1001  1001——>0x99
  • 显示数字“5”,acdfg亮,状态值1001  0010——>0x92
  • 显示数字“6”,acdefg亮,状态值1000  0010——>0x82
  • 显示数字“7”,abc亮,状态值1111  1000——>0xF8
  • 显示数字“8”,abcdefg亮,状态值1000  0000——>0x80
  • 显示数字“9”,abcdfg亮,状态值1001  0000——>0x90
  • 显示字母“A”,abcefg亮,状态值1000  1000——>0x88
  • 显示字母“B”,cdefg亮,状态值1000  0011——>0x83
  • 显示字母“C”,adef亮,状态值1100  0110——>0xC6
  • 显示字母“D”,bcdeg亮,状态值1010  0001——>0xA1
  • 显示字母“E”,adefg亮,状态值1000  0110——>0x86
  • 显示字母“F”,aefg亮,状态值1000  1110——>0x8E

        共阳极数码的段选,用表格展示如下:

显示字符段选码
0C0H
1F9H
2A4H
3B0H
499H
592H
682H
7F8H
880H
990H
A88H
B83H
CC6H
DA1H
E86H
F8EH

2.3 用数码管显示数字

        下面以一显示数字10为例:

        在LED1和LED2是显示10,假设选LED1位个位,选LED2位十位。这里采用先进行位选,再进行段选的方式;或者你也可以采用先段选然后位选的方式,由于这两个步骤是相邻的,离得较近,执行速度较快,区别不大。

        先由P2口选取LED1,位选码:000(P2.2~P2.4),再在P0口进行段选,显示0:  0011 1111B,换算成16进制:o*3FH。至此,个位显示已经完成。接下来仿造个位的显示步骤了显示十位,由P2口选取LED2,位选码:001(P2.2~P2.4),再在P0口进行段选,显示1:  0000 0110B,换算成16进制:o*06H。这样显示数字10的操作就完成了。代码如下:

ORG 0000H
	AJMP MAIN
	ORG 0030H
		MAIN:
		MOV P2,#11100011B
		MOV P0,#03FH
		ACALL DELAY
		MOV P2,#11100111B
		MOV P0,#06H
		ACALL DELAY
		AJMP MAIN
		
		DELAY:
		MOV R6,#10
		LF:MOV R7,#250
		DJNZ R7,$
			DJNZ R6,LF
			RET
			END

        为什么利用数码管显示数字10需要用到延迟子程序呢?这里需要提到消影。

        根据数码管显示的原理,显示的顺序是 位选 -->段选-->位选-->段选-->位选 这样循环,而问题就出现在段选-->位选这里,虽然单片机工作频率很快但是也是需要一定的时间来工作,当完成一个操作内的位选之后,段选之前的这段单片机还在工作的时间里,有段“空白时间”。在“空白时间”内,由于还未进行下一个段选,此时的段选还是上一个操作里的段选,导致LED模块显示的是上一个LED模块的样子。

        那么应该如何解决这种现象呢,也就是我们所说的消影。这里在位段选后调用延时子程序。

由于人的视觉暂留视觉大概是0.05-0.2s,所以这里采用的是5毫米的延时。

DELAY:
		MOV R6,#10
		LF:MOV R7,#250
		DJNZ R7,$
			DJNZ R6,LF
			RET
			END

三、动态数码管之秒表的显示

3.1 实验内容

        使用单片机定时器定时,以数码管作为单片机的输出设备,单片机上电复位后,在数码管上从00开始,显示秒数,到99秒后,数码管重新从00开始显示。  

3.2 实验原理 

         时间是单片机控制系统的重要控制参数,很多常用的家用电器如全自动洗衣机、智能电饭煲、家用面包机等都是采用时间参数实现的过程控制。秒表的设计是使用单片机集成定时器T0定时,以“秒”为单位在显示器上显示的设计实例。

3.3 实验分析

         在数码管上从00开始,显示秒数,到99秒后,数码管重新从00开始显示。这里可以用定时器计时,当到达1s后加一,然后在数码管上显示,一直到100的时刻归零。这里用定时器0各种方式1,进行定时,设置初值为15536,即50ms定时,50ms*20=1s,定时器中断服务子程序如下:

T_0:
				PUSH DPH
				PUSH DPL
				PUSH ACC
				MOV TH0,DPH
				MOV TL0,DPL
				INC R4
				CJNE R4,#20,QUIT
				MOV R4,#0
				INC R7
				CJNE R7,#100,QUIT 
				MOV R7,#0
				QUIT:
				POP ACC
				POP DPL
				POP DPH
				RETI

        由于数码管一次只能显示一位数码管,所以秒数的个位和十位得分开传入数码管。而秒数是依次加一的,需要对秒数进行个位和十位的分离,这里用到了汇编的DIV指令,将秒数/10,商为十位传入31H单元内,余数为个位传入30H单元内,该子程序代码如下:

BTD:        
			PUSH ACC
			MOV A,R7
			MOV B,#10
			DIV AB
			MOV 31H,A
			MOV 30H,B
			POP ACC
			RET

        这里的PUS,POP 操作仅仅为了保存A进入该子程序前的数据,可删。

         得到了秒数的个位和十位,接下来进行数码管的显示,仿造上面数字10的显示程序,同时这里将0~9的段选码制作为表格形式:

ORG 0100H			
				TABLE:
	DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH

        数码管显示数字采用位置基址+变址寻址(查表)的方式,传输段选码给对应的数码管,该子程序如下:

DISP:
			PUSH DPH
			PUSH DPL
			PUSH ACC
			MOV DPTR,#TABLE    
			MOV P2,#11100011B 
			MOV A,30H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11100111B
			MOV A,31H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			POP ACC
			POP DPL
			POP DPH
			RET   

DELAY:MOV R6,#10                        ;消影
				LP:MOV R5,#250
                   DJNZ R5,$
                   DJNZ R6,LP
                    RET		         

3.4 代码实现

         动态数码管之秒表的显示全部代码如下:

ORG 0000H
	AJMP MAIN
	ORG 000BH
		AJMP T_0
		ORG 0030H         
			MAIN:          
			MOV TMOD,#01H
			MOV DPTR,#15536
			MOV TH0,DPH
			MOV TL0,DPL
			SETB EA
			SETB ET0
			SETB TR0
			MOV SP,#6FH
			MOV R4,#0
			MOV R7,#0
			AGAIN:
			ACALL BTD
			ACALL DISP
			SJMP AGAIN
			
			BTD:        
			PUSH ACC
			MOV A,R7
			MOV B,#10
			DIV AB
			MOV 31H,A
			MOV 30H,B
			POP ACC
			RET
			
			DISP:
			PUSH DPH
			PUSH DPL
			PUSH ACC
			MOV DPTR,#TABLE    
			MOV P2,#11100011B 
			MOV A,30H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11100111B
			MOV A,31H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			POP ACC
			POP DPL
			POP DPH
			RET             
			
				
				T_0:
				PUSH DPH
				PUSH DPL
				PUSH ACC
				MOV TH0,DPH
				MOV TL0,DPL
				INC R4
				CJNE R4,#20,QUIT
				MOV R4,#0
				INC R7
				CJNE R7,#100,QUIT  
				MOV R7,#0
				QUIT:
				POP ACC
				POP DPL
				POP DPH
				RETI
				DELAY:MOV R6,#10
				LP:MOV R5,#250
                   DJNZ R5,$
                   DJNZ R6,LP
                    RET				   
			ORG 0100H			
				TABLE:
	DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
	END

             结果显示:  

四、动态数码管之时钟的显示

4.1 实验内容

        使用单片机定时器定时,单片机上电后在数码管上显示时,分,秒。单片机上电后显示00-00-00,当显示到23-59-59后显示00-00-00,继续计时。

4.2 实验原理

         电子时钟的设计是在实验五秒表设计的基础上,使用单片机定时器T0定时,进行二十四小时制的“时-分-秒”的显示。

4.3 实验分析

        时钟的显示与秒表的显示本质上没太大区别,只是显示的数码管由2个变到8个,其中两个是“-”符号用来隔开分秒,时分。 由下图:

         “-”符号只需要在对应的数码管上点亮g段的LED灯,即:MOV P0,#01000000B。其他分析与秒表分析类似,这里不再赘述。

4.4 代码实现

        动态数码管之时钟的显示全部代码:

ORG 0000H
	AJMP MAIN
	ORG 000BH
		AJMP T_0
		ORG 0030H          
			MAIN:          
			MOV TMOD,#01H
			MOV DPTR,#15536
			MOV TH0,DPH
			MOV TL0,DPL
			SETB EA
			SETB ET0
			SETB TR0
			MOV SP,#6FH
			MOV R3,#0
			MOV R2,#0
			MOV R6,#0
			MOV R7,#0
	AGAIN:
			ACALL BTD
			ACALL BTD_1
			ACALL BTD_2
			ACALL DISP
	RE:     SJMP AGAIN
			
			BTD:        
			PUSH ACC
			MOV A,R2
			MOV B,#10
			DIV AB
			MOV 31H,A
			MOV 30H,B
			POP ACC
			RET
			
BTD_1:         
			PUSH ACC
			MOV A,R6
			MOV B,#10
			DIV AB
			MOV 41H,A
			MOV 40H,B
			POP ACC
			RET	
			
BTD_2:         
			PUSH ACC
			MOV A,R7
			MOV B,#10
			DIV AB
			MOV 51H,A
			MOV 50H,B
			POP ACC
			RET	

DISP:
			PUSH DPH
			PUSH DPL
			PUSH ACC
			MOV DPTR,#TABLE    
			MOV P2,#11100011B 
			MOV A,30H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11100111B
			MOV A,31H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11101011B 
			MOV P0,#01000000B
			ACALL  DELAY
			MOV P2,#11101111B
			MOV A,40H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11110011B 
			MOV A,41H        
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11110111B
			MOV P0,#01000000B
			ACALL  DELAY
			MOV P2,#11111011B
			MOV A,50H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			MOV P2,#11111111B 
			MOV A,51H         
			MOVC A,@A+DPTR
			MOV P0,A
			ACALL  DELAY
			POP ACC
			POP DPL
			POP DPH
			RET             
				
			
				
T_0:
				PUSH DPH
				PUSH DPL
				PUSH ACC
				MOV TH0,DPH
				MOV TL0,DPL
				INC R3
				CJNE R3,#20,QUIT
				MOV R3,#0
				INC R2
				CJNE R2,#60,QUIT  
				MOV R2,#0
				INC R6
				CJNE R6,#60,QUIT
				MOV R6,#0
				INC R7
				CJNE R7,#24,QUIT
				MOV R7,#0
		QUIT:
				POP ACC
				POP DPL
				POP DPH
				RETI
				

DELAY:             MOV R5,#4
			LP:    MOV R4,#250
                   DJNZ R4,$
                     DJNZ R5,LP
                    RET				   
			ORG 0200H			
				TABLE:
	DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
	END

        结果显示: 

 


总结

         今天介绍数码管的显示其中包含了动态数码管和静态数码管两种,以及数码管的段选和位选,同时简略的介绍利用数码管实现秒表和时钟的功能。

  • 20
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值