学习笔记|课后练习解答|电磁炉LED实战|逻辑运算|STC32G单片机视频开发教程(冲哥)|第八集(下):课后练习分析与解答

news2025/1/14 1:09:28

课后练习解答

增加按键3,按下后表示启动,选择的对应的功能的LED持续闪烁,表示正在工作,且在工作的时候无法切换功能。
在这里插入图片描述

需求分解

  • 1 增加按键3
#define KEY3 P34  //增加按键3
  • 2 按下后表示启动 电平控制
  • 3 工作状态锁定
    表示正在工作,且在工作的时候无法切换功能。
    该功能需要检测的标志位,且工作的时候无法进行切换。
    增加:bit Run_Now = 0; //0停止工作 1 开始工作。

增加KEY3控制代码如下:

/*=======================按下按键3,执行本段代码=====================*/
		if (KEY3 == 0)    //必须是按键按下才会执行以下代码,key3被点击,灯在一闪一闪的时候,KEY3非按下模式
		{
			delay_ms(10);  //防抖
			if (KEY3 == 0)
			{
				while(KEY3 == 0);	//等待按键松开,将要执行按下蜂鸣
				if(Run_Mode > 0)   //表示有模式,已经选择了模式,Run_Mode=0时,未选择模式,不执行
				{
					BEEP = 0;		//打开蜂鸣
					delay_ms(10);   //延迟10ms
					BEEP = 1;		//关闭蜂鸣
					Run_Now = !Run_Now; //运行和停止之间的切换
				}

			}

		}
		if( Run_Now = 1)   //正在运行
		{
			P2 = 0XFF; 	//全部熄灭
			delay_ms(200);   //延迟200ms
			P2 = ~(1<< (Run_Mode - 1));	//点亮这个灯
			delay_ms(200);   //延迟200ms
		}
		else  			//停止运行时,没有工作,灯和上面的一样
		{
			P2 = ~(1<< (Run_Mode - 1));
		}

按动KEY2后,0位LED持续闪烁,不能实现既定功能。

第一版代码问题分析

与编译提示的“ warning C137: constant in condition expression”有关,这里应该是判断,不是赋值。修改。
调整后,可以控制状态等闪动,但是接着按KEY2,移动不受影响,有逻辑错误,继续排查。
即工作的时候,功能无法切换没有实现。工作状态,变量Run_Now为1,而KEY2能切换的前提是Run_Now状态为0,所以增加条件限制:“if(Run_Now == 0) //Run_Now状态为0(未工作)时才能切换”。
另外,代码KEY2松开后才能执行,实际运行中,按下后有没有松开不太确定,改成按下就执行,等到它松开,调整while循环的位置到最后:while(KEY3 == 0); //等待按键松开,将要执行按下蜂鸣
KEY1,KEY2也可根据调整。
注意:if …else可看做是一个整体,中间不能加入其他保留字,如while等。
编译,写入开发板,下载成功,功能正常。

Tips:STC-ISP的设置

可保存,方便调用:

在这里插入图片描述
按键需要按的稍微久一点,原因后期课程会分析,讲定时器的时候优化。

Tips:定时器

参考链接:单片机定时器工作原理是什么单片机定时器工作方式有哪些
在这里插入图片描述

使用单片机时经常用到一个元件,那就是单片机定时器,单片机定时器的作用主要是在发生软件故障时,通过使器件复位(如果软件未将器件清零)将单片机复位,也可以用于将器件从休眠或空闲模式唤醒,还能用做精确延时处理,常被应用于时间控制、程序延时、对外部时间计数和检测等工作范围内。那么单片机定时器原理是什么呢?
单片机定时器,其实质是一个计数器,脉冲每一次下降沿,计数寄存器数值将加1,如果计数的脉冲是来源于单片机内部的晶振,由于其周期极为准确,则称为定时器;如果计数的脉冲来源于单片机外部的引脚,由于其周期一般不准确,则称为计数器。
单片机定时器工作方式有哪些
单片机定时器的工作方式有很多,大致可分为以下几种:1、方式0
方式0为13位计数,由TLO的低5位(高3位未用)和THO的8位组成TLO的低5位溢出时向THO进位,THO溢出时,置位TCON中的TFO标志,向CPU发出中断请求。
2、方式1
方式1的计数位数是16位,由TLO(TL1)作为低8位、THO(TH1 )作为高8位,组成了16位加1计数器。3、方式2
方式2为自动重装初值的8位计数方式。在方式2下,当定时器计满255( FFH)溢出时,CPU自动把TH的值装入TL中,不需用户干预,比较适合于用作较精确的脉冲信号发生器。
4、方式3
方式3只适用于定时器/计数器TO,定时器T1方式3时相当于TR1=0,停止计数。方式3将TO分成为两个独立的8位计数器TLO和THO。

实现完整电磁炉显示功能的代码

void Test(void)   //电磁炉的功能
{
		if (KEY1 == 0)   //开关机键
		{
			delay_ms(1000);  //长按1s开机
			if (KEY1 == 0)
			{
/*=======================还没有开机的情况下,执行本段代码=====================*/
				if (Run_Flag == 0)  //表示还没有开机
				{
					Run_Flag = 1;   //开机变量改为1,表示已经开机
					BEEP = 0;		//打开蜂鸣
					delay_ms(10);   //延迟10ms
					BEEP = 1;		//关闭蜂鸣
					P40 = 0;		//打开了LED总电源
					P2 = 0X00;		//全部点亮
					delay_ms(300);   //延迟200ms
					P2 = 0XFF; 		//全部关闭
				}
				else
				{
					Run_Flag = 0;   //标记已关机
					BEEP = 0;		//打开蜂鸣(提醒)
					delay_ms(10);   //延迟10ms
					BEEP = 1;		//关闭蜂鸣
					P2 = 0XFF;		//状态指示全部关闭
					P40 = 1;		//关闭总电源LED
					Run_Mode = 0;   //模式清零
					Run_Now = 0;	//运行状态清零(改成停止)
				}
				while(KEY1 == 0);	//按钮按下,先执行并等待按钮松开

			}

		}
/*=======================按下按键2,执行本段代码=====================*/
		if (KEY2 == 0 && Run_Flag == 1 )   //切换模式,且处于开机状态,状态选择键有效
		{
			delay_ms(10);  //防抖
			if (KEY2 == 0)
			{
					if (Run_Now == 0)	//Run_Now状态为0(未工作)时才能切换
					{
						BEEP = 0;		//打开蜂鸣
						delay_ms(10);   //延迟10ms
						BEEP = 1;		//关闭蜂鸣
						Run_Mode++;		//每次按下,模式+1(移至下一个led)
						if (Run_Mode > 8)  //如果模式大于8,回到模式1
							Run_Mode = 1;  //Run_Mode超过8后清零,回到第一个灯
						//错误写法,执行结果是8个灯中仅1个不亮
													//灯是低电平点亮,1<< Run_Mode,即1<<1,左移以后为0000 0010,仅1个LED灭,继续左移,尾部补0,还是只有1个LED灭
													//解决方法:RunMode先减1,再左移,最后全部取反。这里用~为全取反。而!是位取反。
															//P2 = 0XFX;  P6<< 1 + 1;  也可以实现
						P2 = ~(1<< (Run_Mode - 1));
					}
					while(KEY2 == 0);	//按钮按下,并等待按钮松开
			}

		}
/*=======================按下按键3,执行本段代码=====================*/
		if (KEY3 == 0)   //必须是按键按下才会执行以下代码,key3被点击,灯在一闪一闪的时候,KEY3非按下模式
		{
			delay_ms(10);  //防抖
			if (KEY3 == 0)
			{
				if(Run_Mode > 0 )   //表示有模式,已经选择了模式且处在开机状态下,Run_Mode=0时,未选择模式,不执行
				{
					BEEP = 0;		//打开蜂鸣
					delay_ms(10);   //延迟10ms
					BEEP = 1;		//关闭蜂鸣
					Run_Now = !Run_Now; //运行和停止之间的切换
				}
				while(KEY3 == 0);	//等待按键松开,先执行
			}
		}
		if( Run_Now == 1)   //正在运行
		{
			P2 = 0XFF; 	//全部熄灭
			delay_ms(200);   //延迟200ms
			P2 = ~(1<< (Run_Mode - 1));	//点亮这个灯
			delay_ms(200);   //延迟200ms
		}
		else  			//停止运行时,没有工作,灯和上面的一样
		{
			P2 = ~(1<< (Run_Mode - 1));
		}
}

测试流程

先KEY1开机蜂鸣一声LED点亮
切换模式KEY2(需处于开机状态下)
按一下KEY3,当前LED闪(在当前模式下运行),运行状态下,切换模式短按长按都失效
再按一下KEY3,LED停闪(运行停止),可以切换模式。
后期学完定时器的章节,再解决按键反应迟钝的问题。或者学完数码管以后,既可以修理一下。

总结

厘清正常、简单的逻辑。疯狂的在用if和else做一个判断。

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

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

相关文章

IDEA项目实践——mybatis实践,创建一个父目录专门存放mybatis项目

系列文章目录 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍_intellij 创建scala IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映…

方案:AI边缘计算智慧工地解决方案

一、方案背景 在工程项目管理中&#xff0c;工程施工现场涉及面广&#xff0c;多种元素交叉&#xff0c;状况较为复杂&#xff0c;如人员出入、机械运行、物料运输等。特别是传统的现场管理模式依赖于管理人员的现场巡查。当发现安全风险时&#xff0c;需要提前报告&#xff0…

【SpringSecurity】四、登录处理器

文章目录 1、登录成功处理器2、登录失败处理器3、无权限处理器4、登出&#xff08;退出&#xff09;处理器5、安全配置类WebSecurityConfig 前后端分离背景下&#xff0c;前后端通过json进行交互&#xff0c;登录成功或失败&#xff0c;返回的不是一个html页面&#xff0c;而是…

python 基础篇 day 2 基本输入输出转换

文章目录 输入函数——input()原型示例注意 输出函数——print()原型示例 数据类型转换转换路径图示格式举例int(x)float(x)bool(x) 注意 格式化输出法一&#xff1a;%格式 类型表举例第二种&#xff1a;format格式类型表举例第三种&#xff1a;f &#xff08;format简化版&…

论文速递 Nature 2023 | Heat-assisted detection and ranging

注1:本文系“计算成像最新论文速览”系列之一,致力于简洁清晰地介绍、解读非视距成像领域最新的顶会/顶刊论文(包括但不限于 Nature/Science及其子刊; CVPR, ICCV, ECCV, SIGGRAPH, TPAMI; Light‐Science & Applications, Optica 等)。 本次介绍的论文是: 2023年,Nature,“…

2023年国赛 高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 最短时…

6个比较火的AI绘画生成工具

随着人工智能技术的发展&#xff0c;市场上出现了越来越多的人工智能图像生成工具。这些人工智能图像生成工具可以自动创建惊人的图像、艺术作品和设计&#xff0c;以帮助设计师和创意人员更快地实现他们的创造性想法。在本文中&#xff0c;我们将推荐7种最近流行的人工智能图像…

Michael.W基于Foundry精读Openzeppelin第30期——ECDSA.sol

Michael.W基于Foundry精读Openzeppelin第30期——ECDSA.sol 0. 版本0.1 ECDSA.sol 1. 目标合约2. 代码精读2.1 toEthSignedMessageHash(bytes32 hash) && toEthSignedMessageHash(bytes memory s)2.2 toTypedDataHash(bytes32 domainSeparator, bytes32 structHash)2.3…

Just KNIME it[S2C21] 图像识别

朋友们&#xff0c;Just KNIME it 还有在跟进吗? 本季已经到 21 期啦。 本期探讨的主题是图像识别问题&#xff0c;快随指北君一起看看吧。 挑战 21&#xff1a;帮助球童&#xff08;第 1 部分&#xff09; 级别&#xff1a;中 描述&#xff1a;球童汤姆是一位最受欢迎的高尔夫…

thinkphp6.0 配合shell 脚本 定时任务

1. 执行命令&#xff0c;生成自定义命令 php think make:command Custom<?php declare (strict_types 1);namespace app\command;use app\facade\AdmUser; use think\console\Command; use think\console\Input; use think\console\input\Argument; use think\console\i…

第 6 章 递归(3)(八皇后问题)

6.7递归-八皇后问题(回溯算法) 6.7.1八皇后问题介绍 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a;在88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c…

堆内存和栈内存的区别

什么是栈内存&#xff1f; 栈内存是为线程流出来的临时空间&#xff0c;每一个线程都有它的临时空间&#xff0c;而且每一个栈都只能被当前的线程访问。 所以它是线程安全的。栈内存的分配和回收是由系统完成的。 当函数调用的时候 系统就会为这个函数分配栈空间&#xff0c;当…

国产化kylin配置网络不通解决方案—1

kylin镜像自行官网下载 kylin系统安装外网不通配置 进入vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno IPV6INITyes IPV6_AUTOCONFyes IPV6_DEFROUTEyes IPV6_FAILURE_FAT…

虚拟化技术——存储虚拟化

概念 通过虚拟化技术&#xff0c;把存储资源整合到一起后对外提供服务&#xff0c;同时实现数据安全性、容量提升、性能提升等效果。 存储资源整合对象 多套存储 多颗硬盘 多个盘符 数据安全性 容量提升 性能提升 对象及实现技术 磁盘虚拟化 保护数据安全&#xff0…

国内ChatGPT对比与最佳方案

很久没写内容了&#xff0c;主要还是工作占据了太多时间。简单分享下我这段时间的研究吧,由于时间仓促&#xff0c;有很多内容没有具体写&#xff0c;请自行到我分享的网站体验查看。 前言 ChatGPT 的出现确实在很大程度上改变了世界。许多人已经亲身体验到了ChatGPT作为一个…

Nacos简述

介绍 ​ Nacos主要在微服务生态中可以发现、配置和管理微服务&#xff0c;实现动态服务发现和注册、服务配置、DNS服务、服务元数据及流量管理。 ​ 目前Nacos支持多种生态&#xff0c;比如SpringCloud、Dubbo、云原生Cloud Native等。 Nacos关键特性 1、服务发现和服务健康…

Golang面向对象:封装 继承 多态

面向过程转换到面向对象&#xff0c;那么必然会涉及到几个特性&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;那么Golang中的面向过程会有什么特性&#xff1f;那我们来仔细说一说&#xff1a; 封装&#xff1a; 首先要一个类的概念&#xff0c;类就像一下工厂…

BATPowerShell实现本地文件自动上传FTP服务器

运维工作中&#xff0c;经常需要一些脚本来实现自动化&#xff0c;今天分享本地文件自动上传FTP的两种解决办法&#xff1a; 一、使用BAT自动上传FTP 使用批处理&#xff08;BAT&#xff09;命令文件将本地文件夹内容上传到FTP服务器需要使用Windows自带的命令行工具&#xf…

使用mysql:5.6和 owncloud 镜像,构建一个个人网盘

一.拉取镜像 docker pull mysql:5.7 docker pull owncloud 二.创建容器 1.MySQL容器 docker run -d --name db1 -p 3306:3306 -e MYSQL_ROOT_PASSWORD123456. -e MYSQL_DATABASEowncloud -e MYSQL_USERowncloud -e MYSQL_PASSWORDowncloud mysql:5.7 docker run: 创建和运行…

2023年03月 C/C++(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题&#xff1a;和数 给定一个正整数序列&#xff0c;判断其中有多少个数&#xff0c;等于数列中其他两个数的和。 比如&#xff0c;对于数列1 2 3 4, 这个问题的答案就是2, 因为3 2 1, 4 1 3。 时间限制&#xff1a;10000 内存限制&#xff1a;65536 输入 共两行&#x…