• 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亮),称为 段码(阴码),和共阴极正好是相反关系;

    \[\begin{cases} 共阳极连接 \to 共阳极端 接VCC 并选中 \to 阴极(位选端)传递(阴码)段码(1亮、0灭) \to 数码管显示 \\ 共阴极连接 \to 共阴极端 接GND 并选中 \to 阳极(位选端)传递(阳码)段码(1灭、0亮) \to 数码管显示 \end{cases} \]



    四位一体数码管

    开发板上即为 四位一体的数码管,且有两个,正好组成了 八位数码管;

    而TX-1C上 包含的是六位数码管,而非八位;

    1.四位数码管 也有 两种连接方式,即 共阴极连接共阳极连接

    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<reg51.h>
    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<reg51.h>
    #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<reg51.h>
    #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.这是一个数码管的常见问题,称为 数码管的消影

    位选-->段选-->位选-->段选-->位选-->......
    在这一位的段选 (输入段码)结束,进行下一位的位选时,很短的时间内,上一位的数据会串到下一位数据里面去;
    所以我们在 段选和位选之间 ,增加一个 P0 清零 的操作;



    动态数码管显示(数码管同时显示123).c

    #include<reg51.h>
    #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};
    void Delayms(unsigned int x){
    	unsigned int j;
    	for(;x>0;x--) for(j=110;j>0;j--);
    }
    void NixieTube(uchar wei,uchar duan){
    	D=0;
    	W=1;
    	P0=Nixiewei[wei];
    	W=0;
    	D=1;
    	P0=Nixiecode[duan];
    	Delayms(1); //让数码管 稳定显示,立刻清零会让数码管 显示较暗
            P0=0; //清零操作
    }
    void main(){
    	while(1){
    		NixieTube(1,1);
    		NixieTube(2,2);
    		NixieTube(3,3);
    	}
    }
    

    运行结果如下:




    相关知识

    1.在运行某些代码时,TX-1C的LED点阵模块会乱闪

    2.将左下角 DOT-OE旁的跳线帽 拔下来即可 断开LED点阵模块,

    3.拔下来的跳线帽不要乱丢,可以 只插一个脚放在原处,也可以妥善保管在其他地方

    上图即为拔下来的跳线帽


    1.此元件为电容
    2.104的数量规则与 第二节 所讲的电容是相同的,其单位是pF

    1000pF=1nF, 1000nF=1uF, 1000uF=1000mF, 1000mF=1F
    F 是一个很大的单位,正常电容都是uF、nF级别的;超级电容能达到1 ~ 2 F,其一般作为备用电池;

    3.TX-1C的原理图上,电容的量都是直接用单位标记好的。


    TM1640芯片:内部自带显存 扫描电路,单片机只需 通过两根通讯线,按照它规定的 通讯协议 告诉它显示什么即可;
    74HC595(移位寄存器)驱动数码管:通过 三根数据线和两根电源线 就可控制 八个数码管,可耗费单片机CPU时间,但可以很大地节省单片机的IO口;

  • 相关阅读:
    prototype常用函数
    SQL Left Join,用于在网站中显示相关联的内容
    .net中ajax实现检测用户名的完整测子
    绑定数据源后,Repeater在创建时触发的事件,以及如果在cs文件中调用某个字段的值
    sql2005 转换到 sql2000
    FCKeditor 2.6.3在ASP.NET中的配置方法
    怎样和老板谈绩效考核(3)
    If Tomorrow Never Comes
    为何会被拒(1)
    为何会被拒(2)
  • 原文地址:https://www.cnblogs.com/Potrem/p/51_4.html
Copyright © 2020-2023  润新知