前言
本教程基于B站江协科技课程进行个人学习整理,专为拥有C语言基础的零基础入门51单片机新手设计。既帮助解决因时间差导致的设备迭代调试难题,也助力新手快速掌握51单片机核心知识,实现从C语言理论到单片机实践应用的高效过渡 。
目录
1.知识储备
1.传统方式编程与模块化编程区别
传统方式编程:
所有的函数均放在main.c里,若使用的模块比较多,则一个文件内会有很多的代码,不利于代码的组织和管理,而且很影响编程者的思路。
模块化编程:
把各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数的声明,其它.c文件想使用其中的代码时,只需要#include“XXX.h"文件即可。使用模块化编程可极大的提高代码的可阅读性、可维护性、可移植性等。
2.模块化编程框图
下图所标记位置为预编译,其作用是防止重复包含声明,这就能够避免编译错误,提高编译效率,保持代码清晰。
下图所标记位置即为Delay函数的声明,在头文件(.h)中进行.
防止重复包含代码的实现过程,如下图所示,蓝色框内的左边红色文字就是对右边代码的解释。
3.模块化编程注意事项
1. .c文件:函数、变量的定义
2. .h文件:可被外部调用的函数、变量的声明
3. 任何自定义的变量、函数在调用前必须有定义或声明(同一个.c)
4. 使用到的自定义函数的.c文件必须添加到工程参与编译
5. 使用到的.h文件必须要放在编译器可寻找到的地方(工程文件夹根目录、安装目录、自定义)
4.C预编译
作用:
实现代码可选化与精简化,既能按需启用不同功能模块,精简冗余代码,还能提升代码的可维护性、可移植性,方便调试测试与软件定制,高效满足多样化开发需求。
2.操作流程
1.调试Keil uVision5,正常显示汉字
由于Keil uVision5是外国软件,不兼容中国汉字,为了方便我们能够看到“LCD1602.h”(下文将会用到)中的注释,我们需要调试,解决方法如下:
1.打开Keil uVision5,左击下图所标记位置。
2.左击“Encoding”右边的小箭头,选择“UTF-8(全球语言)”,再左击“OK”。(“Encoding“中有“BIG5(繁体中文)”和“GB2312(简体中文)”,选择什么看个人的习惯)
注意:选择“UTF-8”之后,不会出现半字和乱码的问题,但是在使用它之前的汉子会变成乱码,所以我们需要先选择“UTF-8”,再创建或导入含有中文的文件。
2.代码模块化
1.打开Keil uVision5,左击屏幕左上角的“Project”。
2.左击如图所示的位置
3.“Ctrl+Shift+N”新建一个文件夹(作者这里已经建好了),左击进入。
4..文件名命名完成,左击“OK”。
5.基本51单片机格式代码如下图所示。(这里小编省略了创建“main.c”的过程,如要需要可从小编之前的作品中查阅)
6.左击下图标记位置左边的符号,main.c显现
7.输入你想要调用的模块化代码的头文件,这里以“Delay”延时函数为例。
8.右击“Source Group 1”,再左击下图所标记位置
9.选择C语言,“Name”命名为“Delay”,左击“Add”。
10.“Delay.c”在目录中展现
11.找到之前学习时,有用到延时代码的文件,左击进入
12.打开“main.c”(小编选择的打开方式为VS)
13.复制Delay延时代码
14.粘贴进5-1中Delay.c源文件中
15.右击“Source Group 1”,再左击下图所标记位置
16.选择头文件,“Name”命名为“Delay”,左击“Add”。
17.目录中并没有显示"Delay.h"
18.右击“Source Group 1”,再左击下图所标记位置
19.右击文件类型最右侧的小箭头,找到“All”,左击选择,这样我们才能看见Delay.h
20.找到Delay.h并选中,左击“Add”,
21.显然,Delay.h被添加进目录中,左击“close”退出下图所示界面
22.在"Delay.h"中输入预编译代码
23.对Delay延时函数进行声明
24.同理,可得数码管的头文件和源文件(这里小编的头文件命名有误,请将“Nixiie.h”改正为“Nixie.h”),由于该源文件的代码定义P0口并且调用了Delay延时函数,所以要加上两个头文件,如下图标记位置所示。
25.Nixie.h的代码如下图所示
3.主体代码编写
如下图所示。
由于5-1的代码过于简单,所以5-2 LCD1602调试工具中的代码一并展示,如下图所示。(图中的“LCD1602.h”和“LCD1602.c”需要在江协科技的简介中找到并下载)
为什么用LCD1602而不用数码管?理由如下:
1.数码管需要不断扫描,一旦扫描不及时,数码管就会闪烁,显示内容也没有LCD1602多
2.LCD1602只与数码管和三个LED冲突,与其他器件不冲突,那么使用它调试会很方便,但是也有一个缺点,就是数码管和三个LED就不能用了。
4.进行烧录
1..打开stc-isp,左击“打开程序文件”。
2.找到存储代码文件夹的位置,双击进入。
3..双击“Objects”。
4.双击选中下图所示位置。
5.在确保51单片机已经与电脑连接的状态下,左击“下载/编程”。
6.在确保51单片机已经与电脑连接的状态下,按下51单片机开关,等待操作界面显示“操作成功”的字样后,关闭51单片机再次启动即可。
7.操作结果如下图所示。
8.同理,得到LCD的操作结果,如下所示。
3.代码解析
5-1 模块化编程中的代码
Nixie(1,1)到Nixie(8,8)中,Nixie第一个参数表示现实的数码管的位置,第二个参数表示要在该位置上数码管要显示的数字。
5-2 LCD1602调试工具中的代码
根据下图进行理解
1.()中第一个参数表示第几行,第二个参数表示第几列,第三个参数表示要显示的数据,第四个参数表示指定长度(只有显示的数据为数字时才会有)
2.如果 LCD_ShowNum(1,9,123,3)中指定长度小于“3”,比如“2”,那么要显示的数字的最高位“1”就不会显示,只显示“23”;如果指定长度大于“3”,比如“4”,那么高位会补“0”,显示“0123”。
3.LCD_ShowSignedNum(1,13,-66,2)中第三个参数“-66”中的“-(负号)”并不包括在第四个参数即指定长度中。
4.LCD_ShowBinNum(2,4,0xAA,8)中第三个参数不能输入“1010 1010”,只能用十六进制数字来代表。
“LCD1602.h”和“LCD1602.c”
需要在江协科技的简介中找到并下载。我们之前调试软件,将编码方式改为“UTF-8”就是为了让我们能够阅读它们中的内容。
4.总结
本文既是我跟随 B 站江协科技学习 51 单片机模块化编程及 LCD1602 调试工具的实践总结,也是一份专为新手打造的实用指南。全文虽篇幅较长,但紧扣知识储备与代码模块化两大核心内容展开。当你深入理解并熟练掌握这两点,便能精准把握课程精髓,开启单片机开发的进阶之路。