蓝桥杯-单片机组基础7-存储器映射扩展与PWM脉冲调制(附小蜜蜂课程代码)

news2024/11/14 20:50:08

蓝桥杯单片机组备赛指南请查看这篇文章:戳此跳转蓝桥杯备赛指南文章

本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。

型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2

(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)


1.存储器映射拓展

(截取自小蜜蜂单片机课程视频)

   存储器映射拓展方式的地址:

0x8000指示灯
0xa000蜂鸣器与继电器
0xc000数码管位选
0xe000数码管段选

 在比赛当中,建议还是只使用IO口拓展方式,尽量不使用存储器映射拓展方式。

注意:

进行存储器映射拓展时,需要将开发板J13的跳线帽连接到“MM模式”

使用XBYTE关键字,需要引入头文件“ absacc.h ”来操作拓展资源

存储器拓展方式要占用单片机的P3.6引脚,会与矩阵键盘的引脚冲突

1.1 代码参考

        在主函数中进行选择,对state_all赋不同初值,获得不同的效果。

1——蜂鸣器与数码管;2——蜂鸣器单独作用;3——数码管单独作用(默认)

#include < reg52.h >
#include < intrins.h >
#include < absacc.h >

//使用定时器1实现延时效果
//使用四个独立按键实现类型选择

unsigned char code SMG_duanma [18]=
			{ 0xc0 , 0xf9 , 0xa4 , 0xb0 , 0x99 , 0x92 , 0x82 , 0xf8 , 
				0x80 , 0x90 , 0x88 , 0x80 , 0xc6 , 0xc0 , 0x86 , 0x8e ,
				0xbf , 0x7f };
					
void Delay ( unsigned char time )
{
	unsigned char i,j;
	if ( time%2 == 0 )
	{
		time /= 2;
	}
	else 
	{
		time = (time/=2) + 1;
	}

	
	
	while ( time-- )
	{

		_nop_ ();
		_nop_ ();
		i=22;
		j=128;
		do 
		{
			while ( --j );
		}
		while ( --i );
	}
}



void ledrunning ( unsigned char linspace )
{
	unsigned char i,state_led;
	for ( i=0 ; i<8 ; i+=linspace )
	{
		state_led = 0xff;
		state_led &= ~( 1<<i );
		XBYTE[0x8000] = state_led;
		Delay (500);
	}
}

void buzzrunning ( unsigned char buzz_state )
{
	if ( buzz_state == 0 )
		XBYTE[0xa000] = 0x00;
	else 
		XBYTE[0xa000] = 0xff;
}


void SMG_running ( )
{
	unsigned char i,j;
	for ( i=0 ; i<7 ; i++ )
	{
		XBYTE[0xc000] = 0x01 << i;
		for ( j=0 ; j<10 ; j++ )
		{			
			XBYTE[0xe000] = SMG_duanma [j];
			Delay (500);
			
		}
	}
	
}


void main ()
{
	unsigned char state_all = 3;
	while (1)
	{
		if ( state_all == 1 )
		{
			buzzrunning (0);
			ledrunning (1);
		}
		else if ( state_all == 2 )
		{
			buzzrunning (0);
			Delay ( 400 );
			buzzrunning (1);
			Delay ( 400 );
		}
		else if ( state_all == 3 )
		{
			buzzrunning (0);
			SMG_running ();
		}

	}
}

2.PWM脉冲宽度调制

2.1 pwm脉冲调制的作用效果

        比较通俗的来说,pwm脉冲调制,可以让我们自定义灯光的亮度,使得LED灯可以产生不同的亮度;自定义电机的转速,使得电机可以以不同的速度旋转;自定义蜂鸣器的嗡叫大小,使得蜂鸣器也可以小声歌唱……

        比较专业的来说则是:脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法则,可以通过对改变脉冲的时间宽度,来等效的获得所需要合成的相应幅值和频率的波形,实现模拟电路的数字化控制。PWM信号是通过调节占空比的变化来调节信号、能量等的变化。

2.2 什么是PWM

        PWMPulse-width modulation),中文名脉冲宽度调制。下面我采用功率的思路来理解PWM的作用。

        在我们之前的编程中,单片机的引脚通过赋值1或0,从而输出5v或0v的电压。如下图所示:

        在1个周期中,可以看出单片机引脚的输出电压恒定为5v,假设引脚上接了一个5欧姆的电阻,则该电阻获得的功率是恒定的,W=U^2/R=5^2/5=5瓦特。如果我们希望电阻上的功率低一些怎么办?根据W=Q/t式子,分子Q与电压直接相关,而电压由硬件电路决定无法改变;分母t与我们使单片机引脚为高电平的时间有关,可以通过编程更改。因此,我们可以设置在一个周期中,单片机引脚处于高电平的时长,从而改变输出功率,让电阻的功率降低。

        假设我们要使电阻上的功率为3w,由面积等效规律可得出,在一个周期中高电平应该占据60%的时长,画出电压图像为:

        通过设置在一个周期中,高电平与低电平所占时长的比例,即可实现0~最大功率之间的功率输出。其中,高电平所占的时长我们称为占空比(Duty cycle),通常规定其数值为0~100%,当占空比为100%时即表示最大功率输出。

2.3 pwm的编程原理

        在编程时,我们可以利用定时/计数器生成一个100个时钟序列的周期,在时钟序列累加值低于占空比数值时输出高电平,时钟序列累加值高于占空比数值时输出低电平,从而实现一个周期中的脉冲宽度调制。

        我们定义两个变量,pwm_count和pwm_duty:

        pwm_count 变量用于计数一个周期中的时钟序列个数。采用定时/计数器中断设置时钟序列间隔,通常可以设置为0.1ms,每经历一次0.1ms,通过中断使该变量自增1 。因为占空比在0~100之间变化,为了方便我们也设置该变量在计数值达到100时清零。

        pwm_duty变量用于定义占空比。在编写函数时,当pwm_count<pwm_duty时,我们令引脚输出高电平,反之输出低电平。在调用函数时,通过向函数中传递0~100以内的数值,从而设置引脚输出功率在最大功率的0~100%之间变化。

2.4 pwm的代码参考

        代码效果://按键S7通过控制pwm来控制LED1的亮度

//按键S7通过控制pwm来控制LED1的亮度
#include < REGX52.h >
#include < INTRINS.h >

sbit S7 = P3^0;
sbit L1 = P0^0;

void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
	}
}

void Delay ( unsigned char value_delay )
{
	while ( value_delay -- )
	{
		unsigned char i,j;		
		_nop_ ();
		_nop_ ();

		i = 22;
		j = 128;
		do
		{
			while ( --j );
		}while ( --i );
	}
}

unsigned char key_value = 1;
void scan_key ()
{
	if ( S7 == 0 )
	{
		Delay ( 3 );
		if ( S7 == 0 )
		{
			while ( S7 == 0 );
			key_value ++ ;
			if ( key_value == 5 )
			{
				key_value = 1;
			}
		}
	}
}

//=============================================
void Init_Timer0 ()
{
	TMOD = 0x01;
	TH0 = ( 65535 - 100 ) / 256;
	TL0 = ( 65535 - 100 ) % 256;
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}

unsigned char pwm_count = 0;
void Service_Timer0 () interrupt 1
{
	TH0 = ( 65535 - 100 ) / 256;
	TL0 = ( 65535 - 100 ) % 256;
	pwm_count++;
}

//===============================================

void set_pwm ( unsigned char duty_pwm )
{
	if ( pwm_count <= duty_pwm )
	{
		L1 = 0;
	}
	else if ( pwm_count < 100 )
	{
		L1 = 1;
	}
	else if ( pwm_count == 100 )
	{
		pwm_count = 0;
	}	
}

void L1_pwmrunning ()
{
	switch ( key_value )
	{
		case 1:
			TR0 = 0;
			L1 = 1;		
		break;
		case 2:
			TR0 = 1;
			set_pwm ( 10 );
		break;			
		case 3:
//			TR0 = 1;
			set_pwm ( 50 );
		break;			
		case 4:
//			TR0 = 1;
			set_pwm ( 90 );
		break;
	}
}

void main ()
{
	select_HC573 ( 4 );
	Init_Timer0 ();
	while ( 1 )
	{
		scan_key ();
		L1_pwmrunning ();
	}
}

3.PWM脉冲宽度调制编程思路重述

        通过定时/计数器设置100个时钟序列,通过计数时钟序列,并于占空比进行比较确定输出高电平或者低电平。到计数值小于占空比时输出高电平,大于占空比时输出低电平。

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

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

相关文章

HCIA-HarmonyOS设备开发认证V2.0-习题

目录 习题一习题二习题三&#xff08;待续...&#xff09;坚持就有收获 习题一 # HarmonyOS简介 1. 以下哪几项属于OpenHarmony的技术特性&#xff1f;&#xff08;&#xff09;A. 统一OS&#xff0c;弹性部署B. 一次开发&#xff0c;多端部署C. 硬件互助&#xff0c;资源共享…

基于数字孪生的机场人群智慧管控技术

源自&#xff1a;系统仿真学报 作者&#xff1a;钟竞辉,林育钿,李稳强&#xff0c;蔡文桐 “人工智能技术与咨询” 发布 摘 要 针对机场人群应急管控和管理智能化的需求&#xff0c;提出基于数字孪生的机场人群智慧管控方案。构建了包含数据层、建模层、功能层和应用层四维…

【JavaEE进阶】 Linux搭建Java部署环境

文章目录 &#x1f343;前言&#x1f334;Linux权限&#x1f6a9;用户操作&#x1f6a9;三种角色&#x1f6a9;文件类型和访问权限&#x1f388;文件类型&#x1f388;基本权限 &#x1f6a9;修改文件权限 &#x1f38d;搭建Java部署环境&#x1f6a9;apt&#x1f388;apt常用命…

【c++】STL--List的实现

目录 一. List的数据结构 二. List实现的基本框架 1. list的结点结构类 2. List的迭代器类 正向迭代器 反向迭代器 3. List操作接口的实现 1. 默认成员函数 构造函数 和 析构函数 拷贝构造函数 和 赋值运算符重载 2. 修改相关函数接口 insert 和 erase …

人大金仓KingbaseES:windows安装

人大金仓KingbaseES&#xff1a;windows安装 产品简介 金仓数据库管理系统[简称:KingbaseES]是北京人大金仓信息技术股份有限公司&#xff08;简称人大金仓&#xff09;自主研发的、具有自主知识产权的商用关系型数据库管理系统&#xff08;DBMS&#xff09;。该产品面向事务…

春日特惠,爱基百客限时放送,开启您的学术新篇章!

春回大地&#xff0c;万物复苏&#xff0c; 正是探索未知、启发新思的最佳时节。 在这个充满生机的季节里&#xff0c; 我们推出了春季大促活动&#xff0c; 旨在助力每一位科研工作者在新的一年里实现更多突破。 让我们一起迎接科研人的春天&#xff0c; 开启智慧的花朵…

初阶数据结构:二叉树(补充扩展)

目录 1. 堆排序1.1补充&#xff1a;建堆的时间复杂度1.2 堆排序&#xff1a;升序与降序 2. TopK问题3. 二叉树的链式结构及其遍历方式3.1 二叉树的链式结构3.2 二叉树的前序遍历2.2 二叉树的中序遍历2.3 后序遍历2.4 层序遍历 4. 二叉树OJ练习4.1 单值二叉树4.2 判断两棵二叉树…

“零碳未来”:引领全球向低碳经济转型

全球环境基金(GEF),这个由183个国家和地区组成的国际合作组织,是世界银行1990年创建的实验项目,一直致力于支持环境友好型项目,推动全球环境改善。而“零碳未来”不仅是一个由全球环境基金(GEF)创建的跨越国界的全新交易平台,更是一个致力于推动全球向低碳经济转型的零碳排放生…

代码随想录day12(2)字符串:重复的子字符串(leetcode459)

题目要求&#xff1a;给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 思路&#xff1a; 一、首先对于暴力解法&#xff0c;可以枚举所有的字串进行判断。但是枚举时实际上只需…

【Pytorch 第四讲】图像分类的Tricks

1. 标签平滑 在分类问题中&#xff0c;最后一层一般是全连接层&#xff0c;然后对应标签的one-hot编码&#xff0c;即把对应类别的值编码为1&#xff0c;其他为0。这种编码方式和通过降低交叉熵损失来调整参数的方式结合起来&#xff0c;会有一些问题。这种方式会鼓励模型对不同…

【机器学习】生成对抗网络GAN

概述 生成对抗网络&#xff08;Generative Adversarial Network&#xff0c;GAN&#xff09;是一种深度学习模型架构&#xff0c;由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;两部分组成&#xff0c;旨在通过对抗训练的方式生成逼…

在全志V853平台上成功部署深度学习步态识别算法

北理工通信课题组辛喆同学在本科毕业设计《基于嵌入式系统的步态识别的研究》中&#xff0c;成功将深度步态识别算法GaitSet移植到全志V853开发板上。本研究在CASIA-B数据集上进行测试&#xff0c;正常行走状态下该系统的步态识别准确率达到了94.9%&#xff0c;背包行走和穿外套…

Java I/O流

一、常用文件操作 1.创建文件对象 2.获取文件相关信息 3.目录的操作和文件删除 二、IO 流原理及流的分类 1.IO流原理 2.流的分类 2.1 字节流和字符流 2.2 节点流和处理流 3.IO流体系图 三、常用的类介绍 1.FileInputStream 和 FileOutputStream&#xff08;字节流、节点流&…

2核4g服务器能支持多少人访问?并发数性能测评

2核4g服务器能支持多少人访问&#xff1f;支持80人同时访问&#xff0c;阿腾云使用阿里云2核4G5M带宽服务器&#xff0c;可以支撑80个左右并发用户。阿腾云以Web网站应用为例&#xff0c;如果视频图片媒体文件存储到对象存储OSS上&#xff0c;网站接入CDN&#xff0c;还可以支持…

力扣经典题目解析--反转链表

原题地址: . - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 题目解析 链表&#xff08;Linked List&…

交叉编译qt5.14.2

qt源码下载地址&#xff1a;qt-everywhere-src-5.14.2.tar.xz 1.修改qt-everywhere-src-5.14.2/qtbase/mkspecs/linux-arm-gnueabi-g/qmake.conf文件&#xff1a; # # qmake configuration for building with arm-linux-gnueabi-g #MAKEFILE_GENERATOR UNIX CONFIG …

贪心算法练习题(最小化战斗力差距、谈判、纪念品分组、分糖果)

目录 一、贪心算法的介绍 二、贪心算法的实现步骤 三、最小化战斗力差距 四、谈判 五、纪念品分组 六、分糖果 一、贪心算法的介绍 贪心的基本原理:每一步都选择局部最优解&#xff0c;而尽量不考虑对后续的影响&#xff0c;最终达到全局最优解。 贪心的局限性:贪心算法…

深度学习-Pytorch实现经典AlexNet网络:山高我为峰

深度学习-Pytorch实现经典AlexNet网络之山高我为峰 深度学习中&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;它们把AI技术不断推向高潮。2012年AlexNet大放异彩&#xff0c;它把深度学习技术引领第一个高峰…

智慧楼宇的心脏:E6000物联网主机

智慧楼宇是指通过全面覆盖的感知设备和互联网技术&#xff0c;为建筑提供高效、舒适、安全、环保、可持续的智能化服务。 在科技快速发展的今天&#xff0c;智慧楼宇已经不再是遥不可及的梦想。而在这个梦想成真的过程中&#xff0c;物联网主机扮演着至关重要的角色。它如同智慧…

JS逆向进阶篇【去哪儿旅行登录】【下篇-逆向Bella参数JS加密逻辑Python生成】

目录&#xff1a; 每篇前言&#xff1a;引子——本篇目的1、 代码混淆和还原&#xff08;1&#xff09;单独替换&#xff1a;&#xff08;2&#xff09;整个js文件替换&#xff1a; 2、算法入口分析3、 深入分析&#xff08;0&#xff09;整体分析&#xff1a;&#xff08;1&am…