-
一台能够工作的计算机要有这样几个部份构成: CPU( 进行运算、 控制) 、 RAM(数据存储)、ROM(程序存储) 、 输入/输出设备(例如: 串行口、并行 输出口等)。在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板 的印刷线路板上。而在单片机中,这些部份全部被做到一块集成电路芯片中了, 所以就称为单片机(也称微控制器 MCU),而且有一些单片机中除了上述部份外, 还集成了其它部份如 A/D, D/A 等。体积不大,一般用 40 脚封装, 当然功能 多一些单片机也有引脚比较多的, 如 68 引脚, 功能少的只有 10 多个或 20 多个引脚,有的甚至只 8 只引脚。
-
MCU:微控制单元(Microcontroller Unit) ,又称单片微型计算机(Single Chip Microcomputer )或者单片机,是把中央处理器(Central Process Unit;CPU)的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LCD驱动电路都整合在单一芯片上,形成芯片级的计算机,为不同的应用场合做不同组合控制。诸如手机、PC外围、遥控器,至汽车电子、工业上的步进马达、机器手臂的控制等,都可见到MCU的身影。
-
AT89C51,AT:ATMEL:(美国)爱特梅尔公司;
-
-
51单片机由一个IP核和片上外设组成,IP核(内核)就是上图中的CPU,片上外设就是上图中的:时钟电路、SFR和RAM、ROM、定时/计数器、并行I/O口、串行I/O口、中断系统。IP核跟外设之间由系统总线连接,且是8bit的,速度有限。
-
51内核是上个世纪70年代Intel公司设计的,速度只有12M,外设是IC厂商(STC)在内核的基础上添加的,不同的IC厂商会在内核上添加不同的外设,从而设计出各具特色的单片机。这里Intel属于IP核厂商,STC属于IC厂商。我们后面要讲的STM32也一样,ARM属于IP核厂商,ARM给ST授权,ST公司在Cortex-M3内核的基础上设计出STM32单片机。
-
链接:51与STM32单片机架构(内核和片上外设)的区别汇总+拓展
-
普中 51-单核-A2 开发板,STC89C52单核A2开发板,这一款开发板采 用的是单 CPU 设计,用的是 STC 公司生产的经典 51 内核芯片 STC89C52,这是一 款拥有 64KB FLASH 超大存储器的 51 单片机,可容纳更大更复杂的程序
-
宏晶科技STC名字由来:SysTem Chip或者SysTem on Chip(片上系统)
-
STC89Cxx 芯片介绍
-
RAM:用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
-
ROM:用以存放程序、一些原始数据和表格;
-
总线(BUS)是单片机各部件之间传送信息的公共通道。单片机中有内部总 线和外部总线两类,内部总线是 CPU 内部之间的连线,外部总线是指 CPU 与其它 部件之间的连线;外部总线有三种: 数据总线 DB(Data Bus),地址总线 AB (Address Bus)和控制总线 CBControl Bus)。
-
keil编译C51程序的结果:
“Program Size: data=11.0 xdata=0 code=282”
代表生成的各个段的大小。具体来说
data=11.0代表你这段程序生成的目标代码所占用单片机的内部RAM空间是11.0个字节;
xdata是片外RAM空间,xdata=0表示没有使用片外RAM空间数据;code=282代表生成的代码大小(即ROM空间,这里一般指Flash)是282字节。
链接:ROM、RAM、FLASH区别
-
. 数据类型
-
特殊功能寄存器型
-
这是 C51 扩充的数据类型,用于访问 51 单片机中的特殊功能寄存器数据, 它分 sfr 和 sfr16 两种类型。其中:sfr 为字节型特殊功能寄存器类型,占一个 内存单元,利用它可以访问 51 内部的所有特殊功能寄存器;sfr16 为双字节型 特殊功能寄存器类型,占用两个字节单元,利用它可以访问 51 内部的所有两个 字节的特殊功能寄存器。在 C51 中对特殊功能寄存器的访问必须先用 sfr 或 sfr16 进行声明。
-
sfr用于将一个单片机的特殊功能寄存器(special funcTIon register)赋值给一个变量,这样在后面的程序中就可以中这个变量指引(refer to)该寄存器。sbit与sfr用法类似,只是sbit是位操作,用于将某个sfr中具体位赋值给一个变量,这样后面程序就可用通过该变量为该位清0或置1。
-
位类型
-
这也是 C51 中扩充的数据类型,用于访问 51 单片机中的可寻址的位单元。 在 C51 中,支持两种位类型:bit 型和 sbit 型。它们在内存中都只占一个二进 制位,其值可以是“1”或“0”。其中:用 bit 定义的位变量在 C51 编译器编译 时,在不同的时候位地址是可以变化的,而用 sbit 定义的位变量必须与 51 单片 机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起,在 C51 编译器编译时,其对应的位地址是不可变化的。
-
指针型: 指针型本身就是一个变量,在这个变量中存放的指向另一个数据的地址。这 个指针变量要占用一定的内存单元,对不同的处理器其长度不一样,在 C51 中它 的长度一般为 1~3 个字节。
-
C51 允许任何标准数据类型的隐式转换,隐式转换的优先级顺序如下: Bit→char→int→long→float→signed→unsigned
-
数据类型说明符:
-
typedef unsigned int u8;
-
typedef unsigned char u16;
-
存储种类
-
存储种类是指变量在程序执行过程中的作用范围。C51 变量的存储种类有四 种,分别是自动(auto)、外部(extern)、静态(static)和寄存器(register)。
-
a.auto: 使用 auto 定义的变量称为自动变量,其作用范围在定义它的函数体或复合 语句内部,当定义它的函数体或复合语句执行时,C51 才为该变量分配内存空间, 结束时占用的内存空间释放。自动变量一般分配在内存的堆栈空间中。定义变量 时,如果省略存储种类,则该变量默认为自动(auto)变量。
-
b.extern: 使用 extern 定义的变量称为外部变量。在一个函数体内,要使用一个已在 该函数体外或别的程序中定义过的外部变量时,该变量在该函数体内要用 extern 说明。外部变量被定义后分配固定的内存空间,在程序整个执行时间内 都有效,直到程序结束才释放。
-
c.static: 使用 static 定义的变量称为静态变量。它又分为内部静态变量和外部静态 变量。在函数体内部定义的静态变量为内部静态变量,它在对应的函数体内有效, 一直存在,但在函数体外不可见,这样不仅使变量在定义它的函数体外被保护, 还可以实现当离开函数时值不被改变。外部静态变量上在函数外部定义的静态变 量。它在程序中一直存在,但在定义的范围之外是不可见的。如在多文件或多模 块处理中,外部静态变量只在文件内部或模块内部有效。
-
d.register: 使用 register 定义的变量称为寄存器变量。它定义的变量存放在 CPU 内部 的寄存器中,处理速度快,但数目少。C51 编译器编译时能自动识别程序中使用 频率最高的变量,并自动将其作为寄存器变量,用户可以无需专门声明。
-
存储器类型
-
存储器类型是用于指明变量所处的单片机的存储器区域情况。存储器类型与 存储种类完全不同。C51 编译器能识别的存储器类型有以下几种,见表所示
-
复合赋值运算符
-
C51 语言中支持在赋值运算符“=”的前面加上其它运算符,组成复合赋值运 算符。下面是 C51 中支持的复合赋值运算符
-
+= 加法赋值
-
?+ 减法赋值
-
*= 乘法赋值
-
/= 除法赋值
-
%= 取模赋值
-
&= 逻辑与赋值
-
|= 逻辑或赋值
-
^= 逻辑异或赋值
-
~= 逻辑非赋值
-
“ >>= 右移位赋值 ”
-
<<= 左移位赋值
-
逗号运算符
-
在 C51 语言中,逗号“,”是一个特殊的运算符,可以用它将两个或两个以 上的表达式连接起来,称为逗号表达式。逗号表达式的一般格式为: 表达式 1,表达式 2,……,表达式 n 程序执行时对逗号表达式的处理:按从左至右的顺序依次计算出各个表达式 的值,而整个逗号表达式的值是最右边的表达式(表达式 n)的值。例如: x=(a=3,6*3)结果 x 的值为 18。
-
条件运算符
-
条件运算符“?:”是 C51 语言中唯一的一个三目运算符,它要求有三个运 算对象,用它可以将三个表达式连接在一起构成一个条件表达式。条件表达式的 一般格式为: 逻辑表达式?表达式 1:表达式 2 其功能是先计算逻辑表达式的值,当逻辑表达式的值为真(非 0 值)时,将 计算的表达式 1 的值作为整个条件表达式的值;当逻辑表达式的值为假(0 值)时,将计算的表达式 2 的值作为整个条件表达式的值。例如:条件表达式 max=(a>b)?a:b 的执行结果是将 a 和 b 中较大的数赋值给变量 max。
-
函数的定义 函数定义的一般格式如下:
-
函数类型 函数名(形式参数表) [reentrant][interrupt m][using n]
-
reentrant 修饰符
-
这个修饰符用于把函数定义为可重入函数。所谓可重入函数就是允许被递归 调用的函数。函数的递归调用是指当一个函数正被调用尚未返回时,又直接或间 接调用函数本身。一般的函数不能做到这样,只有重入函数才允许递归调用。
-
关于重入函数,注意以下几点:
-
(1)用 reentrant 修饰的重入函数被调用时,实参表内不允许使用 bit 类 型的参数。函数体内也不允许存在任何关于位变量的操作,更不能返回 bit 类型 的值。
-
(2)编译时,系统为重入函数在内部或外部存储器中建立一个模拟堆栈区, 称为重入栈。重入函数的局部变量及参数被放在重入栈中,使重入函数可以实现 递归调用。
-
(3)在参数的传递上,实际参数可以传递给间接调用的重入函数。无重入 属性的间接调用函数不能包含调用参数,但是可以使用定义的全局变量来进行参 数传递。
-
interrupt m 修饰符
-
interrupt m 是 C51 函数中非常重要的一个修饰符,这是因为中断函数必须 通过它进行修饰。在 C51 程序设计中,当函数定义时用了 interrupt m 修饰符, 系统编译时把对应函数转化为中断函数,自动加上程序头段和尾段,并按 51 系 统中断的处理方式自动把它安排在程序存储器中的相应位置。
-
自定义函数的声明
-
在 C51 中,函数原型一般形式如下:
-
[extern] 函数类型 函数名(形式参数表); 函数的声明是把函数的名字、函数类型以及形参的类型、个数和顺序通知编 译系统,以便调用函数时系统进行对照检查。函数的声明后面要加分号。
-
如果声明的函数在文件内部,则声明时不用 extern,如果声明的函数不在文 件内部,而在另一个文件中,声明时须带 extern,指明使用的函数在另一个文 件中。