51单片机工程模板创建

新建工程

创建项目

  1. 打开Keil软件,新建一个工程

  2. 在保存项目文件窗口,手动创建一个项目目录,例如Teample

选择CPU型号

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

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

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

给工程添加文件

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

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

配置魔术棒选项卡

生成Hex文件

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

51仿真器配置

  仿真器一端连接电脑,同时仿真器也给开发板供电,所以使用仿真器可不接电源线。要使用51仿真器在线调试程序,需要在Keil软件内进行相应的配置。具体的配置如下:

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

1
2
3
4
5
6
7
8
9
#include "reg52.h"

void main()
{
while(1)
{

}
}

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

reg52.h头文件介绍

头文件作用

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

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

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

头文件内容

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*--------------------------------------------------------------------------
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系列单片机内部所有的功能寄存器