一.常量与变量
1.常量
又称为标量,在程序执行过程中不能改变,常量数据类型有整形(int)、浮点型(float)、字符型和字符串型。应用中一般使用“#define”定义在程序中经常用到的常量。
2.变量
是一种在程序执行过程中,数值不断变化的量。C51对变量的定义格式:【存储种类】数据类型【存储器类型】变量名
C51中的四中存储种类:auto(自动)、extern(外部)、static(静态)、register(寄存器)。默认为:auto。
根据变量的作用域的不同,变量还可以分为局部变量和全局变量两种。
局部变量。内部变量,只在定义它的函数模块内有效,必须定义在该函数模块的开头。
全局变量。外部变量,程序开始处或各个功能函数外面定义的变量,对于整个程序都有效。一般定义在程序的开始。
二.数据类型
【存储种类】数据类型【存储器类型】变量名
C51相对于c增加了bit、sfr、sfr16、sbit的特殊数据类型。
C51变量的数据类型
数据类型 |
长度/bit |
长度/Byte |
值域 |
unsigned char |
8 |
1 |
0~255 |
Signed char/char |
8 |
1 |
-128~+127 |
unsigned int |
16 |
2 |
0~65535 |
Signed int |
16 |
2 |
-32786~+32786 |
Unsigned long |
32 |
4 |
0~4294967295 |
Signed long |
32 |
4 |
-2147483678~+2147483677 |
float |
32 |
4 |
-1.175494E-38~+3.402823E |
_指针 |
|
13 |
|
bit |
2 |
|
0或1 |
1.Char字符类型
长度是8位,1字节(1B),用于定义处理字符变量数据的变量或常量。无符号型(unsigned char)和符号字符类型(signed char),默认signed char。-128~+127。Unsigned char常用于处理ASCLL字符或处理小于255的整型数。
2.Int整形
长度为16位,双字节(2B),用于存放一个双字节数据。分有符号int整型数signed int和无符号int整型数unsigned int。
Unsigned int用字节中的最高位表示数据符号位。0正数,1负数。
3.Long长整型
长度为32位,4字节(4B)。
4.Float浮点型
十进制数中具有7位有效数据,符合IEEE754标准的单精度浮点型数据,占4B,24位精度。
5._指针型
本身就是一个变量,这个变量中存放指向另一个数据的地址。 指针变量要占据一定的内存单元,不同处理器长度不尽相同,C51 中长度一般为1~3个字节。
6.
Bit类型
存放逻辑变量,占用一个位地址,C51编译器把bit类型的变 量安排在单片机内RAM的位寻址区。
三.变量的存储器类型
存储器类型与存储空间的对应关系
存储类型 |
与存储空间的对应关系 |
DATA |
直接寻址片内数据存储区,访问速度快(128B) |
BDATA |
可位寻址片内数据存储区,允许位与字节混合访问(16B) |
IDATA |
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256B) |
PDATA |
分页寻址片外数据存储区(256B) |
XDATA |
片外数据存储区(64KB) |
CODE |
代码存储区(64KB) |
1.DATA区
使用存储类型data、bdata定义变量时,C51编译器会将它 们定位在片内数据存储区中(RAM)STC89C52存储长度为512B, 能快速存取各种数据,片内数据存储区是临时存放传递变量或使 用频率较高的变量的理想存储场所。Data区除了包含程序变量外, 还保护了堆栈和数据寄存器组。在SMALL存储模式下,未说明存 储器类型时,变量默认被定义在DATA区。
2.BDATA区
如果在DATA区的位寻址BDATA区定义变量,这个变量就可以 进行位寻址,并且申明位变量。这种可位寻址的变量对状态寄存 器十分有用,可以单独使用变量的每一位,而不一定要用位变量 名引用变量。但不允许在BDATA区定义float和double类型的变 量。
3.IDATA区
也可以存放使用频繁的变量,使用寄存器作为指针进行位寻址。 在寄存器中设置8位地址间寻址,与外部存储器相比,指令执行 周期和代码行长度都比较短。
4.PDATA和XDATA区
单片机的片外RAM区,声明变量和其他区语法相同。
5.CODE区
单片机的程序代码区,代码区的数据是不可以改变的。可存放 数据表,跳转向量和状态表。
四.存储模式
在变量定义时省略了存储器类型标识符,C51编译器会选择默认的存储器类型。默认的存储器类型由SMALL、COMPACL、和LARGE存储模式(Memory Models)指令决定。存储模式是编译器的编译选项,用于决定变量的默认存储类型、参数传递区和无声明存储类型说明变量的存储类型。各种不同模式对于哦哦哦那个不同的实际硬件系统,也将有不同的编译结果。
1.小模式(SMALL Model)
所有未声明存储器类型变量,都默认驻留在内部数据区,即这 种方式和用DATA进行显示说明一样。变量访问速度快,当所有数 据对象(包括堆栈)都必须放在内部数据存储区中,空间有限。
2.紧凑模式(Compact Model)
所有未声明存储器的变量类型,默认驻留在外部数据存储区的 一个页上。即PDATA进行存储器类型的说明一样的。该模式利用 R0和R1寄存器进行间接寻址(@R0和@R1)。该模式存取速度笔小 模式慢但比大模式快。
3.大模式(Large Model)
所有未声明存储器的变量类型,默认驻留在外部数据存储区, 即和利用XDATA进行显示说明一样。
例:
在不同存储器类型下等价下面的变量说明:
Unsigned chardata var1; //Small模式,被定位在DATA区,片内RAM
Unsigned charpdata var1;//Compact模式片外按页面间接寻址RAM
Unsigned charxdata var1;//Large模式,片外间接寻址RAM
为了提高运行速度,建议在编写源程序时,把存储模式设定为Small,必要时在程序中XDATA、PDATA和IDATA等类型变量进行专门声明。
sbit和bit的区别:sbit定义特殊功能寄存器中的可寻址位;而bit则定义了一个普通的位变量,一个函数可包括bit类型的参数也可作为返回值。sbit可以访问MCS-51单片机内20H~2FH范围内的位对象。
五.C51语言的数组、指针与结构
1.数组 是一个由同类型的变量组成的集合,它保存在连续的存储区域中,第一个元素保存在最低地址中,最末一个保存在最高地址中。
定义方式:数据类型【存储器类型】数组名【常量1】···【常量n】
2.指针 指针是指某个变量所占用存储空间的首地址。用来存放指针变量的类型。
类型说明符 _指针变量名
char _s; char _str[4]; int _numptr;
这样声明的指针要占用3B。对于MCS-C51存储结构的特殊性,也可以指定存储器类型的指针,声明时定义指针指向的存储器类型,也称为给予存储器类型的指针。
例如:char data _str;char xdata _numtab;
unsigned char code _powtab;
3.结构 结构变量是将相互关联、多个不同类型的变量结合在一起形成一个组合变量。定义格式:
struct 结构名{
结构成员说明;
}
六.对绝对地址进行访问
1.使用指针 _:取指令;&:取地址
具体运算:变量=_指针变量 指针变量=&目标变量
取内容运算时将指针变量所指向的目标地址的值赋给左边的变量,取地址运算是将目标变量的地址赋给左边的变量。变量中只能存放地址(也就是指针型数据),一般情况下不要将非指针类型数据赋给一个指针变量。
MCS-51单片机工作在总线方式下,P0/P2口作为地址/数据总线使用。对外部扩展的数据存储器RAM的读写,可采用指针的方法,实现在C51程序中对任意指定的存储器地址进行操作。
2.使用C51扩展关键字_at_对确定地址进行访问
使用_at_对指定的存储器空间的地址进行定位,例如对外部接口的地址进行读写。
【存储器类型】 数据类型 标识符 _at_常数
数据类型通常为uchar的1字节类型;常数规定变量的绝对地址,由译码电路产生;使用_at_定义的变量必须为全局变量。
3.使用C51运行库中预定义宏
函数原型:
#defineCBYTE((unsigned char volatile code_)0)
#defineDBYTE((unsigned char volatile idata_)0)
#definePBYTE((unsigned char volatile pdata_)0)
#defineXBYTE((unsigned char volatile xdata_)0)
函数原型放在absacc.h文件中。
七.C51的运算符和表达式
1.赋值运算符 “=” 变量=表达式;
2.算术运算符 C51中的算术运算符中只有取正值和取负值元素运算符是单目运算符,其他的都为双目运算算符
+:加或取正值运算符 -:减或取负值运算符 _:乘法运算符
/:除法运算符 %:模(取余)运算符
3.自增自减预算 “++”、“—”
4.关系运算符
>:大于;<:小于;>=:大于等于;<=:小于等于;!=:不等于
5.逻辑运算符
逻辑与:条件1&&条件2; 逻辑或:条件1||条件2;
逻辑非:!条件式
6.位运算符 变量1 位运算符 变量2
&:按位与。|:按位或。^:按位异或。~:按位取反。
<<:左移。 >>:右移。
位运算符的优先级从低到高:“~”、“<<”、“>>”、“&”、“^”、“|”。
7.复合运算符
+=:加法运算符 >>=:右移位负值 -=:减法赋值
&=:逻辑与赋值 *=:乘法赋值 |=:逻辑或赋值
/=:除法赋值 ^=:异或赋值 %=:取模赋值
~=:逻辑非赋值 <<=:左移位赋值
一般形式: 变量 复合赋值运算符 表达式
八.C51语言的程序结构
1.顺序结构
是指程序由低地址向高地址顺序执行指令代码的过程,是最简 单的程序结构。从地址0000H开始执行。
2.选择结构
if语句和switch语句构成。
①if语句 if(表达式) 语句1 else 语句2
②switch语句 处理多路分支的情况
case分支常量的表达式的值必须是整型、字符型,不能使用条件运算符
break语句用于跳出switch结构
3.循环结构
for、while、do···while 3种语句构成循环结构。
九.C51语言的函数
实现程序的模块化,同c语言。
十.中断服务函数
void函数名() interrupt n
中断号和中断源的对应关系
中断号 |
中断源 |
中断号 |
中断源 |
0 |
外部中断0 |
3 |
定时、计数器1 |
1 |
定时/计数器0 |
4 |
串行口 |
2 |
外部中断1 |
5 |
定时、计数器2 |
中断函数运行过程中完成的任务:
(1)中断产生时,中断函数被系统所使用。
(2)中断函数运行完成退出时,堆栈保存的数据将被恢复。
(3)中断函数退出时,其对应的汇编代码使用RETI指令退出。
中断函数应遵循以下规则:
(1)不能进行参数传递。
(2)没有返回值
(3)不能再子函数中直接调用
(4)如中断调用了其他函数,必须保证函数和中断函数使用了相同的寄存器。
(5)对中断函数不需要声明。
十一.C51库函数与头文件
1.C51的库函数
2.本征库函数
<intrinis.h>文件下的
_cror_()、_crol_():将char型变量循环左移或右移
_iror_()、_irol_():将int型变量循环左移或右移
_lrol_()、_lrol_():将long型变量循环左移或右移
_nop_():空指令12M晶振下为1us常用于IIC通信
_testbit_:测试该为变量并跳转同时清除
_chkfloat_:测试并返回浮点数的状态。
3.几类重要的库函数
(1).专用寄存器include文件。
(2).绝对地址include文件absacc.h
(3).动态内存分配函数malloc(stdilb.h)。
(4).缓冲区处理数,string.h,包括复制、比较、移动函 数···
(5).输入输出流函数
4.C51的预处理
(1)预处理命令以“#”开头,后面不加分号;
(2)预处理命令在编译前执行,编译是对预处理的结果进行的,如词法、语法分析等。
(3)多数预处理命令习惯放在头文件的开头。
5.使用C51时的注意事项
(1).采用短变量;(2)避免浮点运算。
评论(0)
您还未登录,请登录后发表或查看评论