先不解释静态和动态的区别,看完就明白了(主要是我的菜,解释不清楚)。
单片机上没有静态数码管模块,虽然没有,但仍然可以 使用动态数码管电路中的一个来学习静态数码管显示。
数码管简介:
数码管51单片机上的数码管,通俗一点讲就是多个led组装在一起,照亮和组装数字管led根据发光二极管单元的连接方式,可分为共阳极数码管和共阴极数码管。
共阳数码管是指将所有发光二极管的阳极连接在一起形成公共阳极(COM)在应用数码管和共阳数码管时,应使用公共极端 COM 接到 5V,当一个字段发光二极管的阴极低电时,相应的字段会点亮,反之亦然。
共阴数码管是指将所有发光二极管的阴极连接在一起形成公共阴极(COM)在应用数字管和共阴数字管时,应使用公共极端COM 接到地线GND 上,当某个字段发光时 二极管的阳极为高电平时,相应字段就点亮,反之就不亮。
我的单片机是共阴数码管,原理图如下:
数字管驱动芯片and译码器:
因为共阴数码管靠单片机 IO口输出电流点亮,但单片机 I/O口难以输出稳定、大的电流,因此数字管与单片机连接时需要增加驱动电路。可采用拉电阻法或专用数字管驱动芯片,如 74HC573、74HC245等,输出电流大, 电路接口简单
我的译码器是74HC138.(译码器有点脑壳,只需了解原理即可)。
静态数码管显示:
因此,如果您想显示单个数字管,您只需要字段即可对应led点亮。
例如,显示0,就是abcdef亮,g和Dp不亮,Dp是最高位,a二进制是0011 十六进制0111x3f。本原理可推出常用字符段选,代码表如下:
不研究138译码器的原理,直接编写代码,点亮左数第二个数字管(LED7),那么138译码器的配置:C=1,B=1,A=0。(C是高位,110进制转换是6,0123456,第7个数)用这种方法控制哪个显示,有没有巧妙?
#include<reg52.h> typedef unsigned char u8; sbit K1=P2^2; sbit K2=P2^3; sbit K3=P2^4; u8 code number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //ram资源宝贵 ,code它的功能是告诉单片机存储我定义的数据ROM(程序存储区),写入后不能更改 //这个code可要可不要 void main() { K3=1; K2=1; K1=0; //LED7显示 while(1) { P0=number[1]; //显示1 } }
动态数码管显示:
上面显示的静态数码管使用了138译码器以外的8个I/O如果你想全部显示8个,你需要64个I/O口,单片机根本没有那么多资源。
因此,使用138译码器实现数码管的动态刷新显示,switch-case是核心。
#include<reg52.h> typedef unsigned char u8; sbit K1=P2^2; sbit K2=P2^3; sbit K3=P2^4; u8 code number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; void delay(u8 t) { while(t--); } void dtxs(u8 i,x) { switch(i) { case 1:K3=0;K2=0;K1=0;break; case 2:K3=0;K2=0;K1=1;break; case 3:K3=0;K2=1;K1=0;break; case 4:K3=0;K2=1;K1=1;break; case 5:K3=1;K2=0;K1=0;break; case 6:K3=1;K2=0;K1=1;break; case 7:K3=1;K2=1;K1=0;break; case 8:K3=1;K2=1;K1=1;break; } P0=number[x]; delay(10); P0=0x00; } void main() { while(1) { dtxs(1,9); dtxs(2,8); ///单片机最后两个显示89 } }
孟新在路上,制作起来不容易。如有错误,请在评论区纠正。各位帅气逼人,美如天仙,颜值出众的看官点赞,求求求。(网上卑微求赞)