51单片机之动态数码管显示

首先来看一下开发板上的电路原理图:

 

本开发板上使用的是,通过P22、P23、P24控制3-8译码器来对数码管进行位选,通过P0口经过573的驱动控制数码管的段选,通过P13控制573的使能端,为低电平时573才会有输出。

138译码器的真值表如下图G1,G2A,G2B都是选通脚,当G1,G2A,G2B为100的时候138译码器开始工作,A为最低位,B为中间位,C为最高位。CBA=000B时,Y0为1,其他口为0,CBA=001B时,Y1为1,其他口为0,CBA=010B时,Y2为1,其他口为0,CBA=011B时,Y3为1,其他口为0,CBA=100B时,Y4为1,其他口为0,CBA=101B时,Y5为1,其他口为0,CBA=110B时,Y6为1,其他口为0,CBA=111B时,Y7为1,其他口为0。

由于8个数码管是共阴的,所以当Y0~Y7中的一个为1,其反值为0,相应的数码管阴极置低,再将数码管的段选位置高,就可以显示相应的值。

 

 

     使用38译码器只能在同一个时刻让一个数码管显示,想要让8个数码管同时显示。这个时候就要用到动态显示技术。

      动态显示是多个数码管,交替显示,利用人的视觉暂停作用使人看到多个数码管同时显示的效果。就像我们看的电影是有一帧一帧的画面显示的,当速度够快的时候我们看到它就是动态的。当我们显示数码管的速度够快的时候,也就可以看到它们是同时显示了。

  程序示例如下:

#include "reg52.h"

   typedef unsigned char u8;
   typedef unsigned int u16;

   sbit LSA = P2^2;
   sbit LSB = P2^3;
   sbit LSC = P2^4;


   u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,
                    0x66, 0x6d, 0x7d, 0x07,
					0x7f, 0x6f, 0x77, 0x7c,
					0x39, 0x5e, 0x79, 0x71}; //0~F数码

 

   void delay(u16 i) //延时函数
   {
    while(i--);
   }
	
	void DigDisplay() //数码管显示函数
	{
	u8 i;
	for(i=0;i<8;i++)
	{ 
	  switch(i)
	  {
		case 0:
	  		LSC = 0;LSB = 0;LSA = 0;break; //显示第1个数码管
		case 1:
	  		LSC = 0;LSB = 0;LSA = 1;break; //显示第2个数码管
		case 2:
	 		LSC = 0;LSB = 1;LSA = 0;break; //显示第3个数码管
		case 3:
			LSC = 0;LSB = 1;LSA = 1;break; //显示第4个数码管
		case 4:
			LSC = 1;LSB = 0;LSA = 0;break; //显示第5个数码管
		case 5:
	  		LSC = 1;LSB = 0;LSA = 1;break; //显示第6个数码管
		case 6:
	  		LSC = 1;LSB = 1;LSA = 0;break; //显示第7个数码管
		case 7:
	 		LSC = 1;LSB = 1;LSA = 1;break; //显示第8个数码管
	  }
	  P0 = smgduan[i+1];//显示1~8的数值
	  delay(100); //延时,造成视觉暂留现象
	  P0 = 0x00; //数码管消隐
	}
	}	

   void main()
   {
   while(1)
   {
   DigDisplay();
   }
   }

 

    在上例代码中使用了C51中的code关键字。

u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,

                    0x66, 0x6d, 0x7d, 0x07,

                           0x7f, 0x6f, 0x77, 0x7c,

                        0x39, 0x5e, 0x79, 0x71};

       这称之为编码定义,编码定义方法与C语言中的数组定义方法非常相似,不同的地方就是在数组类型后面多了一个code关键字,code即表示编码的意思。需要注意的是,单片机C语言中定义数组时是占用内存空间的,而定义编码时是直接分配到程序空间(ROM)中,编译后编码占用的是程序存储空间,而非内存空间(RAM)。

     本次实验使用的是共阴极数码管,在静态数码管试验中使用的是共阳极数码管,那在试验过程中如果不清楚数码管是共阴极或者共阳极,可以使用万用表来确定数码管是共阴极还是共阳极的。

    

     对数字万用表来说,红色表笔连接表内部电池正极,黑色表笔连接表内部电池负极,当把数字万用表置于二极管档时,其两表笔间开路电压约为1.5V,把两表笔正确加在发光二极管两端时,可以点亮发光二极管。

     如下图所示,将数字万用表置于二极管挡,红表笔接在①脚,然后用黑表笔去接触其他各引脚,假设只有当接触到⑨脚时,数码管的a段发光,而接触其余引脚时则不发光。由此可知,被测数码管为共阴极结构类型,⑨脚是公共阴极,①脚则是数码管的a段.接下来再检测各段引脚,仍使用数字万用表二极管档,将黑表笔固定接在⑨脚,用红表笔依次接触②、③、④、⑤、⑥、⑦、⑧、⑩引脚时,数码管的其他段先后分别发光,据此便可绘出该数码管的内部结构和引脚排列图。

           

      检测中,若被测数码管为共阳极类型,则需将红、黑表笔对调才能测出上述结果,在判别结构类型时,操作时要灵活掌握,反复试验,直到找出公共端为止,大家只要懂得了原理,检测出各个引脚便不在是问题了。

### 关于3位数码管的用途与购买 #### 数码管概述 数码管是一种常见的显示设备,广泛应用于各种电子产品中。7段数码管由七个发光二极管(LED)组成,可以显示0到9之间的数字以及一些字母字符。对于3位数码管而言,这意味着能够同时展示三位数的信息。 #### 主要应用领域 - **计数器**:用于测量时间、次数或其他数量单位,在工业控制面板上非常普遍。 - **温度显示器**:实时监控环境温度变化情况,适用于家庭取暖系统或空调装置。 - **电压/电流表头**:电力仪表中的重要组成部分之一,用来指示电源参数。 - **时钟和闹钟**:提供精确的时间读取功能,增强用户体验感。 - **消费类电子产品**:如MP3播放器、计算器等小型便携式设备上的数据显示部分[^1]。 #### 购买建议 当考虑采购此类组件时,请注意以下几个方面: - **尺寸规格**:确认所需的具体大小,包括高度、宽度及厚度,确保其适合目标产品的安装空间。 - **颜色选项**:红色是最常见也是最便宜的选择;绿色次之;蓝色则相对昂贵些。还有其他多种色彩可供挑选,具体取决于设计需求和个人喜好。 - **驱动方式**:静态扫描型易于编程实现但成本较高;动态扫描虽然复杂度增加却能有效降低成本并减少功耗。 - **接口形式**:共阳极接法意味着所有LED阴极端连在一起接地线;而共阴极则是正极汇合供电源端口。选择合适的类型以便更好地匹配现有的硬件平台。 - **品牌质量**:优先考虑知名品牌的产品,这类供应商通常具有更严格的质量把控流程和服务保障体系[^2]。 ```python # Python代码示例:模拟点亮一个3位数码管显示特定数值 def display_number_on_3_digit_seven_segment(number): segments = [ 'abcdef', # 0 'bc', # 1 'abdeg', # 2 'abcdg', # 3 'bcfg', # 4 'acdfg', # 5 'acfgh', # 6 'abc', # 7 'abcdefgh' # 8 'abcdfg'] # 9 digits = str(number).zfill(3)[-3:] # 取最后三个字符作为显示内容 result = [] for d in digits: segment = segments[int(d)] result.append(segment) return '-'.join(result) print(display_number_on_3_digit_seven_segment(123)) ```
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WangLanguager

您的鼓励是对我最大的支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值