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

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

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

型号:国信天长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个时钟序列,通过计数时钟序列,并于占空比进行比较确定输出高电平或者低电平。到计数值小于占空比时输出高电平,大于占空比时输出低电平。

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

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

相关文章

【Python】matplotlib绘制图像时增加颜色条

一、需求 plt.imshow()是matplotlib中的一个函数&#xff0c;用于显示图像。它可以传递一个二维或三维数组作为image参数&#xff0c; 并将图像数据显示为图形&#xff0c;并对图像进行不同的可视化设置。 在显示的过程中&#xff0c;我们如果需要增加一个图例显示颜色条&…

Word转Excel怎么操作?4个实用技巧别忘了!

“我在处理一个Word文件时&#xff0c;需要将里面的一些表格内容转化为Excel。有什么比较好用的Word转Excel方法可以推荐吗&#xff1f;” 在互联网时代&#xff0c;数据处理和信息整合是工作中不可或缺的一部分。有时&#xff0c;我们可能会遇到需要将Word文档中的数据或内容转…

高性能深度学习库luminal

一、概述 Luminal是一个深度学习库&#xff0c;它使用可组合的编译器来实现高性能。 当前的机器学习库往往很庞大复杂&#xff0c;因为它们试图直接将高级操作映射到底层手工编写的内核上&#xff0c;并且专注于立刻执行&#xff08;eager模式&#xff09;。像PyTorch这样的库…

Java Web开发---复试Tips复习

&#xff08;自用&#xff0c;摘录自各种文章和自己总结&#xff09; 小知识点理解 Web Web应用开发主要是基于浏览器的应用程序开发。一个Web应用由多部分组成 Web应用程序编写完后&#xff0c;若想提供给外界访问&#xff0c;需要服务器来统一管理 常用的动态网页语言——…

react native中如何使用webView调用腾讯地图选点组件

react native中如何使用webView调用腾讯地图选点组件 效果示例图代码示例备注 效果示例图 代码示例 import React, {useEffect, useRef, useState} from react; import {Modal, StyleSheet} from react-native; import {pxToPd} from ../../common/js/device; import {WebView…

私有化部署自己的ChatGPT,免费开源的chatgpt-next-web搭建

随着AI的应用变广&#xff0c;各类AI程序已逐渐普及&#xff0c;尤其是在一些日常办公、学习等与撰写/翻译文稿密切相关的场景&#xff0c;大家都希望找到一个适合自己的稳定可靠的ChatGPT软件来使用。 ChatGPT-Next-Web就是一个很好的选择。它是一个Github上超人气的免费开源…

产品介绍二维码怎么做?多种内容组合二维码的方法

现在扫描二维码来获取内容的方式越来越常见&#xff0c;比如很多的产品介绍都会做成二维码图片后&#xff0c;在产品包装、传单、展板等印刷展示。而一般展示的内容类型多为文本、图片、视频等内容&#xff0c;那么这些类型的内容放入一个二维码中展示如何实现呢&#xff1f; …

白酒:制曲工艺的环境因素与微生物生态关系

在豪迈白酒的酿造过程中&#xff0c;制曲工艺是非常关键的一环。而环境因素与微生物生态关系对于制曲工艺的成功与否起着决定性的作用。云仓酒庄深谙此道&#xff0c;在制曲过程中注重环境因素的调控&#xff0c;并深入研究微生物生态关系&#xff0c;以提升豪迈白酒的品质和风…

Jmeter 命令启动 —— 动态参数化!

Jmeter命令行参数 1、在Linux中&#xff0c;使用非GUI的方式执行Jmeter。若需更改参数&#xff0c;必须先编辑jmx文件&#xff0c;找到对应变量进行修改&#xff0c;比较麻烦。 因此&#xff0c;可以参数化一些常用的变量&#xff0c;直接在Jmeter命令行进行设置 2、参数 -J…

draw.io设置矩形四个边的有无

第一步创建一个矩形 选中矩形&#xff0c;并编辑样式 然后在编辑框中输入 verticalLabelPositionbottom;verticalAligntop;html1;shapemxgraph.basic.rect;right1;将原来的内容覆盖掉 然后点击应用 然后发现 点击那四个设置就可以了

MyCAT集群——MyCAT2如何配置读写分离

先搭载MySQL一主两从 192.168.20.110MyCAT192.168.20.111Master192.168.20.112slave1192.168.20.113slave2 配置就不写了&#xff0c;比较基础&#xff0c;写一下步骤 1.进入mysql配置文件或者其子配置文件&#xff0c;添加server_id,开启gtidgtid_modeON,enforce-gtid-cons…

智慧公厕:改变城市公共卫生管理的未来

现代城市发展快速&#xff0c;人口不断增加&#xff0c;公共卫生管理面临着严峻的挑战。传统公厕的建设、管理和使用模式已经无法满足日益提高的卫生与环保需求。然而&#xff0c;随着科技的进步与智能化的发展&#xff0c;智慧公厕正成为一种全新的解决方案&#xff0c;为城市…

(十六)【Jmeter】取样器(Sampler)之测试活动(Test Action)

简述 操作路径如下: JMeter中的测试活动取样器实际上并不是一个具体的取样器类型,而是一种对测试计划中的多个取样器进行组合和执行的活动。常常被用作定时器,在某个请求之后等待多长时间。 参数说明 Logical Action on Thread(在线程上的逻辑操作) Pause Duration(mil…

Python知识汇总

重要链接&#xff1a; matplotlib库&#xff1a;matplotlib — Matplotlib 3.5.1 documentation DataFrame库&#xff1a;DataFrame — pandas 2.2.1 documentation (pydata.org) Python Matplotlib 实现散点图、曲线图、箱状图、柱状图示例&#xff1a;Python Matplotlib 实…

计算机网络-网络安全(二)

1.应用层安全协议&#xff1a; S-HTTP或SHTTP&#xff08;Sec HTTP&#xff09;&#xff0c;安全超文本传输协议&#xff0c;是HTTP扩展&#xff0c;使用TCP的80端口。HTTPS&#xff1a;HTTPSSL&#xff0c;使用TCP的443端口。和TLS&#xff08;传输层安全标准&#xff09;是双…

Linux conntrack和iptables技术解析

Linux虚拟文件系统管理技术 1. netfilter解析1.1 netfilter的基础原理1.2 netfilter的相关hook 2. conntrack解析2.1 conntrack的基础原理2.2 conntrack的表记录解析 3. iptables解析3.1 iptables基础原理3.2 融合conntrack表的iptables规则 4. 疑问和思考4.1 conntrack和iptab…

从零开始学单片机,该怎么入门?

从零开始学单片机&#xff0c;该怎么入门&#xff1f; 在开始前我分享下我的经历&#xff0c;我刚入行时遇到一个好公司和师父&#xff0c;给了我机会&#xff0c;一年时间从3k薪资涨到18k的&#xff0c; 我师父给了一些 电气工程师学习方法和资料&#xff0c;让我不断提升自己…

神经网络推理优化方法总结

&#x1f380;个人主页&#xff1a; https://zhangxiaoshu.blog.csdn.net &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️&#xff0c;如有错误敬请指正! &#x1f495;未来很长&#xff0c;值得我们全力奔赴更美好的生活&…

C语言操作符详解(一)

一、操作符的分类 • 算术操作符&#xff1a; 、- 、* 、/ 、% • 移位操作符:<< >> • 位操作符: & | ^ • 赋值操作符: 、 、 - 、 * 、 / 、% 、<< 、>> 、& 、| 、^ • 单⽬操作符&#xff1a; &#xff01;、、--、&、*、、…

Android Studio开发(一) 构建项目

1、项目创建测试 1.1 前言 Android Studio 是由 Google 推出的官方集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Android 应用程序。 基于 IntelliJ IDEA: Android Studio 是基于 JetBrains 的 IntelliJ IDEA 开发的&#xff0c;提供了丰富的功能和插件…