HNU小学期BSP软件编程基础十道测试题

http://t.csdnimg.cn/Yv0R1 文章参考了这位大佬的代码,在他的基础上进行了纠错、完善等处理。

配置

编程前的准备工作按大佬的流程即可,稍有不同的是学习通课程网站的资料里没有头文件的整个压缩包了,但我们可以下载某个BSP版的工程文件,并在里面找到inc文件夹,里面包含所有头文件。

后面把这个文件夹复制到你想要的地方,然后配置的时候引用这个路径就好。

库文件也在刚刚的BSP版的工程文件里面的source里,选择全部文件类型才能看到库文件STCBSP_V3.6.LIB。

不同之处就以上两点,其余的按大佬文中的配置流程即可。

测试题(持续更新中)

1、Display: 在数码管指定位置显示指定内容。编写程序,在数码管显示"  12HL- 21" 。
#include "STC15F2K60S2.H"
#include "displayer.H" 
#include "sys.H"


code unsigned long SysClock=11059200L;        //必须。 (定义系统工作时钟频率,用户可以修改,且必须与实际工作频率(下载时选择的)一致

#ifdef _displayer_H_                          //显示模块选用时必须。(数码管显示译码表,用戶可修改、增加等) 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x77,0x7c,0x39,0x5e,0x79,0x78,0x76,0x38,0x54,0x5c,0x73,0x67,0x3e,0x6e};  
	              /* 序号:   0    1    2    3    4    5    6    7    8    9    10     11	 12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27 */
                  /* 显示:   0    1    2    3    4    5    6    7    8    9    (无)   下-  中-  上-   A    b    C    d    E    F    H    L    n    o    P    q    U    y */  
#endif



void main()
{  				
	
	displayerInit();                              
	LedPrint(0);
    SetDisplayerArea(0,6);                           
	Seg7Print(1,2,20,21,12,2,1);	 
	MySTC_Init();
	while(1)
		MySTC_OS();
}

按老师要求加上了其他一些字母的编码,修改在decode_table[]中。


2、按键:按下K1,数码管灯显示"H"。松开后灭掉。
#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H"            
#include "key.H" 

code unsigned long SysClock=11059200;

#ifdef _displayer_H_                          
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};
                 /* 序号:   0    1    2    3    4    5    6    7    8    9    10     11	 12   13   14   15  */
                 /* 显示:   0    1    2    3    4    5    6    7    8    9    (无)   下-  中-  上-   H    L  */  
 
#endif

char a=10;

void myKey_callback()
{ char k;
	k=GetKeyAct(enumKey1);
	if( k == enumKeyPress ) a=14;
	  else if( k == enumKeyRelease ) a=10;
	Seg7Print(10,10,10,10,10,10,10,a);}
}

void my10mS_callback(){
Seg7Print(10,10,10,10,10,10,10,a);}

void main(){
	 DisplayerInit();   
	 KeyInit(); 
	 LedPrint(0);
	 SetDisplayerArea(0,7);
	 //SetEventCallBack(enumEventSys10mS, my10mS_callback);
	 SetEventCallBack(enumEventKey, myKey_callback);
	 MySTC_Init();
	 while(1){
		 MySTC_OS();
	 }
}

在系统事件10ms即SetEventCallBack(enumEventSys10mS, my10mS_callback)那里进行了修改,去掉了那句语句,实际上对应的处理函数也可以去掉。因为系统事件10ms会耗费系统资源,不如只用按键事件,并对按键事件处理函数稍作修改即可。

同时注意,当前版本按键初始化KeyInit();中间没有下横线_

3、蜂呜器:开机后发出指定频率。开机后发出1.2KHz 1.8S的声音。
#include "STC15F2K60S2.H"
#include "sys.H"
#include "beep.H"

code unsigned long SysClock=11059200L;

int main(){
	
	BeepInit();
	SetBeep(1200,180);
	MySTC_Init();
	while(1)
		MySTC_OS();

}

暂无修改。

4、音乐:开机后A调,每分钟100拍,播放1、2、3、4、5 (给简谱)。
#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H" 
#include "Beep.H"
#include "music.H"

code unsigned long SysClock=11059200;

#ifdef _displayer_H_ 
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};
                 /* 序号:   0    1    2    3    4    5    6    7    8    9    10     11	 12   13   14   15  */
                 /* 显示:   0    1    2    3    4    5    6    7    8    9    (无)   下-  中-  上-   H    L  */  
 
#endif

code unsigned char arr[]={
	0x31,0x10,
	0x32,0x10,
	0x33,0x10,
	0x34,0x10,
	0x35,0x10};

int main(){
	  DisplayerInit();
	  LedPrint(0);
	  SetDisplayerArea(0,7);
	  BeepInit();
	  MusicPlayerInit();
	  SetPlayerMode(enumModePlay);
	  SetMusic(100,0xFA,arr,10,enumMscDrvSeg7andLed);
	  MySTC_Init();
	  while(1){
			MySTC_OS();
		}
	
}

增加了用7段数码管Seg7显示信息和用Led指示灯打拍的功能。

记得添加dispalyer模块,并且指定数码管范围即语句SetDisplayerArea(0,7);

数码管左侧显示每分钟拍数;右侧横线前的数字表示音调,如1代表A调等;横线后数字代表当前音是do、re、mi、fa、so、la、si中的哪一个,如1代表do等。

修改SetMusic(100,0xFA,arr,10,enumMscDrvSeg7andLed);的最后一个参数即可设置是否显示,具体可以看学习板说明文档。


5、秒表:数码管显示分、秒、毫秒。
#include "STC15F2K60S2.H"
#include "sys.H"
#include "displayer.H"  

code unsigned long SysClock=11059200L;

#ifdef _displayer_H_
code char decode_table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x08,0x40,0x01,0x76,0x38};   
                /* 序号:   0    1    2    3    4    5    6    7    8    9    10     11	 12   13   14   15  */
                /* 显示:   0    1    2    3    4    5    6    7    8    9    (无)   下-  中-  上-   H    L  */  
#endif

long min=0,sec=0,ms=0,temp=0;
char oput[8]={0};

void fun(){
	temp++;
	ms=temp;
	sec=(temp/1000)%60;
	min=temp/60000;
	oput[0]=ms%10;
	oput[1]=(ms/10)%10;
	oput[2]=(ms/100)%10;
	oput[3]=12;
	oput[4]=sec%10;
	oput[5]=(sec/10)%10;
	oput[6]=12;
	oput[7]=min;
	Seg7Print(oput[7],oput[6],oput[5],oput[4],oput[3],oput[2],oput[1],oput[0]);
}

int main(){
	DisplayerInit(); 	
	SetDisplayerArea(0,7);
	Seg7Print(1,1,1,1,1,1,1,1);
	LedPrint(0);
	SetEventCallBack(enumEventSys1mS, fun);
	MySTC_Init();
	while(1)
		MySTC_OS();
}

大佬的原代码中,sec=(temp/1000)%60000;这一行不太对,一分钟是60s,因此temp除了1000以后应该是对60取余而不是60000。

此外,大佬代码中的if(sec>59) sec=sec-60;也不对,由于上面他的代码是取余60000,所以sec可能会比59大,因此需要用到这个if。但是这又带来了另一个问题,就是如果上面计算得到的sec>=120的话,比如sec=121,if语句也只减了一个60,会导致数码管显示秒的部分在2分钟后变为从60开始,61、62、63...而不是从00开始,这也是个bug。

因此,简化代码即可。对应代码改为sec=(temp/1000)%60;并把后面的if语句删去,即可得到正确的逻辑。

由于数码管位数限制,这个程序只能显示10分钟以内的计时。

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

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

相关文章

北京大学长安汽车发布毫米波与相机融合模型RCBEVDet:最快能达到每秒28帧

Abstract 三维目标检测是自动驾驶中的关键任务之一。为了在实际应用中降低成本,提出了利用低成本的多视角相机进行3D目标检测,以取代昂贵的LiDAR传感器。然而,仅依靠相机很难实现高精度和鲁棒性的3D目标检测。解决这一问题的有效方法是将多视…

苍穹外卖--编辑员工和根据id查询员工信息

查询员工信息 编辑员工 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.dto.EmployeePageQueryDTO; import com.sky.entity.Employee; import com.sky…

Instruct-GS2GS:通过用户指令编辑 GS 三维场景

Paper: Instruct-GS2GS: Editing 3D Gaussian Splats with Instructions Introduction: https://instruct-gs2gs.github.io/ Code: https://github.com/cvachha/instruct-gs2gs Instruct-GS2GS 复用了 Instruct-NeRF2NeRF 1 的架构,将基于 NeRF 的三维场景编辑方法迁…

IDEA如何创建原生maven子模块

文件 -> 新建 -> 新模块 -> Maven ArcheTypeMaven ArcheType界面中的输入框介绍 名称:子模块的名称位置:子模块存放的路径名创建Git仓库:子模块不单独作为一个git仓库,无需勾选JDK:JDK版本号父项:…

C++ 是否变得比 C 更流行了?

每年都会出现一种新的编程语言。创造一种新语言来解决计算机科学中的挑战的诱惑很难抗拒。一些资料表明,目前有多达 2,500 种语言,这并不奇怪! 对于我们嵌入式软件开发人员来说,这个列表并不长。事实上,我们可以用一只…

【Linux】网络新兵连

欢迎来到 破晓的历程的 博客 ⛺️不负时光,不负己✈️ 引言 在上一篇博客中,我们简单的介绍了一些Linux网络一些比较基本的概念。本篇博客我们将开始正式学习Linux网络套接字的内容,那么我们开始吧! 1.网络中的地址管理 大家一…

uniapp安卓端实现语音合成播报

最初尝试使用讯飞语音合成方式,能获取到语音数据,但是数据是base64格式的,在安卓端无法播放,网上有说通过转成blob格式的url可以播放,但是uniapp不支持转换的api;于是后面又想其他办法,使用安卓插件播报原生安卓语音播报插件 - DCloud 插件市场 方案一(讯飞语音合成) 1.在讯飞…

分享一个Typecho博客系统专用的CloudFlare缓存规则,优化加速一下下!

好久都没有更新Typecho博客了,最近几天明月测试了一套适用于Typecho博客系统的CloudFlare缓存规则,经过近一周时间的测试确定有效,并且加速效果特别突出,今天就无偿分享给大家,也算是为国内Typecho生态添砖加瓦了吧! 总结下来,这套CloudFlare缓存规则带来的好处就是可以…

华为机试HJ108求最小公倍数

华为机试HJ108求最小公倍数 题目: 想法: 要找到输入的两个数的最小公倍数,这个最小公倍数要大于等于其中最大的那个数值,遍历最大的那个数值的倍数,最大的最小公倍数就是输入的两个数值的乘积 input_number_list i…

tableau饼图与环形图绘制 - 5

饼图与环形图绘制 1. 饼图绘制1.1 饼图绘制1.2 显示标签1.3 显示合计百分比1.4 设置百分比格式1.5 添加说明1.6 图像导出 2. 环形图绘制2.1 选择标记为饼图2.1 饼图绘制2.2 双饼图绘制2.3 设置大饼图大小2.4 设置双轴2.5 设置小饼图属性 1. 饼图绘制 酒店价格等级饼图 1.1 饼…

作业/数据结构/2024/7/8

链表的相关操作作业: 1】 按值修改 2】按值查找,返回当前节点的地址 (先不考虑重复,如果有重复,返回第一个) 3】 逆置(反转) 4】释放链表 main.c #include "head.h"int main(int argc, con…

品牌文化五大维度,构建品牌竞争力的秘诀!

品牌文化对于企业的发展和成功至关重要。 品牌文化不仅是企业和消费者之间的纽带,也是企业内部员工的凝聚力。 在当今竞争激烈的市场环境中,建立一个有活力和影响力的品牌文化是每个企业都需要认真思考和实践的事情。 品牌文化的五大维度包括价值观、…

VMware vSAN替换存储解决方案如何选择?

What is vSAN ? 是一款软件定义的企业存储解决方案,支持超融合基础架构系统。vSAN与VMware vSphere 完全集成在一起,作为ESXi Hypervisor内的分布式软件层,通过整合、池化ESXi各个主机上的存储资源,为vSphere虚拟化平…

医疗器械网络安全| 常见安全漏洞与防护措施

医疗器械网络安全顾问​https://link.zhihu.com/?targethttps%3A//www.wanyun.cn/Support%3Fshare%3D24315_ea8a0e47-b38d-4cd6-8ed1-9e7711a8ad5e 一、常见安全漏洞 医疗器械软件在现代医疗体系中扮演着至关重要的角色,然而,随着技术的不断发展&…

(2)滑动窗口算法练习:无重复字符的最长子串

无重复字符的最长子串 题目链接:3. 无重复字符的最长子串 - 力扣(LeetCode) 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是"a…

计算机网络知识汇总

目录 前言 概述 1、互联网的组成 2、端系统之间的两种通信方式 1、客户-服务器方式 2、对等连接方式(P2P) 3、交换技术 4、时延 5、利用率 6、协议 7、计算机网络体系结构 8、ISP 物理层 链路层 网络层 传输层 应用层 前言 最近准备找工作…

Linux 网络--TCP协议收包流程(NAPI机制)

Linux 网络--TCP协议收包流程(NAPI机制) 平台环境简介:宿主机: ubuntu18.04Linux内核源码版本: Linux-4.15网卡驱动: Intel e1000 (ubuntu 虚拟机默认网卡驱动)协议:TCP协议,本文分析收包过程 本…

Python编程学习笔记(3)--- 操作列表

1、遍历列表 遍历列表可以采用for循环的方法,需要对列表中的每一个元素都执行相同的操作。 具体事实如下: name ["ada","cdb","dbc","bad","jinb"] for Name in name:print(Name)运行结果&#x…

html H5 dialog弹窗学习,实现弹窗显示内容 替代confirm、alert

html H5 dialog弹窗学习,实现弹窗内容 替代confirm 框架使用的mui,使用mui.confirm() 弹窗内容过多时,弹窗被撑的到屏幕外去了,使用H5 dialog 标签自定义一个固定大小的弹窗,内容过多时可下拉显示 效果展示 隐私政策内容很多,可以下拉显示 代码 myDialog.css dialog{p…

tomcat 项目迁移,无法将项目作为服务service启动

背景 测试服务器需要迁移到正式服务器上,为了方便省事,将测试服务器上的一些文件直接复制到正式服务器 问题 使用startup启动项目之后,可以直接使用使用tomcat9w启动,或者作为服务service启动的时候,显示无法访问到资源…