【51单片机】数码管的静态与动态显示(含消影)

这篇具有很好参考价值的文章主要介绍了【51单片机】数码管的静态与动态显示(含消影)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

数码管在现实生活里是非常常见的设备,例如【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言
这些数字的显示都是数码管的应用。

静态数码管:

器件介绍:

【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言
注意:数码管有共阴共阳的区分。
【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言
在自己设计电路时,应当选用一种数码管时需要选用相应的译码器(共阴配共阴,共阳同理)


数码管的使用:

数码管其实就是一段一段LED构成的,51单片机使用的是共阴数码管,即图中的上侧表示,其中的标号怎样理解呢?
【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言
3和8为一个端子引出去的两个引脚,都是接地,
其余引脚的虽然右图看似杂乱无章,实则有点就近原则的意思,一个引脚控制一段LED,从上侧左图就可以看出。


但是这是一个数码管,51单片基中的数码管是下图这样的
看着复杂,无非就是多了7个共阴端,这时我们就需要译码器来进行选择哪个管子亮,这个过程叫做位选
【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言
在学习数电时,会接触到译码器,其中最经典的就是138译码器

译码器的使用:

大概说一下它的功能,
使能端让译码器正常工作情况下(51单片机的译码器可以看到三个使能端已经达到此效果),我们通过输入端A B C来进行控制Y端子的输出,每次输出一位有效,有效的会输出0
正好符合我们共阴的配置,一次可以选择一个数码管的亮灭1【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言


缓冲器:

选择完管子,就轮到每个管子应该输出什么数字了,
这个过程叫做段选
回到这张图片,我们发现每个管子的数字是通过P0端来实现显示数字
74HC245的作用主要是缓冲,增加电流,让灯更亮,
电阻的作用是限流,防止烧坏
【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言

实现原理:

元器件的使用知道了,现在就可以操作了
现在梳理一下流程

  1. 通过译码器控制指定的管子亮灭
  2. 控制P0寄存器控制显示的数字

技巧:

在需要一个实现固定功能的代码情况下,可以将其封装成一个函数,使用时更方便,便捷

我们这里就选择将控制第几个灯亮,显示什么数字的功能封装成一个函数

注意:

赋值时应当注意译码器的高低位等器件的高低位,防止最后的结果不符合预期

#include <REGX52.H>
//延时函数
void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

//loc代表选择灯亮的位置,num代表你要显示的数字
void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		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;
	}
	//数字的显示通过数组,我们再控制LED灯时普遍喜欢用数组实现
	P0 = arr[num];
}

完整代码:

#include <REGX52.H>

void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		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 = arr[num];
}

void main()
{
	NixieTube(1, 1);
	
	while(1)
	{	
	}
}

动态数码管:

先来科普一下:

动态数码管不是动态的显示数字(表面理解),而是一次显示多个数字

有了以上的基础,动态数码管可谓是信手拈来
我们将封装好的函数放在while(1)循环中,在循环中放入你想控制的位置与数字

消影:

运行后发现会有重影的现象【51单片机】数码管的静态与动态显示(含消影),单片机,51单片机,嵌入式硬件,单片机,c语言
产生原因:
我们静态显示一个数码管时是位选–>段选,最后死循环完成的,
但是动态的显示的顺序是 位选 -->段选–>位选–>段选–>位选 这样循环,而问题就出现在段选–>位选这里,因单片机的速度非常快,导致上一次的段选与下一次的位选相结合,造成了重影

消影方法:
对封装好的函数进行一点改进,
现状态稳定1ms,在次状态开始前进行清0的操作

void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		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 = arr[num];
	Delay(1);
	P0 = 0x00;
}

完整代码:

#include <REGX52.H>

void Delay(unsigned char xms)		//@11.0592MHz
{
	unsigned char i, j;
	
	while(xms--)
	{
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

char arr[] = { 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F };

void NixieTube(unsigned char loc, num)
{
	switch(loc)
	{
		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 = arr[num];
	Delay(1);
	P0 = 0x00;
}

void main()
{
	while(1)
	{	
		NixieTube(1, 1);
		NixieTube(2, 2);
		NixieTube(3, 3);
	}
}

有不好的地方尽情留言文章来源地址https://www.toymoban.com/news/detail-804586.html

到了这里,关于【51单片机】数码管的静态与动态显示(含消影)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机控制数码管动态显示

    首先打开proteus,导入8位数码管和89c51。 然后如图连线,分清断码和位码, 断码就是一个数码管的7个LED灯。 位码:就是第几位显示,由于是共阴极,所以哪位接地就显示哪位。 下面通过改变位码的接线就可以看出不同的效果 下面就编写程序,从第1位到第8位显示从0到7的八

    2023年04月21日
    浏览(43)
  • 51单片机“独立按键”控制静态数码管———显示数字0-9

    (1).独立按键模块电路图可以清楚的看到,所有从引脚JP1出来的电流都会接到GND,且当所有按键按下时被执行链接GND。所以,当JP1引脚各端口----识别----到“电流为低电平为0时”,说明按键被按下,否则为高电平按键没有被按下。 ( 2).按键的原理其是需要我们单片机有检

    2024年02月11日
    浏览(46)
  • 51单片机动态数码管显示自己学号

    实验题目:使用51单片机实现动态数码管显示自己8位学号,例如20220018 在此原理图又分两种连接方式: 第一种是8位数码管接38译码器来减少端口使用。 第二种是,没有端口要求接好就可以那就是,把位选端接P3口,段选端接P0口,这样占用端口多,一般实验都是使用第一种接

    2024年02月13日
    浏览(56)
  • C51单片机-共阳极数码管循环显示数字0至9,共阴极数码管循环显示5201314(动态)

    keil uVision4界面: proteus仿真界面:

    2024年02月06日
    浏览(54)
  • 利用AT89C52单片机实现数码管的静态与动态显示

            资源work1和work2(完整工程文件在笔者本人主页的资源中,免费欢迎下载)分别完成下面两个任务:         1、单片机接矩阵键盘和2个静态数码管,自行设计硬件电路,利用汇编语言,要求将按键值(0~15)在数码管显示。         主要代码: ……      

    2024年02月02日
    浏览(46)
  • 51单片机数码管

    51单片机的数码管是一种常用的数字显示设备,用于在嵌入式系统中显示数字和一些特定的符号。数码管通常由七段LED组成,每个LED段可以显示数字0到9以及一些字母和符号。通过控制每个LED段的亮灭,可以显示不同的数字和字符。 在51单片机中,数码管通常连接到GPIO(通用

    2024年01月21日
    浏览(48)
  • 51单片机(数码管可调时钟)

    1.数码管(共阴极)如何显示数字:位选+段选(单个) 位选:138译码器通过P22、P23、P24三个端口输入二进制数(011、000等)来选择连同译码器右边的哪一条线,而这些线又分别连着数码管的LED12345678、决定选择哪一个来显示数字 段选:决定输出什么数字,数码管下方又连着一

    2024年02月05日
    浏览(46)
  • 51单片机数码管显示(三)

    目录 一、静态数码管显示 1、一位数码管 (1)LED数码管各段名称 (2)数码管引脚定义 (3) 共阴极(89C52RC单片机LED数码管采用共阴极方式) (4)共阳极 2、四位一体数码管 (1)四位一体数码管引脚定义 (2)上面共阴极和下面共阳极  3、数码管模块原理图详解 4、编写

    2024年02月08日
    浏览(40)
  • 二、51单片机控制数码管

    (1)数码管的外观: 数码管可分为单个的,联排的(2位、4位、8位) (2)数码管的作用: 数码管是显示器件,是用来显示数字的。 (1)数码管的亮灭是由内部的照明LED的亮灭实现的。 (2)一位数码管内部有八颗LED灯,利用内部的LED灯的亮和灭让数码管显示不同的数字。 (1)驱动方法的

    2023年04月09日
    浏览(45)
  • 51单片机入门————数码管显示

    我们在马路上看到的红绿灯,就是由数码管来实现的,就是其中可能加入了一些延时和转换 数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示 我们先讨论一个数码管 数码管有共阳极和共阴极,我们现在使用的STC89C52是共阴极的,说明数码管共用阴极 上面是

    2024年02月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包