51单片机第四节数码管
- 格式:pdf
- 大小:178.60 KB
- 文档页数:6
51单⽚机第四节数码管
本笔记默认学习者已拥有:1.Keil5和stc烧写⼯具 等各种软件、驱动、环境;
2.有⼀个属于⾃⼰的 51单⽚机开发板及相关零件 ;
3.认识C语⾔的语法;
本⼈使⽤的51开发板为 郭天祥C51 TX-1C增强版开发板 ;
本笔记根据B站up主:江科⼤⾃化协的教学视频 整理得到ヾ(•ω•)
4-1 静态数码管显⽰
上图为TX-1C的 数码管及LED模块 原理图
138译码器和74HC245 都是⽤来控制 数码管显⽰ 的;
单数码管
1.上图为 ⼀位数码管,数码管有两种连接⽅式(对应 右边上下两幅图);2.右上图的原理图,8个LED的阴极都连在⼀个引脚上,称为共阴极连接;3.右下图的原理图,8个LED的阳极都连在⼀个引脚上,称为共阳极连接;
TX-1C开发板的连接⽅式是 共阴极连接;
4.左下⾓的 左边图⽚ ,定义了8个LED的名称;
5.左下⾓的 右边图⽚ ,定义了引脚的名称,与右图的引脚名称⼀⼀对应
假设数码管连接⽅式为 共阳极连接,观察可以发现,数码管中的 LED 的引脚引出,使⽤的是就近原则;
假设数码管连接⽅式为 共阴极连接,如果上数码管显⽰ 数字6 ?
1.要让数码管显⽰ 数字6,让要 LED-A、C、D、E、F、G亮起;
2.共阴极的公共端 要接地(给数据‘0’,或者是低电平);
3.阳极(称为位选端)根据LED的亮灭需求给 数据0或1(1亮、0灭) ,称为 段码(阳码) (1011 1110 即为段码);
如果 共阳极连接,共阳极端 要接到 VCC(⾼电平),阴极给 数据0或1 (1灭,0亮),称为 段码(阴码),和共阴极正好是相反关系;
共阳极连接→共阳极端接VCC并选中→阴极(位选端)传递(阴码)段码(1亮、0灭)→数码管显⽰共阴极连接→共阴极端接GND并选中→阳极(位选端)传递(阳码)段码(1灭、0亮)→数码管显⽰
四位⼀体数码管
开发板上即为 四位⼀体的数码管,且有两个,正好组成了 ⼋位数码管;
⽽TX-1C上 包含的是六位数码管,⽽⾮⼋位;1.四位数码管 也有 两种连接⽅式,即 共阴极连接 和 共阳极连接 ;{
Processing math: 100%2.四位数码管,(每位的公共端 单独引出来,位选端全部连在⼀起(所有A段连在⼀起、所有B段连在⼀起……),总共有12个引脚;
假设数码管连接⽅式为 共阴极连接,如何在 第三位 显⽰ 数字1 ?
1.给第三位的公共端 赋值 0(低电平),给其他位的公共端 赋值 1(⾼电平);
这样等同于 其他位的公共端(负极)接到了正极上,⽆论如何都亮不了;只有第三位能亮;
2.这样给 LED-B、C 的位选端 赋值 1,其他 位选端 赋值0
共阳极连接 即为 公共端 赋值 1(⾼电平)亮,其他以此类推;3.发现这样⼀个现象,数码管⽆法在同⼀时间显⽰多个数字,其在同⼀时刻下只能有⼀个显⽰,
只有⼀个数码管能被点亮,即使有多个被选中的数码管,显⽰的数字也是相同的;
这种共⽤引脚的现象,是为了减少控制数码管IO⼝;
(四位数码管有32个LED,如果都采⽤ 共阴极连接 的⽅式,也要32+1(公共端)=33个引脚;)
(采⽤这种链接,就只需要12个引脚即可控制四位数码管;)
如何让数码管多位显⽰不同数字(动态数码管显⽰)?
1.利⽤ ⼈眼视觉的暂留 和 数码管显⽰的余辉 的原理
先让第⼀位数码管显⽰1,然后很快地让第⼆位数码管显⽰2,再很快地让第三位数码管显⽰3,
让它不断地扫描,重复显⽰1、2、3的过程,这样三个数字就“同时”显⽰了;
原理分析
138译码器
1.观察到 原理图右图 与数码管有关的,有138译码器(74LS138)和74HC245两枚芯⽚;
TX-1C的原理图为左图,也有两个74HC573芯⽚与数码管有关;
芯⽚名称与功耗、电压、说明符号有关,具体内容不做分析;
2.如图,数码管连接⽅式为 共阴极连接,这样传输数据,就能让第三位显⽰ 数字1 了;
3.⽽上⾯的 LED1 ~ 8,其实接在了138译码器的输出端,138译码器正好可以实现让LED1 ~ 8输出 0或1;
LED1 ~ 8 对应了 TX-1C 六位数码管的SEG DS 1 ~ 6;
4.138译码器可将LED 1 ~ 8的⼋个端⼝ 转化为 由 3个端⼝ (P22、P23、P24)控制,⽽G1、G2A、G2B端⼝ 被 称为 使能端;
使能端 相当于 ⼀种开关,如果电平有效,它就可以⼯作;如果电平⽆效,它就不⼯作;
观察原理图发现,使能端是已经接好 VCC 和 GND 的,也就是说,其上电 其实就会⼯作TX-1C的74HC573也是同理,但其并未压缩 控制端⼝的数量;
5.138译码器也叫“38线译码器”,是由3个线到8个线,其中C是⾼位、A是低位,
CBA组成的数符合8进制,控制着Y0 ~ Y7 这8个端⼝;
6.所以,138译码器的作⽤就是⽤来选中某⼀位数码管的
74HC245
1.74HC245是⼀种 双向数据缓冲器,VDD、GND都可视为电源,OE为使能(其 接地 就⼯作);
2.DIR(direction),是⽅向的意思,它接到了VCC(⾼电平)上,将数据从左边输出到右边,从右边将数据读取回左边;
DIR若接到低电平上,会将数据从右边输出到左边,从左边将数据读取回右边;
3.单⽚机的⾼电平 驱动能⼒有限,其输出的最⼤电流不能太⼤;其低电平 驱动能⼒强;因此,LED模块才采⽤了 低电平点亮 的模式;
4.如果⽤⾼电平 直接点亮 数码管,电流会很⼩,灯会很暗;所以其加⼀个缓冲器,缓冲器可以提⾼ 其驱动能⼒,
如果直接将 数据 输出 给 数码管,数据就会被视为 驱动数据;现在增加了缓冲器,数据 就变成了 控制信号,
控制信号 只需要很微弱,缓冲器 就可以接收到,缓冲器再通过⾃⼰接到的电源,输出 数据 到引脚上,
这样控制的电流只需要⾮常⼩,就能驱动数码管 以⽐较亮的形式显⽰;
5.CC2电容 是⽤来 稳定电源的,叫电源滤波;
6.图右有 ⼀ 排阻,阻值为100R(即为100Ω),作⽤为 限流电阻 ,防⽌数码管的电流过⼤;
TX-1C既没有电容,也没有排阻;
原理总结
1.⽤ 138译码器 使 数码管 的某⼀位 被选中;
2.再给P0⼝⼀个 段码数据;
TX-1C虽然⽤P0⼝控制 段码输⼊,但也⽤P0⼝控制 位选;
需要先⽤ P2.6⼝和P2.7⼝ 控制 输⼊数据 是 段码 还是 位选;P2.6⼝控制 段码的输⼊;P2.7⼝控制 位选的输⼊;
例,给P2.6 数据1 (⾼电压)、给P2.7 数据 0 (低电压),就可以确定现在给数据是 段码 ;
1.由TX-1C的原理图可知,数码管内 LED灯 与 P0端⼝ 的顺序关系:
(1)LED的名称定义是通⽤⽆疑的;
(2)数码管本⾝的引脚名称不重要,重要的是 LED与哪个 P0 的 引脚 相连;
2.由TX-1C的原理图可知, P0.0引脚 控制 数码管的最左位,P0.5引脚控制 数码管的最右位,
剩余引脚是没有控制 数码管 位选 的作⽤的,哪个P0 的 引脚 控制 六位数码管的 哪位 很重要;
代码实现
静态数码管显⽰(让数码管第三位显⽰3).c
#include
sbit D=P2^6; //段码⼝
sbit W=P2^7; //位选⼝
void main(){
D=0;
W=1;
P0=0xFB;//1111 1011
W=0;
D=1;
P0=0x4F;//0100 1111
while(1);
}
下⾯写出了⼀个通⽤函数,可以让数码管在 第⼏个位置 显⽰ 哪个数
#include
#define uchar unsigned char
sbit D=P2^6;
sbit W=P2^7;
void NixieTube(uchar wei,uchar duan){ //NixieTube是数码管的英⽂
uchar WEI,DUAN; //(Nixie是⼥⽔妖的意思)
D=0;
W=1;
switch(wei){ //位选部分
case 1:WEI=0xFE; break; case 2:WEI=0xFD; break;
case 3:WEI=0xFB; break;
case 4:WEI=0xF7; break;
case 5:WEI=0xEF; break;
case 6:WEI=0xDF; break;
}
P0=WEI;
W=0;
D=1;
switch(duan){ //段码部分
case 0:DUAN=0x3F; break;
case 1:DUAN=0x06; break;
case 2:DUAN=0x5B; break;
case 3:DUAN=0x4F; break;
case 4:DUAN=0x66; break;
case 5:DUAN=0x6D; break;
case 6:DUAN=0x7D; break;
case 7:DUAN=0x07; break;
case 8:DUAN=0x7F; break;
case 9:DUAN=0x6F; break;
case 10:DUAN=0x77; break; //A
case 11:DUAN=0x7F; break; //B
case 12:DUAN=0x39; break; //C
case 13:DUAN=0x3F; break; //D
case 14:DUAN=0x79; break; //E
case 15:DUAN=0x71; break; //F
case 16:DUAN=0x80; break; //.
}
P0=DUAN;
}
void main(){
NixieTube(3,3);
while(1);
}
运⾏结果如下:
4-2 动态数码管显⽰
1.如果只是单纯让其显⽰完⼀个再显⽰⼀个,代码如下:
#include
#define uchar unsigned char
sbit D=P2^6;
sbit W=P2^7;
uchar Nixiewei[]={0,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};
uchar Nixiecode[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7F,0x39,0x3F,0x79,0x71,0x80};
//将两个switch改进为数组
void NixieTube(uchar wei,uchar duan){
D=0;
W=1;
P0=Nixiewei[wei];
W=0;
D=1;
P0=Nixiecode[duan];
}
void main(){
while(1){
NixieTube(1,1);
NixieTube(2,2);
NixieTube(3,3);
}
}
运⾏结果如下:
2.这是⼀个数码管的常见问题,称为 数码管的消影 ;
位选-->段选-->位选-->段选-->位选-->......