【蓝桥杯-单片机】基础模块:数码管

文章目录

  • 【蓝桥杯-单片机】基础模块:数码管
    • 01 数码管原理图
      • 什么是位选和段选
      • 共阳极数码管和共阴极数码管的区分
        • (1)共阳极数码管(Common Anode):
        • (2)共阴极数码管(Common Cathode):
    • 02 代码
      • (1)数码管静态显示
      • (2)数码管动态显示
          • ①定时器生成步骤
          • ②中断配置方法
          • 补充知识:8051的中断源
            • (1)8051的5个中断源
            • (2)中断函数写法
            • (3)中断触发控制寄存器IE (左边是高位)
            • (4)中断优先级控制寄存器IP
            • (5)TIMER控制寄存器TCON

【蓝桥杯-单片机】基础模块:数码管

01 数码管原理图

在这里插入图片描述
在这里插入图片描述

从图2可知,位选和段选最终都接到了D0.7口;从图1可知,对应D0.7的是P0口。因此P0口是数据口,数据应该往P0口写。
但是位选和段选都是写入P0口。P0=0xA4,如何设置为段选?利用锁存器实现。
在这里插入图片描述
令P2.6=1,写入段选数据;令P2.6=0,关闭,数据存进去了。
令P2.7=1,写入位选数据;令P2.7=0,关闭,数据存进去了。

//数码管显示函数
void Seg_Disp(unsigned char wela,dula)
{
	P0 = 0x00; //消影
	P2_6 = 1;
	P2_6 = 0;	
	
	P0 = Seg_Wela[wela];
	P2_7 = 1;
	P2_7 = 0;		
	
	P0 = Seg_Dula[dula];
	P2_6 = 1;
	P2_6 = 0;	
}

什么是位选和段选

  • 位选(Digit Select):
    位选是指在多位数码管中选择哪一位进行显示。例如,4位数码管就有4个位选引脚,通过控制这些引脚的电平状态,可以选择显示哪一位的数字。位选的常见方式是通过一个计时器或者控制芯片,轮流地激活每一位,以达到依次显示多个数字的效果。
    位选引脚一般用W0、W1、W2等表示,其中W0对应最低位,W1对应次低位,以此类推。

  • 段选(Segment Select):
    段选是指选择数码管的哪一段(LED)亮起来,以显示对应数字的哪一部分。例如,7段数码管的每一段可以表示数字0-9中的一部分。段选通常使用BCD码(二进制编码十进制)或其他编码方式,将要显示的数字转化为对应的段选信号。
    段选引脚一般用a、b、c、d、e、f、g等表示,对应数码管的7个LED段。

  • DP是数码管中的一种特殊段,它代表小数点(Decimal Point)。在一些数码管中,除了表示数字0到9的七个段(a到g),还包括一个用于显示小数点的额外段,即DP段。

在这里插入图片描述
这里的h即DP。

共阳极数码管和共阴极数码管的区分

共阳极数码管和共阴极数码管是两种常见的数码管类型,它们在工作原理和控制方式上有一些区别:

(1)共阳极数码管(Common Anode):

共阳极数码管中,所有的LED段的阳极(正极)都是连接在一起的,而每个LED段的阴极(负极)则分别连接到不同的引脚。
控制时,通过给某一段的阴极引脚接通电流,同时将共阳极引脚设置为高电平,该段就会被激活,显示相应的数字或字符。

(2)共阴极数码管(Common Cathode):

共阴极数码管中,所有的LED段的阴极(负极)都是连接在一起的,而每个LED段的阳极(正极)则分别连接到不同的引脚。
控制时,通过给某一段的阳极引脚接通电流,同时将共阴极引脚设置为低电平,该段就会被激活,显示相应的数字或字符。

主要区别在于共阳极数码管是通过通电阴极(负极)来激活LED段,而共阴极数码管是通过通电阳极(正极)来激活LED段。

例如:假设以下是一个共阴极数码管(共阴极引脚设置为低电平激活),如果我要显示数字2,对8个段选线的电平设置(从h->a)为10100100,转换为16进制为0xA4。即设置段选为0xA4就可以让数码管显示数字2

在这里插入图片描述

02 代码

(1)数码管静态显示

普通代码(直接在while循环里写)

		P0 = 0x00; //消影
	    P2_6 = 1;
		P2_6 = 0;	
		
		P0 = 0xfe;//访客(数据)来了
		P2_7 = 1;//位码门打开
		P2_7 = 0;//位码门关闭,防止别人进来
		
		P0 = 0x5b;//访客(数据)来了
		P2_6 = 1;//段码门打开
		P2_6 = 0;//段码门关闭,防止别人进来(这是用锁存器实现的)

模块化编程:

/* 变量声明区 */
unsigned char Seg_Wela[6] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char Seg_Dula[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
//数码管显示函数
void Seg_Disp(unsigned char wela,dula)
{
	P0 = 0x00; //消影
	P2_6 = 1;
	P2_6 = 0;	
	
	P0 = Seg_Wela[wela];
	P2_7 = 1;
	P2_7 = 0;		
	
	P0 = Seg_Dula[dula];
	P2_6 = 1;
	P2_6 = 0;	
}

这边的代码和蓝桥杯的底层代码是有一点不一样的,但是思路都是一样的,要先学会简单的。
这些代码再蓝桥杯比赛的时候需要凭借肌肉记忆敲出来,不能现场推,会来不及。

(2)数码管动态显示

动态数码管:每位数码管显示不同的数字,若直接重复调用一个数码管显示的函数,会因为程序执行逻辑是由上至下依次执行,会造成后面的数据影响前面的显示效果

  • 一种解决方案,显示后面直接delay。这种做法不建议,程序写多了会卡。
  • 用定时器
特性定时器(Timer)延时函数(Delay)
作用用于计算程序执行时间、生成精确的时间延迟、定时触发事件等。用于在程序中创建一段固定的时间延迟
工作原理以某个频率递增或递减的计数器通过在程序中插入循环,等待一段时间
使用方法配置计数方向、预分频器、计数模式等参数确定循环次数,基于系统时钟频率和所需延时时间
应用生成精确的时间间隔、PWM控制、周期性任务调度等简单的等待、初始化延时等

总结:定时器提供了更为精确的时间控制,适用于需要准确时间测量和控制的场景。延时函数是一种简单的时间控制方法,适用于一些简单的等待或初始化场景,但在需要高精度时间控制的情况下不够准确。

①定时器生成步骤
  • 打开STC-ISP烧录软件,找到定时器计算器
  • 系统频率12MHz定时长度1毫秒定时器模式十六位定时器时钟127T
  • 复制C代码到工程中
  • 删除AUXR &=Ox7F;

在这里插入图片描述

//定时器初始化函数
void Timer0Init(void)		//1毫秒@12.000MHz
{
	//AUXR &= 0x7F;		//定时器时钟12T模式,没有这个定义,删掉
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;//加上
	EA = 1;//加上
}

在嵌入式系统和单片机编程中,ET0 和 EA 是与定时器/计数器相关的控制寄存器。

  • ET0(Timer 0 溢出中断允许位):
    ET0 位是 8051 单片机中的特殊功能寄存器(SFR),用于控制定时器/计数器 0 的溢出中断是否允许。
    当 ET0 位被设置为 1 时,允许定时器/计数器 0 溢出时触发中断。溢出中断是在定时器/计数器达到最大计数值后溢出到 0 时触发的。
  • EA(全局中断允许位):
    EA 位同样是 8051 单片机中的特殊功能寄存器,用于控制全局中断是否允许。
    当 EA 位被设置为 1 时,允许所有中断(包括外部中断、定时器中断等)生效。如果 EA 位被清零,则禁止所有中断,即使各个中断的特定中断允许位(如 ET0)被设置为 1,相应中断也不会触发。

这两个寄存器通常与定时器/计数器模块一起使用,以实现在定时器计数达到某个值时触发中断的功能。在使用定时器中断时,通常需要设置 ET0 位来启用定时器溢出中断,并设置 EA 位来启用全局中断。

②中断配置方法
  • 在生成的定时器初始化函数内增加中断打开命令ET0=1、EA=1
  • 书写中断服务函数(Timer0Server)
  • 在服务函数内初始化计数值
  • 在主程序内添加定时器0初始化函数
//中断服务函数
void Timer0Server() interrupt 1
{
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	
	Seg_Pos++;
	if(Seg_Pos == 6) Seg_Pos = 0;
	
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	
}

完整代码

/* 头文件声明区 */
#include <REGX52.H>
#include <intrins.h>

/* 变量声明区 */
unsigned char Led_Data = 0xFE;//用于循环位移的LED变量 初始值为LED1亮
unsigned char Seg_Wela[6] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char Seg_Dula[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};
unsigned char Seg_Pos;
unsigned char Seg_Buf[6] = {5,2,1,10,10,10};

/* 五百毫秒延时函数 */
void Delay500ms()		//@12.000MHz
{
	unsigned char i, j, k;
	
	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

/** 
* @函数名 自定义延时函数
* @函数功能 延时任意毫秒
* @入口参数 延时时间
* @返回值 无
*/
void Delay(unsigned int xms)		//@12.000MHz
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

//数码管显示函数
void Seg_Disp(unsigned char wela,dula)
{
	P0 = 0x00; //消影
	P2_6 = 1;
	P2_6 = 0;	
	
	P0 = Seg_Wela[wela];
	P2_7 = 1;
	P2_7 = 0;		
	
	P0 = Seg_Dula[dula];
	P2_6 = 1;
	P2_6 = 0;	
}

//定时器初始化函数
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}

//中断服务函数
void Timer0Server() interrupt 1
{
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	
	Seg_Pos++;
	if(Seg_Pos == 6) Seg_Pos = 0;
	
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	
}


/* Main */
void main()
{
	Timer0Init();
	while(1)
	{
		
	}
}

  • 头文件和变量声明
    #include <REGX52.H> 和 #include <intrins.h> 分别包含 8051 单片机的头文件和一些内联汇编函数的头文件。
    Led_Data 是用于循环位移的 LED 变量。
    Seg_Wela 和 Seg_Dula 是用于控制共阴数码管的位选和段选的数组。
    Seg_Pos 用于表示当前数码管显示的位置。
    Seg_Buf 是用于存储数码管显示的数字。
  • 延时函数:
    Delay500ms() 实现了一个 500 毫秒的延时函数,通过嵌套循环实现延时。
    Delay(unsigned int xms) 是一个自定义延时函数,根据传入的毫秒数进行延时。
  • 数码管显示函数:
    Seg_Disp(unsigned char wela, dula) 用于控制数码管的显示。通过设置 P0 端口和 P2.6、P2.7 引脚的状态来控制位选和段选。
  • 定时器初始化函数和中断服务函数:
    Timer0Init() 初始化定时器0,配置为工作在方式1,用于产生1毫秒的定时中断。
    Timer0Server() 是定时器0的中断服务函数,通过定时中断实现LED循环位移和数码管显示的刷新。
  • Main 函数:
    main() 函数中初始化了定时器,并进入一个无限循环,程序主要通过定时器中断服务函数进行 LED 和数码管的显示控制。
补充知识:8051的中断源

以下内容搬运自博客:http://blog.chinaunix.net/uid-20629402-id-1608165.html

(1)8051的5个中断源

在这里插入图片描述

(2)中断函数写法
返回值 函数名 interrupt n { …… }

n对应中断源编号。
例如:

//中断服务函数
void Timer0Server() interrupt 1
{
	TL0 = 0x18;		//设置定时初始值
	TH0 = 0xFC;		//设置定时初始值
	
	Seg_Pos++;
	if(Seg_Pos == 6) Seg_Pos = 0;
	
	Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos]);
	
}

interrupt 1表示这个是5个中断源中Timer0的中断服务函数!

(3)中断触发控制寄存器IE (左边是高位)

在这里插入图片描述

  • EX0:响应外部/INT0的中断
  • ET0:响应TIMER0的中断
  • EX1、ET1:对应/INT1与TIMER1
  • ES:对应UART
  • ET2:响应TIMER2溢出或捕捉的中断(仅对8052)
  • EA:中断使能。EA=1时才允许中断。
(4)中断优先级控制寄存器IP

在这里插入图片描述
分别对应各中断的优先级。仅分0(低)、1(高)两级,同级的中断还是看中断源编号进行优先级排序。

(5)TIMER控制寄存器TCON

在这里插入图片描述

  • TF1与TF0分别是硬件去置位的,当Timer1/Counter1溢出时,TF1会被置为1,而当处理器去执行中断服务时,它又被硬件置0。(当然TF0管的就是Timer0/Counter0了)
  • TR1与TR0由软件置位,管的是Timer/Counter的激活。(如在程序里写TR0=1,就是说Counter0开始计数,当然如果这个Timer/Counter被设置为Counter的工作方式的话)
  • IE1与IE0由硬件置位,与TF1、TF0等同,只是IE1与IE0管的是外部中断。
  • IT1与IT0由软件置位,设为1时,对应的外部中断为负缘触发,设0时为低准位触发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言中大小写字母如何转化

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

【Miniconda】基于conda列出当前环境下所有已创建的虚拟环境

【Miniconda】基于conda列出当前环境下所有已创建的虚拟环境 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的…

MS08-067 漏洞利用与安全加固

文章目录 环境说明1 MS08_067 简介2 MS08_067 复现过程3 MS08_067 安全加固 环境说明 渗透机操作系统&#xff1a;2024.1漏洞复现操作系统: Windows XP Professional with Service Pack 2- VL (English)安全加固复现操作系统&#xff1a;Windows XP Professional with Service …

Windows系统搭建Cloudreve结合内网穿透打造可公网访问的私有云盘

目录 ⛳️推荐 1、前言 2、本地网站搭建 2.1 环境使用 2.2 支持组件选择 2.3 网页安装 2.4 测试和使用 2.5 问题解决 3、本地网页发布 3.1 cpolar云端设置 3.2 cpolar本地设置 4、公网访问测试 5、结语 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff…

BUGKU-WEB shell

题目描述 题目截图如下&#xff1a; 描述&#xff1a; $poc "a#s#s#e#r#t";$poc_1 explode("#", $poc);$poc_2 $poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];$poc_2($_GET[s])进入场景看看&#xff1a;是一个空白的界面 解题思路 …

HTML 学习笔记(十)块和内联

每个HTML元素都有一个默认的显示值&#xff0c;显示值又可以再分为block(块)和inline(内联) 一、块元素 通过F12进入浏览器开发者模式查看该元素会发现其所占宽度为整个网页的宽度 1.div标签 通过div标签将一些元素装进"盒子"&#xff0c;从而对盒子中的全部元素…

OPTIONS请求(跨域预检查)

目录 一、什么是OPTIONS请求&#xff1f;二、简单请求、复杂请求三、特定的请求头、响应头 一、什么是OPTIONS请求&#xff1f; OPTIONS 请求方式是 HTTP 协议中的一种&#xff0c;主要用于 从响应头中获取服务器支持的HTTP请求方式。 OPTIONS 请求方式是 浏览级行为&#xf…

Hubspot 2023年推荐使用的11个AI视频生成器

视频是任何营销活动不可或缺的一部分&#xff1b;然而&#xff0c;如果你不懂编辑或时间紧迫&#xff0c;它们可能会很乏味&#xff0c;很难创建。一只手从电脑里伸出来&#xff0c;拳头碰到另一只手&#xff1b;代表AI视频生成器。 幸运的是&#xff0c;你可以利用许多人工智能…

市场复盘总结 20240314

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 25% 最常用的…

vue 引用百度地图

address.vue <template><div><!-- 地图 --><el-drawer:visible.sync"type1"direction"rtl"size"50%"append-to-bodyclass"map-drawer":before-close"beforeClose"><div style"width: 100%…

Twitter广告投放技巧

明确目标受众&#xff1a; 确定你的目标受众&#xff0c;包括他们的兴趣、地理位置、年龄等。Twitter提供了广告定位选项&#xff0c;确保你的广告被展示给最相关的用户。 使用吸引人的图像和视频&#xff1a; 在Twitter上&#xff0c;图像和视频是引起关注的关键。确保你的广…

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)

写在前面 谈及到中国企业走入国际市场&#xff0c;拓展海外营销渠道的时候&#xff0c;如果单纯依靠一个小公司去国外做广告&#xff0c;拉渠道&#xff0c;找代理公司&#xff0c;从售前到售后&#xff0c;都是非常不现实的。我们可以回想一下40年前&#xff0c;30年前&#x…

吐槽FineDataLink工具Format函数处理日期转字符串格式的说明文档

一.背景 为公司师带徒的任务做些记录。 二.文档存在的问题 1.文档情况 FORMAT-格式转换- FineBI帮助文档 FineBI帮助文档 函数定义&#xff1a; FORMAT(object,format) formart的格式有哪些呢&#xff1f;我们截图看看&#xff1a; 2.文档说明不足问题 同事的需求是把时…

Kubernetes operator系列:webhook 知识学习【更新中】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Kubernetes operator学习 系列文章&#xff0c;本节会对 kubernetes webhook 知识进行学习 本文的所有代码&#xff0c;都存储于github代码库&#xff1a;https://github.com/graham924/share-code-operator-st…

记某次HVV:文件上传打入内网

免责声明 本文仅用于参考和学习交流&#xff0c;对于使用本文所提供的信息所造成的任何直接或间接的后果和损失&#xff0c;使用者需自行承担责任。本文的作者对此不承担任何责任。请在使用本文内容时谨慎评估风险并做出独立判断。谢谢&#xff01; 前言 某次地市hvv发现一个…

《天软特色高频因子》报告第12期

天软特色因子“近1月尾盘成交占比”&#xff08;A02002&#xff09;从行业角度分析&#xff0c;在基础化工、电子设备行业表现稳定&#xff0c;无论在有效性、区分度方面表现明显&#xff0c;而在非银金融、环保行业表现较差&#xff1b;从规模角度分析&#xff0c;该因子规模特…

韩国大带宽服务器的数据中心位置

很多用户会选择韩国大宽带服务器&#xff0c;那么韩国大带宽服务器的数据中心位置在哪&#xff0c;rak小编为您整理发布韩国大带宽服务器的数据中心位置。 韩国大带宽服务器的数据中心通常位于**首尔及其周边地区**。 韩国因其地理位置的优势&#xff0c;拥有丰富的网络带宽资源…

【BOM笔记】基本概述、window对象常见事件、定时器、JS执行机制、location/navigator/history对象

文章目录 1 BOM概述1.1 什么是BOM1.2 BOM的构成 2 window 对象的常见事件2.1 窗口加载事件2.2 调整窗口大小事件 3 定时器3.1 setTimeout() 定时器3.2 setInterval() 定时器3.3 this 4 JS 执行机制4.1 JS 是单线程4.2 同步和异步4.3 JS 执行机制 5 location 对象5.1 属性5.2 方…

跨境电商干货|如何在Snapchat上做电商?

Snapchat是一个与用户互动与创意内容为主的平台&#xff0c;也因其广阔的受众群体广受跨境电商卖家的喜爱&#xff0c;成为跨境出海的热门渠道之一。本文将为大家分享&#xff0c;要在Snapchat上进行电子商务&#xff0c;可以遵循以下步骤&#xff1a; 1、创建商业账户 在Snap…

EDM营销平台的核心功能?如何做精准营销?

EDM营销平台如何选择&#xff1f;怎么使用邮件营销平台优化发信&#xff1f; EDM营销平台以其独特的优势&#xff0c;成为了企业实现精准营销、提升品牌影响力的重要工具。那么&#xff0c;EDM营销平台究竟拥有哪些核心功能呢&#xff1f;接下来&#xff0c;AokSend就来一一探…