【蓝桥杯-单片机】基础模块LED和按键

文章目录

  • 【蓝桥杯-单片机】Led、按键等基础模块
    • 01 前置准备
      • (1)新建工程
      • (4)编写程序
    • 02 基础模块:LED
      • (0)LED原理图
      • (1)对P1整体赋值,控制所有的LED灯
      • (2)对P1中的的8个IO口单独复制,控制单个LED灯
      • (3)控制LED灯闪烁
        • 实现原理
        • 延时函数
          • 延时函数的生成
          • 自定义延时函数
      • (4)LED流水灯
        • 方法一:通过给P1口赋不同的值从而达到流水灯的效果
        • 方法二:通过内置函数库实现流水灯效果
    • 03 基础模块:按键(KEY)
      • (1)用KEYX控制LEDX的亮灭
        • 按键消抖
      • (2)用按键控制流水灯的运行速度

【蓝桥杯-单片机】Led、按键等基础模块

01 前置准备

(1)新建工程

  • 每个不同的工程项目对应一个不同的文件夹
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 芯片选择AT89C52
    在这里插入图片描述

  • 点开品字工具栏,修改相关信息
    在这里插入图片描述

  • 点开魔术棒,勾选生成HEX文件
    在这里插入图片描述

(4)编写程序

  • 右键点击User栏添加用户主程序(main.c)
    在这里插入图片描述
  • 右键引用51头文件
    在这里插入图片描述
  • 编写程序主体框架
  • 按照原理图编写程序
  • 烧录程序
    在这里插入图片描述
    原理图:
    在这里插入图片描述

02 基础模块:LED

(0)LED原理图

在这里插入图片描述
在这里插入图片描述

(1)对P1整体赋值,控制所有的LED灯

#include <REGX52.H>

void main()
{
	while(1)
	{
		P1 = 0x5F;//0101 1111
	}
}

在这里插入图片描述

(2)对P1中的的8个IO口单独复制,控制单个LED灯

#include <REGX52.H>

void main()
{
	while(1)
	{
		//P1 = 0x5F;//0101 1111
		P1_2 = 0;//点亮第3个灯
	}
}

在这里插入图片描述

(3)控制LED灯闪烁

实现原理

通过不断给P1端口赋高低电平,实现LED灯的开与关,从而达到闪烁的目的

延时函数

在单片机代码中,每次执行一条代码是很快的,也就几微秒左右,那有时候我们想让某一条代码执行后等待一阵子,再去执行下一条,这时候就需要用到延时函数

延时函数的生成
  • 打开STC-ISP烧录工具
  • 打开软件延时计算器
  • 系统频率选择12MHz,定时长度选择500毫秒,指令集选择STC-Y1
  • 生成C代码,粘贴至工程文件中,并删除nop语句
    在这里插入图片描述
自定义延时函数

在这里插入图片描述
延时1ms的代码

void Delay1ms()		//@12.000MHz
{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}

自定义的延时函数:

//自定义延时函数
void Delay(unsigned int x)		//@12.000MHz
{
	unsigned char i, j;

	while(x--)
	{
		i = 2;
		j = 239;
		do{
			while(--j);
		}while(--i);
	}
}

例如:x传入的值为1000,则这个延时函数实现了延时1s的功能。

(4)LED流水灯

方法一:通过给P1口赋不同的值从而达到流水灯的效果
方法二:通过内置函数库实现流水灯效果
  • crol:循环左移
  • cror:循环右移
  • 所属库:intrins.h

以下代码通过定义变量time实现了让流水灯越流越快的功能:

void main()
{
	while(1)
	{
		P1 = Led;
		Led = _crol_(Led,1);
		Time = Time - 100;
		Delay(Time);		
	}
}

03 基础模块:按键(KEY)

(1)用KEYX控制LEDX的亮灭

按键消抖
Key_Val = Key_Read();//读取键码值
Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
Key_Old = Key_Val;//扫描辅助变量
//按键读取函数
unsigned char Key_Read()
{
	unsigned char temp = 0;
	if(P3_4 == 0) temp = 1;
	if(P3_5 == 0) temp = 2;
	if(P3_6 == 0) temp = 3;
	if(P3_7 == 0) temp = 4;
	return temp;
}
//变量声明区域
unsigned char Led = 0xfe;//LED数据变量
unsigned int Time = 1000;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键扫描变量


void main()
{
	while(1)
	{
		Key_Val = Key_Read();//读取键码值
		Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
		Key_Old = Key_Val;//扫描辅助变量
		
		switch(Key_Down)
		{
			case 1:
				P1_0 = 0;//按键1控制第1个Led亮
			break;
			
			case 2:
				P1_1 = 0;//按键2控制第2个Led亮
			break;
			
			case 3:
				P1_0 = 1;//按键3控制第1个Led灭
			break;
			
			case 4:
				P1_1 = 1;//按键4控制第2个Led灭
			break;
		}
	}
}

(2)用按键控制流水灯的运行速度

//按键读取函数
unsigned char Key_Read()
{
	unsigned char temp = 0;
	if(P3_4 == 0) temp = 1;
	if(P3_5 == 0) temp = 2;
	if(P3_6 == 0) temp = 3;
	if(P3_7 == 0) temp = 4;
	return temp;
}
//变量声明区域
unsigned char Led = 0xfe;//LED数据变量
unsigned int Time = 1000;
unsigned char Key_Val,Key_Down,Key_Up,Key_Old;//按键扫描变量
bit Flag = 0;

void main()
{
	while(1)
	{
		Key_Val = Key_Read();//读取键码值
		Key_Down = Key_Val & (Key_Val ^ Key_Old);//检测下降沿
		Key_Up = ~Key_Val & (Key_Val ^ Key_Old);//检测上升沿
		Key_Old = Key_Val;//扫描辅助变量
		
		P1 = Led;
		if(Flag == 1){
			Delay(Time);
			Led = _crol_(Led,1);
		}
		
		switch(Key_Down)
		{
			case 1:
				Flag = 1;//流水灯运行
			break;
			
			case 2:
				Flag = 0;//流水灯暂停
			break;
			
			case 3:
				Time = Time -100;//加速
			break;
			
			case 4:
				Time = Time + 100;//减速
			break;
		}
	}
}

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

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

相关文章

【C++】函数模板和类模板

目录 1.泛型编程 2.函数模板 2.1函数模板的定义格式 2.2函数模板的实例化 2.3函数模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 3.3模板的分离编译 1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段…

Linux——文件重定向

目录 前言 一、重定向 二、重定向的运用 三、dup2 四、命令行中的重定向 五、为什么要有标准错误 前言 在之前我们学习了文件标识符&#xff0c;直到close可以使用文件标识符进行关闭&#xff0c;但是当我们关闭1号&#xff08;stdout&#xff09;时&#xff0c;无法往显…

java 哨兵线性搜索

顾名思义&#xff0c;哨兵线性搜索是线性搜索的一种&#xff0c;与传统线性搜索相比&#xff0c;比较次数减少了。在传统的线性搜索中&#xff0c;仅进行N次比较&#xff0c;而在哨兵线性搜索中&#xff0c;哨兵值用于避免任何越界比较&#xff0c;但没有专门针对正在搜索的元素…

springMVC自定义类型转换

目录 &#x1f34b;&#x1f34a;自定义的转换类 &#x1f34b;&#x1f34a;xml文件中添加配置 &#x1f34b;&#x1f34a;测试 SpringMVC 底层已经封装了很多的类型转换器&#xff0c;也就是为什么我们页面上传的字符串可以使用 Integer接收或者可以直接转换为数组的原因…

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…

高级语言讲义2010计专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

JavaWeb--Mybatis

一&#xff1a;Mybatis概述 1.Mybatis概念 MyBatis 是一款优秀的 持久层框架 &#xff0c;用于简化 JDBC 开发&#xff1b; MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code&#xff0c;并且改名为 MyB…

《Effective Modern C++》- 极精简版 15-21条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective Modern C》- 极精简版 5-14条。本文列出《Effective Modern C》的15-21条的个人理解的极精简版本。 Item15、尽量使用constexpr constexpr形容对象 constexpr对象都是const&#xff0c;但是const对象不一定是conste…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

C++篇 语 句

到目前为止&#xff0c;我们只见过两种语句&#xff1a; return 语句和表达式语句。根据语句对执行顺 序的影响&#xff0c;C 语言其余语句大多属于以下 3 大类。 选择语句&#xff1a; if 语句和 switch 语句。循环语句&#xff1a; while 语句&#xff0c; do...while 语句和…

SSH移植到BusyBox

手动编译SSH安装挺麻烦的&#xff0c;本文主要是我大量借鉴和实践总结出来的流程&#xff0c;一步一按照做不会有太大问题。 移植平台&#xff1a;IMX6UL(迅为开发板) 根文件系统&#xff1a;BusyBox 所有操作都建议不要在root账户下运行&#xff0c;并且make install的安装路…

【FFmpeg】ffmpeg 命令行参数 ⑤ ( 使用 ffmpeg 命令提取 音视频 数据 | 保留封装格式 | 保留编码格式 | 重新编码 )

文章目录 一、使用 ffmpeg 命令提取 音视频 数据1、提取音频数据 - 保留封装格式2、提取视频数据 - 保留封装格式3、提取视频数据 - 保留编码格式4、提取视频数据 - 重新编码5、提取音频数据 - 保留编码格式6、提取音频数据 - 重新编码 一、使用 ffmpeg 命令提取 音视频 数据 1…

《2024国家自然科学基金青年基金》 相关申请注意事项解读

一 年龄计算 2004 对应 89 2005 对应 90 2006 对应 91 2007 对应 92 2008 对应 93 2009 对应 94 2010 对应 95 .。。 二 资助比例&#xff08;2023&#xff09; 2024年 23.13% 2023年 24% 三 2024年政策变动&#xff0c;只能申请3年的30万&#xff0c;不能像23年一样选择10-20的…

【二十九】springboot高并发示例

本章演示在springboot项目中的高并发demo&#xff0c;演示导致的问题&#xff0c;以及单机部署下的解决方案和集群部署下的解决方式以及分布式下的解决方案。 目录 一、单机模式下高并发问题 二、集群模式下高并发问题 一、单机模式下高并发问题 前提&#xff1a;先写一个减扣…

TI IWR6843ISK ROS驱动程序搭建

1、设备准备 1.1 硬件设备 1&#xff09;TI IWR 6843 ISK 1块 2&#xff09;Micro USB 数据线 1条 1.2 系统环境 1&#xff09;VMware Workstation 15 Player 虚拟机 2&#xff09;Ubuntu18.04 并安装有 ROS1 系统 如若没有安装 ROS 系统&#xff0c;可通过如下指令进行…

腾讯云轻量服务器流量用完了怎么办?停机吗?

腾讯云轻量服务器流量用完了怎么办&#xff1f;超额流量另外支付流量费&#xff0c;流量价格为0.8元/GB&#xff0c;会自动扣你的腾讯云余额&#xff0c;如果你的腾讯云账号余额不足&#xff0c;那么你的轻量应用服务器会面临停机&#xff0c;停机后外网无法访问&#xff0c;继…

深入了解XSS攻击:原理、防御与应对策略

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

结构体内存对齐详解

目录 结构体对齐&#xff1a; 为什么要进行内存对齐&#xff1f; 关于结构体的详解文章&#xff1a;C语言结构体详解_结构体变量和结构体类型举例-CSDN博客 结构体对齐&#xff1a; 存储的时候和当前存储的成员类型字节大小和默认对齐数比较&#xff0c;取小值 存在该对齐数的…

PodMan容器技术

容器 容器技术 软件应用通常依赖于运行时环境提供的系统库、配置文件或服务。传统上&#xff0c;软件应用的运行时环境安装 在物理主机或虚拟机上运行的操作系统中。 然后&#xff0c;管理员在操作系统上安装应用依赖项。 在RHEL中&#xff0c;诸如 RPM 等打包系统可协助管…

Docker MySQL 报 2059 错误:认证插件 ‘caching_sha2_password‘ 无法加载

使用docker部署的mysql8.0.29再使用Navicat连接myslq报错Authentication plugin ‘xxxxxxx’ cannot be loaded&#xff1a;XXXXXX &#xff08;无法加载身份验证插件&#xff09; 原因&#xff1a;mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规…