杰瑞科技汇

Keil for C51教程如何快速上手?

Keil C51 完整入门教程

第一部分:准备工作

什么是 Keil C51?

Keil C51 是德国 Keil 公司(现为 ARM 公司的一部分)开发的 8051 内核单片机的集成开发环境,它集代码编辑、编译、链接、仿真和调试于一体,是 8051 开发领域最流行、最经典的工具。

Keil for C51教程如何快速上手?-图1
(图片来源网络,侵删)
  • IDE (Integrated Development Environment): 集成开发环境,将所有工具整合在一起。
  • C51 Compiler: C51 编译器,将我们编写的 C 语言代码转换成 8051 单片机可以执行的机器码。
  • µVision IDE: Keil 的图形界面,我们主要在这个界面里工作。

安装 Keil C51

目前最新的 Keil 版本是 MDK (Microcontroller Development Kit),它完美支持 8051 开发。

步骤:

  1. 下载安装包

    • 访问 Keil 官网:https://www.keil.com/
    • 注册并登录账号(免费)。
    • 下载 MDK 版本(MDK527),建议下载最新稳定版。
  2. 安装 Keil

    Keil for C51教程如何快速上手?-图2
    (图片来源网络,侵删)
    • 运行下载的安装包(如 SetupMDK527.exe)。
    • 按照安装向导的提示进行安装。注意:在安装过程中,确保勾选了 "Pack Installer",这对于后续添加器件支持包至关重要。
  3. 安装 8051 器件支持包

    • Keil 默认可能不包含所有 8051 芯片的支持包。
    • 打开 Keil MDK,点击菜单栏的 "Pack Installer" (图标像一个电路板)。
    • 在搜索框中输入你的单片机型号,STC89C52AT89S52
    • 找到对应的设备包,点击右侧的 "Install" 按钮,安装完成后,Keil 就能识别你的芯片了。
  4. 安装破解/注册工具 (可选)

    • 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 引脚。

创建新项目

  1. 打开 Keil µVision IDE。
  2. 点击菜单栏 Project -> New µVision Project...
  3. 选择一个文件夹保存你的项目,给项目命名(如 LED_Blink),然后点击 保存
  4. 接下来会弹出 "Select Device for Target" 窗口。
  5. 在左上角的搜索框中输入你的单片机型号(如 STC89C52RC),然后从列表中选择它,点击 OK
  6. Keil 会询问是否添加启动代码,对于 8051,通常选择 "Standard",然后点击 OK

添加源文件

  1. 在左侧的 "Project" 窗口中,右键点击 "Source Group 1"
  2. 选择 "Add New Item to Group 'Source Group 1'..."
  3. 在弹出的窗口中,选择 C File (.c),给文件命名(如 main.c),然后点击 Add
  4. 现在你应该能看到 main.c 文件出现在 Source Group 1 下了。

编写 C51 代码

双击打开 main.c,输入以下代码:

Keil for C51教程如何快速上手?-图3
(图片来源网络,侵删)
#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 的值越大,延时越长。

编译项目

  1. 点击工具栏上的 "Build Target" 按钮(快捷键 F7)。
  2. 如果代码没有错误,底部的 "Build Output" 窗口会显示 0 Error(s), 0 Warning(s),并生成一个 .hex 文件(如 LED_Blink.hex),这个 .hex 文件就是我们要烧录到单片机里的程序。

第三部分:下载程序到单片机

使用 STC-ISP 工具 (以 STC 单片机为例)

这是最简单、最常用的方法。

  1. 打开 STC-ISP 软件:从 STC 官网下载并安装。
  2. 选择单片机型号:在软件中选择你的芯片型号(如 STC89C52RC)。
  3. 打开程序文件:点击 "打开程序文件" 按钮,选择刚刚在 Keil 中生成的 LED_Blink.hex 文件。
  4. 选择串口和波特率
    • 将你的开发板通过 USB 线连接到电脑。
    • 在 STC-ISP 软件的下拉菜单中选择对应的 串口号(可以在 Windows 的“设备管理器”中查看)。
    • 波特率选择 1152009600 即可。
  5. 下载
    • 重要:先点击软件上的 "下载/编程" 按钮。
    • 然后给你的开发板重新上电(按一下复位按钮或重新插拔 USB 线),单片机检测到下载请求后会自动进入下载模式。
  6. 成功:如果一切正常,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);
}

第五部分:调试技巧

  1. 设置断点:在代码行号左侧点击,可以设置红色断点,程序运行到断点处会暂停。
  2. 开始/停止调试:点击工具栏的 "Start/Stop Debug Session" 按钮(快捷键 Ctrl+F5)进入调试模式。
  3. 单步执行
    • Step Over (F10):执行当前行,如果函数调用,则直接跳过。
    • Step Into (F11):执行当前行,如果函数调用,则进入函数内部。
  4. 查看变量:在调试模式下,将鼠标悬停在变量上,或在 "Watch & Call Stack Window" 窗口中添加变量,即可查看其当前值。
  5. 查看寄存器:在 "Peripherals" 菜单下,可以查看和修改所有特殊功能寄存器(如 P1, TMOD, SCON 等)的值,这对于调试 I/O 和外设非常有用。

总结与进阶

  • 熟练掌握:多练习 LED 点亮、按键检测、数码管显示、串口通信等基础实验。
  • 阅读数据手册:这是成为高手的必经之路,学会查阅你所用单片机的官方数据手册,了解其引脚、寄存器、电气特性和时序。
  • 学习 Proteus 仿真:使用 Proteus 软件可以与 Keil 联调,在电脑上仿真你的硬件电路,大大加快开发速度,减少硬件调试成本。
  • 探索 RTOS:对于复杂的项目,可以考虑学习在 C51 上运行实时操作系统,如 FreeRTOS,以更好地管理任务和资源。

这份教程为你铺平了 Keil C51 的入门之路,最重要的就是动手实践,遇到问题多思考、多查阅资料,祝你学习愉快!

分享:
扫描分享到社交APP
上一篇
下一篇