详解51单片机静态数码管的原理及编程实现
1.数码管原理图
单个数码管有8个LED灯,通过输入电平点亮a~g可显示数字,以下为原理图:
数码管原理图分为共阴极与共阳极两种:
①共阴极:a~dp位于发光二极管的阳极(即高电平的一端)部分,左接GND端
②共阳极:a~dp位于发光二极管的阴极(即低电平的一端)部分,右接VCC电源
例如:点亮共阴极数码管显示数字1,对应输入二进制数为
a, b, c, d, | e, f, g , dp |
0 1 1 0 | 0 0 0 0 |
原理:a,e,f,g,dp输入为0时,由于0,1分别表示低电平、高电平,以a端为例:左右两边为低电平,二极管未接通,不发光。
同理:点亮共阳极数码管显示数字1,输入二进制为:1001 1111(0表示低电压,对应的管脚即为接通状态,二极管点亮)
二.代码部分讲解
void Nixie_tube(unsigned char location,Number)// 定义无符号char类型变量 location,Number
//location:数码管显示的位置,Number:数码管显示位置上对应的数字
{
switch(location) //选择数码管位数
{
case 1:P2_4=1,P2_3=1,P2_2=1;break;
case 2:P2_4=1,P2_3=1,P2_2=0;break;
case 3:P2_4=1,P2_3=0,P2_2=1;break;
case 4:P2_4=1,P2_3=0,P2_2=0;break;
case 5:P2_4=0,P2_3=1,P2_2=1;break;
case 6:P2_4=0,P2_3=1,P2_2=0;break;
case 7:P2_4=0,P2_3=0,P2_2=1;break;
case 8:P2_4=0,P2_3=0,P2_2=0;break;
}
P0=Nixie_Table[Number];
}
原理:
P22~P24控制LED1~LED8显示
P24 为高位 P23为中位 P22为低位
例如:P24 P23 P22
输入: 1 1 1 二进制转十进制为:7,表示Y7显示,Y7与LED8连通
即LED1 LED2 LED3 LED4 LED5 LED6 LED7 LED8对应的电平为
1 1 1 1 1 1 1 0
可以理解为:P24~P22输入3位二进制数可表示LED1~LED8的显示
原理为:输入3位二进制后转化为十进制即表示对应的LED显示位
unsigned char Nixie_Table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x71,0x00};
// 0 1 2 3 4 5 6 7 8 9 A B C D F 空
//unsigned char Nixie_Table[] 全局定义 Nixie_Table(数码管显示数字表)
由于单片机采用16进制存储格式,数码管显示位上数字显示用16位进制存储
如显示1:在单片机存储中格式为0x3f;
三.整体代码
#include <REGX52.H>
//定义函数体--达到单次编写可多次产生不同的值(显示数码管位数,显示数值)
//主体函数中包括定义函数体,填写数字返回到定义函数体中
unsigned char Nixie_Table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x71,0x00};
void Nixie_tube(unsigned char location,Number)// nixie_show_subfunction(数码管显示函数)
{
switch(location) //选择数码管位数
{
case 1:P2_4=1,P2_3=1,P2_2=1;break;
case 2:P2_4=1,P2_3=1,P2_2=0;break;
case 3:P2_4=1,P2_3=0,P2_2=1;break;
case 4:P2_4=1,P2_3=0,P2_2=0;break;
case 5:P2_4=0,P2_3=1,P2_2=1;break;
case 6:P2_4=0,P2_3=1,P2_2=0;break;
case 7:P2_4=0,P2_3=0,P2_2=1;break;
case 8:P2_4=0,P2_3=0,P2_2=0;break;
}
P0=Nixie_Table[Number];//显示数字
}
void main() //main 主函数
{
Nixie_tube(6,2);//调用函数Nixie_tube(数码管)6:表示第6个数码管显示数字
//2:表示第6个数码管上显示的数字为2
while(1)
{
}
}