基于51单片机数码管显示
## 数码管显示原理
- 数码管(LED Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示,如图所示。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示);按能显示多少个“8”可分为1位、2位、3位、4位、5位、6位、7位等数码管。
- 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极的数码管,共阴数码管在应用时应将公共极接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
根据数码管共阴共阳连接,通过单片机给单片机I/O口送高低电平就可以控制数码管每一段的显示。
## 共阴级数码管编码
符号 | 编码 | 符号 | 编码 | 符号 | 编码 | 符号 | 编码 |
---|---|---|---|---|---|---|---|
0 | 0x3f | 4 | 0x66 | 8 | 0x7f | c | 0x39 |
1 | 0x06 | 5 | 0x6d | 9 | 0x6f | d | 0x5e |
2 | 0x5b | 6 | 0x7d | A | 0x77 | E | 0x79 |
3 | 0x4f | 7 | 0x07 | b | 0x7c | F | 0x71 |
一位数码管显示数字代码
#include <>
unsigned char code LED[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//数码管显示0-9数字编码,写成数组直接给I/O口送进数组元素就欧克
void main(){
P1=LED[1];//可以根据电路图所接单片机I/O口改变向数码管接口
}
当数码管多位一体时,它们内部的公共端是独立的,而负责显示什么数字的段线全部连接在一起, 独立的公共端可以控制多位 一体中的哪一 位数码管点亮,连接在-起的段线可以控制这个能点亮数码管亮什么数字,通常我们把公共端叫做“位选线”,连接在一起的段线叫做“段选线”,有了这两个线后,通过单片机及外部驱动电路,就可以控制任意的数码管显示任意的数字了。
一般单位数码管有10个引脚,二位数码管也是10个引脚,四位数码管是12个引脚,关于具体的引脚及段、位标号大家可以查询相关资料,最简单的办法是用数字万用表测量。 若没有数字万用表,也可用直流电源串接1k电阻后测量,将测量结果进行记录,通过统计便可绘制出引脚标号。
多位数码管显示需要用到段选与位选信号,也就是当你用到那一位数码管的时候,需要打开位选端,只有这样才可以向那一位传输数据,传输段选信号时还要打开段选段,这样才能可控的任意选择给哪一位数码管送入那一段数据;
多位数码管显示代码
#include <>
#define uint unsigned int
#define uchar unsigned char
void delay(uint x);
sbit wela = P2^7; //定义位选IO口
sbit dula = P2^6‘、//定义段选IO口
uchar code D[] = {0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};//0-9段选编码
uchar code W[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//I/O口位选编码
void main()
{
uint i;
for(i=0;i<8;i++)//i可以控制几位数码管
{
delay(500);
wela=1;
P0=W[i];
wela=0;
P0=0xff;//消隐防止数码管亮的不均衡
dula=1;
P0=D[i];
dula=0;
}
}
//延时函数 这里是软件代码空运行延时
void delay(uint x){
uint i,j;
for(i=0;i<x;i++){
for(j=0;j<110;j++);
}
}