一、编程环境搭建与工程准备
1.编程环境下载与配置:参考b站江协科技或者西风的视频(完全免费)
2.工程项目的创建
(1)先在桌面新建文件夹,重命名为准考证号
(2)重命名完成后创建两个文件,分别为User
和Driver
-
User
文件夹中存放Keil创建的uvision project项目和main函数。 -
Driver
文件夹中存放C语言源代码(.c)和头文件(.h)。
(3)打开Keil,按照下图创建工程
-
选择刚刚在桌面创建的以准考证号命名的文件。
-
点击进去后,打开
User
文件夹,修改文件名然后点击保存
-
项目创建成功
(4)在keil内配置项目
选择芯片
-
在
Device
中按照如图所示点击(如果没有STC MCU Database请先安装MCU芯片包)。
-
在
search
界面输入15F
,选择STC15F2K60S2
类型的芯片,该芯片为蓝桥杯比赛时使用的芯片,选择好后点击OK。
-
点击OK后跳出该页面,点击否。
配置路径
-
点击品字格
-
左边的
Project Targets
下面的Target 1
双击后可以修改项目名称。中间的Groups
为Project Targets
文件夹内的文件。
-
我们先双击
Groups
的Source Group 1
,修改成User
,并点击上面的文件夹图标加入新文件,将其命名为Driver
。
-
配置好后,点击OK。
-
最终效果
-
然后再点击工具箱
-
先点击
Output
,再点击Grete HEX File
(生成Hex文件),这个文件的作用是当你完成代码编写并进行编译后,Keil 会生成一个.hex
文件。你可以将这个.hex
文件通过编程工具(如 JTAG、ISP、USB 编程器等)烧录到单片机中。-
然后再点击
C51
,点击Include Paths
(Driver文件路径)的省略号。-
按照下图步骤,先创建文件,再将文件重命名成
Driver
,然后点击OK,在工具箱主页面也点击OK,到这边为止,我们的工程项目的创建就完成了。
-
-
二、c语言基础
1.创建.c文件和.h文件
(1)源文件(Source Files)
.c
文件通常被称为源文件,它们包含了程序的主要实现。每个 .c
文件可以定义程序中的函数、变量和其他逻辑。
(2)头文件(Header Files)
与 .c
文件不同,.h
文件是头文件,通常用来声明函数、结构体、常量、宏等,而不包含实际的代码实现。头文件通常被其他 .c
文件引用(通过 #include
)。
(3)源文件和头文件在编译中的作用:
-
.c
文件通过编译器编译后,生成目标文件(通常是.o
或.obj
文件)。 -
目标文件与其他源文件编译生成的目标文件一起,经过链接器链接成最终的可执行文件。
(4)其他类型的源文件
-
C++源文件:扩展名通常是
.cpp
或.cc
。 -
汇编源文件:扩展名通常是
.s
或.asm
。
生成main.c
同理,在刚刚添加项目到User页面我们也可以添加.h
文件
2.语法基础
该部分只介绍部分语法基础,想深入学习c语言可以观看视频
【浙江大学翁恺教你C语言程序设计!C语言基础入门!】 浙江大学翁恺教你C语言程序设计!C语言基础入门!_哔哩哔哩_bilibili
(1)库函数(Library Function)
是指在程序设计中,由操作系统或标准库提供的函数,它们预先编写并打包成库文件,供开发者在编写程序时调用。库函数通常是为了提高开发效率、避免重复造轮子而设计的,它们为程序员提供了许多常用功能,如输入输出、数学运算、字符串处理等。
也就是说:库函数通常是由标准库或第三方库提供的,我们无需重新编写这些功能,可以直接使用它们。
在我们蓝桥杯单片机组编写c源代码时,我们只需要引用STC15F2K60S2
库即可。
在main.c
的第一行处单击,出现|
后点击鼠标右键,点击第二行的Insert #include <STC15F2K60S2.H>
,我们就成功引用库函数了。
(2)变量
-
基本格式:
<数据类型> <变量名>;
其中,分号(;
)用作语句的结束符,标识语句的结束。以下是对不同变量类型的定义以及存储区修饰符的应用。
-
例子:
int a; // 整型变量a,初始值为0
char b; // 字符型变量b,初始值为0
int a = 3; // 整型变量a,初始值为3
-
全局变量和局部变量
全局变量(Global Variable):全局变量是在函数外部声明的变量,通常位于文件的顶部。它的作用范围从声明的位置开始,直到文件的结尾。也就是说,全局变量在整个文件中都可以被访问。
局部变量(Local Variable):局部变量是在函数内部声明的变量,只在函数内部有效。局部变量的作用范围仅限于它所在的代码块(函数、循环、条件语句等),在函数外部无法访问。
int a; void Insert() { int b = 2; } void Change() { a = 1; //正确,a是全局变量,生存期为整个程序 b = 1; //错误,b是在Insert中定义的局部变量,生存期只有在Insert内有效 }
-
带有存储区修饰符的格式:
<存储区修饰符> <数据类型> <变量名>;
在嵌入式编程中,常用的存储区修饰符有:
-
xdata
:用于将变量存储在外部数据存储器中,如外部 SRAM 或 EEPROM。 -
idata
:用于将变量存储在内部数据存储器中,通常是微控制器的内部 RAM。 -
pdata
:用于指示变量存储在特殊的程序存储器中,常见于数据和程序存储器分离的嵌入式系统中。
通过使用存储区修饰符,我们可以精确控制变量存储的物理位置,从而提高程序的性能,尤其是在资源受限的嵌入式系统中。
idata unsigned char a; //unsigned char型的全局变量,初始值为0
unsigned char a = 0; //不使用idata时,赋初值0
-
嵌入式中常用的数据类型及其范围
-
数据类型 类型 范围 大小 signed char
有符号字符 -128 到 127 1 字节 unsigned char
无符号字符 0 到 255 1 字节 unsigned short
无符号短整型 0 到 65,535 2 字节 unsigned int
无符号整型 0 到 65,535(16 位)或 0 到 4,294,967,295(32 位) 2 字节(16 位)或 4 字节(32 位) float
浮点数 ±1.4 × 10^−45 到 ±3.4 × 10^38 4 字节 bool
布尔类型 true
或false
1 字节 unsigned long int
无符号长整 0 到 4,294,967,295(32位)或0 到 18,446,744,073,709,551,615(64)位 4 字节(32 位系统) 或 8 字节(64 位系统)
(3)函数
在编程中,函数是用来组织代码、实现特定功能的独立模块。函数通常由函数声明、函数定义和函数调用三部分组成。
简单来说,函数声明是告诉编译器函数的名称、返回类型以及参数类型。它通常在函数定义之前进行声明,也可以在头文件中进行声明,供其他文件使用。函数定义是函数的实际实现部分,包含了函数体,也就是执行具体操作的代码。函数调用是程序中实际使用函数的地方。调用时需要提供函数的实际参数(如果有),并根据函数的返回类型来处理返回结果。函数调用必须在编译器知道该函数的声明或定义之后才能执行。
unsigned char func(unsigned char a)//函数名为func,传入参数为无符号字符型a,返回值为无符号字符型
{
int b = 0;
unsigned char c = 0;
if(b > a)
b = a;
else
c = a;
return c;//return b则会报错,这是因为b是整形,而函数返回值是无符号字符型
}
void func_dis(void)
{
unsigned char a = func(2);//调用已经声明的函数func,并传入参数2,定义无符号字符型变量接收func函数的返回值
}
(4)main 函数
main函数
是程序的入口点,程序从这里开始执行。每个 C 或 C++ 程序都必须有一个 main
函数,可以根据需求设置不同的返回类型和参数。
void main()
{
while(1)
{
}
}
到此为止,我们可以了解部分c语言的基础,如果还有不理解的地方,欢迎在评论区留言或私信我。后续会陆续更新蓝桥杯单片机组的各个模块的代码编写以及省赛国赛真题的完整编写过程。