第一章 单片机概述
1.1.51单片机简介
51 单片机原是指 20 世纪 80 年代早期由 Intel 公司推出的一种 8 位微控制器系列,其以
简单、稳定、功能丰富而广受欢迎,现在更多的指实现了 8051 指令集的一系列单片机。我
们目前使用的 51 单片机一般是宏晶 STC89 系列,这其中流传最广的版本,也是我们今天课
程的主角,就是 STC89C52RC。
我们的核心板采用的单片机型号是 STC89C52,LQFP44 封装,芯片的相关文档自行查询,也可找我领取。
1.2 封装
目前 STC89C52RC 有两种常见封装:LQFP44 和 PDIP40。
(1)LQFP44
(2)PDIP40
两种封装的芯片并无性能差异,只是外观不同,同时 LQFP44 比 PDIP40 多了四个 GPIO
引脚,具体选择哪一种需要看 PCB 板的设计要求。
1.3 命名规则
1.4 单片机最小应用系统

第 2 章 开发板简介
做单片机开发,除了要开发环境,还需要能运行代码的开发板。我们这门课使用的是 51
开发板,板子分为核心板和扩展版两个部分。核心板只包含 51 单片机运行的最小组成,外
设都放在了扩展版上,两个板通过标准插口连接。
2.1 开发板实物图
本人使用的开发板为尚硅谷公司的。
2.2 核心板原理图
2.3 扩展板原理图
第 3 章 开发环境与工具
3.1 Keil5 软件安装
51 单片机的开发使用的是定制的 C 语言(与标准 C 语言语法有一点点不同),所以配
套编译器不能再使用 gcc,而是要使用 armcc。armcc 是商业编译器,要使用需要商业授权。
Windows 下,armcc 被集成在 Keil 中。
Keil 是一个 Windows 环境下进行单片机开发的 IDE(集成式开发环境),可以在其中
编写代码,管理项目以及最重要的:仿真和调试代码。
(1)官网下载地址
Keil 主页:https://www.keil.com
(2)本地下载地址
通过网盘分享的文件:02_51_keil
链接: https://pan.baidu.com/s/1AEcChUNSiPSWkZN0WDOB0w?pwd=9uy9 提取码: 9uy9
--来自百度网盘超级会员v1的分享
3.2 STC-isp软件安装
(1)官网安装
STC-isp 是 STC 公司专门为 STC 芯片准备的 USB 口刷写工具。
官方下载地址:http://www.stcmcudata.com/STCISP/stc-isp-15xx-v6.92A.zip
(2)本地下载
通过网盘分享的文件:03_isp程序下载工具
链接: https://pan.baidu.com/s/1QtrB5CCwpXUhJTEyXRG09g?pwd=vww6 提取码: vww6
--来自百度网盘超级会员v1的分享
3.3 逻辑分析仪
单片机中“时序”是一个很重要的概念,简单来说,就是安排单片机做事情的顺序。当
单片机通过 GPIO 操作外设时,控制信号必须符合外设的要求。
以我们后面要用的超声模块为例,我们想使用这个模块,必须在 TRIG 引脚发射一个至
少 20us 的高位脉冲,然后等待一段时间,在 ECHO 引脚会收到超声模块的回复。在这个过
程中,可能出现以下问题:
(1)我们单片机发射的脉冲可能持续时间不到 20us。
(2)等待回复的时间不确定,如果等待时间不足,可能出现干扰信号。
关于这个超声模块,我们用 51 做小车的时候会详细讲解,但是通过上面的描述,大家
应该能看明白,单片机代码和外设通信的时序非常重要。而如果需要准确测量这个时序,我
们需要一个辅助设备:逻辑分析仪。
逻辑分析仪实物图如下所示:
3.4 VScode 软件安装
如果学习 c 语言过程中,没有安装 VScode 的同学,需要安装一下 VScode,方便后续代
码的编写。
第 4 章 点亮 LED
4.1 创建项目
4.2编写程序
编写代码
#include<STC89c5xRC.H>//包含STC89c52头文件
void main()
{
//让P00引脚输出低电平
P00=0;
//死循环卡住单片机,让他不要继续往下执行
while(1);
}
4.3 编译程序
4.4烧录程序
4.5 案件解读
第五章 闪烁LED
5.1 需求描述
令 LED1 每秒钟闪烁一次,具体效果下图所示。
5.2 软件设计
5.2.1 实现思路
想让 LED1 闪烁,只需让 P00 的值不断地在 0 和 1 之间循环变化即可。
5.2.2 代码实现
(1)代码
#include<STC89C5xRC.H> //包含STC89C52的头文件
#include<INTRINS.H>
void Delay_1MS(unsigned int xms);//延时函数的声明
void main()
{
//让led变为低电平
P00=0;
//死循环卡住单片机,让他不要继续往下执行
while(1)
{
//对led不断取反,取反就是亮灭转换
P00=~P00;
//延时500ms
Delay_1MS(500);
}
}
void Delay_1MS(unsigned int count) //@11.0592MHz
{
unsigned char data i, j;
while (count > 0) {
_nop_();
i = 2;
j = 199;
do {
while (--j):
} while (--i);
count--;
}
}
(2)代码解读
1)延时函数说明
这段代码中,LED 闪烁的部分其实相当简单,就是对 P00 不断取反。亮灭的节奏主要
取决于延时函数的实现。那我们如何实现一个 1ms 的延时函数呢?这里,我们可以使用
STC-ISP 自带的软件延时计算器。
2)延时的原理
在 51 单片机中,执行每条指令都需要特定的时间,因此只需知道每条指令执行多长时
间,再令其循环执行特定的次数就能实现延时。
关于每条指令的执行时间,需要搞清楚时钟周期、机器周期和指令周期三个概念,具
体内容如下
3)_nop_函数说明
由于生成的延时函数中调用了_nop_( ) 系统函数,该函数作用是执行一个空操作,延
时 函 数 调 用 _nop_( ) 的 作 用 目 的 仅 仅 是 为 了 使 延 时 更 加 精 准 。 由 于 该 函 数 定 义 在
<INTRINS.H>文件中,因此需要引入该文件。
第六章 流水灯
6.1 需求描述
令 P00 到 P07 的 LED 依次亮起,间隔 100ms,不断循环。
6.2软件设计
6.2.1 代码实现
#include <STC89C5xRC.H>
#include <INTRINS.H>
#define LED P0
//增加自定义类型,简化代码编写
typedef unsigned char u8;
typedef unsigned int u16;
//声明延时函数
void Delay1ms(u16 count);
void main()
{
//声明临时变量
u8 temp=1;
//temp是8个bit,对于8个led,1代表亮,正好和P0相反
//之后我们只要对temp做左位移,就可以实现流水灯
while(1)
{
//P0是temp取反;0000 0001取反1111 1110
LED=~temp;
//左移位次数为:0000 0001,0000 0010,0000 0100 ... 1000 0000
LED<<=1;
//temp是char类型8位,如果等于1000 0000,再左移一位就变成0000 0000,所以如果temp等
//于0时,需要将temp在设置为1;
if(temp==0)
{
temp=1;
}
//延时函数100ms
Delay1ms(100);
}
}
void Delay1ms(u16 count) //@11.0592MHz
{
unsigned char data i, j;
while (count > 0) {
count--;
_nop_();
i = 2;
j = 199;
do {
while (--j);
} while (--i);
}
}