8段数码管实验

这篇博客介绍了八段数码管的基本结构和工作原理,包括共阳极和共阴极的区别,以及在实际应用中如何连接限流电阻。通过实验,展示了如何使用八段数码管显示数字1到8,并提供了程序源代码示例,实现了数码管的循环显示功能。

认识数码管
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元(多一个小数点显示),本实验所使用的是八段数码管。按发光二极管单元连接方式分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管。共阳数码管在应用时应将公共极COM 接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮。当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管。共阴数码管在应用时应将公共极COM 接到地线GND 上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮。当某一字段的阳极为低电平时,相应字段就不亮。
数码管的每一段是由发光二极管组成,所以在使用时跟发光二极管一样,也要连接限流电阻,否则电流过大会烧毁发光二极管的。本实验用的是共阴极的数码管,共阴数码管在应用时应将公共极接到GND,当某一字段发光二极管的阳极为低电平时,相应字段就点熄灭。当某一字段的阳极为高电平时,相应字段就点亮。介绍完原理,
在这里插入图片描述
在这里插入图片描述
我们开始准备实验用元器件。
八段数码管1
220Ω直插电阻
8
面包板1 面包板跳线1 扎
我们参考实物连接图按原理图连接好电路。
在这里插入图片描述
在这里插入图片描述
数码管共有七段显示数字的段,还有一个显示小数点的段。当让数码管显示数字时,只要将相应的段点亮即可。例如:让数码管显示数字1,则将b、c 段点亮即可。将每个数字写成一个子程序。在主程序中每隔2s 显示一个数字,让数码管循环显示1~8 数字。每一个数字显示的时间由延时时间来决定,时间设置的大些,显示的时间就长些,时间设置的小些,显示的时间就短。
参考程序源代码:

//设置控制各段的数字IO 脚
int a=7;//定义数字接口7 连接a 段数码管
int b=6;// 定义数字接口6 连接b 段数码管
int c=5;// 定义数字接口5 连接c 段数码管
int d=10;// 定义数字接口10 连接d 段数码管
int e=11;// 定义数字接口11 连接e 段数码管
int f=8;// 定义数字接口8 连接f 段数码管
int g=9;// 定义数字接口9 连接g 段数码管
int dp=4;// 定义数字接口4 连接dp 段数码管
void digital_1(void) //显示数字1
{
unsigned char j;
digitalWrite(c,HIGH);//给数字接口5 引脚高电平,点亮c 段
digitalWrite(b,HIGH);//点亮b 段
for(j=7;j<=11;j++)//熄灭其余段
digitalWrite(j,LOW);
digitalWrite(dp,LOW);//熄灭小数点DP 段
}
void digital_2(void) //显示数字2
{
unsigned char j;
digitalWrite(b,HIGH);
digitalWrite(a,HIGH);
for(j=9;j<=11;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
digitalWrite(c,LOW);
digitalWrite(f,LOW);
}
void digital_3(void) //显示数字3
{
unsigned char j;
digitalWrite(g,HIGH);
digitalWrite(d,HIGH);
for(j=5;j<=7;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
digitalWrite(f,LOW);
digitalWrite(e,LOW);
}
void digital_4(void) //显示数字4
{
digitalWrite(c,HIGH);
digitalWrite(b,HIGH);
digitalWrite(f,HIGH);
digitalWrite(g,HIGH);
digitalWrite(dp,LOW);
digitalWrite(a,LOW);
digitalWrite(e,LOW);
digitalWrite(d,LOW);
}
void digital_5(void) //显示数字5
{
unsigned char j;
for(j=7;j<=9;j++)
digitalWrite(j,HIGH);
digitalWrite(c,HIGH);
digitalWrite(d,HIGH);
digitalWrite(dp,LOW);
digitalWrite(b,LOW);
digitalWrite(e,LOW);
}
void digital_6(void) //显示数字6
{
unsigned char j;
for(j=7;j<=11;j++)
digitalWrite(j,HIGH);
digitalWrite(c,HIGH);
digitalWrite(dp,LOW);
digitalWrite(b,LOW);
}
void digital_7(void) //显示数字7
{
unsigned char j;
for(j=5;j<=7;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
for(j=8;j<=11;j++)
digitalWrite(j,LOW);
}
void digital_8(void) //显示数字8
{
unsigned char j;
for(j=5;j<=11;j++)
digitalWrite(j,HIGH);
digitalWrite(dp,LOW);
}
void digital_9(void)//显示数字9
{
  unsigned char j;
  
  for(j=5;j<=10;j++)
  {
    digitalWrite(j,HIGH);
    digitalWrite(dp,LOW);
    digitalWrite(e,LOW);
  }
}
void digital_0(void)//显示数字0
{
  unsigned char j;
  digitalWrite(d,HIGH);
  digitalWrite(e,HIGH);
  for(j=5;j<=8;j++)
  {
    digitalWrite(j,HIGH);
    digitalWrite(dp,LOW);
    digitalWrite(g,LOW);
  }
}
void digital_point(void)//显示数字.
{
  unsigned char j;
  for(j=5;j<=11;j++)
  {
    digitalWrite(j,LOW);
    digitalWrite(dp,HIGH);
  }
void setup()
{
int i;//定义变量
for(i=4;i<=11;i++)
pinMode(i,OUTPUT);//设置4~11 引脚为输出模式
}
void loop()
{
while(1)
{
digital_1();//显示数字1
delay(2000);//延时2s
digital_2();//显示数字2
delay(1000); //延时1s
digital_3();//显示数字3
delay(1000); //延时1s
digital_4();//显示数字4
delay(1000); //延时1s
digital_5();//显示数字5
delay(1000); //延时1s
digital_6();//显示数字6
delay(1000); //延时1s
digital_7();//显示数字7
delay(1000); //延时1s
digital_8();//显示数字8
delay(1000); //延时1s
  digital_9();//显示数字9
  delay(500);//延时0.5秒
  digital_0();//显示数字0
  delay(500);//延时0.5秒
  digital_point();//显示右下角的点
  delay(500);//延时0.5秒
}
}

在setup()前面定义了一系列的数字显示子程序,这些子程序的定义可以方便在loop()中使用,使用时只需将子程序的名写上即可。

### 8数码管显示实验原理 8数码管是一种常见的电子显示屏,通常用于显示数字和部分字符。它由八个发光二极管组成,分别标记为 a、b、c、d、e、f、g 和 dp(小数点)。通过控制这八个的通断状态,可以形成不同的数字或符号。 #### 动态扫描显示原理 动态扫描是实现多位数码管显示的核心技术之一。其基本思想是对多个数码管分时点亮,在人的视觉暂留效应下形成连续显示的效果。具体来说: - **位选信号**:决定哪个数码管被激活。 - **选信号**:决定该数码管应显示的具体内容。 每次只点亮一个数码管,并快速切换至下一个,从而让人眼感知不到闪烁现象[^1]。 --- ### C语言代码实现 以下是基于单片机(如51系列)的一个简单例子来说明如何利用C语言编程完成8数码管的静态与动态显示功能: ```c #include <reg52.h> // 定义共阴极数码管编码表 (支持0~9以及小数点) unsigned char code NixieTable[] = { 0x3F, // '0' 0x06, // '1' 0x5B, // '2' 0x4F, // '3' 0x66, // '4' 0x6D, // '5' 0x7D, // '6' 0x07, // '7' 0x7F, // '8' 0x6F // '9' }; sbit DIGIT1 = P2^0; // 第一位数码管使能端 sbit DIGIT2 = P2^1; // 第二位数码管使能端 sbit DIGIT3 = P2^2; // 第三位数码管使能端 sbit DIGIT4 = P2^3; // 第四位数码管使能端 void delay(unsigned int time) { unsigned int i; for(i = 0; i < time; i++); } void display_digit(unsigned char position, unsigned char number){ switch(position){ // 设置对应的位选线 case 1: DIGIT1 = 0; DIGIT2 = 1; DIGIT3 = 1; DIGIT4 = 1; break; case 2: DIGIT1 = 1; DIGIT2 = 0; DIGIT3 = 1; DIGIT4 = 1; break; case 3: DIGIT1 = 1; DIGIT2 = 1; DIGIT3 = 0; DIGIT4 = 1; break; case 4: DIGIT1 = 1; DIGIT2 = 1; DIGIT3 = 1; DIGIT4 = 0; break; } P0 = NixieTable[number]; // 输出码到P0口 delay(5); // 延时一时间保持亮度均匀 } ``` 此程序片展示了如何针对不同位置上的数码管设置相应的数值。实际应用中还需要加入循环逻辑以便于处理更多数据源输入情况下的轮询机制[^4]。 --- ### 注意事项 当设计硬件连接方案时需要注意以下几点: - 确认所使用的数码管类型(共阳还是共阴),因为它们决定了高低电平代表的意义相反; - 如果直接驱动能力不足的话可能需要用到额外功率放大器件比如三极管阵列芯片等来进行增强驱动电流的能力; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值