单⽚机实现寄存器点亮LED实验
为了顺利过渡到库开发,在STM32编程的开始,我们对照51点亮⼀个LED的⽅法,给⼤家演⽰⼀下STM32如何⽤操作寄存器的⽅法点亮⼀个LED,然后再慢慢讲解到底什么是库,让⼤家知道库跟寄存器的关系。
1. ⽤51点亮⼀个LED
  在⽤STM32点亮⼀个LED之前,我们先来复习下⽤51如何点亮⼀个LED。
硬件上我们假设51单⽚机的P0⼝的第0位接了⼀个LED,负逻辑亮。如果我们要点亮这个LED,代码上我们会这么写:
P0 = 0XFE;//总线操作点亮 LED
这时候我们就把LED点亮了,如果要关掉LED ,则是:
P0 = 0XFF;//总线操作关闭 LED
这⾥⾯我们⽤的是总线操作的⽅法,即是对P0⼝的8个IO同时操作,但起作⽤的只是P0^0。
除了这种总线操作的⽅法,我们还学习过位操作,利⽤51编译器的关键字sbit,我们可以定义⼀个位变量:
sbit LED = P0^0;
那么LED = 0,就点亮了LED;
LED = 1,就关闭了 LED。
为了让程序看起来见名知义,我们定义两个宏:
#define ON 0
#define OFF 1
点亮和关闭LED的代码就变成了:
LED = ON;//位操作点亮LED
LED = OFF;//位操作关闭LED
稍微整理⼀下代码,整体效果就是:
//假设51单⽚机的PO~0⼝接LED,负逻辑点亮
#define ON 0
#define OFF 1
sbit LED = P0^0;
void main(void)
{
P0 = 0XFE;//总线操作点亮LED
P0 = 0XEF;//总线操作关闭LED
LED = ON;//位操作点亮LED
LED = OFF;//位操作关闭LED
}
上⾯总线和位操作的的⽅法,学过51的朋友是⾮常熟悉的,也很容易理解。那么我们再说⼀下⼤家容易忽略的⼏个知识点。
1. 什么是寄存器
在点亮 LED 的时候,我们都是⽤操作寄存器的⽅法来实现的,那⼤家是否想过,这个寄存器到底是什么?为什么我们可以直接操作P0⼝?
解答上⾯的问题之前,我们先简单介绍下51单⽚机的主要组成部分,这对我们学习其他单⽚机也有好处。
我们以国内的STC89C51为例,该单⽚机主要由51内核、外设IP、和总线这三⼤部分组成。内核是由 Intel 公司⽣产的,外设 IP 就是STC 公司在内核的基础上添加的诸如定时器、串⼝、IO ⼝等这些东西,总线就是⽤来连接内核和外设的接⼝单元。Intel 在这⾥属于IP核设计公司,STC 属于 IC 设计公司。世界上能设计 IP 核的公司屈指可数。我们⾮常熟悉的ARM公司就属于IP核设计公司,ARM 给其他公司授权,其他IC公司就在ARM内核上设计出各具特⾊的MCU,我们后⾯要学习的STM32就是属于⼀中基于ARM内核的MCU。
寄存器则是内置于各个 IP 外设中,是⼀种⽤于配置外设功能的存储器,就是⼀种内存,并且有想对应
的地址。学过C语⾔我们就知道,要操作这些内存就可以使⽤C语⾔中的指针,通过寻址的⽅式来操作这些具有特殊功能的内存⼀寄存器。⽐如 P0 ⼝对应的地址是0X80,那么我们要修改 0X80 这个地址对应的内存的内容的话,按照常理可以这样操作:
*(*0X80) = 0XFE;//点亮LED
可当我们编译的时候,编译器会报错,在51⾥⾯只能通过sfr和sbit这两个关键字来实现寄存器映象,不能直接操作寄存器对应的地址,这是51相较于STM32不同的地⽅。
51单⽚机的这些寄存器位于地址80H~FFH中,对应着128个地址,但不是每个地址都是有效的,51系列的单⽚机有21个,52系列的则有26个,其他的都是保留区。
寄存器映射
2. 寄存器映射
  实际上我们在编程的时候并不是通过指针来操作寄存器的,⽽是直接给P0、P1这些端⼝寄存器赋值。那么这些外设资源是如何与地址建⽴⼀⼀对应的关系(寄存器映射定义),这得益与51特有的两个关键字:sfr和sbit,其他单⽚机没有,只能⽤其他的⽅式来实现寄存器映射。这两个关键字帮我们实现了所有寄存器的定义,所以我们才可以像操作普通变量⼀样来操作寄存器。其实我们⼀开始提到的点亮LED 的代码,全貌应该是这样的:
sfr P0 = 0x80;//寄存器定义
P0 = 0XFE;//总线操作点亮LED
为了⽅便起见,我们可以把寄存器映射全部写好封装在⼀个头⽂件⾥⾯,不⽤每⽤⼀个寄存器就定义⼀次。其实这⽅⾯的⼯作不⽤我们做,我们在编程的时候都会在开始的地⽅添加⼀个头⽂件:
#include <reg51.h>
这个头⽂件已经实现了全部寄存器的定义,该⽂件是keil⾃带,在安装⽬录:
  Keil\C51\INC下可以到。这个⽂件实现了字节寄存器和位寄存器的定义。
1/*-----------------------------------------------------------------
2
3    REG51.H
4
5    Header file for generic 80C51 and 80C31 microcontroller.
6
7    Copyright(c)1988-2002 Keil Elektronik GmbH and Keil Software,Inc.
8
9    All rights reserved.
10
11-------------------------------------------------------------------*/
12
13 #ifndef __REG51_H_
14
15#define __REG51_H_
16
17/*BYTE Register */
18
19 sfr P0 = 0x80;
20
21 sfr P1 = 0×90;
22
23 sfr P2 = 0xA0;
24
25 sfr P3 = 0xB0;
26
27 sfr PSW = 0xD0;
28
29 sfr ACC = 0xE0;
30
31 sfr B = 0XF0;
32
33 sfr SP= 0×81;
34
35 sfr DPL= 0×82;
36
37 sfr DPH = 0×83;
38
39 sfr PCON = 0×87;
40
41 sfr TCON = 0x88;
42
43 sfr TMOD = 0×89;
44
45 sfr TL0 = 0×8A;
46
47 sfr TL1 = 0×8B;
48
49 sfr TH0 = 0×8C;
50
51 sfr TH1 = 0×8D;
51 sfr TH1 = 0×8D; 52
53 sfr IE = 0xA8;
54
55 sfr IP = 0×B8;
56
57 sfr SCON = 0x98; 58
59 sfr SBUF = 0x99; 60
61/*BIT Register */
62
63/*PSW*/
64
65 sbit CY = 0xD7; 66
67 sbit AC = 0xD6; 68
69 sbit F0 =0xD5
70
71 sbit RS1 = 0xD4; 72
73 sbit RS0 = 0xD3; 74
75 sbit OV = 0xD2; 76
77 sbit P = 0xD0;
78
79
80
81/*TCON*/
82
83 sbit TF1 = 0x8F; 84
85 sbit TR1 = 0x8E; 86
87 sbit TF0 = 0×8D; 88
89 sbit TR0 = 0×8C; 90
91 sbit IE1 = 0×8B;
92
93 sbit IT1 = 0×8A;
94
95 sbit IE0 = 0×89;
96
97 sbit IT0 = 0×88;
98
99
100
101/*IE*/
102
103 sbit EA = 0XAF; 104
105 sbit ES = 0xAC; 106
107 sbit ET1 = 0xAB; 108
109 sbit EX1 = 0xAA; 110
111 sbit ET0 = 0xA9; 112
113 sbit EX0 = 0xA8; 114
115
116
117/*IP*/
118
119 sbit PS = 0xBC;
120
121 sbit PT1 =0xBB;
122
123 sbit PX1 = 0xBA;
124
125 sbit PT0 = 0xB9;
126
127 sbit PX0 = 0xB8;
128
129
130
131/*P3*/
132
133 sbit RD = 0xB7;
134
135 sbit WR = 0xB6;
136
137 sbit T1 = 0xB5;
138
139 sbit T0 = 0xB4;
140
141 sbit INT1 = 0xB3;
142
143 sbit INT0 = 0xB2;
144
145 sbit TXD = 0xB1;
146
147 sbit RXD = 0xBO;
148
149
150
151/*SCON*/
152
153 sbit SM0 = 0x9F;
154
155 sbit SM1 = 0x9E;
156
157 sbit SM2 = 0x9D;
158system的头文件
159 sbit REN = 0x9C;
160
161 sbit TB8 = 0x9B;
162
163 sbit RB8 = 0×9A;
164
165 sbit TI = 0x99;
166
167 sbit RI = 0x98;
168
169#endif
3. 启动⽂件⼀STARTUP.A51
  还有⼀个就是启动代码,这个也是很多初学者容易忽略的地⽅,对于这部分我们主要总结下它的功能,不详解讲解⾥⾯的代码。
单⽚机在上电复位后,⾸先执⾏的是启动⽂件⼀STARTUP.A51,⽽不是我们通常看到的main函数。我们新建51⼯程的时候会有⼀个提⽰:是否拷贝启动代码到当前的⼯程,我们⼀般选择是。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。