【蓝桥杯-单片机】基础模块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 1111P1_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.hqwc.cn/news/525802.html

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

相关文章

Unity Shader实现UI流光效果

效果&#xff1a; shader Shader "UI/Unlit/Flowlight" {Properties{[PerRendererData] _MainTex("Sprite Texture", 2D) "white" {}_Color("Tint", Color) (1, 1, 1, 1)[MaterialToggle] PixelSnap("Pixel snap", float…

【react框架】跟我一起速读Next.js官方入门教学课程文档

文章目录 前言目录结构样式方案正常引入样式文件Tailwind方案CSS Modules方案clsx方案 文字和图片优化文字图片 Pages和Layout的机制PagesLayout 通过Link组件改变路由并且拆分打包提供Hooks通过Vercel创建数据未完待续... 前言 对于那些对Next.js一无所知的前端伙伴来说&…

CNC机加工引入复合机器人可以提高生产效率,降低成本

CNC加工企业在过去依赖大量的人工来完成生产线上的各项任务&#xff0c;包括CNC机床的上下料、物料搬运以及部分装配工作。然而&#xff0c;随着产能需求的不断增长和人工成本的持续上升&#xff0c;企业逐渐意识到自动化升级的重要性与迫切性。 面临的挑战与需求&#xff1a; …

Image Demoireing with Learnable Bandpass Filters

一、简介 标题:Image Demoireing with Learnable Bandpass Filters(https://openaccess.thecvf.com/content_CVPR_2020/papers/Zheng_Image_Demoireing_with_Learnable_Bandpass_Filters_CVPR_2020_paper.pdf) 期刊:CVPR 时间:2020 作者:Bolun Zheng, Shanxin Yuan, …

js【深度解析】代码的执行顺序

代码的分类 我们将每一句要执行的 js 代码当做一个任务&#xff0c;则 js 代码可以按照其执行方式的不同&#xff0c;按下图分类 同步任务&#xff1a;立即执行的代码异步任务&#xff1a;延迟执行的代码 微任务&#xff1a;被放入微任务队列&#xff08;micro task queue&…

数字化转型导师坚鹏:金融科技咨询方法论

金融科技咨询方法论 ——方法、做法、演法、心法 课程背景&#xff1a; 数字化转型背景下&#xff0c;很多机构存在以下问题&#xff1a; 不知道先进的金融科技咨询方法论&#xff1f; 不知道如何运作金融科技咨询项目&#xff1f; 不知道如何汇报咨询项目关键成果&…

机器学习第29周周报 Beyond Dropout

文章目录 week29 Beyond Dropout摘要Abstract一、泛化理论二、文献阅读1. 题目2. abstract3. 网络架构3.1 特征图失真3.2 失真优化 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 全连接层实验4.3.2 卷积网络上的实验 4.4 结论 小结参考文献 week29 Beyond Dropout …

练习ROS动作编程

ROS学习记录&#xff1a;动作编程 引言&#xff1a; ​ 通过本实验&#xff0c;我们将联系我们学过的动作编程&#xff0c;客户端发送一个运动目标,模拟小乌龟运动到目标位置的过程,包含服务端和客户端的代码实现&#xff0c;并且带有实时的位置反馈。 希望你在本次学习过后&am…

Java 可变长参数

可变长参数定义 从 Java5 开始&#xff0c;Java 支持定义可变长参数&#xff0c;所谓可变长参数就是允许在调用方法时传入不定长度的参数。可变长参数允许方法接受任意多个相同类型的参数&#xff0c;在方法内部可以将这些参数视为数组来处理。可变长参数通过省略号&#xff0…

vue 自定义组件绑定model+弹出选择支持上下按键选择

参考地址v-modelhttps://v2.cn.vuejs.org/v2/guide/components-custom-events.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%BB%84%E4%BB%B6%E7%9A%84-v-model 原文代码 Vue.component(base-checkbox, {model: {prop: checked,event: change},props: {checked: Boolean},template: `…

【SQL】550. 游戏玩法分析 IV (关键点:确定连续两次登录)

前述 常见函数用法示例&#xff1a; DATEDIFF(col1, col2) 1DATE_ADD(MIN(col), INTERVAL 1 DAY)ROUND(3.1415926,3) > 四舍五入得到 3.142 题目描述 leetcode原题&#xff1a;550. 游戏玩法分析 IV 思路 确定连续两次登录统计&#xff0c;保留两位小数 写法一 关键…

c语言,大宗撮合交易中心系统核心模块代码

撮合交易系统&#xff08;Matching System&#xff09;常用于大宗交易&#xff0c;如股票、期货等市场&#xff0c;它负责根据买卖双方的报价和数量&#xff0c;自动撮合成交。撮合系统的核心模块通常包括订单管理、价格计算和撮合逻辑等部分。 由于撮合系统的实现复杂且依赖于…