大家好,欢迎来到IT知识分享网。
“Then we can always regroup on the moon, silly!“
—— Johnny 《To the Moon》
目录
前言
在前面的文章中介绍了LED灯,今天介绍单片机的数码管,这篇文章将介绍数码管的显示其中包含了动态数码管和静态数码管两种。
一、数码管是什么?
数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮这些发光二极管时就可以组成不同的数字显示出来。
二、数码管原理图
下图我们可以知道8个数码管通过了一个74HC245芯片和单片机的P00-P07相连接。74HC138译码器通过P22-P24输出的相对于的电平选择控制哪个具体的数码管。
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时选择第二个数码管,以此类推。
由于 74HC138译码器可接受3位二进制加权地址输入(A0, A1和A2),则对P2.1,P2.2,P2.3输入一组三位的二进制编码,可以选择相应的数码管,而这一组编码称为位选码。顾名思义,这一组编码就是用来选择8个数码管中的其中一个。动态数码管模块图中的 LED8、LED7、LED6、LED5、LED4、LED3、LED2、LED1 网络标签都是数码管的公共端口 COM,位选指的就是这里。 以普中A3开发板为例,8个数码管的位选码如下表:
P2.2 | P2.3 | P2.4 | 选择的数码管 |
0 | 0 | 0 | LED1 |
0 | 0 | 1 | LED2 |
0 | 1 | 0 | LED3 |
0 | 1 | 1 | LED4 |
1 | 0 | 0 | LED5 |
1 | 0 | 1 | LED6 |
1 | 1 | 0 | LED7 |
1 | 1 | 1 | LED8 |
2.2 数码管之段选码
从图可以看出来,数码管共有 a、b、c、d、e、f、g、dp 这么 8 个段,而实际上,这 8 个段每一段都是一个 LED 小灯,所以一个数码管就是由 8个 LED 小灯组成的。注意 dp 这个段,它是表示一个小数点!我们看一下数码管内部结构的示意图:
数码管分为共阳和共阴两种:
共阴数码管就是 8 只 LED 小灯的阴极是连接在一起的,阴极是公共端,由阳极来控制单个小灯的亮灭。
同理共阳数码管就是阳极接在一起。两者的区别在于点亮LED灯是高电平亮(共阴极)还是低电平亮(共阳极),灭灯则为LED灯是高电平灭(共阳极)还是低电平灭(共阴极)。如下表:
共阳极 | 共阴极 | LED灯状态 |
0 | 1 | 亮 |
1 | 0 | 灭 |
看到这里不难猜出,所谓的段选就是选择要点亮数码管中 a、b、c、d、e、f、g、dp 哪些段。
下面以共阴极数码管为例,分析0~F的显示:
- 显示数字“0”,abcdef亮,状态值00——>0x3f
- 显示数字“1”,bc亮,状态值00000110——>0x06
- 显示数字“2”,abdeg亮,状态值0——>0x5b
- 显示数字“3”,abcdg亮,状态值0——>0x4f
- 显示数字“4”,bcfg亮,状态值0——>0x66
- 显示数字“5”,acdfg亮,状态值0——>0x6d
- 显示数字“6”,acdefg亮,状态值0——>0x7d
- 显示数字“7”,abc亮,状态值00000111——>0x07
- 显示数字“8”,abcdefg亮,状态值0——>0x7f
- 显示数字“9”,abcdfg亮,状态值0——>0x6f
- 显示字母“A”,abcefg亮,状态值0——>0x77
- 显示字母“B”,cdefg亮,状态值0——>0x7c
- 显示字母“C”,adef亮,状态值00——>0x39
- 显示字母“D”,bcdeg亮,状态值0——>0x5e
- 显示字母“E”,adefg亮,状态值0——>0x79
- 显示字母“F”,aefg亮,状态值0——>0x71
共阴极数码的段选,用表格展示如下:
显示字符 | 段选码 |
0 | 3FH |
1 | 06H |
2 | 5BH |
3 | 4FH |
4 | 66H |
5 | 6DH |
6 | 7DH |
7 | 07H |
8 | 7FH |
9 | 6FH |
A | 77H |
B | 7CH |
C | 39H |
D | 5EH |
E | 79H |
F | 71H |
同理,下面对共阳极数码管分析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
共阳极数码的段选,用表格展示如下:
显示字符 | 段选码 |
0 | C0H |
1 | F9H |
2 | A4H |
3 | B0H |
4 | 99H |
5 | 92H |
6 | 82H |
7 | F8H |
8 | 80H |
9 | 90H |
A | 88H |
B | 83H |
C | C6H |
D | A1H |
E | 86H |
F | 8EH |
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,#B MOV P0,#03FH ACALL DELAY MOV P2,#B 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,#B MOV A,30H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B 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,#B MOV A,30H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B 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,#0B。其他分析与秒表分析类似,这里不再赘述。
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,#B MOV A,30H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B MOV A,31H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B MOV P0,#0B ACALL DELAY MOV P2,#B MOV A,40H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B MOV A,41H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B MOV P0,#0B ACALL DELAY MOV P2,#B MOV A,50H MOVC A,@A+DPTR MOV P0,A ACALL DELAY MOV P2,#B 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
结果显示:
总结
今天介绍数码管的显示其中包含了动态数码管和静态数码管两种,以及数码管的段选和位选,同时简略的介绍利用数码管实现秒表和时钟的功能。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/142136.html