资源预览内容
第1页 / 共46页
第2页 / 共46页
第3页 / 共46页
第4页 / 共46页
第5页 / 共46页
第6页 / 共46页
第7页 / 共46页
第8页 / 共46页
第9页 / 共46页
第10页 / 共46页
亲,该文档总共46页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第9章 单片机C语言程序设计 4.1 Keil C简介与环境设置 4.2 C51简介 4.3 C51基础知识及表达式 4.4 C51控制语句 4.5 数组 4.6 指针 4.7 函数 4.8 C51开发工具使用 4.9 常用Keil C调试方法,一般情况下单片机常用的程序设计语言有两种: 汇编语言: 汇编语言具有执行速度快、占存储空间少、对硬件可直接编程等特点,因而特别适合在对实时性能要求比较高的情况下使用。 C语言: C语言克服了汇编语言的不足之处,同时又增加了代码的可读性,语言大多数代码被翻译成目标代码后,其效率和汇编语言相当。特别是C语言的内嵌汇编功能,使C语言对硬件操作更加方便。,Keil C Vision2工作窗口,4.1 Keil C简介 Keil C Vision2 开发环境是德国Keil Software,Inc.and Keil Elektro nik GmbH开发的微处理器开发平台,可以开发多种8051兼容单片机程序。 Keil Software-Cx51编译器兼容ANSI C语言标准。,4.2 Cx51简介 4.2.1 Cx51的扩展 Cx51编译器兼容ANSI C标准,又扩展支持了8051微处理 器,其扩展内容如下: 存储区; 存储区类型; 存储模型; 存储类型说明符; 变量数据类型说明符; 位变量和位可寻址数据; SFR; 指针; 函数属性。,4.2.2 存储区 8051单片机支持程序存储器和数据存储器的分离,存储器根据读写情况可以分为:程序存储区(ROM)、快速读写存储器(内部RAM)、随机读写存储器(外部RAM)。 1. 程序存储器(code) 在8051中程序存储器是只读存储器,其空间为64K ,在C51中用code关键字来声明访问程序存储区中的变量。 。,2. 内部数据存储器 在8051单片机中,内部数据存储器属于快速可读写存储器,与51兼容的扩展型单片机最多有256字节内部数据存储区。 (1)data data存储类型声明的变量可以对内部RAM直接寻址128B (0x000x7F)。 (3)bdata bdata存储类型声明的变量可以对内部RAM 16B(0x200x2F)的128位进行位寻址 (2)idata idata存储类型声明的变量可以对内部RAM间接寻址256B(0x000xFF),,3. 外部数据存储器 外部数据存储器又称随机读写存储器,访问存储空间为64KB。其访问速度要比内部RAM慢。访问外部RAM的数据要使用指针进行间接访问。 在C51中使用关键字xdata和pdata存储类型声明的变量来访问外部存储空间中的数据。 (1)xdata xdata存储类型声明的变量可以访问外部存储器64KB的任何单元(0x00000xFFFF)。 (2)pdata pdata存储类型声明的变量可以访问外部存储器(一页)低256B(不建议用)。,4.2.3 存储模式 在Cx51中,存储器模式可以确定一些变量在缺省情况下的存储器类型。程序中可用编译器控制命令SMALL、COMPACT、LARGE指定存储器模式。 1. SMALL模式 SMALL模式中所有的变量在缺省的情况下位于单片机的内部数据区,这和用data存储类型标识符声明的变量是相同的。在本模式中变量访问非常有效,然而所有对象和堆栈必须适和内部RAM。 2. COMPACT模式 COMPACT模式中所有变量在缺省的情况下都存放在外部数据区的一页(256B)中,这和用pdata存储类型标识符声明的变量是相同的。 3. Large模式 LARGE模式下所有变量在缺省情况下存放在外部数据存储区(范围为64k字节),这和用xdata存储类型标识符声明的变量是一致的,该模式使用数据指针DPTR寻址。,4.2.4 数据类型 在Cx51中不仅支持所有的C语言标准数据类型,而且还对其进行了扩展,增加了专用于访问8051硬件的数据类型,使其对单片机的操作更加灵活。 1. bit类型 bit用于声明位变量,其值为1或0。 2. sbit类型 sbit类型用于声明可位寻址变量中的某个位变量,其值为1或0。 3. sfr类型 sfr类型用于声明特殊功能寄存器(8位),位于内部RAM地址为0x80-0xFF的128字节存储单元,这些存储器一般用作计时器、计数器、串口、并口和外围使用。,4. sfr16类型 sfr16类型用于声明两个连续地址的特殊功能寄存器(地址范围为065 535)。 5.其它类型 C51程序中常用的数据类型还有: char(字符型) unsigned char(无符号字符型) int(整型) unsigned int(无符号整型)等类型。,例如: char bdata c1 ; /*声明一个字符变量 char bdata bobject ;/*声明可位寻址变量 bobject*/ sbit bobj3=bobject3 ; /*声明位变量bobj3为 bobject的第三位*/ sfr TMOD=0x89H; /*声明TMOD(定时器/计数器工作 模式寄存器)其地址为89H*/ sfr P0=0x80; /*声明P0为特殊功能寄存器,地址 为80H*/,4.3 C51基础知识及表达式 4.3.1 C语言的标识符和关键字 标识符是用来标识源程序中某个对象的名字的,这些 对象可以是语句、数据类型、函数、变量、常量、数组等。 一个标识符有字符串、数字和下划线等组成,第一个字符 必须是字母或者下划线。 关键字则是编程语言保留的特殊标识符,它们具有固 定名称和含义。在C语言程序中不允许使用与关键字完全 相同标识符 4.3.2 算术运算符与表达式 C51语言运算符非常丰富,除了控制语句及输入、输 出,其他所有的基本操作几乎都作为运算符来处理。 C51算术运算符与表达式如下: + 加运或取正算符,例如,2+3。 - 减运或取负算符,例如,5-3。 * 乘运算符,例如,2*3。 / 除运算符,例如,6/3。 % 模运算符,或叫取余运算符,如7%3,结果为1。,4.3.3 关系运算符与表达式 关系表达式是由关系运算符连接表达式构成的。 1. 关系运算符 关系运算符都是双目运算符,共有如下6种: ,=,y、(x=5)=y等。 关系表达式的值是整数0或1,其中0代表逻辑假;1代表逻辑真。在C语言中不存在专门的“逻辑值”。,4.3.4 逻辑运算符与表达式 逻辑表达式是由逻辑运算符连接表达式构成的。 1. 逻辑运算符 C语言中提供了3种逻辑运算符: 1)单目逻辑运算符:!(逻辑“非”)。 2)双目逻辑运算符:&(逻辑“与”)。 3)双目逻辑运算符:|(逻辑“或”)。 其中逻辑“与”&的优先级大于逻辑“或”|,它们的优 先级都小于逻辑“非”!。逻辑运算符具有自左至右的结合性。 逻辑运算符、赋值运算符、算术运算符、关系运算符 之间优先级的次序为:!(逻辑非)、算术运算符、关系 运算符、&(逻辑与)、|(逻辑或)、赋值运算符。 2. 逻辑表达式 由逻辑运算符组成的表达式称为逻辑表达式。逻辑运算符两边的运算对象可以是C语言中任意合法的表达式。 逻辑表达式的结果为1(结果为“真”时)或0(结果为“假“时)。,4.3.5 赋值运算符与表达式 1. 赋值运算符 “=”符就是赋值运算符,赋值运算符构成的表达式格式如下: 变量名=表达式 说明: 1)赋值表达式的功能是把表达式的值赋给变量。如a=3,表示把3赋给变量a。 2)赋值运算符为双目运算符,即“=”两边的变量名和表达式均为操作数,一般情况下变量与表达式的值类型应一致。 3)运算符左边只能是变量名,而不能是表达式。,2. 复合赋值运算符 在“=”前面加上双目运算符,如“”、“+”、“- ”、“*”、“%”、“/”等即构成复合赋值运算符。 所有复合赋值运算符级别相同,且与赋值运算符同一优先级,都具有右结合性。 例如, b+=4等价于b=b+4 a=4等价于a=a4,4.3.6 自增和自减运算符与表达式 1. 自增和自减运算符格式与表达式 格式: i+ i- 功能:先使用i的值,然后,变量i的值增加(减少)1,即i=i1。 格式: +i -i 功能:变量i先增加(减少)1,即i=i1,然后,再使用i的值。 例如: int a=3, b ; b=a+ ; 执行后,则b的值为3,a的值为4。 int a=3 , b ; b=+a ; 执行后,则b的值为4,a的值为4。,4.3.7 位运算符与表达式 1位运算符 位运算符共有6种,即、&、 和 |,分别表示按位取反、左移位、右移位、按位与、按位异或、按位或。 2. 位逻辑运算符及表达式 逻辑运算符包括取反、按位与、按位异或、按位或,其按位操作的情况,见表4-6,其中a和b分别表示一个二进制位。 3.移位运算符 移位运算符是将一个数的二进制位向左或向右移若干位。 移位运算符有左移运算符和右移运算符。 1)左移运算符的一般书写格式为: 表达式1 表达式2 其中“表达式1”是被移对象,“表达式2”给出移动位数。,例如,按位取反示例,求 15的值。 unsigned char x =15 ; /* x为00001111 */ P0=x ; /* P0=00001111 */ x = x ; /* x取反后结果为11110000 */ P0=x ; /* P0=11110000 */ 例如,将变量a的内容按位左移2位: unsigned char a =0x0f ; a =a2 ; /* a左移4位后a的值为00111100 */,4.3.8 条件运算符与表达式 条件运算符格式: 表达式1 ? 表达式2 : 表达式3 其执行过程:首先判断表达式1的值是否为真,如果是真,就将表达式2的值作为整个条件表达式的值,如果为假,将表达式3作为整个条件表达式的值。 例如: max=(ab)?a:b 当ab成立时,max=a; 当ab不成立时,max=b;,4.4 C51控制语句 4.4.1 条件语句 条件语句又称为分支语句,由关键字if构成,有以下三种基本形式: 1)单分支条件语句格式: if(条件表达式) 语句 执行过程:如果括号里条件表达式结果为真,则执行括号后的语句。 2)两分支条件语句格式: if(条件表达式) 语句1 else 语句2 执行过程:如果括号里条件表达式结果为真,则执行语句1,否则(也就是括号里的表达式为假)执行语句2。,3)多分支条件语句格式: if(条件表达式1)语句1 else if (条件表达式2) 语句2 else if (条件表达式3) 语句3 else if (条件表达式n) 语句m else 语句n 这种条件语句常用来实现多方向条件分支,其实,它是由if-else语句嵌套而成的,在此种结构中,else总是与最邻近的if相配对。,4)条件语句嵌套 在进行程序设计时,经常要用到条件分支嵌套。所谓条件分支嵌套就是在选择语句的任一个分支中可以嵌套一个选择结构子语句。 完整的嵌套格式为: if(表达式1) if(表达式2) 语句序列1 ; else 语句序列2 ; else if(表达式3) 语句序列3 ; else 语句序列4 ; 在编程时,可以根据实际情况使用上面格式中的一部分。例如, 需要注意: else总是与最邻近的if相配对。 以上if-else嵌套了两个子语句,但整个语句仍然是一条C语句。,一条语句,4.4.2 switch/case 语句 switch/case 语句是一种多分支选择语句。 其格式如下: switch(表达式) case 常量表达式1:语句1; break; case 常量表达式2:语句2; break; case 常量表达式n:语句n; break; default: 语句m; break; ,执行过程: 当
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号