80C51的C语言程序设计教学课件PPT单片机
9.1 单片机的C语言 9.1.1 C51程序开发概述 9.1.2 C51程序结构 9.2 C51的数据类型与运算 经常使用的变量应置于片内RAM中,即用bdata、data、idata来定义; 不经常使用的变量或规模较大的变量应该置于片外RAM中,即用pdata、xdata来定义。 例如: 如果用户不对变量的存储器类型进行定义,C51编译器采用默认的存储器类型。由编译控制命令中的存储模式指令限制。例如: char var;/* 在SMALL模式时,var定位data存储区 */ /* 在COMPACT模式时,var定位pdata存储区 */ /* 在LARGE模式时,var定位xdata存储区 */ 9.2.3 80C51硬件结构的C51定义 三、内部RAM中可位寻址对象的定义 RAM的20H~2FH单元可用bdata存储器类型访问,带有bdata类型的变量可以进行字或字节寻址,用sbit指定bdata变量的相应位后就可以进行位寻址。 定义可独立寻址访问的位: sbit mybit0 = ibase^0; sbit mybit15 = ibase^15; sbit ary07 = array[0]^7; sbit ary37 = array[3]^7; 访问示例: ibase = -1; /* 字寻址 */ array[2] = ‘a’;/* 字节寻址 */ ary07 = 0; /* 位寻址 */ 用bit定义普通位变量时C51编译器会自行安排该位变量于可位寻址的bdata区。例如,bit mybit。 应注意的是,不能定义bit类型指针,也不能定义bit类型数组。 9.2.4 C51的运算符和表达式 2、自增、自减运算符 ++ 自增运算符; -- 自减运算符。 3、类型转换 运算符两侧的数据类型不同时,要转换成同种类型。方式有两种: 三、逻辑运算符和逻辑表达式 四、位运算符 C51提供6种位运算符: 五、赋值和复合赋值运算符 “=”称为赋值运算符,作用是将一个数据的值赋给一个变量。 复合运算符如下: 9.3 C51流程控制语句 此种形式的条件语句常用于实现多方向条件分支。 二、开关语句 开关语句主要用于多分支的场合。一般形式为: switch (表达式) { case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; … … case 常量表达式n:语句n;break; default :语句n+1; } 三、for语句 一般形式为: for([初值表达式];[条件表达式];[更新表达式])语句 9.4 C51的指针类型 9.5 C51的函数 与普通的C语言程序类似,C51程序是有若干模块化的函数构成。函数是C51程序的基本模块,常说的子程序就是由函数来实现的。 9.5.2 C51函数的调用与参数传递 寄存器参数传递使用的寄存器如表: 寄存器传递方式最多可以传递3个参数。这种参数传递可以产生高效的代码。可以用REGPARMS和NOREGPARMS编译命令来控制。 当无寄存器可用时,或说明了“pragma NOREGPARMS”时,参数可以采用固定的存储器位置传递。在固定的存储器位置进行参数传递是C51的一个重要特征。在SMALL模式下,参数传递在内部RAM中完成。在COMPACT和LARGER模式下,参数的传递要在外部RAM中完成。 由于80C51单片机片内RAM空间非常有限,所以C51编译器仅将函数的返回地址保存到堆栈中,不采用堆栈传递参数。但应注意,C51提供一种模拟堆栈,从而支持可重入函数的递归调用。 9.5.3 C51的库函数 9.6 C51编程实例 9.6.1 80C51内部资源的编程 一、中断服务函数示例 C51利用中断函数,控制中断系统的相关资源 常用的中断源对应的中断号 using 用于指定使用的工作寄存器组,m的范围是0~3。不设定工作寄存器组时,编译系统会将当前工作寄存器组的寄存器压入堆栈。 在应用程序中任何函数都不能调用中断服务函数,因为它是由系统调用的。 例 :在单片机应用系统中,外中断0引脚接一个开关,P1.0接一发光二级管。要求开关闭合一次,发光二极管的状态改变一次。程序为: 二、定时计数器编程示例 例 用T0方式1,产生10ms的定时,使P1.0引脚上输出周期为20ms方波,采用中断方式,设系统时钟频率为12 MHz