读/写操作。若对其进行访问,将得到一个不确定的随机数,因而是没有意义的。用户在使用特殊功能寄存器时,不需要记住特殊功能寄存器及其位的地址,只要记住特殊功能寄存器及位的名称就可以了,操作时对其名字进行操作。51单片机的特殊功能寄存器可分为两大类:和内部功能部件有关的、和CPU有关的。和内部功能部件有关的特殊功能寄存器将在介绍各个功能部件的同时介绍,CPU有关的特殊功能寄存器主要有以下几个:累加器A和寄存器B、程序状态字PSW、堆栈指针SP、数据指针DPTR。2.2.4CPU的时序周期计算机在执行指令时,会将一条指令分解为若干基本的微操作。这些微操作所对应的脉冲信号在时间上的先后次序称为计算机的时序。因此微型计算机中的CPU实质上就是一个复杂的同步时序电路,这个时序电路是在时钟脉冲推动下工作的。51单片机的时序由下面4种周期构成。1.振荡周期振荡周期是指为单片机提供定时信号的振荡源的周期。2.状态周期两个振荡周期为一个状态周期,用S表示。两个振荡周期作为两个节拍分别称为节拍PI和节拍P2。在状态周期的前半周期P1有效时,通常完成算术逻辑运算;在后半周期P2有效时,一般进行内部寄存器之间的传输。3.机器周期CPU执行一条指令的过程可以划分为若干阶段,每一阶段完成某一项基本操作,如取指令、存储器读/写等。通常把完成一个基本操作所需要的时间称为机器周期。51单片机的一个机器周期包含6个状态周期,用S1,S2,,S6表示:共12个节拍,依次可表示为S1P1,S1P2,S2P1,S2P2,,S6P1,S6P2,其时序单元如图2-8所示。S10rrr图2-8MCS-51单片机时序单元3.指令周期指令周期是指执行一条指令所占用的全部时间,它以机器周期为单位。51系列单片机除乘法、除法指令是4机器周期指令外,其余都是单周期指令和双周期指令。若用12MHz晶体振荡器(晶振),则单周期指令和双周期指令的指令周期时间分别是1us和2μS,乘法和除法指令为4μs。通过上面的分析,我们可以看出,外部晶振的二分频是51单片机的内部时钟周期,6个时钟周期构成了单片机的机器周期。如果单片机的外部晶振是12MHz,则其内部的机器周期是lμs,指令周期为l~4us。4.时序图的概念时序图是描述电路信号变化规律的图示。从左到右,高电平在上,低电平在下,高阻39
39 读/写操作。若对其进行访问,将得到一个不确定的随机数,因而是没有意义的。 用户在使用特殊功能寄存器时,不需要记住特殊功能寄存器及其位的地址,只要记住 特殊功能寄存器及位的名称就可以了,操作时对其名字进行操作。 51单片机的特殊功能寄存器可分为两大类:和内部功能部件有关的、和CPU有关的。和 内部功能部件有关的特殊功能寄存器将在介绍各个功能部件的同时介绍,CPU有关的特殊功 能寄存器主要有以下几个: 累加器A和寄存器B、程序状态字PSW、堆栈指针SP、数据指针DPTR。 2.2.4 CPU的时序周期 计算机在执行指令时,会将一条指令分解为若干基本的微操作。这些微操作所对应的 脉冲信号在时间上的先后次序称为计算机的时序。因此微型计算机中的CPU实质上就是一个 复杂的同步时序电路,这个时序电路是在时钟脉冲推动下工作的。 51单片机的时序由下面4种周期构成。 1.振荡周期 振荡周期是指为单片机提供定时信号的振荡源的周期。 2.状态周期 两个振荡周期为一个状态周期,用S表示。两个振荡周期作为两个节拍分别称为节拍P1 和节拍P2。在状态周期的前半周期P1有效时,通常完成算术逻辑运算;在后半周期P2有效 时,一般进行内部寄存器之间的传输。 3.机器周期 CPU执行一条指令的过程可以划分为若干阶段,每一阶段完成某一项基本操作,如取指 令、存储器读/写等。通常把完成一个基本操作所需要的时间称为机器周期。 51单片机的一个机器周期包含6个状态周期,用S1, S2, ., S6表示;共12个节拍,依 次可表示为S1P1, S1P2, S2P1, S2P2, ., S6P1, S6P2,其时序单元如图2-8所示。 P1 P2 S1 P1 P2 S2 P1 P2 S3 P1 P2 S4 P1 P2 S5 P1 P2 S6 图2-8 MCS51单片机时序单元 3.指令周期 指令周期是指执行一条指令所占用的全部时间,它以机器周期为单位。51系列单片机 除乘法、除法指令是4机器周期指令外,其余都是单周期指令和双周期指令。若用12MHz晶 体振荡器(晶振),则单周期指令和双周期指令的指令周期时间分别是1μs和2μs,乘法和 除法指令为4μs。 通过上面的分析,我们可以看出,外部晶振的二分频是51单片机的内部时钟周期,6个 时钟周期构成了单片机的机器周期。如果单片机的外部晶振是12MHz,则其内部的机器周期 是1μs,指令周期为1~4μs。 4.时序图的概念 时序图是描述电路信号变化规律的图示。从左到右,高电平在上,低电平在下,高阻
态在中间。双线表示可能高也可能低,视数据而定。交线表示状态的高低变化,可以是由高变低,也可以是山低变高,也可以不变。坚线是生命线,代表时序图的对象在一段时期内的存在,时序图中的每个对象和底部中心都有一条垂直的虚线,这就是对象的生命线,对象的消息存在于两条生命线之间。时序要满足建立时间和保持时间的约束,才能保证锁存到正确的地址。数据或地址线的时序图有0/1两条线,表示是一个固定的电平,可能是“0”,也可能是“1”,视具体的地址或数据而定;交叉的线表示电平的变化,状态不确定,数值无意义。2.3C51语言的数据单片机在开发时大都采用C语言编程。51单片机的C语言又称为C51。本节介绍C51的数据类型、常量、变量、存储空间等基本问题。熟悉了C51的的基本问题,也可以基本掌握STM32单片机的C语言编程问题。数据类型2.3.1C51语言中的数据类型分为基本数据类型和聚合型数据类型,这里首先介绍基本数据类型。C51语言编译器支持的数据类型、长度和值域如表2-5所示。表2-5C51语言的数据类型数据类型值域长度/bit长度/byte位型bit10,1无符号字符型unsigned char80~2551有符号字符型00I-128~127signed char无符号整型1620~65535unsigned int有符号整型16signed int232 768~32 767无符号长整型324unsigned long0~4 294 967295有符号长整型324-2 147 483 648~2 147 483 647signed long浮点型32float4±1.176E38~±3.40E+38(6位数字)双精度浮点型double640±1.176E38~±3.40E+38(10位数字)指针型24一般指针3存储空间0~655352.3.2常量与变量C51语言中的数据有常量和变量之分。1.常量C51语言中的常量是不接受程序修改的固定值,常量可以是任意数据类型。C51中的常量有整型常量、实型常量、字符型常量、字符串常量、符号常量等。(1)整型常量整型常量即整常数。它可以是十进制、八进制、十六进制数字表示的整数值。通常情况下,C51程序设计时常采用十进制和十六进制数。整型常量的表示如表2-6所示。表2-7整型常量的表示整型常量类型表示形式示例十进制以非0开始的整数表示6、89、72240
40 态在中间。双线表示可能高也可能低,视数据而定。交叉线表示状态的高低变化,可以是 由高变低,也可以是山低变高,也可以不变。竖线是生命线,代表时序图的对象在一段时 期内的存在,时序图中的每个对象和底部中心都有一条垂直的虚线,这就是对象的生命 线,对象的消息存在于两条生命线之间。时序要满足建立时间和保持时间的约束,才能保 证锁存到正确的地址。数据或地址线的时序图有0/ 1两条线,表示是一个固定的电平,可能 是“0”,也可能是“1”,视具体的地址或数据而定;交叉的线表示电平的变化,状态不确 定,数值无意义。 2.3 C51语言的数据 单片机在开发时大都采用C语言编程。51单片机的C语言又称为C51。本节介绍C51的数据 类型、常量、变量、存储空间等基本问题。熟悉了C51的的基本问题,也可以基本掌握STM32 单片机的C语言编程问题。 2.3.1 数据类型 C51语言中的数据类型分为基本数据类型和聚合型数据类型,这里首先介绍基本数据类 型。C51语言编译器支持的数据类型、长度和值域如表2-5所示。 表 2-5 C51 语言的数据类型 数 据 类 型 长度/bit 长度/byte 值 域 位型 bit 1 0,1 无符号字符型 unsigned char 8 1 0~255 有符号字符型 signed char 8 1 -128~127 无符号整型 unsigned int 16 2 0~65 535 有符号整型 signed int 16 2 -32 768~32 767 无符号长整型 unsigned long 32 4 0~4 294 967 295 有符号长整型 signed long 32 4 -2 147 483 648~2 147 483 647 浮点型 float 32 4 ±1.176E 38~±3.40E+38(6 位数字) 双精度浮点型 double 64 8 ±1.176E 38~±3.40E+38(10 位数字) 指针型 一般指针 24 3 存储空间 0~65 535 2.3.2 常量与变量 C51语言中的数据有常量和变量之分。 1.常量 C51语言中的常量是不接受程序修改的固定值,常量可以是任意数据类型。C51中的常 量有整型常量、实型常量、字符型常量、字符串常量、符号常量等。 (1)整型常量 整型常量即整常数。它可以是十进制、八进制、十六进制数字表示的整数值。通常情 况下,C51程序设计时常采用十进制和十六进制数。整型常量的表示如表2-6所示。 表 2-7 整型常量的表示 整型常量类型 表示形式 示例 十进制 以非 0 开始的整数表示 6、89、722
八进制以0开始的数表示023、0721十六进制以0X或0x开始的数表示0X12、0x45AB说明:①在整型常量后加一个字母“L”或“1”,表示该数为长整型。例如23L、0Xfd41等。②整型常量在不加特别说明时总是正值。如果需要的是负值,则必须将负号“”放置于常量表达式的最前面,例如-0x56、-9等。(2)实型常量实型常量又称浮点常量,是一个十进制表示的符号实数。实型常量的值包括整数部分、尾数部分和指数部分。一些实型常量的示例如下:15.75、1.575E1、1575E-3、0.0025、2.5e3、25E-4。(3)字符型常量字符型常量是指用一对单引号括起来的一个字符。如a”、9”、”!等。字符常量中的单引号只起定界作用并不表示字符本身。在C51语言中,字符是按其对应的ASCII码值来存储的,1个字符占1个字节。ASCII码参见附录A。注意字符9和数字9的区别,前者是字符常量,后者是整型常量,它们的含义和在单片机中的存储方式都是不同的。(4)字符串常量字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,如"China”、"123456"等。C51语言中,字符串常量在内存中存储时,系统自动在字符串的未尾加一个串结束标志,即ASCII码值为O的字符NULL,常用1O表示。因此在程序中,长度为n个字符的字符串常量,在内存中占n+1个字节的存储空间。要特别注意字符常量与字符串常量的区别。除了表示形式不同外,其存储性质也不同,字符”A'只占用1个字节,而字符串常量”A”占2个字节。(5)符号常量C51语言中允许将程序中的常量定义为一个标识符,称为符号常量。符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。符号常量在使用前必须先定义,定义的形式是:#define标识符常量例如:#defineFPI3.1415926#define TURE1#define是C51语言的预处理命令,它表示经定义的符号常量在程序运行前将由其对应的常量替换。定义符号常量的目的是为了提高程序的可读性,便于程序的调试与修改。因此在定义符号常量时,应使其尽可能表达所代表的常量的含义。此外,若要对一个程序中多次使用的符号常量的值进行修改,只需对预处理命令中定义的常量进行修改即可。2.变量41
41 八进制 以 0 开始的数表示 023、0721 十六进制 以 0X 或 0x 开始的数表示 0X12、0x45AB 说明: ① 在整型常量后加一个字母“L”或“l”,表示该数为长整型。例如23L、0Xfd4l 等。 ② 整型常量在不加特别说明时总是正值。如果需要的是负值,则必须将负号“-”放 置于常量表达式的最前面,例如-0x56、-9等。 (2)实型常量 实型常量又称浮点常量,是一个十进制表示的符号实数。实型常量的值包括整数部 分、尾数部分和指数部分。 一些实型常量的示例如下:15.75、1.575E1、1575E-3、0.0025、2.5e3、25E-4。 (3)字符型常量 字符型常量是指用一对单引号括起来的一个字符。如'a'、'9'、'!'等。字符常量中 的单引号只起定界作用并不表示字符本身。 在C51语言中,字符是按其对应的ASCII码值来存储的,1个字符占1个字节。ASCII码参 见附录A。 注意字符'9'和数字9的区别,前者是字符常量,后者是整型常量,它们的含义和在单 片机中的存储方式都是不同的。 (4)字符串常量 字符串常量是指用一对双引号括起来的一串字符,双引号只起定界作用,如"China"、 "123456"等。 C51语言中,字符串常量在内存中存储时,系统自动在字符串的末尾加一个串结束标 志,即ASCII码值为0的字符NULL,常用\0表示。因此在程序中,长度为n个字符的字符串常 量,在内存中占n+1个字节的存储空间。 要特别注意字符常量与字符串常量的区别。除了表示形式不同外,其存储性质也不 同,字符'A'只占用1个字节,而字符串常量"A"占2个字节。 (5)符号常量 C51语言中允许将程序中的常量定义为一个标识符,称为符号常量。符号常量一般使用 大写英文字母表示,以区别于一般用小写字母表示的变量。符号常量在使用前必须先定 义,定义的形式是: #define 标识符 常量 例如: #define PI 3.1415926 #define TURE 1 #define是C51语言的预处理命令,它表示经定义的符号常量在程序运行前将由其对应 的常量替换。定义符号常量的目的是为了提高程序的可读性,便于程序的调试与修改。因 此在定义符号常量时,应使其尽可能表达所代表的常量的含义。此外,若要对一个程序中 多次使用的符号常量的值进行修改,只需对预处理命令中定义的常量进行修改即可。 2.变量