【普中51单片机开发攻略--基于普中-2&普中-3&普中-4】-- 第 8 章 51 单片机工程模板创建

(1)实验平台:普中51单片机开发板-A2&A3&A4


本章将向大家介绍如何使用 KEIL C51 软件以及如何创建 51 单片机工程。 通过本章的学习, 让大家创建属于自己的 51 单片机工程模板, 为后面学习 51 单片机编程做好铺垫。 本章分为如下几部分内容:

[8.1 51 单片机工程模板创建](#8.1 51 单片机工程模板创建)

[8.1.1 新建工程](#8.1.1 新建工程)

[8.1.2 选择 CPU 型号](#8.1.2 选择 CPU 型号)

[8.1.3 给工程添加文件](#8.1.3 给工程添加文件)

[8.1.4 配置魔术棒选项卡](#8.1.4 配置魔术棒选项卡)

[8.1.5 修改编程区内字体大小](#8.1.5 修改编程区内字体大小)

[8.2 reg52.h 头文件介绍8.2.1 头文件作用](#8.2 reg52.h 头文件介绍8.2.1 头文件作用)

[8.2.2 头文件内容](#8.2.2 头文件内容)

课后作业


8.1 51 单片机工程模板创建

前面章节我们介绍了如何安装和破解 KEIL C51 软件, 这一节我们来介绍下如何使用该软件创建一个 51 单片机工程模板, 为后面章节程序的编写带来方便。

8.1.1 新建工程

首先在电脑任意位置新建一个文件夹, 命名为"51 单片机工程模板创建" 。

打开 KEIL C51 软件, 新建一个工程, 工程名根据喜好命名, 但是要注意使用英文, 如果使用中文名可能会出现一些奇怪的错误, 这里我们命名为template, 直接保存在刚才创建的"51 单片机工程模板创建" 文件夹下。 具体

步骤如下:

8.1.2 选择 CPU 型号

这个根据开发板使用的 CPU 具体的型号来选择, 我们开发板使用的是STC89C52 或 STC89C516 芯片。 在 KEIL C51 软件内找不到这种型号的单片机, 因为 51 内核单片机具有通用性, 所以在这里可以任选一款 89C52 就行, Keil 软件的关键是程序代码的编写, 而非用户选择什么硬件, 在这里我们选择 Ateml 的89C52 来说明。 具体操作如下:

点击 OK 键后, 弹出如下对话框:

该对话框内容是提示我们是否要将 8051 启动文件添加到工程中, 这里我们选择"否" , 原因是 KEIL C51 内已经帮我们完成了启动, 所以只需要编写应用程序即可。 选择"否" 后界面如下:

8.1.3 给工程添加文件

选择 File/New...或者使用工具栏的图标来新建一个文件后点击保存, 系统会自动定位到我们工程目录, 只需要在文件名栏输入新建的文件名即可, 一个 51 单片机工程必须含有且仅有一个 main 函数, 因此将新建的文件命名为 main.c(当然也可以根据个人习惯自定义命名, 但必须是英文) , 点击保存。 具体操作步骤如下:

然后将新建的 main.c 文件添加到工程中, 选择工程组"Source Group 1",鼠标右键选择"Add Files to Group 'Source Group 1' ..." ,然后选择对应的 xxx.c 文件, 点击 Add 键后在点击 Close 关闭。 这时工程中就显示已加入的文件。 具体操作如下:

8.1.4 配置魔术棒选项卡

这一步的配置工作非常重要, 很多人自己编写程序编译后发现找不到 .HEX 文件, 或者使用我们 51 仿真器的时候出现仿真失败, 这些问题都是在这个地方没有配置好导致的。

1, 选择魔术棒工具的 Output 选项卡, 勾选红色框 3, 即程序编译成功后会产生 HEX 文件。 具体操作如下:

2, 51 仿真器配置

当购买了 51 仿真器且你的仿真器安装好驱动并且连接了电脑和板子, 那么就可以开始配置。 如果使用我们公司的 51 仿真器的朋友, 相关驱动的安装请查看"\1--用户必看\4--普中 51 仿真器使用说明" 教程。 将 51 仿真器直接插在单片机卡座上, 仿真器采用防呆设计, 方向错了没法卡紧。 仿真器一端连接电脑, 同时仿真器也给开发板供电, 所以使用仿真器时可不接电源线。 要使用 51 仿真器在线调试程序, 需要在 KEIL 软件内进行相应的配置。具体的配置如下(这里已经将普中 51 仿真器连接至开发板) :

根据上图从 1 到 10 步骤设置完成之后就可以进行在线仿真调试了。

最后点击 OK 按钮即可。 然后双击工程组中的 main.c 文件, 我们输入如下内容:

cpp 复制代码
#include "reg52.h"

void main()
{
    while(1)
    { 
        
    }
}

编译后结果 0 错误 0 警告, 表明我们创建的 51 单片机工程完全正确。如下:

上图红色标记 1 中三个按钮都可以对代码编译, 但其功能不同:

第一个: 它是编译当前界面所在的一个 C 文件。

第二个: 联合编译整个工程, 发生修改的文件重新编译, 并生成可执行文件。

第三个: 联合编译整个工程, 所有文件都重新编译, 并生成可执行文件。

从上面说明可以看出, 一般情况下, 我们不使用第三个编译按钮, 第二个最常用。 因为第三个每次都把所有的文件都重新编译, 需要消耗大量的时间。 当工程比较小的时候, 感觉不到, 但是工程较大的时候就不行了。

8.1.5 修改编程区内字体大小

有朋友可能会觉得, KEIL C51 默认提供的字体比较小, 看起来非常不舒服。下面我们就来介绍如何在 KEIL C51 软件内修改编程区字体大小问题。

1, 首先在 KEIL C51 软件的工具栏中内找到一个"小扳手" , 如下所示:

2, 然后点击它, 弹出如下设置界面, 按照设置界面的红色标号顺序进入。

3, 点击标号 5 按钮时用于选择设置当前字体大小等信息的, 选择适合自己的字体大小即可, 然后点击 OK, 设置完成。 如下所示:

最后设置完成后, 编程区内的字体就会发生改变。

更多有关 KEIL C51 软件的使用小技巧大家可以通过百度了解学习。

8.2 reg52.h 头文件介绍8.2.1 头文件作用

在代码中引用头文件, 其实际意义就是将这个头文件中的全部内容放到引用头文件的位置处, 免去我们每次编写同类程序都要将头文件中的语句重复编写。在代码中加入头文件有两种书写方法, 分别为#include <reg52.h>和#include "reg52.h", 包含头文件时都不需要在后面加分号。 两种写法的区别如下:

①当使用<>包含头文件时, 编译器先进入到软件安装文件夹处开始搜索这个头文件, 也就是 KEILC51/C51/INC 这个文件夹下, 如果这个文件夹没有引用的头文件, 编译器将会报错。

②当使用""包含头文件时, 编译器先进入到当前工程所在文件夹处开始搜索该头文件, 如果当前工程所在文件夹下没有该头文件, 编译器将继续回到软件安装文件夹处搜索这个头文件, 若找不到该头文件, 编译器将报错。

8.2.2 头文件内容

打开该头文件查看其内容, 将鼠标移动到 reg52.h 上, 单击右键, 选择"Open document <reg52.h>" , 即可打开该头文件, 如下:

以后若需打开工程中的其他头文件, 也可采用这种方式, 或者将工程编译后,通过右边工程组"+" 下拉找到对应头文件, 双击打开。 如下:

头文件内容如下:

cpp 复制代码
/*--------------------------------------------------------------------------
REG52.H
Header file for generic 80C52 and 80C32 microcontroller.
Copyright (c) 1988-2002 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
--------------------------------------------------------------------------*/
#ifndef __REG52_H__
#define __REG52_H__
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* 8052 Extensions */
sfr T2CON = 0xC8;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;
/* BIT Registers */
/* PSW */
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0; //8052 only
/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/* IE */
sbit EA = IE^7;
sbit ET2 = IE^5; //8052 only
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
/* IP */
sbit PT2 = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
/* P3 */
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;
/* SCON */
sbit SM0 = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
/* P1 */
sbit T2EX = P1^1; // 8052 only
sbit T2 = P1^0; // 8052 only
/* T2CON */
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2 = T2CON^0;
#endif

从上面代码中可以看到, 该头文件中定义了 52 系列单片机内部所有的功能寄存器, 用到了前面讲到的 sfr 和 sbit 这两个关键字, "sfr P0=0x80;" 语句的意义是, 把单片机内部地址 0x80 处的这个寄存器重新起名叫 P0, 以后我们在程序中可直接操作 P0, 就相当于直接对单片机内部的 0x80 地址处的寄存器进行操作。 通俗点讲就是通过 sfr 这个关键字, 让 Keil 编译器在单片机与人之间搭建一条可以进行沟通的桥梁, 我们操作的是 P0 口, 而单片机本身并不知道什么是 P0 口, 但是它知道它内部地址 0x80 是什么东西。 说道这我想大家应该明白了,以后凡是编写 51 内核单片机程序时, 我们再源代码的第一行就可以直接包含该头文件。

在上面我们还看到, "sbit CY=PSW^7;" 语句的意思是, 将 PSW 这个寄存器的最高位重新命名为 CY, 以后我们要单独操作 PSW 寄存器的最高位时, 便可直接操作 CY, 其他雷同。

课后作业

(1) 按照上述方法创建一个自己的 51 单片机工程模板。

相关推荐
请叫我7plus3 小时前
用QEMU进行嵌入式Linux开发
linux·驱动开发·嵌入式硬件
d111111111d3 小时前
锁相环是什么,为什么可以用来放大时钟频率,怎么做到的,还有预分频起,为什么可以进行分频和倍频?
笔记·stm32·单片机·嵌入式硬件·学习
1379号监听员_6 小时前
hc05蓝牙模块
stm32·单片机·物联网
error:(6 小时前
【保姆级】WSL 2 中使用 PlatformIO 开发 ESP32 完整教程
stm32·单片机·嵌入式硬件
就是蠢啊6 小时前
51单片机——DS18B02(二)
单片机·嵌入式硬件·51单片机
沧海一条狗6 小时前
Ecat从站SSC代码与GD32H75E接口的适配注意事项
单片机·嵌入式硬件
minglie16 小时前
clion+RP2040-Zero的ws2812
单片机
点灯小铭7 小时前
基于单片机的加油站加油机显示控制系统设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
m0_690780527 小时前
串口通信,嵌入式系统
单片机·嵌入式硬件