当前位置: 首页 > article >正文

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

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.lryc.cn/news/2402529.html

相关文章:

  • RNN和CNN使用场景区别
  • PC端直接打印功能(包括两张图片合并功能)
  • Vue前端篇——项目目录结构介绍
  • 基于端到端深度学习模型的语音控制人机交互系统
  • 原生js操作元素类名(classList,classList.add...)
  • 抽象工厂模式深度解析:从原理到与应用实战
  • 35.成功解决编写关于“江协科技”编写技巧第二期标志位积累的问题
  • Linux常用命令学习手册
  • Tailwind CSS 实战:基于 Kooboo 构建 AI 对话框页面(八):异步处理逻辑详解
  • Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战
  • COMSOL与MATLAB联合仿真人工智能的电学层析成像系统
  • 配置sudo免密却不生效的问题
  • 大模型赋能:金融智能革命中的特征工程新纪元
  • Significant Location Change
  • springboot 微服务 根据tomcat maxthread 和 等待用户数量,达到阈值后,通知用户前面还有多少用户等待,请稍后重试
  • LHA9924芯片可代替AD7190,CS5530
  • 短视频矩阵系统技术saas源头6年开发构架
  • 枫之谷Artale端午节大当机----后端技术的巨大风险
  • 前端删除评论操作(局部更新数组)
  • 数学复习笔记 28
  • Delphi 实现远程连接 Access 数据库的指南
  • 在线OJ项目测试
  • C++ --- vector
  • 【python基础知识】变量名和方法名的单下划线(_)和双下划线(__)总结
  • FART 脱壳某大厂 App + CodeItem 修复 dex + 反编译还原源码
  • ✅ 常用 Java HTTP 客户端汇总及使用示例
  • 快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
  • Keil调试模式下,排查程序崩溃简述
  • Python读取PDF:文本、图片与文档属性
  • 基于SpringBoot+Vue2的租房售房二手房小程序