入门51单片机(1)-----点灯大师梦开始的地方
前言
这一次的博客主要是要记录一下学习的记录的,方便以后去复习一下的,当然这篇博客还是针于零基础的伙伴萌,看完这篇博客,大家就可以学会点灯了。
安装软件
方法一下一下来教!!萌新宝贝萌可以学会的!帮大家省省时间呗!
1.官网下载
Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families.

这里点击后,就进入了网页了。

点击后,要填写信息,之后可以下载,这里呢,官网下载可以下载可以最新的版本!!

2.百度网盘下载安装包、
这里推荐去b站的江科大,那里直接下载,好吧!我们直接把江科大的链接发一发。
资料下载
这样就有安装包了,事实上,keil5的安装很简单,不需要额外的操作,只是注意一下安装路径
自己可以改一改安装路径。当然这里的所有步骤都可以去江科大那边看看。
我这里直接提出就是安装过程中可能会遇到的问题,来节省大家的时间,大家提前留一个心眼。
在解压破解软件的安装包,或是下载软件的时候,一定要关闭杀毒软件,特别是破解软件的时候,这一步很容易有问题

如果是windos11系统的话可以在这里恢复被删除的文件。
下载软件就这里最恶心,其他地方都很简单的,没什么难度。
建立项目
这一步也不难,非常简单,快速的来一遍。
第一步:点击project,点击New uvision project

第二步:.新建一个文件夹。

第三步:点击进去,给项目取名,一般取project,点击保存。

第四步:选择芯片,这里要根据你买的芯片来选择,这里我们买的是江科大的芯片。
选择Atmel这一个选项下的AT8952,这里不要选错了。
然后选择否,不要它的启动文件。



然后就是这个样子。
第五步:新建一个c文件


这里取名一般去main,表示c语言中的主函数。

这样就可以开始我们的点灯了!!!!!
这里已经非常详细了。就是还没有说到破解软件的操作,其实也简单。这里就不说了。因为视频效率更高!!
实验
1.点亮一个led灯

右键插入头文件,也就是库。这里有单片的一些引脚,外设之类的,可以直接调用的。
然后我们要看原理图才可以点灯!!
这里不必说完全看懂电路图,只要知道一些东西就可以了。左边是共阳极也就是说左边是高电平,然后右边是引脚,io口。
在单片机中有很多寄存器,我们可以通过寄存器来控制各个引脚的高低电平,寄存器的值可以通过代码来改。只要p20~p27其中一个引脚变成低电平,那么对应的led灯就会点亮!!
那么看看代码如何实现:
先看看头文件,有没有。

跳转后这里有P2的类型了。

这是一个8位寄存器:p2_0,p2_1,p2_2........分别代表的是它的第0位,第一位,第二位等等一共8位。
只要改变其中一位就可以改变灯泡的亮灭了。
OK,直接,举例吧!!
#include <REGX52.H>void main()
{while(1)P2_0=0;
}

先点第一个,再点第二个。

第一次使用要,点击这个锤子,然后勾选ouput,再然后选择creat HEX File这里是创建目标文件,下载程序时要使用。

这里的型号要选择正确,根据自己的单片机型号来选择。
然后要选择文件

最后可以下载,但是下载之前,先关闭电源,再下载,再打开就完成了点灯了。

这里就完成了点灯l,非常简单的。
因为语句是执行一次的,把它置零了,那么他就一定是低电平。
如果是p2_0->D1,p2_1->2,不同的单片机点灯都各不同,这里还有另外一个点灯的方法。
同样是以点亮d1为例。注意呀P是大写!!!!!!
P2=0xFE;
因为p2是一个8位寄存器,那么d1对应最后一位所以只要这一位是电平即可:1111 1110 =0xFE这里是16进制写法。
这样的只是写法不同而已。
2.循环点灯实验
这里我认为呢?可以使用c语言的位运算来做的。
直接看代码:如果不会c语言的可以看看之前写的c语言博客。位运算不难的!
#include <REGX52.H>
#include <INTRINS.H>void Delayms(int ms) //@11.0592MHz
{unsigned char i, j;while(ms--){ _nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
void main()
{while(1){int i=0;for(;i<8;++i){ int a=0xFF;a-=(1<<i);P2=a;Delayms(100);P2=0xFF;Delayms(100);}}
}
讲解一下呗!好的兄弟!
这里如何的delay函数是可以生成的。

可以去看看自己单片机得到主频,这里可以看到,然后去STC-ISP中自动生成延时函数。

这里主频是根据自己的来,指令集选择STC-Y1,这里不懂为什么是这样的。
然后可以选择时间,我们可以选择1ms,然后传入一个参数代表时间,添加一个循环就可以实现任意时间的延时。
这里的延时函数就是这样生成的。延时在单片机的引用是很重要的。然后再来说一说代码的含义。
这里还要注意:变量的声明只能在前面,如果在后面会报错的!!!注意看是不是所有的变量声明全部都在其他语句的前面。
循环8次,移位的次数是0~7,分别代表d1~d7的点亮,这就是思路。
3.按键控制点灯实验
按键介绍:

解释一下
p3.1代表是k1 p3.0 k2 p3.2 k3 p3.3 k4这里就是独立按键的对应关系
这里的RXD TXD其实就是p3_1 p3_0,可以从最小系统上看到。当按下时电路导通,端口才是低电平。
按键会有一个按下和松开的一个时间

所以开始和结束都有延时,我们要主动添加延时!!
那么看代码吧!
这里要实现的功能是按下k1灯往右移,按下k2灯往左移。
void main()
{int count=0;P2=0XFE;while(1){ if(P3_1==0){Delayms(20);while(P3_1==0);Delayms(20);count++;if(count>=8)count=0;P2=~(1<<count); }if(P3_0==0){Delayms(20);while(P3_0==0);Delayms(20);count--;if(count<=-1)count=7;P2=~(1<<count); }}
}
很好解释的,也是位运算的结果,首先当按钮没有按下时,这个p3_0是高电平,当按下的瞬间,会有一个缓冲作用,所以要延时一下,然后使用while()目的是只有松开后才执行程序,然后再缓冲一定的时间,防止这段程序被执行多次,这样的话可以保证按一下执行一次,对吧!这是我的理解。
然后,让count++,1左移count位,代表想要点亮的灯,最后取反,因为是低电平才会点亮,所以取反。很简单的。可以试试。
4.数码管显示数字实验
这个有点复杂了呀!

但是也好说的!!
我们的目的是:实现对任意一个数码管,显示任意的数字。
原理解释:直接说,这里所有的数码管的负极是共阳极的,也就说只有一个数码管可以被点亮的。
共阳极是段选,COM是片选,是通过3-8译码器来片选的。

举例:000->Y0 001->Y1 010->Y2等等,这样通过二进制枚举。
选用的端口是p2_2 p2_3 p2_4这是片选
来看看段选

这是一个表格,对应不同的位,用到的主要端口是p0。好看代码吧!
这里还是要解释,
int Numarr[]={0x3f,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
void DigitalCube(int Position,int Num)
{switch(Position){case 1:P2_2=1;P2_3=1;P2_4=1;break;case 2:P2_2=0;P2_3=1;P2_4=1;break;case 3:P2_2=1;P2_3=0;P2_4=1;break;case 4:P2_2=0;P2_3=0;P2_4=1;break;case 5:P2_2=1;P2_3=1;P2_4=0;break;case 6:P2_2=0;P2_3=1;P2_4=0;break;case 7:P2_2=1;P2_3=0;P2_4=0;break;case 8:P2_2=0;P2_3=0;P2_4=0;break; }P0=Numarr[Num];//片选 段选 片选 段选//在两个直接会有重叠,因为第一个段暄会和第二个片选和在一起,会重影//所以必须要清零,但是直接清零会偏暗Delayms(1);//所以要延时P0=0;
}
片选 段选 片选 段选
在两个直接会有重叠,因为第一个段暄会和第二个片选和在一起,会重影
所以必须要清零,但是直接清零会偏暗
所以要延时
这里已经很细致了。
5.实现一个点击按钮,使数码管递增的代码(从0~99999999)
int Numarr[]={0x3f,0x30,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6f};
void Delayms(int ms) //@11.0592MHz
{unsigned char i, j;while(ms--){ _nop_();i = 2;j = 199;do{while (--j);} while (--i);}
}
void DigitalCube(int Position,int Num)
{switch(Position){case 1:P2_2=1;P2_3=1;P2_4=1;break;case 2:P2_2=0;P2_3=1;P2_4=1;break;case 3:P2_2=1;P2_3=0;P2_4=1;break;case 4:P2_2=0;P2_3=0;P2_4=1;break;case 5:P2_2=1;P2_3=1;P2_4=0;break;case 6:P2_2=0;P2_3=1;P2_4=0;break;case 7:P2_2=1;P2_3=0;P2_4=0;break;case 8:P2_2=0;P2_3=0;P2_4=0;break; }P0=Numarr[Num];Delayms(1);//Á¢¼´ÇåÁã»áµ¼ÖÂÊýÂë¹ÜÆ«°µP0=0;
}
void main()
{int arr[8]={0};while(1){int i;if(P3_1==0){Delayms(20);while(P3_1==0);Delayms(20);for(i=0;i<8;++i){if(arr[i]<9){arr[i]++;break;}else {while(i<8&&arr[i]==9){i++;}if(i==8){memset(arr,0,sizeof(arr));break;}arr[i]++;i--;while(i>=0){arr[i]=0;i--;}break;}} }i=7;for(;arr[i]<=0;){--i;}switch(i){case 0:{DigitalCube(1,arr[0]);break;}case 1:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);break;}case 2:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);break;}case 3:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);break;}case 4:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);break;}case 5:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);DigitalCube(6,arr[5]);break;}case 6:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);DigitalCube(6,arr[5]);DigitalCube(7,arr[6]);break;}case 7:{DigitalCube(1,arr[0]);DigitalCube(2,arr[1]);DigitalCube(3,arr[2]);DigitalCube(4,arr[3]);DigitalCube(5,arr[4]);DigitalCube(6,arr[5]);DigitalCube(7,arr[6]);DigitalCube(8,arr[7]);break;}}
}
}
这个代码是自己想到的。
看图吧!


可以实现按键使得数码管递增。
这个思路有点麻烦,但是注意这里是后面位对应高位,前面是低位哦。
这样就完成点灯大师的工作了。
简单说说思路:就是用一个8位数组,每次点击更新数组,然后使用数组的数据来更新数码管。这样就实现了这个功能了。
但是我这里反向的,是适合计算机的读取顺序,不适合人类的读取顺序的。可以反向遍历也可以得到结果这里就不改了。
相关文章:
入门51单片机(1)-----点灯大师梦开始的地方
前言 这一次的博客主要是要记录一下学习的记录的,方便以后去复习一下的,当然这篇博客还是针于零基础的伙伴萌,看完这篇博客,大家就可以学会点灯了。 安装软件 方法一下一下来教!!萌新宝贝萌可以学会的!帮…...
3.数组(随想录)
1.二分查找 *2.移除元素 还有一个小优化(可以不看) 3.有序数组的平方 *4.长度最小的子数组 (3种解法) 5.螺旋矩阵 ||...
解决import pyqtgraph.opengl报错
在使用pyqtgraph时,出现没有OpenGL模块的报错 报错信息 ModuleNotFoundError: No module named OpenGL 解决方案 该环境下没有安装OpenGL库导致,输入以下代码进行安装: pip install PyOpenGL conda install -c conda-forge pyopengl 安…...
大模型面经 | 请你介绍一下ReAct(Reasoning and Acting)?
大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...
C#设计模式-状态模式
状态模式案例解析:三态循环灯的实现 案例概述 本案例使用 状态模式(State Pattern) 实现了一个 三态循环灯 的功能。每点击一次按钮,灯的状态会按顺序切换(状态1 → 状态2 → 状态3 → 状态1...)ÿ…...
LLM实现text2SQL实战总结
LLM在组织内部应用的一类重要场景就是利用LLM的NL2SQL能力,简化用户对数据库的访问。本文主要介绍如何使用LLM生成SQL语句,不涉及到如何训练提升LLM的SQL生成能力。 开启正文之前,我们先明确一下这类功能在组织内服务的目标群体。我们将服务目…...
字节跳动开源 LangManus:不止是 Manus 平替,更是下一代 AI 自动化引擎
当 “AI 自动化” 成为科技领域最炙手可热的关键词,我们仿佛置身于一场激动人心的变革前夜。各行各业都在翘首以盼,期待 AI 技术能够真正解放生产力,将人类从繁琐重复的工作中解脱出来。在这个充满无限可能的时代,字节跳动悄然发布…...
21.C++11
1.列表初始化 1.1C11中的{} •C11以后想统⼀初始化⽅式,试图实现⼀切对象皆可⽤{}初始化,{}初始化也叫做列表初始化。 • 内置类型⽀持,⾃定义类型也⽀持,⾃定义类型本质是类型转换,中间会产⽣临时对象,最…...
STM32 HAL库之WDG示例代码
独立看门狗(IWDG) 初始化独立看门狗,在main.c中的 MX_IWDG_Init();,也就是iwdg.c中的初始化代码 void MX_IWDG_Init(void) {/* USER CODE BEGIN IWDG_Init 0 *//* USER CODE END IWDG_Init 0 *//* USER CODE BEGIN IWDG_Init 1 …...
Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7)
Spring AI 发布了它的 1.0.0 版本的第七个里程碑(M7),下个月就是 RC1,紧接着就是 GA!,对于我们 Java 开发者来说,这绝对是个值得关注的好消息! 但是对于 Java 学习者来说,…...
jdk 安装
oracle官网 : Java Archive | Oracle 中国 export JAVA_HOME/Users/xxxxx/app/services/x86jdk/jdk1.8.0_431.jdk/Contents/Home export PATH$JAVA_HOME/bin:$PATH 华为镜像网站:Index of java-local/jdk...
Windows服务器组建与综合服务部署技术方案
目录 一、项目背景与需求分析 1.1 企业网络架构 1.2 核心服务需求矩阵 二、Active Directory与权限管理体系 2.1 用户账户标准化 2.2 文件服务器纵深防御 三、高可用服务集群构建 3.1 分布式文件服务(DFS) 3.2 打印服务高可用方案 四、安全加固与审计体系 4.1 本地安…...
3.2.2.2 Spring Boot配置视图控制器
在Spring Boot中配置视图控制器可以简化页面跳转跳逻辑。通过实现WebMvcConfigurer接口的addViewControllers方法,可以直接将URL映射到特定的视图,而无需编写控制器类。例如,将根路径"/"映射到welcome.html视图,当访问应…...
华为OD机试真题——找出两个整数数组中同时出现的整数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 华为OD机试真题《找出两个整数数组中同时出现的整数》: 目录 题目名称:找出两个整数数组中同…...
Go 1.24 新方法:编写性能测试用例方法 testing.B.Loop 介绍
Go 开发者在使用 testing包编写基准测试用例时,如果不注意,可能会遇到各种陷阱。这些陷阱,导致基准测试结果不准确。Go1.24 版本引入了一种新的基准测试编写方式,它同样易用,并且可以帮助规避编写基准测试时的一些坑。…...
烽火ai场控接入deepseek自动回复话术软件
要将烽火AI场控软件与DeepSeek自动回复话术软件进行对接,实现直播间自动互动功能,需通过API接口或脚本工具完成数据互通。以下是具体操作步骤及注意事项: 确认兼容性与准备工作 软件支持检查 确认烽火AI场控是否开放API接口(一般需…...
Spring AOP 学习笔记 之 Advice详解
学习材料:https://docs.spring.io/spring-framework/reference/core/aop/ataspectj/advice.html 1. 什么是 Advice(通知) 定义:Advice 是 AOP 的核心概念之一,表示在特定的连接点(Join Point)上…...
【Linux系统】进程地址空间
命令行参数 int main (int argc, char* argv[]) 命令行参数列表 argc:参数的个数argv:参数的清单 int main (int argc, char* argv[]) {printf("argc: %d\n",argc);for(int i 0; i < argc; i){printf("argv[%d] : %s \n", i…...
记录学习的第二十六天
还是每日一题。 今天这道题有点难度,我看着题解抄的。 之后做了两道双指针问题。 这道题本来是想用纯暴力做的,结果出错了。😓...
python成功解决AttributeError: can‘t set attribute ‘lines‘
文章目录 报错信息与原因分析解决方法示例代码代码解释总结 报错信息与原因分析 在使用 matplotlib绘图时,若尝试使用 ax.lines []来清除图表中的线条,会遇到AttributeError: can’t set attribute错误。这是因为 ax.lines是一个只读属性,不…...
测试 认识bug
一、软件测试生命周期与测试模型 1. 软件(开发)生命周期:包括需求分析、计划、设计、编码、测试、运行维护阶段。需求分析是起始点,明确用户需求,后续阶段依此展开 。例如开发电商软件,需求分析阶段确定商品…...
Mysql主从复制有哪些方式
MySQL 主从复制主要有以下几种方式,根据不同的分类标准(如同步机制、数据复制格式、拓扑结构等)可以分为: 一、按同步机制分类 1. 异步复制 (Asynchronous Replication) 原理:主库提交事务后,立即返回给客…...
如何建立可复用的项目管理模板
建立可复用的项目管理模板能够显著提高项目执行效率、减少重复劳动、确保项目管理标准化。在企业中,项目管理往往涉及多个步骤和多个团队,然而每次开始一个新项目时,如果都从头开始设计流程和文档,势必浪费大量的时间和精力。通过…...
Spring Cloud 服务间调用深度解析
前言 在构建微服务架构时,服务间的高效通信是至关重要的。Spring Cloud 提供了一套完整的解决方案来实现服务间的调用、负载均衡、服务发现等功能。本文将深入探讨 Spring Cloud 中服务之间的调用机制,并通过源码片段和 Mermaid 图表帮助读者更好地理解…...
如何使用通义灵码玩转Docker - AI助手提升开发效率
一、引言 Docker 作为一种流行的虚拟化技术,能够帮助开发者快速搭建所需的运行环境。然而,对于初学者来说,掌握 Docker 的基本概念和使用方法可能会遇到一些挑战。本文将介绍如何利用通义灵码这一智能编码助手,帮助你更高效地学习…...
GGML源码逐行调试(下)
目录 前言1. 简述2. 预分配计算图内存2.1 创建图内存分配器2.2 构建最坏情况的计算图2.3 预留计算图内存 3. 分词4. 模型推理与生成4.1 模型推理4.2 采样 结语下载链接参考 前言 学习 UP 主 比飞鸟贵重的多_HKL 的 GGML源码逐行调试 视频,记录下个人学习笔记&#x…...
uniapp的通用页面及组件基本封装
1.基本布局页面 适用于自定义Navbar头部 <template><view class"bar" :style"{height : systemInfo.statusBarHeight px, background: param.barBgColor }"></view><view class"headBox" :style"{ height: param.h…...
YOLO11改进——融合BAM注意力机制增强图像分类与目标检测能力
深度学习在计算机视觉领域的应用取得了显著进展,尤其是在目标检测(Object Detection)和图像分类(Image Classification)任务中。YOLO(You Only Look Once)系列算法凭借其高效的单阶段检测框架和卓越的实时性能,成为目标检测领域的研究热点。然而,随着应用场景的复杂化…...
Spring Boot循环依赖全解析:原理、解决方案与最佳实践
🚨 Spring Boot循环依赖全解析:原理、解决方案与最佳实践 #SpringBoot核心 #依赖注入 #设计模式 #性能优化 一、循环依赖的本质与危害 1.1 什么是循环依赖? 循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系。 典…...
力扣 283 移动零的两种高效解法详解
目录 方法一:两次遍历法 方法二:单次遍历交换法 两种方法对比 在解决数组中的零移动到末尾的问题时,我们需要保持非零元素的顺序,并原地修改数组。以下是两种高效的解法及其详细分析。 方法一:两次遍历法 思路分析…...
