【51单片机】1. 基础点灯大师

news2025/7/23 9:52:45

1. 新建一个项目集一些基本操作

打开Keli软件,然后:

  1. 【Project】→【new μVision Project】→选择项目保存位置

  2. 建议文件名选一些通用的名字,如【Project】

  3. 左下角选择【Atmel】的【AT89C52】

  4. 弹出的【是否添加启动文件到文件夹下】,可以选【否】

  5. 在左侧新建出了一个【Target1】,点击【+】号展开后,我们的代码在【Source Group 1】下写

  6. 右键【Source Group 1】,选择【Add New Item to Group ‘Source Group 1’】

在这里插入图片描述

  1. 选择【C File】,即C语言文件,命名为【main】

在这里插入图片描述

  1. 三个按钮分别代表编译、编译和建立工程、全部重新编译和建立工程

在这里插入图片描述

  1. 可以修改编辑框中的字体大小

在这里插入图片描述

2. 发光二极管(LED)原理

从电路原理图的角度来看,左侧为正极,右侧负极

在这里插入图片描述

从实物角度来看:

  • 正极内电极小,引脚长

  • 负极内电极大,引脚短

在这里插入图片描述

若正负极接反,LED是不会亮的

3. 电路板上的发光二极管

在这里插入图片描述

  • 板子上的原理如上图,右侧是正极,左侧接入单片机

  • 由2所知,发光二极管朝向向左,只有右侧为正极,左侧为负极的时候才会亮,右侧VCC为正极

  • 左侧单片机的引脚给5V时(高电平)不会亮,因为没有形成从高向低流动的电压差;只有引脚给0V(低电平)时形成电压差才会亮

单片机中,1表示高电平,0表示低电平

知道以上原理后可以写代码

4. 点亮一个LED(点灯大师、嵌入式Hello World)

代码如下所示:

#include <REGX52.H>

void main()
{
    P2 = 0xFE; // 1111 1110
}

分析一下,从板子上可以看到,LED模块对应P20-P27,意思是LED模块连接到单片机的P2引脚,P2由8位(0~7)组成,分别对应这8盏灯

在这里插入图片描述

由3分析的原理可知,单片机给低电平的时候,LED才会亮,我们希望点亮第一盏灯,也就是希望点亮的那盏灯的信号给0,其他信号给1

二进制信号1111 1110转换为十六进制就是FE,在C语言代码中就写成P2=0xFE0x开头表示十六进制

这里的P2由#include <REGX52.H>中定义,这里边给了P2的具体地址:

在这里插入图片描述

代码写好后需要编译和生成工程文件,由于keli默认不生成.hex的文件,需要设置一下:

在这里插入图片描述

再次点build(快捷键F7)就会有hex文件

在这里插入图片描述

注意:代码中写的0xFE表示1111 1110,对应板子上从右至左的灯,根据3分析的原理,亮起的应该是D1,了解这个原理后想亮哪盏都可以

在这里插入图片描述

5. 烧录流程

单片机连接至电脑,启动单片机(按一下板子上的蓝色按钮),并打开STC-ISP软件,按照以下流程操作:

  1. 单片机型号选择STC89C52RC/LE52RC

  2. 串口号一般会自动识别出来,没识别出来就手动选择一下最长的那个(还没识别出来需要检查一下驱动是否安装好)

  3. 打开程序文件,找到生成的.hex结尾的文件

  4. 在单片机打开的情况下,【点击下载】→【关闭单片机】→【打开单片机】;如果是单片机关闭的情况下,【点击下载】→【打开单片机】就可以

  5. 显示“操作成功”后表示烧录成功,可以看到红灯亮起

在这里插入图片描述

效果如下:

在这里插入图片描述

6. LED灯闪烁

让一个LED灯闪烁,代码如下:

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    while(1)
    {        
        P2 = 0xFE;
        Delay500ms();
        P2 = 0xFF;
        Delay500ms();
    }
}

实际上就是给P2赋予不同的值,一下亮一下灭,由于执行代码的速度很快,中间还需要加上延时0.5s,延时代码的函数通过STC-ISP生成,步骤如下:

在这里插入图片描述

效果如下:

在这里插入图片描述

7. LED流水灯

知道上面的原理,写LED流水灯也很简单了:),只需要分析出每个灯亮的情况就可以,分别是:

1111 1110 // FE
1111 1101 // FD
1111 1011 // FB
1111 0111 // F7
1110 1111 // EF
1101 1111 // DF
1011 1111 // BF
0111 1111 // 7F

由此可以写出下面的代码:

#include <REGX52.H>
#include <INTRINS.H>

void Delay500ms()        //@11.0592MHz
{
    unsigned char i, j, k;

    _nop_();
    i = 4;
    j = 129;
    k = 119;
    do
    {
        do
        {
            while (--k);
        } while (--j);
    } while (--i);
}

void main()
{
    while(1)
    {
        P2 = 0xFE;
        Delay500ms();
        P2 = 0xFD;
        Delay500ms();
        P2 = 0xFB;
        Delay500ms();
        P2 = 0xF7;
        Delay500ms();
        P2 = 0xEF;
        Delay500ms();
        P2 = 0xDF;
        Delay500ms();
        P2 = 0xBF;
        Delay500ms();
        P2 = 0x7F;
        Delay500ms();
    }
}

效果如下:

在这里插入图片描述

8. 指定时长的延时

这个就是一些代码层面的简单改进了,利用STC-ISP生成1ms延时的代码:

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

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

接着写一个延时指定长度的函数,或者直接改这个Delay1ms的代码也行,我是直接写了一个延时指定长度的函数:

void DelaySpecificTime(unsigned int ms)
{
    while (ms){
        Delay1ms();
        ms--;
    }
}

就可以实现控制速度的流水灯,只需要简单调整传输给DelaySpecificTime的参数就行,完整代码如下

#include <REGX52.H>
#include <INTRINS.H>

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

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

void DelaySpecificTime(unsigned int ms)
{
    while (ms){
        Delay1ms();
        ms--;
    }
}

void main()
{
    while(1)
    {
        P2 = 0xFE;
        DelaySpecificTime(100);
        P2 = 0xFD;
        DelaySpecificTime(100);
        P2 = 0xFB;
        DelaySpecificTime(100);
        P2 = 0xF7;
        DelaySpecificTime(100);
        P2 = 0xEF;
        DelaySpecificTime(100);
        P2 = 0xDF;
        DelaySpecificTime(100);
        P2 = 0xBF;
        DelaySpecificTime(100);
        P2 = 0x7F;
        DelaySpecificTime(100);
    }
}

效果如下:

在这里插入图片描述

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

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

相关文章

PC端直接打印功能(包括两张图片合并功能)

一、 效果图 二、demo代码 <template><div class"box"><divref"printContent"class"print-content"><div class"print-title">打印图片</div><imgclass"preview-image":src"merged…

Vue前端篇——项目目录结构介绍

&#x1f4d8; 前言 在正式开始学习 Vue 3 开发之前&#xff0c;了解并熟悉其项目目录结构是非常关键的第一步。一个清晰、规范的目录结构不仅有助于开发者高效地组织代码&#xff0c;还能显著提升项目的可读性和可维护性。 Vue 3 作为现代前端开发中广泛使用的主流框架之一&…

抽象工厂模式深度解析:从原理到与应用实战

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…

35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题

江科大学长又发布了第二期的编写技巧&#xff01; 大家可以看看&#xff1a;https://space.bilibili.com/383400717 最后面给了一个未完成的任务&#xff1a; 这里我已经把这个问题给解决了&#xff01; 总代码放在资源里面&#xff0c;key.c放在文章最后面&#xff01;同时感…

Linux常用命令学习手册

Linux常用命令学习手册https://download.csdn.net/download/2401_87690752/90953550 《Linux常用命令学习手册》提供了一份实用的Linux操作指南&#xff0c;主要收录了系统管理和文件操作等基础命令。内容涵盖了目录切换、文件查看、权限设置等核心功能&#xff0c;适合Linux初…

Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解

在现代 Web 应用中&#xff0c;异步处理是实现流畅交互的核心技术。本文基于前几章实现的内容Tailwind CSS 实战&#xff1a;基于 Kooboo 构建 AI 对话框页面&#xff08;七&#xff09;&#xff1a;消息框交互功能添加-CSDN博客&#xff0c;深入解析 AI 对话框页面中异步逻辑的…

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

文章目录 前言:准备工作UE4 vs UE5 性能对比引擎核心技术方案对比UE5 优化总结项目设置可伸缩性组设置VolumetricCloud最后前言: 最近在使用UE5制作VR项目 制作完后发现,我们的场景一直很卡顿,场景优化也做到了极致,但是帧率最高也才30+ 但是我们看到一个竞品,他的帧率竟…

COMSOL与MATLAB联合仿真人工智能的电学层析成像系统

关键词&#xff1a;MATLAB&#xff0c;电学层析成像&#xff0c;人工智能&#xff0c;图像重建&#xff0c;深度学习 一、引言 基于人工智能的电学层析成像系统是一种创新的检测技术&#xff0c;结合了电学层析成像技术与人工智能算法的优势。电学层析成像技术&#xff0c;简…

配置sudo免密却不生效的问题

如图&#xff0c;我配置了dhcp4这个账号sudo免密&#xff0c;但是执行sudo的时候还是要输密码。 查看dhcp的用户组&#xff0c;是配置了一个wheel组&#xff0c;而wheel组配置的是需要密码。 我们用dhcp4用户执行sudo -l 发下他匹配了两条命令策略&#xff0c;一个是免密一个…

大模型赋能:金融智能革命中的特征工程新纪元

一、AI进化论&#xff1a;从“判别”到“生成”的金融新战场 1.1 判别式AI的“痛点”与大模型的“破局” 想象这样一幅画面&#xff1a;银行风控模型像老式收音机&#xff0c;需要人工反复调试参数才能捕捉风险信号&#xff1b;而大模型则是智能调音台&#xff0c;能自动“听…

LHA9924芯片可代替AD7190,CS5530

LHA9924是一款高性能、单芯片模数转换器(ADC)。该器件包括一个低噪声可编程增益放大器(PGA)、Δ-Σ调制器和数字滤波器。该ADC支持两种运行模式&#xff0c;可在功耗与分辨率之间实现最佳平衡。双通道多路复用器可以选择外部信号测量和内部ADC测试信号。具有使输入电路短路来测…

短视频矩阵系统技术saas源头6年开发构架

在短视频内容爆发式增长的今天&#xff0c;短视频矩阵系统SAAS技术成为企业快速搭建视频平台的关键解决方案。本文将系统解析从技术源头到服务落地的全流程开发路径。 一、系统定义与技术基础 短视频矩阵系统是集视频上传、智能编辑、多端分享、高清播放于一体的综合性平台。其…

前端删除评论操作(局部更新数组)

​评论的删除是局部删除&#xff0c;把所点击的评论id号传递给后端&#xff0c;通知后端在数据库中删除数据&#xff0c;并且返回数据&#xff0c;但是在前端并不直接接收返回的数据&#xff0c;而是触发回调事件&#xff0c;在前端上进行删除评论&#xff0c;首先通过pId观察他…

在线OJ项目测试

一.项目简介 1.1项目背景 历史起源&#xff1a;最早的OJ系统&#xff08;如UVa、POJ&#xff09;是为国际大学生程序设计竞赛&#xff08;ICPC&#xff09;等赛事开发的&#xff0c;用于自动评判参赛者的代码正确性和效率。 需求场景&#xff1a;竞赛需要公平、高效的评分系统…

C++ --- vector

C --- vector的使用 前言1、构造函数1.1默认构造1.2n个val值构造1.3迭代器区间构造1.4拷贝构造1.4初始化列表构造 2、遍历方式2.1[ ] 下标2.2迭代器2.3范围for 3、常用方法或重载&#xff08;1&#xff09;增push_back()insert()assign() &#xff08;2&#xff09;删erase()c…

FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ FART 脱壳 fartthread 方法在 app 启动的时候&#xff08;ActivityThread&#xff09;开启 fart 线程&#xff0c;休眠 60 秒&#xff0c;等待 app 启动完成后…

快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令

目录 1. uv 介绍2. uv 安装&#xff08;Windows版&#xff09;3. 快速模拟一个要发布到TestPyPI上的依赖包&#xff0c;scoful-test-lib3.1 初始化 uv init3.2 进入scoful-test-lib3.3 修改pyproject.toml3.4 使用命令 uv sync3.5. 使用命令 uv lock3.6 使用命令 uv build3.7 获…

Python读取PDF:文本、图片与文档属性

在日常的数据采集、文档归档与信息挖掘过程中&#xff0c;PDF格式因其版式固定、内容稳定而被广泛使用。Python 开发者若希望实现 PDF 内容的自动化提取&#xff0c;选择一个易用且功能完善的库至关重要。本文将介绍如何用Python实现 PDF文本读取、图片提取 以及 文档属性读取 …

基于SpringBoot+Vue2的租房售房二手房小程序

角色&#xff1a; 管理员、房东、租客/买家 技术&#xff1a; springbootvue2mysqlmybatispagehelper 核心功能&#xff1a; 租房售房小程序是一个专注于房屋租赁和销售的综合性平台&#xff0c;基于SpringBootVue2MySQLMyBatisPageHelper技术栈开发&#xff0c;为用户提供…

基于本地LLM与MCP架构构建AI智能体全指南

一、AI智能体开发的新范式 随着人工智能技术的快速演进&#xff0c;AI智能体&#xff08;AI Agents&#xff09;正成为连接技术创新与实际应用的核心载体。从智能家居的温控系统到复杂的金融风控决策&#xff0c;AI智能体通过感知环境并执行目标导向的行为&#xff0c;正在重塑…