C51
程序结构
-
汇编语言
- 面向机器的编程语言(能直接操作单片机的系统硬件)
- 具有指令效率高、执行速度快的优点
- 低级编程语言
- 程序可读性差,移植困难,且编程时必须具体组织、分配存储器资源和处理端口数据
-
C51语言
- 为51系列单片机设计的一种C语言,是标准C语言的子集
- 具有结构化语言特点和机器级控制能力,代码紧凑,效率可与汇编语言媲美
- 程序的可读性强,易于调试维护,编程工作量小,产品开发周期短
-
C51程序结构
-
C51程序的基本单元是函数
-
一个C51源程序至少包含一个主函数(主函数是程序的入口)
-
main()函数一对圆括号()必须有,不能省略
-
C51语言程序基本结构
包含<头文件> 函数类型说明 全局变量定义 main(){ 局部变量定义 <程序体> } func1(){ 局部变量定义 <程序体> ... } funcN(){ 局部变量定义 <程序体> ... }
-
数据结构
-
C51变量(在程序执行过程中,数值可以发生变化的量)
-
变量的基本属性:变量名、变量值(变量名与存储单元地址相对应,变量值与存储单元的内容相对应)
-
定义变量
[存储种类] 数据类型 [存储类型] 变量名;
- 数据类型、变量名和末尾的英文分号是不能省略的部分
-
-
变量存储种类(变量在程序执行过程中的作用范围):自动(auto)、外部(extern)、静态(static)、寄存器(register)
- 自动变量:使用存储种类说明符auto定义的变量
- 作用范围在定义它的函数体或复合语句内部
- 如果省略存储种类,则变量默认为自动变量
- 将函数体内和复合语句中使用频繁的变量放在片内RAM中,且定义为自动变量(有效利用片内有限的RAM资源)
- 外部变量:使用存储种类说明符extern定义的变量
- 将多个函数或模块共享的变量定义为外部变量
- 外部变量是全局变量,在程序执行期间一直占有固定的内存空间
- 静态变量:使用存储种类说明符static定义的变量
- 内部静态变量(当离开函数时数值不被改变):在函数体内部定义的静态变量
- 外部静态变量:在函数体外部定义的静态变量
- 寄存器变量:使用存储种类说明符register定义的变量
- 将使用频率最高的那些变量定义为寄存器变量
- 自动变量:使用存储种类说明符auto定义的变量
-
变量数据类型(数据的不同格式)
-
C51基本数据类型(有符号数据类型可忽略signed标识符)
-
特殊数据类型
-
bit位型:定义一个位变量(0或1)
bit bit_name [=0或1]
-
sfr特殊功能寄存器型:21个特殊功能寄存器(地址为80H~FFH)
sfr sfr_name = 地址常数 //8位SFR sfr16 sfr16_name = 地址常数 //16位SFR
- sfr sfr_name是一个特殊功能寄存器名
- “=”后面必须是常数
- 数值范围必须在特殊功能寄存器地址范围内(0x80~0xFF)
-
sbit可位寻址型:定义可寻址的特殊功能寄存器的位寻址对象
-
sbit 位变量=位地址
sbit CY=0xD7 //将位的绝对地址赋给变量名(位地址必须位于0x80~0xFF之间)
-
sbit 位变量名=SFR名称^位位置
sfr PSW=0xD0 sbit CY=PSW^7 //SFR名称必须是己定义的SFR名字 //位位置是一个0~7之间的常数
-
sbit 位变量名=字节地址^位位置
sbit CY=0xD0^7 //以一个常数(字节地址)作为基地址,该常数必须在0x80~0xFF之间
-
-
sbit与bit的区别
-
bit型变量的位地址是由编译器为其随机分配的
-
sbit型变量的位地址是由用户指定的
-
sfr型变量和sbit型变量必须定义为全局变量(必须在所有C51函数之前定义)
-
-
用预处理命令#include <reg51.h>后可使用特殊功能寄存器明和特殊位名称
-
-
-
变量存储类型
-
逻辑存储空间(3个):片内低128B RAM、片外 64KB RAM、片内外统一编址 64KB ROM
-
存储类型(6种):data、bdata、idata、xdata、pdata、code
- 变量定义时必须指明其所属类型,否则无法选择存储空间
- 如果再定义变量时省略了存储类型说明符,C51编译器会根据当前编译模式自动认定默认存储变量
-
编译模式(3种):小编译模式(Small)、紧凑编译模式(Compact)、大编译模式(Large)
-
-
变量名
-
C51规定变量名可以由字母、数字和下划线3种字符组成(第一个字符必须为字母或下划线)
-
大写的变量和小写的变量不同(习惯上变量用小写表示)
-
变量名除了应避免使用标准C语言的32个关键字外,还要避免使用C51拓展的新关键字
-
C51拓展的21个关键字
-
所有变量在使用前必须声明(变量须“先定义,后使用”)
-
-
C51指针
-
标准C语言指针的一般定义形式
数据类型*指针变量名; //被指变量和指针变量都位于C编译器默认的存储区中
-
C51指针的一般定义形式
数据类型 [存储类型1] * [存储类型2] 指针变量名 //数据类型:被指向变量的数据类型 //存储类型1:被指向变量所在的存储区类型 //存储类型2:指针变量所在的存储区类型
-
混编
-
在C51中调用汇编程序
- C51编译器的编译规则
-
程序的寻址:通过在汇编文件中定义同名的“函数”来实现
-
参数传递:使用寄存器
-
返回值传递:汇编语言通过寄存器或存储器传递参数给C语言程序
-
- C51编译器的编译规则
-
在C51中嵌入汇编程序
-
汇编代码必须放在两条预处理命令#pragma asm和#pragma endasm之间(预处理命令必须用小写字母)
#include<reg51.h> void main(void){ unsigned char i=0; //定义变量i #pragma asm //嵌入汇编代码 MOV R0,#0AH LOOP:INC A //累加器循环加1 DJNZ R0,LOOP #pragma endasm i=ACC; //累加器结果传给i }
-