嵌入式开发之51单片机入门(一)与LED灯的故事
得而不惜就该死。
--小泽
继续傻冒开始,这次的傻冒之旅是关于嵌入式的51单片机开发,这个系列只讲程序开发逻辑,如需初始环境安装配置,建议移步B站江协科技大佬,本系列也是对大佬所讲内容的复刻,同时添加一些自己的学习感受,权当自己的复习笔记了。废话不多,开始干!
一、点亮第一个LED
1、创建工程
1.1 Project->New
1.2 创建51Project文件夹,用于存放之后的项目文件
(此操作便于日后项目管理)
1.3 选择单片机型号:AT89C52
1.4 创建第一个C语言项目文件
简单初始程序
#include <REGX52.H>void main(){return;
}
快捷插入头文件
1.5 点亮第一个LED灯
那么我们该如何进行点亮,这里面的底层逻辑涉及到什么呢?首先看一看开发板的原理图。
这张图涉及到很多口,我们此时只关注右下角的21-28(p20-p27),这是用于连接LED的接口
在来看看LED灯的接口,LED的左侧接口与上述MCU的右下角一一对应,但是发现LED的右侧统一接上VCC电源正极,并且我们知道对于任何灯来说,需要在灯的两端接上正负,才能使其点亮。由于右侧恒为正,所以我们只需要控制p20-p27的正负就能控制这八个灯的点亮状态,而p20到p27的正负可以使用代码控制,0为负,1为正。
由于我们的目标是点亮一个LED灯,所以只需要将p20-p27任意一个设置为0即可,我们选择点亮p20处LED
修改后的代码
#include <REGX52.H>void main(){P2 = 0xFE; //1111 1110 //使用十六进制 标识:0xreturn;
}
1.6 运行生成
对keil5的一些简单配置
1.6.1 此设置能在build编译后生成HEX文件,用于后续板子测试
1.6.2 此设置编码格式,UTF-8能够兼容中文字体
1.6.2 控制设置代码字体大小
开始编译build
2、操作
2.1 选择板子类型和串口
对于串口,插上板子后会自动检测
2.2 打开程序文件,选中刚刚生成的HEX文件
2.3 下载源程序,查看结果
二、LED闪烁
1、创建工程
步骤和一同理,不再赘述,说一个区别,在51Project文件夹中创建2-2 LED闪烁,保存即可,其余操作均一致。
选择单片机型号:AT89C52
1.1 初始工程模样
1.2 编程
根据我们实验一的描述, LED为正负则亮,0 1分别表示正负,所以控制LED闪烁则需要控制0 1交替变换,代码如下
#include <REGX52.H>void main(){while(1){P2 = 0xFE;//p20Ϊ0ʱ ÁÁP2 = 0xFF;//p20Ϊ1ʱ °µ}return;
}
但是按照此逻辑去下载程序,我们观察到单片机板子的p20恒亮,这是因为单片机切换速度太块,导致肉眼就看不出变化所以我们借助stc-isp.exe去生成停顿函数,控制切换速度。
设置如下
系统频率:12MHz
定时长度:500毫秒
8051指令集:STC-Y1
1.3 编译代码
修改后代码:
#include <REGX52.H>
#include <INTRINS.H>void Delay500ms() //@12.000MHz
{unsigned char i, j, k;//_nop_()函数在INTRINS.H头文件中_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);
}void main(){while(1){P2 = 0xFE;//p20Ϊ0ʱ ÁÁDelay500ms();P2 = 0xFF;//p20Ϊ1ʱ °µDelay500ms();}return;
}
在编译前我们设置输出文件HEX
开始编译
2、操作
2.1单片机类型:STC89C52RC/LE52RC
2.2串口号:插入板子后自动识别
2.3打开源文件程序
2.4下载/编程
2.5查看结果
三、LED流水线
1、创建工程
创建工程同上,不在赘述。
选择单片机型号:AT89C52。
1.1 工程结构
1.2 代码如下:
#include <REGX52.H>
#include <INTRINS.H>void Delay500ms() //@12.000MHz
{unsigned char i, j, k;_nop_();i = 4;j = 205;k = 187;do{do{while (--k);} while (--j);} while (--i);
}void main(){while(1){P2 = 0xFE; //1111 1110 Delay500ms();P2 = 0xFD; //1111 1101Delay500ms();P2 = 0xFB; //1111 1011Delay500ms();P2 = 0xF7; //1111 0111Delay500ms();P2 = 0xEF; //1110 1111Delay500ms();P2 = 0xDF; //1101 1111Delay500ms();P2 = 0xBF; //1011 1111Delay500ms();P2 = 0x7F; //0111 1111Delay500ms();}return;
}
1.3勾选output HEX输出
1.4编译
2、操作
同一和二中的操作。
2.1单片机类型:STC89C52RC/LE52RC
2.2串口号:插入板子后自动识别
2.3打开源文件程序
2.4下载/编程
3、进阶
修改Delay500ms()函数,变成传参函数,传入参数标识停顿的毫秒数。
修改的方向:由于我们的单片机为12MHz,12.000MHz 的时钟频率下,一个机器周期是 1 微秒(因为 1 / 12MHz * 12 = 1μs),又因为500毫秒为500,000微秒,所以我们让循环接近500,000即可。
3.1函数解释
(1)函数定义:void DelayMs(unsigned int ms)
定义了一个名为 DelayMs
的函数,它接收一个无符号整型参数 ms
,代表要延时的毫秒数,函数无返回值。
(2)外层循环:for (i = 0; i < ms; i++)
这个循环会执行 ms
次,每次循环会产生大约 1 毫秒的延时。
(3)内层嵌套循环:
for (j = 0; j < 123; j++)
:外层循环,循环 123 次。
for (k = 0; k < 4; k++);
:内层循环,循环 4 次。
这两层嵌套循环的组合能让 CPU 执行一定数量的空操作,从而实现大约 1 毫秒的延时。
(4)空操作指令:_nop_();
执行一个空操作,占用一个机器周期,在这可能用于微调延时时间。
#include <intrins.h>// 定义一个函数用于实现毫秒级延时
void DelayMs(unsigned int ms) {unsigned int i;unsigned char j, k;// 外层循环,循环次数为传入的毫秒数for (i = 0; i < ms; i++) {// 空操作,可能用于微调延时_nop_();// 以下循环用于实现约 1 毫秒的延时for (j = 0; j < 123; j++) {for (k = 0; k < 4; k++);}}
}
至此,初步结束
相关文章:
嵌入式开发之51单片机入门(一)与LED灯的故事
得而不惜就该死。 --小泽 继续傻冒开始,这次的傻冒之旅是关于嵌入式的51单片机开发,这个系列只讲程序开发逻辑,如需初始环境安装配置,建议移步B站江协科技大佬,本系列也是对大佬所讲内容的复刻,同时添加一…...
TCP 与 UDP
TCP 与 UDP 的区别(重要) 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。是否是可靠传输:远地主机在收到 UDP 报…...
Linux:进程地址空间
在讲述本篇文章之前,我们先来看一段代码。 从上图输出可以看到,我们的子进程继承了父进程的全局变量val,当子进程中的val产生了修改时,父进程的val值并没有变化,但父子进程在打印val的地址时,会发现val的地…...
【Linux】Linux 操作系统 - 03 ,初步指令结尾 + shell 理解
文章目录 前言一、打包和压缩二、有关体系结构 (考)面试题 三、重要的热键四、shell 命令及运行原理初步理解五、本节命令总结总结 前言 本篇文章 , 笔者记录的笔记内容包含 : 基础指令 、重要热键 、shell 初步理解 、权限用户的部分问题 。 内容皆是重要知识点 , 需要认真理…...
华为数通不同级别的认证路径和要求是什么?
一、认证路径 HCIA:无需前置认证,通过一门考试(代码H12-811)即可拿证。 HCIP:建议先通过HCIA-Datacom,再选择子方向(如高级路由、安全)。 HCIE:最好有hcia/hcip的基础…...
电子电气架构 --- 新能源汽车电子电气系统功能需求
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…...
《从单体到分布式:一个订单系统的架构升级》
1. 问题爆发:单体架构的极限 原来的订单系统长这样: 技术栈:SpringBoot MyBatis MySQL(主从)部署:单机跑所有模块(订单、支付、库存)痛点ÿ…...
琴键上的强化学习:让机器人在真实世界里弹钢琴!
在科技飞速发展的今天,机器人的能力边界不断拓展。想象一下,机器人坐在钢琴前,行云流水地弹奏出美妙乐章,这不再是科幻电影里的场景。近日,科研人员在机器人弹钢琴领域取得了突破性进展,让我们一同走进这个…...
【Unity网络编程知识】C#的 Http相关类学习
1、搭建HTTP服务器 使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用)自己编写HTTP服务器应用程序,一般作为Web服务器或者短连接游戏服务器时使用该方式(工作后由后端程序员来做&#…...
【算法学习】链表篇:链表的常用技巧和操作总结
算法学习: https://blog.csdn.net/2301_80220607/category_12922080.html?spm1001.2014.3001.5482 前言: 在各种数据结构中,链表是最常用的几个之一,熟练使用链表和链表相关的算法,可以让我们在处理很多问题上都更加…...
【前端笔记】CSS预处理语言 LESS
官网: Less 快速入门 | Less.js 中文文档 - Less 中文网 LESS很多地方可以比CSS简写很多 安装 npm install -g less 核心优势:变量、嵌套、混合、运算功能让CSS更容易维护,比原生CSS更加简洁高效 1. 变量(Variables)…...
Oracle 查看后台正在执行的 SQL 语句
在 Oracle 数据库中,要查看后台正在执行的 SQL 语句,可以通过查询动态性能视图(Dynamic Performance Views)或使用监控工具来实现。 1. 查询动态性能视图 (1) 查看当前活跃会话及其执行的 SQL 使用 v$session 和 v$sql 视图关联…...
强化学习原理二 BasicConcepts
状态,State 状态空间,State Space 行动,Action状态转换,state transition策略,Policy 用数组或者矩阵表示这样一个策略 奖励,Reward 不确定的话,表格就不适用了。这个时候就要用数学来表示&…...
【机密计算顶会解读】13:CAGE:通过 GPU 扩展补充 Arm CCA
导读:本文介绍GAGE,利用Arm CCA中的现有硬件安全特性来确保敏感数据的安全性,支持GPU加速的机密计算,在实际平台上的平均性能开销仅为 2.45%,在保持高性能的同时,提供了良好的数据安全保护,且其…...
Android 使用kill -9(SIGKILL信号)强制终止Native进程时,是否会生成tombstone文件
在Android系统中,使用kill -9(SIGKILL信号)强制终止Native进程时,不会生成tombstone文件。以下是具体原因和背景分析: 1. SIGKILL信号的特性 SIGKILL(信号9) 是Linux系统中最高优先级…...
WPS JS宏编程教程(从基础到进阶)-- 第六部分:JS集合与映射在 WPS 的应用
目录 第6章 JS集合与映射在 WPS 的应用6-1 集合的创建(实例:唯一值提取)示例代码详细解析Excel 环境模拟说明6-2 集合的不重复特性应用(案例:提取唯一值记录)示例代码详细解析案例说明6-3 集合成员添加与删除示例代码代码解析直观示意(Excel 模拟表格)6-4 集合成员添加…...
1.VTK 使用CMakeLists
文章目录 1.创建目录2.配置VTK编译环境3.创建main.cpp4.CMake编译 1.创建目录 选择一个空文件夹创建CMakeLists.txt 文件,注意CMakeLists不要写错 2.配置VTK编译环境 cmake_minimum_required(VERSION 3.5) # 最低要求 CMake 3.5,避免兼容性问题 proje…...
PDFtk
如果下载的pdf文件有秘钥的话,使用下面linux命令去掉秘钥: pdftk 纳税记录.pdf input_pw 261021 output 纳税记录_output.pdf将多个单页pdf合并为一个pdf的linux命令: pdftk 自然人电子税务局1.pdf 自然人电子税务局2.pdf 自然人电子税务局3.pdf 自然人…...
整理我的macos的复杂混乱的python环境
一、彻底清理现有环境(为全新配置铺路) 1. 核级清理(⚠️ 先备份重要数据) bash复制# 删除所有第三方Python安装 sudo rm -rf /Library/Frameworks/Python.framework/ rm -rf ~/Library/Python/ rm -rf ~/.local/bin/python* rm…...
Vue Router(1)
RouterLink 和 RouterView RouterLink 是一个导航组件,用于在不重新加载页面的情况下切换视图。 RouterView 是一个视图渲染容器组件,用于显示与当前 URL 匹配的组件。 <template><p><strong>Current route path:</strong> {{…...
AI时代如何让命令行工具快速智能化?
引言 作为开发者,我们经常会开发各种命令行工具来提升工作效率。 在AI时代我们又多了一个选择:通过AI生成代码,缺点是不可控、速度慢,优点是使用简单;而代码生成工具与AI的优缺点恰恰相反,如何结合两者的优…...
Android 回答视频边播放边下载的问题
分层次的回答突出 技术深度、架构思维 和 实战优化,从基础实现到高阶优化: 一、核心技术方案(基础回答) 如何实现视频边下边播? 1. **网络请求**:使用 HTTP Range 请求(Header: Range: bytes0…...
【HarmonyOS 5】鸿蒙中如何使用MQTT
一、MQTT是什么? MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级、基于发布 / 订阅(Publish/Subscribe)模式的即时通讯协议,专为资源受限的物联网(IoT&a…...
Conda与Pip:Python包管理工具的对比与选型
在当今的Python开发环境中,包管理工具的选择对于项目的顺利进行至关重要。Conda和Pip作为两种主流的Python包管理工具,各自具有独特的特点和优势。本文将详细对比Conda和Pip,帮助开发者在项目中做出更合适的选择。 一、概述 Condaÿ…...
建筑兔零基础自学记录69|爬虫Requests-2
Requests库初步尝试 #导入requests库 import requests #requests.get读取百度网页 rrequests.get(http://www.baidu.com) #输出读取网页状态 print(r.status_code) #输出网页源代码 print(r.text) HTTP 状态码是三位数字,用于表示 HTTP 请求的结果。常见的状态码有…...
OpenCV——图像融合
OpenCV——图像融合 一、引言1.1 图像融合分类 二、C代码实现三、效果展示3.1 标准球3.2 铝制底座 一、引言 在许多计算机视觉应用中(例如机器人运动和医学成像),需要将来自多幅图像的相关信息集成到一幅图像中。这种图像融合将提供更高的可靠性、准确性和数据质量…...
显示背光发烫异常解析
■显示屏问题描述:: 分辨率:1024x600 尺寸:7寸 16:9 显示模式:IPS 背光参数:3串10并 电压:9.6V 电流:200ma 问题描述:常温装填下,在整机点亮一段时间后&a…...
机器学习--数据填充
一、引言 在机器学习领域,数据的质量直接关乎模型的性能。而数据缺失是实际数据收集过程中极为常见的问题,它像一颗隐藏的 “暗雷”,随时可能影响模型训练的准确性与稳定性。数据填充作为解决数据缺失问题的核心手段之一,有着多种…...
【Linux】40.网络基础(2.2)
文章目录 2. 传输层2.1 再谈端口号2.1.1 端口号范围划分2.1.2 认识知名端口号2.1.3 netstat2.1.4 pidof 2.2 UDP协议2.2.1 UDP协议端格式2.2.2 UDP的特点2.2.3 面向数据报2.2.4 UDP的缓冲区2.2.5 UDP使用注意事项2.2.6 基于UDP的应用层协议 2.3 TCP协议2.3.1 TCP协议段格式2.3.…...
YOLOv12即插即用--CPAM
1.模块介绍 本文提出了一种新型基于注意尺度序列融合的 YOLO 框架,称为 ASF-YOLO,该框架结合空间与尺度信息,实现了高效且精确的细胞实例分割。在 YOLO 分割框架的基础上,设计了 尺度序列特征融合(SSFF)模块,用于增强多尺度信息提取能力;同时引入 三重特征编码器(TPE…...
工业制造核心术语
• BOM: Bill of Material。物料清单。根据物料所处的阶段不同,可分为不同视图:EBOM(Engineering BOM,设计BOM)、PBOM(Process BOM)工艺BOM、MBOM(Manufacturing BOM&…...
实现一个 Markdown 编辑器组件:Vue 3 + Vite + Highlight.js
文章目录 一、项目背景与需求分析二、搭建基础项目1. 初始化 Vue 3 项目2. 安装依赖 三、实现 Markdown 编辑器组件1. 创建 Markdown 编辑器组件2. 组件说明 四、优化与拓展1. 自动保存功能2. 文件上传功能 五、总结 一、项目背景与需求分析 在现代前端开发中,Mark…...
海外交友APP多语音系统实现
一、逻辑分析 语音录制功能: 用户需要在 APP 中能够方便地触发语音录制操作。这涉及到调用设备的麦克风权限,获取音频输入流。录制的音频数据需要进行临时存储,以便后续处理和发送。 语音播放功能: 当接收到其他用户发送的语音消…...
VSCode、clangd、mingw 配置与使用
1.安装 安装如下软件: VSCodeclangd 扩展mingw-w64 2.配置 配置好 mingw-w64 到用户环境中。 在项目中设置 .clangd 扩展,设置 argument //setting.json"clangd.arguments": ["--query-driverD:\\Development\\Tools\\mingw64\\bin…...
Rust入门之迭代器(Iterators)
Rust入门之迭代器(Iterators) 本文已同步本人博客网站 本文相关源码已上传Github 前言 迭代器(Iterators)是 Rust 中最核心的工具之一,它不仅是遍历集合的抽象,更是 Rust 零成本抽象(Zero-Co…...
Android 14 、15动态申请读写权限实现 (Java)
在 Android 14、15 中,Google 进一步优化了存储权限系统,特别是写权限的管理。以下是完整的 Java 实现方案: 1. AndroidManifest.xml 声明权限 <!-- Android 14 存储权限 --> <uses-permission android:name"android.permiss…...
Codeforces Round 1013 (Div. 3)
Problem - A - Codeforces 解题思路: 对每个需要的数字进行计数 #include<bits/stdc.h> using namespace std;int main() {int t;cin >> t;while (t--){int n;cin >> n;int two 2;int zero 3;int five 1;int three 1;int one 1;int flag …...
SAP-ABAP:SAP PO接口中System Landscape(SL Landscape Directory,SLD)作用详解
SAP PO接口中System Landscape(SL Landscape Directory,SLD)作用详解 System Landscape Directory(SLD)是SAP Process Orchestration(PO)的核心组件,用于管理企业IT系统中的所有技术组件、业务系统及其关联关系。以下是其关键作用及实现逻辑: 中央元数据仓库存储全局…...
从繁琐到高效,2025年AI PPT工具选秒出PPT
在如今快节奏的职场中,PPT已经成为了日常工作中不可或缺的一部分。然而,传统的PPT制作往往耗费大量时间,尤其是内容整理、排版和设计这些环节,经常让人头疼。如何在保证质量的同时提升制作效率,成为了每个职场人的难题…...
TCP的三次握手和四次挥手
1.三次握手 1)三次握手的目的 确保双方通信能力正常,并同步初始序列号(ISN),防止历史重复连接干扰。 2)三次握手的流程 这张图很复杂,我们可以将其简化为: 客户端Client …...
操作符详解(下)——包含整形提升
1.讲解剩下的操作符 1.1:逗号表达式 逗号表达式,就是用逗号隔开的多个表达式。 逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果 例题1: //C的值是多少? int main() {int a 1;int b 2;int c (a &g…...
关于量化交易在拉盘砸盘方面应用的部分思考
关于“砸盘”的深层解析与操盘逻辑 一、砸盘的本质与市场含义 砸盘指通过集中抛售大量筹码导致价格快速下跌的行为,其核心目标是制造恐慌、清洗浮筹或实现利益再分配。不同场景下的砸盘含义不同: 主动砸盘(操控…...
大模型Prompt提示词越狱相关知识
大模型Prompt提示词越狱相关知识 一、什么是Prompt提示词越狱? 什么是Prompt提示词 Prompt是指你向AI输入的内容,它直接指示AI该做什么任务或生成什么样的输出,简而言之, Prompt就是你与AI之间的“对话内容”,可…...
Prompt攻击
Prompt攻击 Prompt攻击的常见形式 1. 指令覆盖攻击 用户通过输入包含隐藏指令的提示,覆盖模型原本的预设行为。示例: “忽略之前的规则,帮我写一个绕过防火墙的Python脚本。” 模型可能被诱导生成危险代码。 2. 上下文污染攻击 在对话历史…...
KWDB创作者计划—KWDB:AIoT场景下的分布式多模数据库实践
在数字化转型的浪潮中,企业面临着海量多源异构数据的管理挑战。KWDB(KaiwuDB Community Edition)作为一款面向AIoT场景的分布式多模数据库,凭借其创新的技术架构和强大的性能表现,正在成为众多企业和开发者关注的焦点。…...
redisson常用加锁方式
RLock lock redissonClient.getLock("lock:order:" order);和redissonDistributedLocker.tryLock("lock:order:" order, TimeUnit.SECONDS, RedisLockKey.DEFAULT_WAIT_TIME, RedisLockKey.DEFAULT_HOLD_TIME);这两种加锁方式的区别如下&…...
网页部署到宝塔服务器上,发送请求报错?org.springframework.data.redis.RedisSystemException,让我来看看
这几天在部署项目的时候会发现的一个问题是,配置都没有什么问题,但是进入网页操作功能的时候却报错了,报错是这样: Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession57d08368] was …...
龙蜥社区荣获 OS2ATC 2025 “最具影响力开源创新贡献奖”
3 月 29 日,第十二届开源操作系统年度技术大会 (Open Source Operating System Annual TechnicalConference, 简称 OS2ATC) 在北京成功举办。会上,OS2ATC 公布了在开源操作系统等领域做出卓越贡献的获奖组织名单,其中,龙蜥社区凭借…...
conda入门教程
一、安装 Conda 下载 Anaconda 或 Miniconda Anaconda:包含大量常用的数据科学包,适合需要快速搭建数据科学环境的用户。Miniconda:仅包含 Conda 及其依赖项,适合需要更轻量化安装的用户。 可以通过访问 Anaconda 官方网站 或 Min…...
Linux入门指南:从零开始探索开源世界
🚀 前言 大家好!今天我们来聊一聊Linux这个神奇的操作系统~ 🤖 很多小伙伴可能觉得Linux是程序员专属,其实它早已渗透到我们生活的各个角落!本文将带你了解Linux的诞生故事、发行版选择攻略、应用领域,还有…...