Keil C51 完整入门教程
第一部分:准备工作
什么是 Keil C51?
Keil C51 是德国 Keil 公司(现为 ARM 公司的一部分)开发的 8051 内核单片机的集成开发环境,它集代码编辑、编译、链接、仿真和调试于一体,是 8051 开发领域最流行、最经典的工具。

- IDE (Integrated Development Environment): 集成开发环境,将所有工具整合在一起。
- C51 Compiler: C51 编译器,将我们编写的 C 语言代码转换成 8051 单片机可以执行的机器码。
- µVision IDE: Keil 的图形界面,我们主要在这个界面里工作。
安装 Keil C51
目前最新的 Keil 版本是 MDK (Microcontroller Development Kit),它完美支持 8051 开发。
步骤:
-
下载安装包:
- 访问 Keil 官网:https://www.keil.com/
- 注册并登录账号(免费)。
- 下载 MDK 版本(MDK527),建议下载最新稳定版。
-
安装 Keil:
(图片来源网络,侵删)- 运行下载的安装包(如
SetupMDK527.exe)。 - 按照安装向导的提示进行安装。注意:在安装过程中,确保勾选了 "Pack Installer",这对于后续添加器件支持包至关重要。
- 运行下载的安装包(如
-
安装 8051 器件支持包:
- Keil 默认可能不包含所有 8051 芯片的支持包。
- 打开 Keil MDK,点击菜单栏的 "Pack Installer" (图标像一个电路板)。
- 在搜索框中输入你的单片机型号,
STC89C52或AT89S52。 - 找到对应的设备包,点击右侧的 "Install" 按钮,安装完成后,Keil 就能识别你的芯片了。
-
安装破解/注册工具 (可选):
- Keil MDK 是商业软件,有代码大小限制(免费版限制为 2KB 代码)。
- 网上可以找到许多破解或注册工具(如
ARM License Manager),请自行搜索并按照教程进行注册,以解锁完整功能。
硬件准备
- 一块 8051 开发板:STC89C52、AT89S52 等型号的开发板。
- USB 数据线:用于连接电脑和开发板,以及给开发板供电。
- 下载/烧录工具:
- USBasp:经典的并口转USB工具,支持很多 AT 系列芯片。
- STC-ISP:官方下载工具,用于 STC 系列单片机,通常通过 USB 转串口(CH340/PL2303)芯片连接。
- ISP 下载线:用于直接在板子上烧录程序的接口。
第二部分:创建第一个项目 (LED闪烁)
我们将以最经典的 LED 闪烁 实验为例,走完整个开发流程,假设你的开发板上有一个 LED 连接在 P1.0 引脚。
创建新项目
- 打开 Keil µVision IDE。
- 点击菜单栏 Project -> New µVision Project...。
- 选择一个文件夹保存你的项目,给项目命名(如
LED_Blink),然后点击 保存。 - 接下来会弹出 "Select Device for Target" 窗口。
- 在左上角的搜索框中输入你的单片机型号(如
STC89C52RC),然后从列表中选择它,点击 OK。 - Keil 会询问是否添加启动代码,对于 8051,通常选择 "Standard",然后点击 OK。
添加源文件
- 在左侧的 "Project" 窗口中,右键点击 "Source Group 1"。
- 选择 "Add New Item to Group 'Source Group 1'..."。
- 在弹出的窗口中,选择 C File (.c),给文件命名(如
main.c),然后点击 Add。 - 现在你应该能看到
main.c文件出现在Source Group 1下了。
编写 C51 代码
双击打开 main.c,输入以下代码:

#include <reg52.h> // 包含 8052 特殊功能寄存器定义的头文件
// 延时函数,简单延时
void delay(unsigned int time) {
unsigned int i, j;
for (i = time; i > 0; i--)
for (j = 120; j > 0; j--);
}
void main() {
while (1) { // 无限循环
P1 = 0xFE; // 1111 1110b, P1.0 输出低电平,LED 亮
delay(500); // 延时
P1 = 0xFF; // 1111 1111b, P1.0 输出高电平,LED 灭
delay(500); // 延时
}
}
代码解释:
#include <reg52.h>:引入了 8052 单片机内部寄存器(如 P1, TMOD 等)的定义。sbit LED = P1^0;:这是一种更现代和推荐的方式,定义一个名为LED的位变量,它映射到P1.0引脚,上面的代码直接操作了整个 P1 端口,效果相同。P1 = 0xFE;:P1是一个 8 位的端口寄存器。0xFE的二进制是1111 1110,表示 P1.0 引脚输出低电平(0),其他引脚输出高电平(1),如果你的 LED 是共阳极接法(高电平点亮),则应写P1 = 0x01;。while(1):这是一个死循环,让单片机不断执行亮->延时->灭->延时的操作。delay():一个简单的软件延时函数,通过循环空耗时间来实现。time的值越大,延时越长。
编译项目
- 点击工具栏上的 "Build Target" 按钮(快捷键
F7)。 - 如果代码没有错误,底部的 "Build Output" 窗口会显示
0 Error(s), 0 Warning(s),并生成一个.hex文件(如LED_Blink.hex),这个.hex文件就是我们要烧录到单片机里的程序。
第三部分:下载程序到单片机
使用 STC-ISP 工具 (以 STC 单片机为例)
这是最简单、最常用的方法。
- 打开 STC-ISP 软件:从 STC 官网下载并安装。
- 选择单片机型号:在软件中选择你的芯片型号(如
STC89C52RC)。 - 打开程序文件:点击 "打开程序文件" 按钮,选择刚刚在 Keil 中生成的
LED_Blink.hex文件。 - 选择串口和波特率:
- 将你的开发板通过 USB 线连接到电脑。
- 在 STC-ISP 软件的下拉菜单中选择对应的 串口号(可以在 Windows 的“设备管理器”中查看)。
- 波特率选择
115200或9600即可。
- 下载:
- 重要:先点击软件上的 "下载/编程" 按钮。
- 然后给你的开发板重新上电(按一下复位按钮或重新插拔 USB 线),单片机检测到下载请求后会自动进入下载模式。
- 成功:如果一切正常,STC-ISP 会提示“完成”,并且你开发板上的 LED 灯就会开始闪烁了!
使用 Keil 自带的仿真器 (可选)
Keil 也支持在线仿真,但这需要硬件仿真器(如 ULINK2/Pro)的配合,成本较高,通常用于复杂的开发调试,初学者可以先掌握使用 STC-ISP 这类软件下载。
第四部分:Keil C51 核心语法与技巧
C51 与标准 C 的区别
- 包含的头文件:必须包含
<reg52.h>或<at89x52.h>等特定于芯片的头文件,以访问 SFR。 - 数据类型:
bit:C51 扩展的位变量类型,可以声明一个单独的位,占用 1 bit。bit flag;。sfr,sbit:sfr:用于定义 8 位的特殊功能寄存器。sfr P1 = 0x90;。sbit:用于定义 SFR 中的某一位。sbit LED = P1^0;。
- 存储区:8051 有不同的内存空间(CODE, DATA, IDATA, XDATA, PDATA),C51 允许你通过关键字指定变量存储在哪个区域。
data:直接寻址片内 RAM (128字节),最快。bdata:可位寻址片内 RAM (16字节)。idata:间接寻址片内 RAM (256字节)。xdata:外部数据存储器 (64KB),最慢。code:程序存储器 (64KB),存放常量。- 示例:
unsigned char data counter;,unsigned char xdata buffer[256];。
访问 I/O 端口
最直接的方式是使用 P0, P1, P2, P3 等端口寄存器。
// 方式一:直接操作整个端口 P1 = 0x55; // P1.0, P1.2, P1.4, P1.6 输出0,其余输出1 // 方式二:使用 sbit 定义位变量 (推荐) sbit LED1 = P1^0; sbit LED2 = P1^1; LED1 = 0; // 点亮 LED1 LED2 = 1; // 熄灭 LED2
中断
8051 有 5 个中断源:外部中断 0、定时器 0、外部中断 1、定时器 1、串口中断。
C51 使用 interrupt 关键字来定义中断服务函数。
#include <reg52.h>
void timer0_isr() interrupt 1 { // 定时器0的中断号为1
// 中断服务程序代码
TH0 = 0xFC; // 重新装载初值
TL0 = 0x18;
}
void main() {
TMOD = 0x01; // 设置定时器0为模式1 (16位定时器)
TH0 = 0xFC; // 定时1ms的初值
TL0 = 0x18;
ET0 = 1; // 使能定时器0中断
EA = 1; // 开启总中断
TR0 = 1; // 启动定时器0
while(1) {
// 主循环代码
}
}
定时器/计数器
通过设置 TMOD 寄存器来选择工作模式(模式0-3),通过 THx 和 TLx 设置初值。
- 模式1:16位定时器/计数器,最常用。
- 模式2:8位自动重装模式,适合波特率发生器。
串口通信
通过设置 SCON、TMOD 和波特率相关的寄存器(PCON, TH1, TL1)来实现。
#include <reg52.h>
void uart_init() {
SCON = 0x50; // 模式1,允许接收
TMOD = 0x20; // 定时器1,模式2 (8位自动重装)
TH1 = 0xFD; // 波特率9600
TL1 = 0xFD;
TR1 = 1; // 启动定时器1
EA = 1; // 开总中断
ES = 1; // 开串口中断
}
void uart_send_byte(unsigned char dat) {
SBUF = dat;
while(!TI); // 等待发送完成
TI = 0; // 清除发送中断标志
}
void main() {
uart_init();
uart_send_byte('H');
uart_send_byte('e');
uart_send_byte('l');
uart_send_byte('l');
uart_send_byte('o');
while(1);
}
第五部分:调试技巧
- 设置断点:在代码行号左侧点击,可以设置红色断点,程序运行到断点处会暂停。
- 开始/停止调试:点击工具栏的 "Start/Stop Debug Session" 按钮(快捷键
Ctrl+F5)进入调试模式。 - 单步执行:
- Step Over (F10):执行当前行,如果函数调用,则直接跳过。
- Step Into (F11):执行当前行,如果函数调用,则进入函数内部。
- 查看变量:在调试模式下,将鼠标悬停在变量上,或在 "Watch & Call Stack Window" 窗口中添加变量,即可查看其当前值。
- 查看寄存器:在 "Peripherals" 菜单下,可以查看和修改所有特殊功能寄存器(如 P1, TMOD, SCON 等)的值,这对于调试 I/O 和外设非常有用。
总结与进阶
- 熟练掌握:多练习 LED 点亮、按键检测、数码管显示、串口通信等基础实验。
- 阅读数据手册:这是成为高手的必经之路,学会查阅你所用单片机的官方数据手册,了解其引脚、寄存器、电气特性和时序。
- 学习 Proteus 仿真:使用 Proteus 软件可以与 Keil 联调,在电脑上仿真你的硬件电路,大大加快开发速度,减少硬件调试成本。
- 探索 RTOS:对于复杂的项目,可以考虑学习在 C51 上运行实时操作系统,如 FreeRTOS,以更好地管理任务和资源。
这份教程为你铺平了 Keil C51 的入门之路,最重要的就是动手实践,遇到问题多思考、多查阅资料,祝你学习愉快!
