嵌入式51单片机03-数码管系列

news2025/1/11 12:56:40

文章目录

    • 数码管
      • 一、数码管基础知识
      • 二、数码管系列代码
        • 1. 数码管操作(单个数码管静态显示)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 2. 数码管操作(多个数码管静态显示)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 3. 数码管操作(单只静态数码管循环显示0-9,无开关控制)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 4. 数码管操作(单只静态数码管循环显示0-9,k1复位,k2暂停与开始)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 5. 数码管操作(动态数码管循环移位显示0-9)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果
        • 6. 数码管操作(独立按键控制数码管增加与减少)
          • (1)仿真电路图
          • (2)源代码
          • (3)实验结果

数码管

一、数码管基础知识

  • 数码管的工作原理:数码管内部其实就是LED灯拼接而成的,只需要在一端给高电平,而另一端给低电平就可以让数码管显示。它们分别称为数码管的位选端段选端

  • 静态显示:只需要通过位选确定显示哪一位,再通过段选控制显示的数字即可。

  • 动态显示:动态显示的特点就是将所有数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。选亮数码管采用动态扫描的方式。所谓动态扫描,就是轮流向各位数码管送出字形码和相应的位选,利用人眼视觉暂留效应,使人的感觉就是各位数码管同时都在显示。动态显示的亮度比静态显示要差一些,所以在选择限流电阻时应略小于静态显示电路中的。

  • 原理图
    在这里插入图片描述

    段选:数码管上方的LED1~LED8,静态显示时只需要给赋低电平即可,动态显示时使用动态扫描的方式实现。段选通过74HC138译码器实现。

    位选:数码管下方的abcdefgdp,分别对应LCD0~LCD7,使用74HC245驱动。

  • 74HC245:双向数据缓冲器,由于单片机或CPU的数据、地址、控制总线端口都有一定的负载能力,如果负载超过负载能力,就达不到要显示的效果,因此需要驱动芯片。74HC245就是可以提高驱动能力的芯片,作用就是只需要提供一个信号,通过芯片内部的电源把驱动信号拉高,让其变为高电平,驱动数码管显示。

  • 74HC138:起到译码的功能,就是用少的引脚控制多的引脚,来满足单片机引脚不足的一种方式,138是用三位输入控制8位输出。

二、数码管系列代码

1. 数码管操作(单个数码管静态显示)

(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"			


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

//段选的数字,从0~f
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void main()
{	
    //74HC138控制端,全为0时选择最低位数码管显示
	LSA=0;
	LSB=0;
	LSC=0;	
	
	while(1)
	{
		P0=smgduan[0];
	}
}
(3)实验结果

在这里插入图片描述

2. 数码管操作(多个数码管静态显示)

(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"			


//数码管段选端位定义
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//显示0~f
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

						   
//延时函数
void delay(unsigned int i)  
{
	while(i--);	
}

//数码管显示函数
void DigDisplay()  
{
	unsigned int i;
	
	for(i = 0;i < 8;i++)
	{
		switch(i)	 
		{
			case(0):
				LSA = 0; LSB = 0; LSC = 0; P0 = smgduan[9]; break;
			case(1):
				LSA = 1; LSB = 0; LSC = 0; P0 = smgduan[1]; break;
			case(2):
				LSA = 0; LSB = 1; LSC = 0; P0 = smgduan[4]; break;
			case(3):
				LSA = 1; LSB = 1; LSC = 0; P0 = smgduan[0]; break;
			case(4):
				LSA = 0; LSB = 0; LSC = 1; P0 = smgduan[3]; break;
			case(5):
				LSA = 1; LSB = 0; LSC = 1; P0 = smgduan[2]; break;
			case(6):
				LSA = 0; LSB = 1; LSC = 1; P0 = smgduan[0]; break;
			case(7):
				LSA = 1; LSB = 1; LSC = 1; P0 = smgduan[2]; break;
		}	
		delay(100); 
		P0 = 0x00;
	}
}

//主函数
void main()  
{	
	while(1)
	{	
		DigDisplay();  
	}		
}
(3)实验结果

在这里插入图片描述

3. 数码管操作(单只静态数码管循环显示0-9,无开关控制)

(1)仿真电路图

在这里插入图片描述

(2)源代码
//单只静态数码管循环显示0-9
#include "AT89X51.h"


int i,j,k;
int a[17] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
	       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};


void delay(int n)
{
	for (j = n;j > 0;j--)
	for (k = 110;k > 0;k--);
}

void main()
{
	P2_2 = 1;
	P2_3 = 1;
	P2_4 = 1;
    P0 = 0x00;
    
	while (1)
	{
		for (i = 0;i < 16;i++)
		{
			P0 = a[i];
			delay(250);
		}
	}		
}
(3)实验结果

4. 数码管操作(单只静态数码管循环显示0-9,k1复位,k2暂停与开始)

(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "reg52.h"	
#include "intrins.h"


//数码管段选端位定义
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

//按键位定义
sbit k1 = P3^0;
sbit k2 = P3^1;

//显示0~f
unsigned char smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
					       0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char control;						   

						   
//延时函数
void Delay1ms(unsigned int xms)		
{
	unsigned char i, j;
	
	while(xms--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

//按键操作函数
void keyboard(void)
{
	int i;
	
	if(k1 == 0)
	{
		Delay1ms(20);
		while(k1 == 0);
		Delay1ms(20);
		
		while (1)
		{
			for (i = 0;i < 10;i++)
			{
				P0 = smgduan[i];
				Delay1ms(350);
				
				if (k1 == 0)
				{
					Delay1ms(20);
					while(k1 == 0);
					Delay1ms(20);
					//跳出当前for循环,就会从0开始
					break;
				}
				
				//k2按键按下的第一次进入
				if (k2 == 0)
				{
					Delay1ms(20);
					while(k2 == 0);
					Delay1ms(20);
					
					//k2按键按下的第二次退出
					do
					{
						P0 = smgduan[i];
						Delay1ms(350);
					}
					while(k2 != 0);
				}
			}
		}
		P0 = 0x00;
	}
}

//主函数
void main()  
{
	//控制数码管段选
	LSA = 1;
	LSB = 1;
	LSC = 1;
	//数码管初始化
	P0 = 0x00;
	
	while(1)
	{	
		keyboard();
	}		
}
(3)实验结果

5. 数码管操作(动态数码管循环移位显示0-9)

(1)仿真电路图

在这里插入图片描述

(2)源代码
#include "AT89X51.h"


int a[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


//延时函数
void delay(int n)   
{
	int i,j;
	for (i=n;i>0;i--)
	for (j=110;j>0;j--);	   
}

//数码管显示函数	
void DigDisplay()	
{
	int i,t;
	for(i=0;i<8;i++)
	{
		//位选,选择点亮的数码管
		switch(i)	 
		{
			case 0:
				P2_2=0;P2_3=0;P2_4=0; break;//显示第0位
			case 1:
				P2_2=1;P2_3=0;P2_4=0; break;//显示第1位
			case 2:
				P2_2=0;P2_3=1;P2_4=0; break;//显示第2位
			case 3:
				P2_2=1;P2_3=1;P2_4=0; break;//显示第3位
			case 4:
				P2_2=0;P2_3=0;P2_4=1; break;//显示第4位
			case 5:
				P2_2=1;P2_3=0;P2_4=1; break;//显示第5位
			case 6:
				P2_2=0;P2_3=1;P2_4=1; break;//显示第6位
			case 7:
				P2_2=1;P2_3=1;P2_4=1; break;//显示第7位	
		}
		//段选
		for (t=0;t<10;t++)
		{
			P0=a[t];
			delay(150);
		}
		//间隔一段时间扫描	
		delay(50); 
		//消隐
	}
}

void main()
{	
	while(1)
	{	
		DigDisplay();  	
	}		
}
(3)实验结果

6. 数码管操作(独立按键控制数码管增加与减少)

(1)仿真电路图

在这里插入图片描述

(2)源代码
#include<reg51.h>
#include "intrins.h"

sbit key1=P3^1;
sbit key2=P3^0;
sbit ad=P2^2;
sbit bd=P2^3;
sbit cd=P2^4;

unsigned int xianshi[]={0x00,0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(int n)
{
	unsigned int i,j;
	for (i=n;i>0;i--)
	for (j=110;j>0;j--);
}

void Delay1ms(unsigned int xms)		
{
	unsigned char i, j;
	
	while(xms--)
	{
		_nop_();
		i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
}

void main()
{
	unsigned int count=0;
	P0 = 0x00;
	
	while(1)
	{
		ad=1;bd=1;cd=1;
		
		if (key1 == 0)
		{
			Delay1ms(20);
			while(key1 == 0);
			Delay1ms(20);
			
			count++;
			if(count==17)
				count=0;
			P0=xianshi[count];
			delay(250);	
		}
		
		if (key2 == 0)
		{
			Delay1ms(20);
			while(key2 == 0);
			Delay1ms(20);
			
			if (count==0)
				count=15;
			else 
				count--;
			P0=xianshi[count];
			delay(250);	
		}	
	}			
}
(3)实验结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/436497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSDN官方文章MD编辑器文章示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Day950.遗留系统的四化建设 -遗留系统现代化实战

遗留系统的四化建设 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于遗留系统的四化建设的内容。 对于老旧、过时&#xff0c;但又十分重要、不可替代的遗留系统&#xff0c;是遗留系统。听之任之只会埋下隐患&#xff0c;真正出现问题就为时已晚了。在动手改造遗留…

【蓝桥杯省赛真题39】Scratch棒球本垒打 少儿编程scratch图形化编程 蓝桥杯省赛真题讲解

目录 scratch棒球本垒打 一、题目要求 编程实现 二、案例分析 1、角色分析

托福高频真词List01 // 附阅读真题

4月18日单词 &#x1f36e;segregateseparateV.隔离&#x1f36e;leftover remainingadj.剩余的 &#x1f36e;rivalcompetitor &#x1f36e;rivalcompete n.对手&#x1f36e; v.对抗&#x1f36e; apparentlyseeminglyadv.显然 &#x1f36e;unrivaledunequaledadj.无与伦…

Create a Process for Managing Support Cases

文章目录 前言&学习目标学习目标背景 一&#xff0c;Create Support Processes1.创建用户2.创建Processes3.创建Record Types4.创建升级规则(Escalation Rule) 前言&学习目标 记录trailhead学习重点&#xff0c;创建管理支持个案的流程&#xff0c;简化工作流并用新的…

mysql企业级安装部署(保姆级别教程)

前言 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的 RDBMS (Relational Database Management System&#xff0c;关系…

Spring——利用五大类注解和Bean注解实现更简单的存储

目录 一、配置扫描路径 二、使用注解存储Bean对象 2.1 Controller&#xff08;控制器存储&#xff09; 2.1.1 bean标签是否可以和component-san一起使用呢&#xff1f; 2.2 Service(服务存储) 2.3 Repository 2.4 Component 2.5 Configuration 2.6 五大类注解可以不在…

27岁,测试在职近5年,月薪不到2W,担心被应届生取代

工作了近5年&#xff0c;一个月工资不到20K&#xff0c;担心被应届毕业生取代&#xff01;互联网的快速发展伴随着员工适者生存的加速&#xff0c;测试员的薪资也在不断增长&#xff0c;以3年、5年、8年为一条分水岭。如果人们的能力和体力不够&#xff0c;他们就会被淘汰。看起…

Android添加C++/CPP项目代码(2)

Android添加C/CPP项目代码&#xff08;2&#xff09; &#xff08;1&#xff09;选中某个module&#xff0c;右键&#xff0c;Add C to Module 在随后弹出的选项框中选第一个&#xff0c;OK。 &#xff08;2&#xff09;此时会在app下产生一个cpp目录和两个文件&#xff1a; x…

TiDB实战篇-BR进行数据备份与恢复

简介 使用BR进行数据备份与恢复。 原理 Backup备份的时候在PD上面找到表的元数据&#xff0c;然后找到对应的TiKV数据以后&#xff0c;直接备份到外部系统中&#xff08;注意如果没有像HDFS这样的分布式文件存储&#xff0c;那么它每个TiKV备份到本地的文件就只有一部分数据&…

nssctf web 入门(10)

[NISACTF 2022]midlevel [NISACTF 2022]midlevel 尝试使用x-forwarded-for 发现可行判断是不是ssti 确定是ssti模板注入 [NISACTF 2022]is secret [NISACTF 2022]is secret 根据这个我们去看看secret 这里看到这个猜测是通过get传入secret的值然后会机密我们的值 我们发现传…

优秀软件方法学“漫游记”

你好&#xff0c;我是东&#xff08;在极客时间的 ID 是 Fredo&#xff09;。大学的时候我读的是计算机专业&#xff0c;现在是一名工作了近3年的程序员&#xff0c;很高兴能和你分享我的学习体会。 我是怎样学习课程的&#xff1f; 首先聊聊我是怎么学习这门课的。 DDD 是一…

智网工程师培训一些心得

智网工程师培训一些心得 MYSQLApache Flask开发小程序 MYSQL MYSQL的日期如果定义为datetime类型&#xff0c;比较的时候可以使用 entry_form.exercise_date between 2022-1-1 and 2023-4-19 日期可以是非2位宽对齐方式 日期比较也可以使用大于或者小于号MYSQL支持定时备份数…

学习数据结构第6天(栈的基本概念)

栈的基本概念 栈的定义栈的基本操作栈的存储结构 栈的定义 栈(Stack)是一种基于先进后出(FILO)或者后进先出(LIFO)的数据结构&#xff0c;是一种只允许在一端进行插入和删除操作的特殊线性表。 栈按照先进后出的原则存储数据&#xff0c;先进入的数据被压入栈底&#xff0c;最…

数据结构初阶(链表)

文章目录 一、链表的基础概念1.1 什么是链表1.2 分类1.3 链表的底层代码1.4 例题1.5 LinkedList 的实现&#xff08;1&#xff09;什么是LInkedList&#xff08;2&#xff09;底层代码&#xff08;3&#xff09;LinkedLIst的使用 1.6 ArrayList和LinkedList的区别 一、链表的基…

Spring底层架构核心概念

文章目录 Spring底层架构核心概念BeanDefinitionBeanDefinitionReaderAnnotatedBeanDefinitionReaderXmlBeanDefinitionReaderClassPathBeanDefinitionScanner BeanFactoryApplicationContext国际化资源加载获取运行时环境事件发布 类型转换PropertyEditorConversionServiceTyp…

20行Python代码获取 心碎榜单文件保存本地,准备开始emo......

人生苦短 我用python&#xff08;emo版&#xff09; (语气充满悲伤…) 今天咱们试试只用20行代码来实现 批量获取 某某云 文件保存本地&#xff0c;炒鸡简单&#xff01; 悄悄的告诉你&#xff0c;其实不到20行代码~ 事前准备 软件环境 环境Python3.8编辑器是pycharm 模块…

轻松掌握k8s的kubectl使用命令行操作01知识点

程序员使用的kubectl&#xff0c;只能在主节点使用kubectl命令 1、查看集群所有节点 kubectl get nodes 2、根据配置文件&#xff0c;给集群创建资源 kubectl apply -f xxxx.yaml 3、查看集群部署了哪些应用 kubectl get pods -A 4、指定查看命名空间部署了哪些应用 不指…

[DSCoding2] 反转链表——迭代法

题目描述 核心思路 观察上图可以发现&#xff0c;将链表反转后&#xff0c;原有的结点间的引用关系发生了改变&#xff0c;比如反转前1指向2&#xff0c;反转后2指向1&#xff0c; 所以我们可以从修改节点间的引用关系下手。 在遍历链表时&#xff0c;将当前节点的next指针指向…

ReentrantLock原理

实现了Lock接口 内部也维护了一个同步器Sync继承自AQS&#xff0c;Sync是抽象的&#xff0c;两个实现NonFairSync和FairSync public ReentrantLock() {sync new NonfairSync(); } public ReentrantLock(boolean fair) {sync fair ? new FairSync() : new NonfairSync(); }非…