蓝桥杯-单片机组基础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个时钟序列,通过计数时钟序列,并于占空比进行比较确定输出高电平或者低电平。到计数值小于占空比时输出高电平,大于占空比时输出低电平。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯练习系统(算法训练)ALGO-993 RP大冒险

资源限制 内存限制&#xff1a;64.0MB C/C时间限制&#xff1a;200ms Java时间限制&#xff1a;600ms Python时间限制&#xff1a;1.0s 问题描述 请尽情使用各种各样的函数来测试你的RP吧~~~ 输入格式 一个数N表示测点编号。 输出格式 一个0~9的数。 样例输入 0 样…

设计模式-结构型模式-外观模式

外观模式&#xff08;Facade&#xff09;&#xff0c;为子系统中的一组接口提供一个一致的界面&#xff0c;此模式定义了一个高层接口&#xff0c;这个接口使得这一子系统更加容易使用。[DP] 首先&#xff0c;定义子系统的各个组件接口和具体实现类&#xff1a; // 子系统组件接…

Linux:gcc的基本知识

gcc 是一个将C语言文件变成可执行文件的工具。 在Linux中&#xff0c;如果需要将一个C语言文件变得可以执行&#xff0c;那么除了这个文件本身的内容是C语言编写的内容外&#xff0c;还需要gcc这个编译工具进行编译才行。 gcc 使用的格式方法:gcc 要编译的文件 //在该代码下…

云天励飞战略投资神州云海,布局机器人市场

日前,AI上市企业云天励飞(688343.SH)完成了对深圳市神州云海智能科技有限公司(以下简称“神州云海”)的B轮战略投资。 公开资料显示,自2015年于深圳创立以来,神州云海始终聚焦人工智能与服务机器人广阔的应用市场,依托自主的核心算法能力,深耕机器人硬件本体研发,整合上下游产…

Linux系统——LAMP架构

目录 一、LAMP架构组成 1.LAMP定义 2.各组件的主要作用 3.CGI和FastCGI 3.1CGI 3.3CGI和FastCGI比较 4.PHP 4.1PHP简介 4.2PHP的Opcode语言 4.3PHP设置 二、LAMP架构实现 1.编译安装Apache httpd服务 2.编译安装Mysql 3.编译安装PHP 4.安装论坛 5.搭建博客 W…

C++基于多设计模式下的同步异步日志系统day2

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C基于多设计模式下的同步&异步日志系统 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容实现了日志代码设计的实…

前端学习第三天-css基础

1. CSS简介 从HTML被发明开始&#xff0c;样式就以各种形式存在。不同的浏览器结合它们各自的样式语言为用户提供页面效果的控制。最初的HTML只包含很少的显示属性。 随着HTML的成长&#xff0c;为了满足页面设计者的要求&#xff0c;HTML添加了很多显示功能。但是随着这些功能…

nginx出现 “414 request-uri too large”

nginx出现 “414 request-uri too large” 1.修改传参方式 POST 2.字段能变成后端获取就自己获取&#xff0c;不用前端传 3.修改nginx配置&#xff0c;添加client_header_buffer_size 512k;large_client_header_buffers 4 512k;配置

机器学习 -- 梯度下降算法加深

梯度下降算法 在机器学习中&#xff0c;梯度下降算法常用于最小化代价函数&#xff08;或损失函数&#xff09;&#xff0c;以此来优化模型的参数。代价函数衡量的是模型预测值与实际值之间的差异。通过最小化这个函数&#xff0c;我们可以找到模型预测最准确的参数。 代价函…

qt 基于百度API的人脸识别

百度云官网&#xff1a;点击跳转 一、创建应用 跳转进去&#xff0c;可以看到以下界面&#xff1a; 点击红色圈内的“去创建”&#xff0c;创建自己的项目。可以看到以下界面&#xff1a; 输入“应用名称”&#xff0c;并勾选“人脸对比”&#xff0c;还要到页面的最后输入“应…

WPF 滑动条样式

效果图&#xff1a; 浅色&#xff1a; 深色&#xff1a; 滑动条部分代码&#xff1a; <Style x:Key"RepeatButtonTransparent" TargetType"{x:Type RepeatButton}"><Setter Property"OverridesDefaultStyle" Value"true"/&g…

MariaDB MaxScale实现mysql8读写分离

目录 1.MaxScale 是干什么的&#xff1f; 2.MaxScale 实验环境 3.实现数据库主从复制 4.创建用户 1) 创建监控用户 2) 创建路由用户 5.docker 安装MaxScale 6.配置maxscale 使用 maxctrl list servers 命令查看运行状态 查看注册服务 使用 maxctrl list listeners Read-…

k8s单机部署zookeeper

&#xff08;作者&#xff1a;陈玓玏&#xff09; 拉取镜像&#xff1a;docker pull zookeeper&#xff1b;编辑yaml&#xff1a; apiVersion: v1 kind: Service metadata:name: zookeeperlabels:app: zookeeper spec:ports:- name: clientport: 2181protocol: TCPtargetP…

H.266参考软件VTM各版本的性能差异

VTM&#xff08;VVC Test Model&#xff09;&#xff0c;是H.266视频编码标准的参考软件&#xff0c;即是VVC spec.的一种参考实现&#xff0c;代码里包括了H.266的软件编码器和软件解码器实现&#xff0c;代码地址如下&#xff1a; https://vcgit.hhi.fraunhofer.de/jvet/VVCS…

S1---FPGA硬件板级原理图实战导学

视频链接 FPGA板级实战导学01_哔哩哔哩_bilibili FPGA硬件板级原理图实战导学 【硬件电路设计的方法和技巧-哔哩哔哩】硬件电路设计的方法和技巧01_哔哩哔哩_bilibili&#xff08;40min&#xff09; 【高速板级硬件电路设计-哔哩哔哩】 高速板级硬件电路设计1_哔哩哔哩_bil…

外包干了3个月,技术倒退明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…

【C++ map和set】

文章目录 map和set序列式容器和关联式容器键值对setset的主要操作 mapmap主要操作 multiset和multimap map和set 序列式容器和关联式容器 之前我们接触的vector,list,deque等&#xff0c;这些容器统称为序列式容器&#xff0c;其底层为线性序列的的数据结构&#xff0c;里面存…

ChatGPT学习第四周

&#x1f4d6; 学习目标 ChatGPT实践操作 通过实际操作和练习&#xff0c;加深对ChatGPT功能的理解。 项目&#xff1a;创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目&#xff0c;将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货&#xff01;ChatGPT 从零完…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力&#xff1a; 从API…