‘壹’ 2位7段数码管怎么使用
1、2是公共端,控制位码,控制那个数码管亮(左右),如果是纤迟虚共阴的则接低电平,若为供阳的则相反。(这个可以用万用表的二极管档来判断,最好买的时候稳毁燃清楚),a-g、dp是控制断码,控制9个二极管的亮暗,可以直接接51的输出口(P0要加上拉电阻),如果是共阴的则接旦哪高电平来使数码管亮,若为供阳的则相反。用8位码控制,用16进制表示!二极管从最上面顺时针分别为a,b,c,d,e,f中间横线为g,点为dp。
‘贰’ 2位7段共阳数码管如何使用应如何和单片机进行连接。
嘿嘿 可以按照下面的图 进行连接
一个接在P0口、一个接在P2口上,分别为7段数码管提供段形,采用共阴极的数码管,数码管的3、8引脚都接地,即公地。送高电平可陪迟以点亮相应的各段掘桥。
为静态显示方式。
呵呵 满意判乱猛就选满意回答
‘叁’ 数码管显示方式及特点
数码管的显示方式有两种:静态显示和动态显示。
静卜郑态显示方式特点:所谓静态显示就是指无论是多少位数码管,同时处于显示状态。 当单片机系统中使用静态数码管显示时,需要在每一个数码管上添加一个锁存器,当需要某个数码管显示其他内容时,只需要修改与其相连的型档颂锁存器的值蠢举即可。
动态显示方式特点:所谓动态显示,是指无论在任何时刻只有一个数码管处于显示状态,每个数码管轮流显示。当数码管处于动态显示时,所有位选线分离,而每个数码管的各条段选线相连。
‘肆’ 数码管在PLC中如何使用
只需用一个共阴极七段数码管,每段接一个2.2K的颂渣电阻,电阻的另一端接PLC的一组输出口(如:Q1.0、Q1.1、。。。Q1.6),数码管的共阴极接PLC输出侧的地,这样,运行时,如使Q1.0=1,则Q1.0对应的那一段就友罩亮,如Q1.0=0,,则Q1.0对应的那一段就灭。记住每一个输出口对应数码管的段,编出数字由0到9输出口对应的输出状态的值,编程时,在显示送数前,先判断送出的数是几,再把这“几对应的状态值”送给输出野告悄口就可以是数码管显示“几”。S7-200有7段译码指令,用它就可省事多了。
‘伍’ 数码管怎么使用
数码管是嵌入式开发中比较常用的一个模块,本篇文章根据查阅的资料以及学习笔记整理成文,尽可能详尽的讲解常用数码管原理和使用方法。有不足和疏忽的地方,请不吝指正。
一、工作原理
数码管是一种半导体发光器件,其基本单元是发光雀游二极管。能显示4位数字的叫四位数码管,当然也有多位和只有一位的数码管,他们的电气原理相同。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
二、电气特性
单位数码管有十个管脚,其中有8根是用顷哗销来点亮a,b,c,d,e,f,dp 共8个发光二极管(原理中有介绍),3,8两个管脚为公共COM脚,它们相连通且作用相同,可接任意一根。为了更清楚介绍,贴图如下
共阴数码管脚位对应图
三、驱动方式
1、静态驱动也称直流驱动。静态驱动是指每个数码管的每一个段码都由一个单片机的I/O端口进行驱动,或者使用如BCD码二-十进制译码器译码进行驱动。静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O端口多,如驱动5个数码管静态显示则需要5×8=40根I/O端口来驱动,要知道一个89S51单片机可用的'I/O端口才32个呢:),实际应用时必须增加译码驱动器进行驱动,增加了硬件电路的复杂性。
2、数码管动态显示接口是单片机中应用最为广泛的一种显示方式之一,动态驱动是将所有数码管的8个显示笔划"a,b,c,d,e,f,g,dp"的同名端连在一起,另外为每个数码管的公共极COM增加位选通控制电路,位选通由各自独立的I/O线控制,当单片机输出字形码时,所有数码管都接收到相同的字形码,但究竟是那个数码管会显示出字形,取决于单片机对位选通COM端电路的控制,所以我们只要将需要显示的数码管的选通控制打开,该位就显示出字形,没有选通的数码管就不会亮。通过分时轮流控制各个数码管的的COM端,就使各个数码管轮流受控显示,这就是动态驱动。在轮流显示过程中,每位数码管的点亮时间为1~2ms,由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上各位数码管并非同时点亮,芦瞎但只要扫描的速度足够快,给人的印象就是一组稳定的显示数据,不会有闪烁感,动态显示的效果和静态显示是一样的,能够节省大量的I/O端口,而且功耗更低。
四、开发实例
下面讲解一下四位数码管的动态驱动显示,首先看一下接线引脚图如下。
接下来用51单片机设计目标:通过编写c语言程序经编译连接后下载到单片机中,使四位数码管依次显示1,2,3,4
#define uchar usigned char
#define uint usigned int
//位选控制端口
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
//数码管段选编码数组,分别为显示:1,2,3,4的编码
uchar code BianMa[] ={0x7,0xb,0xd,0xe};
//延时1ms函数(用于数码管动态刷新)
void Delay1ms(int time);
void main()
{
while(1)
{
p20 =0; //共阴极数码管低位选有效,表示已选中第一位数码管
P0 =BianMa[0];//通过I/O口P0向数码管送段选编码
Delay1ms(500);//第一位数码管显示0.5秒,然后换到第二位,依次下去,由于视觉停留和数码管余辉,所以感觉四位都在显示
p20 =1;
p21 =0; //第二位亮
P0 =BianMa[1];
Delay1ms(500);
p21 =1;
p22 =0; //第三位亮
P0 =BianMa[2];
Delay1ms(500);
p22 =1;
p23 =0; //第四位亮
P0 =BianMa[3];
Delay1ms(500);
p23 =1;
}
//延时函数体
void Delay1ms(int time
{
int i,j;
for(i =time;i>0;i--)
for(j =110;j>0;j--)
}
五、关于亮度和锁存器
一般来说静态驱动的亮度要高于动态驱动的亮度,但不影响使用。实际使用中为了达到更好的效果,会配合锁存器如74HC573一起使用,可以记忆先前状态数据直到有新数据覆盖。对做51单片机应用开发来说,相对LCD液晶,液晶模块编程更方便,样式更多样,但是其缺点亮度不够。这也恰恰是数码管的优势,如果做简单的计数显示,数码管是最好选择。
六、使用中注意事项
数码管的基本组成是发光二极管,因此其可以通过的电流只有几mA,接5V直流电源做测试的时候一定要串上一个几十K大小的电阻。否则,很容易烧掉,此外用万用表的测电阻档就可将其点亮,足以说明其电流之小。
‘陆’ 数码管——wiringPi接口的使用
我们先来看下数码管的实物图
数码管由四个引脚:CLK,DIO,VCC,GND
VCC接5V GND接GND CLK和DIO接GPIO。
实现原理: https://blog.csdn.net/q1241580040/article/details/45815245
数码管显示原理:https://www.cnblogs.com/yuwl26/p/3307337.html
数码管相对于之前的LED,按钮之类要复杂,想要了解详情的可以看以上两个链接。
我就简单的介绍下数码管原理:通过CLK DIO 两个引脚的高低电平变化来写入数据。
数码管接收到开始信号后 可以写入数据 接收到停止信号后结束写入。
数码管分两种:共阴极 和 共阳极
数码管上的每个数字都由七条短杠 和 一个小数点组成,共阴极的数码管 当短杠接收到高电平时会通电发光,供阳极则为低电平通电发光。
这样说不是很好理解 我就举个例子,比方说我们想让共阴极的数码管显示数字 5,那就要让afgcd 这五个短杠 为高电平1,那个abcdefgD(D表示小数点)为 10110110,这里的数据写入格式为 Dgfedcba ,即01101101,转换为十六进制为 0x6d
unsigned char code table[]={//共阴极0~f数码管编码
0x3f,0x06,0x5b,0x4f, //0~3
0x66,0x6d,0x7d,0x07, 衡胡 //4~7
0x7f,0x6f,0x77,0x7c, //8~b
0x39,0x5e,0x79,0x71 祥棚//c~f
};
除了显示数字字母 数码管还有一些固定的咐宴拦命令
0xc0~0xc3 表示数码管上四个数字的地址
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#define CLK 27
#define DIO 22
//共阴极0~f数码管编码
char segdata[]={
0x3f,0x06,0x5b,0x4f, //0~3
0x66,0x6d,0x7d,0x07, //4~7
0x7f,0x6f,0x77,0x7c, //8~b
0x39,0x5e,0x79,0x71, //c~f
0x00 //不显示
};
//共阴极0~9带小数点的数码管编码
char segdatadp[]={
0xbf,0x86,0xdb,
0xcf,0xe6,0xed,
0xfd,0x87,0xff,0xef
};
//初始化wiringPi 使用BCM编码
void tm1637_init()
{
if(-1==wiringPiSetupGpio())
{
exit(-1);
}
pinMode(CLK,OUTPUT);
pinMode(DIO,OUTPUT);
}
//当CLK高电平时,DIO由高变低则代表开始信号
void tm1637_start()
{
digitalWrite(CLK,1);
usleep(140);
digitalWrite(DIO,1);
usleep(140);
digitalWrite(DIO,0);
usleep(140);
digitalWrite(CLK,0);
usleep(140);
}
//当CLK高电平时,DIO由低变高则代表停止信号
void tm1637_stop()
{
digitalWrite(CLK,0);
usleep(140);
digitalWrite(DIO,0);
usleep(140);
digitalWrite(CLK,1);
usleep(140);
digitalWrite(DIO,1);
usleep(140);
}
void write_bit(char bit)
{
digitalWrite(CLK,0);
usleep(140);
if(bit){
digitalWrite(DIO,1);
}else{
digitalWrite(DIO,0);
}
usleep(140);
digitalWrite(CLK,1);
usleep(140);
}
void write_byte(char data)
{
char i = 0;
for(i=0;i<8;i++)
{
write_bit((data>>i)&0x01);
}
digitalWrite(CLK,0);
usleep(140);
digitalWrite(DIO,1);
usleep(140);
digitalWrite(CLK,1);
usleep(140);
pinMode(DIO,INPUT);
while(digitalRead(DIO));
pinMode(DIO,OUTPUT);
}
void write_command(char cmd)
{
tm1637_start();
write_byte(cmd);
tm1637_stop();
}
void write_data(char addr,char data)
{
tm1637_start();
write_byte(addr);
write_byte(data);
tm1637_stop();
}
void number_display(int h_shi,int h_ge,int m_shi,int m_ge)
{
write_command(0x40);//写数据
write_command(0x44);//固定地址
write_data(0xc0,segdata[h_shi]);//写入第一个数码管
write_data(0xc1,segdata[h_ge]);
write_data(0xc2,segdata[m_shi]);
write_data(0xc3,segdata[m_ge]);
write_command(0x88);//显示开
}
void time_display(int h_shi,int h_ge,int m_shi,int m_ge,int f_dp)
{
write_command(0x40);//写数据
write_command(0x44);//固定地址
write_data(0xc0,segdata[h_shi]);//写入第一个数码管
if(f_dp)
{
write_data(0xc1,segdata[h_ge]);
}else{
write_data(0xc1,segdatadp[h_ge]);
}
write_data(0xc2,segdata[m_shi]);
write_data(0xc3,segdata[m_ge]);
write_command(0x88);//显示开
}
//sigint信号处理函数 退出并关闭数码管
void handler(int signo)
{
number_display(16,16,16,16);
exit(-1);
}
int main()
{
char FLAGDP = 1;
signal(SIGINT,handler);
tm1637_init();
char i = 0;
#if 0
while(1)
{
for(i=0;i<10;i++)
{
number_display(i,i,i,i);
sleep(1);
}
}
#endif
while(1)
{
FLAGDP^=1;
time_t t = time(NULL);
struct tm* _mt = gmtime(&t);
int h_s=0,h_g=0,m_s=0,m_g=0;
h_s = (_mt->tm_hour+8)/10;//时区+8
h_g = (_mt->tm_hour+8)%10;
m_s = _mt->tm_min/10;
m_g = _mt->tm_min%10;
time_display(h_s,h_g,m_s,m_g,FLAGDP);
sleep(1);
}
return 0;
}