51单片机和数码管介绍:
51单片机是一种常见的微控制器,它有足够的I/O端口来驱动8位数码管。下面是一种实现方式 首先,我们需要将8位数码管(也叫8段数码管)连接到一个I/O端口。通常情况下,我们需要对8位数码管的每个段 (a-g和 dp)进行控制。这样,我们需要7个1/0端口来控制这8个段。
数码管的基本原理:
数码管是一种能够显示数字和部分宇母的显示器件 ,它由多个发光二极管组成,可以显示 0-9 的数宇。数码管按照结构可以分为共阳数码管和共阴数码管两种类型。共阳数码管的显示原理是通过控制各个发二极管的通断状态来显示不同的数字 ,而共阴数码管则是通过控制对应的极性来实现数字的显示。
51单片机连接数码管的实现步骤:
由于 51 单片机有多个通用I/O口,因此可以连接多个数码管。连接数 I 码管的步骤如下:
1)确定数码管的类型,共阴还是共阳
2)连接数码管的正极和负极到单片机的对应I/O口
3)编写程序控制 51 单片机的I/O口输出状态,以显示所需的数字
硬件连接:
在硬件连接中,8位数码管由8个发光二极管组成,共8位,每一位都有对应的引脚。其中,数码管的共阴极和共阳极是需要特别注意的部分。
•共阴极数码管:共阴极数码管是指将所有发光二极管的负极接到一起形成公共阴极,即所有发光二极管的负极都连接到一个公共端。在这种情況下,位选接的是高电平,要想正常显示通过控制低电平来控制段选。
•共阳极数码管:共阳极数码管是指将所有发光二极管的正极接到一起形成公共阳极,即所有发光二极管的正极都连接到一个公共端。在这种情況下,位选接的是低电平,要想正常显示通过控制高电平来控制段选。
软件编程:
在软件编程中,主要是通过控制位选和段选来控制数码管的显示。位选是用来控制要显示的位数码管,段选则是用来控制显示的内容。
•静态显示:静态显示的特点是每个数码管的段选必须接一个8位数据线来保持显示的字形码。当送入一次字形码后,显示字形可一直保持,直到送入新字形码为止。
• 动态显示:动态显示的特点是可以同时显示多位数码管,但是品示的内容必须相同。当多位数码管应用于某一系统时,它们的“位选”是可独立控制的,而“段选”是连接在一起的,我们可以通过位选信号控制哪几个数码管亮,而在同一时刻,位选选通的所有数码管上显示的数字始终都是一样的。
以上就是51单片机8位数码管显示的基本方法,你可以根据实际需求选择静态显示或者动态显示,也可以根据具体的显示内容来选择共阴极或共阳极的数码管。
注:在程序中,需要使用数码管驱动程序来控制数码管的显示。通常,数码管驱动程序包括初始化、显示数据和清屏等函数。在初始化函数中,需要设置数码管的工作模式、端口映射和显示模式等参数。在显示数据函数中,需要将显示数据转换为数码管可识别的格式,并将其写入到数码管的显示缓冲区中。在清屏函数中,需要清空数码管的显示缓冲区,以便显示下一组数据。
一、8位数码管的原理图:
通过原理图,我们可以知道,数码管和LED灯存在公用的线路。要使LED灯能亮,P2.3的引脚就要置1,但是P2.3引脚为1时,数码管是不能正常显示的,所以要使数码管正常显示,要对P2.3引脚置0。
同时P2.0、P2.1和P2.2引脚对数码管显示也很重要(位置选择),三个引1即的状态(0或1)对应的三位二进制数可以表示0~7(分别对应从左到右的数码管)。
与LED灯一样,只要通过对P0口赋不同的值就可以是示不同的字符。
二、多位数码管的驱动方式
如图,使用独立的驱动芯片驱动数码管
三、动态显示驱动方案选择
如何实现动态数码管?通过数码管电路图可以知道需要满足2个条件:
最后可以编译数字代码进去,现以12345678为例:(整体代码)
定义管脚:
#include "regx52.h"
#include "intrins.h"
unsigned char meg_code[10] =
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit HC_A0 = P2^2; //对应74HC138的A口
sbit HC_A1 = P2^3; //对应74HC138的B口
sbit HC_A2 = P2^4; //对应74HC138的C口
数码管位选择函数:
//n 需要选择导通的位,1表示LED1导通,2表示LED2导通,以此类推
void SMG_Select(unsigned char n)
{
switch(n)
{
case 1: //LED1导通(由原理图可知LED1和Y0连接,由真值表可知
A0、A1、A2都为L的时候,Y0为L)
HC_A0 = 0;
HC_A1 = 0;
HC_A2 = 0;
break;
case 2:
HC_A0 = 1;
HC_A1 = 0;
HC_A2 = 0;
break;
case 3:
HC_A0 = 0;
HC_A1 = 1;
HC_A2 = 0;
break;
case 4:
HC_A0 = 1;
HC_A1 = 1;
HC_A2 = 0;
break;
case 5:
HC_A0 = 0;
HC_A1 = 0;
HC_A2 = 1;
break;
case 6:
HC_A0 = 1;
HC_A1 = 0;
HC_A2 = 1;
break;
case 7:
HC_A0 = 0;
HC_A1 = 1;
HC_A2 = 1;
break;
case 8:
HC_A0 = 1;
HC_A1 = 1;
HC_A2 = 1;
break;
}
}
延时函数:
void Delay1_ms(unsigned int a) //@11.0592MHz
{
unsigned char i, j;
for(a;a>0;a--)
{
_nop_();
i = 2;
j = 199;
do
{
while (--j);
}
while (--i);
}
}
显示数字主函数:
void main()
{
while(1)
{
//显示数字“1”
SMG_Select(8); //选中LED8导通,其余的关闭
P0 = meg_code[1]; //传送数字“1”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“2”
SMG_Select(7); //选中LED7导通,其余的关闭
P0 = meg_code[2]; //传送数字“2”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“3”
SMG_Select(6); //选中LED6导通,其余的关闭
P0 = meg_code[3]; //传送数字“3”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“4”
SMG_Select(5); //选中LED5导通,其余的关闭
P0 = meg_code[4]; //传送数字“4”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“5”
SMG_Select(4); //选中LED4导通,其余的关闭
P0 = meg_code[5]; //传送数字“5”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“6”
SMG_Select(3); //选中LED3导通,其余的关闭
P0 = meg_code[6]; //传送数字“6”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“7”
SMG_Select(2); //选中LED2导通,其余的关闭
P0 = meg_code[7]; //传送数字“7”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
//显示数字“8”
SMG_Select(1); //选中LED1导通,其余的关闭
P0 = meg_code[8]; //传送数字“8”的字码
Delay1_ms(2); //延时2ms
P0 = 0x00; //关闭显示
}
}
以上是完整代码,如有问题可留言探讨,谢谢!