51单片机的数码管是一种常用的数字显示设备,用于在嵌入式系统中显示数字和一些特定的符号。数码管通常由七段LED组成,每个LED段可以显示数字0到9以及一些字母和符号。通过控制每个LED段的亮灭,可以显示不同的数字和字符。
在51单片机中,数码管通常连接到GPIO(通用输入/输出)引脚上,通过控制这些引脚的电平状态来控制数码管的显示。通过适当的硬件连接和软件编程,可以实现数码管的各种显示效果。
在软件编程中,可以通过扫描显示的方式来控制数码管的显示,即逐个显示每个数码管,并按照一定的时间间隔刷新显示内容,从而呈现出连续的数字或字符。此外,还可以通过PWM(脉冲宽度调制)技术来调节数码管的亮度,实现不同亮度的显示效果。
数码管在嵌入式系统中广泛应用于时钟、计数器、测量仪表、温度计等各种场合,它们提供了一种直观、便捷且低功耗的数字显示方式。因此,51单片机的数码管模块是嵌入式系统中常见的输出设备之一。
单个数码管共阴极数码管需要给正集高电平1点亮(目前我们在使用的是共阴极的数码管)
如何区分共阴极数码管和共阳极数码管:共阴极数码管的负极是接在CND(也就是地上的),共阳极数码管的正极是接在5v的电源上的,要想在单片机中驱动共阴极数码管工作需要给共阴极的数码管一个高电平,而共阳极的数码管则和共阴极数码管相反
四位数码管
锁存器:用于数据的锁存通常和数码管配合使用实现数据的锁存
锁存芯片:le表示的是选通端,如果选通端也就是LE为高电频那么输入端D无论输出什么输出端都是什么如果LE为低电频那么输入端都是锁存到上面的值
上拉电阻的作用:开漏状态表示的是可以输出低电平可以输出高电平
eg1:数码管的静态显示
#include <REGX52.H>
#include <INTRINS.H>
sbit wei = P2^7; // 位选择器:根据自己的单片机板定义,不同的单片机产品管脚可能是不同的
sbit duan = P2^6; // 段选择器
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x77, //"A"
0x7C, //"B"
0x39, //"C"
0x5E, //"D"
0x79, //"E"
0x71, //"F"
0x76, //"H"
0x38, //"L"
0x37, //"n"
0x3E, //"u"
0x73, //"P"
0x5C, //"o"
0x40, //"-"
0x00, //熄灭
0x00 //自定义
};
void Delay(unsigned int xms)
{
unsigned char i, j;
while(xms){
i = 2;
j = 239;
do{
while(--j);
}while(--i);
xms--;
}
}
void main(){
// 打开锁存器
duan = 1;
// 段选控制数码管显示什么值
P0 = leddata[8];
// 关闭锁存器
duan = 0;
// 延迟函数
Delay(5);
// 共阴极数码管加0的时候未选通
// 打开位选择器
wei = 1;
// 数码管全部点亮
P0 = 0;
// 关闭段选择器
wei = 0;
while(1){
}
}
eg2:数码管的静态显示让数码管在第一位显示1:延时函数编写在头文件中
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char
sbit beep = P2^3;
sbit wei = P2^7; // 位选择器
sbit duan = P2^6; // 段选择器
void main(){
// 打开位锁存器
wei = 1;
P0 = 0xfe; // 高电平的16进制位0x06
//关闭位锁存器
wei = 0;
Delay(500);
// 打开段选择器
duan = 1;
P0 =0x06;
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
while(1){
}
}
eg3:数码管显示0-9循环显示间隔500毫秒
#include <REGX52.H>
#include <INTRINS.H>
#include "Util.h"
// 初始化数组
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00 //自定义
};
void main(){
// 使用for循环遍历数组
int i = 0;
// 计算数组的长度
int len = sizeof(leddata)/sizeof(leddata[0]);
for(i = 0; i< len; i++){
// 打开断选择器
duan = 1;
P0 = leddata[i];
duan = 0;
Delay(500);
// 打开位选择器
wei = 1;
P0 = 0;
wei = 0;
}
}
eg4:数码管的动态显示
#include <REGX52.H>
#include <INTRINS.H>
#include "Util.h"
// 初始化数组
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00 //自定义
};
// 创建位选择数组
unsigned char weiOption[] = {
0x7F, 01111111
0xBF,
0xDF,
0xEF,
0xF7,
0xFB,
0xFD,
0xFE,
0x00
};
void main(){
int i = 0;
int j = 0;
int lenght = sizeof(leddata)/sizeof(leddata[0]);
int weiNum = sizeof(weiOption)/sizeof(weiOption[0]);
while(i < lenght && j < weiNum){
wei = 1;
P0 = weiOption[j]; // 点亮第一个数码管
wei = 0;
Delay(1000);
// 锁存
duan = 1;
P0 = leddata[i];
duan = 0;
j++;
i++;
}
}
eg5:数码管的动态显示:1-4
#include <REGX52.H>
#include <INTRINS.H>
#include "Util.h"
// 初始化数组
unsigned char leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00 //自定义
};
void main(){
// 第一位数码管
wei = 1;
P0 = 0xfe;
wei = 0;
duan = 1;
P0 = leddata[1];
duan = 0;
Delay(500);
// 第二位数码管
wei = 1;
P0 = 0xfd;
wei = 0;
duan = 1;
P0 = leddata[2];
duan = 0;
Delay(500);
// 第三位数码管
wei = 1;
P0 = 0xfb;
wei = 0;
duan = 1;
P0 = leddata[3];
duan = 0;
Delay(500);
// 第四位数码管
wei = 1;
P0 = 0xf7;// 11110111
wei = 0;
duan = 1;
P0 = leddata[4];
duan = 0;
Delay(500);
}
eg6:循环显示1 , ,3
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char
sbit beep = P2^3;
sbit wei = P2^7; // 位选择器
sbit duan = P2^6; // 段选择器
void main(){
while(1){
// 清除断码
P0 = 0xff;
// 打开位锁存器
wei = 1;
P0 = 0xfe; // 高电平的16进制位0x06
//关闭位锁存器
wei = 0;
// 打开段选择器
duan = 1;
P0 =0x06;
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
// 清除断码
P0 = 0xff;
// 打开位锁存器
wei = 1;
P0 = 0xfd; // 高电平的16进制位0x06
//关闭位锁存器
wei = 0;
// 打开段选择器
duan = 1;
// 显示数字二
P0 = 0x5B;
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
// 清除断码
P0 = 0xff;
// 打开位锁存器
wei = 1;
P0 = 0xFB; // 1111 1011高电平的16进制位0x06
//关闭位锁存器
wei = 0;
// 打开段选择器
duan = 1;
// 显示数字三
P0 = 0x4F;
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
}
}
eg6:数码管动态显示效果
#include <REGX52.H>
#include "main.h"
#include <INTRINS.H>
#define unit unsigned int
#define uchar unsigned char
sbit beep = P2^3;
sbit wei = P2^7; // 位选择器
sbit duan = P2^6; // 段选择器
//数组的定义
unsigned char code leddata[]={
0x3F, //"0"
0x06, //"1"
0x5B, //"2"
0x4F, //"3"
0x66, //"4"
0x6D, //"5"
0x7D, //"6"
0x07, //"7"
0x7F, //"8"
0x6F, //"9"
0x00 //自定义
};
// 功能函数
void diaplay(uchar i){
uchar bai,shi,ge;
// 计算个位10位和百位
bai = i / 100; // 211 /100 = 2
shi = i % 100 / 10; // 211 % 100 / 10 = 1;
ge = i % 10; // 211 % 10
// 清除断码
P0 = 0xff;
// 打开位锁存器
wei = 1;
P0 = 0xfe; // 高电平的16进制位0x06
//关闭位锁存器
wei = 0;
// 打开段选择器
duan = 1;
P0 =leddata[bai];
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
// 清除断码
P0 = 0xff;
// 打开位锁存器
wei = 1;
P0 = 0xfd; // 高电平的16进制位0x06
//关闭位锁存器
wei = 0;
// 打开段选择器
duan = 1;
// 显示数字二
P0 = leddata[shi];
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
// 清除断码
P0 = 0xff;
// 打开位锁存器
wei = 1;
P0 = 0xFB; // 1111 1011高电平的16进制位0x06
//关闭位锁存器
wei = 0;
// 打开段选择器
duan = 1;
// 显示数字三
P0 = leddata[ge];
// 关闭段选择器
duan = 0;
// 延迟函数500毫秒
Delay(500);
// while循环一直循环条件为true
}
void main(){
while(1){
diaplay(233);
}
}