




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
9.2 c51的数据类型与运算,9.1 单片机的c语言,9.3 c51流程控制语句,9.4 c51的指针类型,9.5 c51的函数,9.6 c51编程实例,第9章 80c51的c语言程序设计,本章内容:,9.1.1 c51程序开发概述,一、采用c51的优点,编译器自动完成变量的存储分配 常用接口芯片编制通用驱动函数 常用功能模块和算法编制相应的函数,方便地进行算法和程序的移植。 当代码长度超过4kb以上时,c51比汇编语言更具有明显的优势。,9.1 单片机的c语言,二、c51程序开发过程,9.1.2 c51程序结构,预处理命令 全局变量说明; 函数1说明; 函数n说明; main() 局部变量说明; 执行语句; 函数调用(实参表); ,函数1(形式参数说明) 局部变量说明; 执行语句; 函数调用(实际参数表); 函数n(形式参数说明) 局部变量说明; 执行语句; 函数调用(实际参数表); ,9.2 c51的数据类型与运算,9.2.1 c51的数据类型,9.2.2 c51的数据的存储器类型,变量和常量必须以一定的存储器类型定位于单片机的存储区域中。,经常使用的变量应置于片内ram中,即用bdata、data、idata来定义; 不经常使用的变量或规模较大的变量应该置于片外ram中,即用pdata、xdata来定义。 例如:,bit bdata flags; /* 位变量flags定位在片内ram的位寻址区 */ char data var; /* 字符变量var定位在片内ram区 */ float idata x,y,z; /* 实型变量x,y,z定位在片内间址ram区 */ sfr p1=0x90; /* 定义p1口地址为90h */,如果用户不对变量的存储器类型进行定义,c51编译器采用默认的存储器类型。由编译控制命令中的存储模式指令限制。例如: char var;/* 在small模式时,var定位data存储区 */ /* 在compact模式时,var定位pdata存储区 */ /* 在large模式时,var定位xdata存储区 */,9.2.3 80c51硬件结构的c51定义,一、特殊功能寄存器的定义 21个sfr,为能直接访问,c51用扩充的关键字sfr和sfr16进行定义。方法为: sfr 特殊功能寄存器名 = 地址常数;,例如: sfr scon = 0x98; sfr p0 = 0x80; sfr16 t2 = 0xcc;,二、sfr特定位的定义 sbit定义可独立寻址访问的位变量,如定义sfr中的一些特定位。方法为:,1、sbit 位变量名 = sfr名位的位置(07),如: sfr psw=0xd0; /* 定义psw地址为0xd0 */ sbit ov=psw2; /* 定义ov位为psw.2 */ sbit cy=psw7; /* 定义cy位为psw.7 */,2、sbit 位变量名 = 字节地址位的位置(07),如: sbit ov=0xd02; /* 定义ov位地址为0xd2 */ sbit cy=0xd07; /* 定义cy位地址为0xd7 */ 注:字节地址作基地址,必须在0x800xff之间。,3、sbit 位变量名 = 位地址,如: sbit ov=0xd2; /* 定义ov位地址为0xd2 */ sbit cy=0xd7; /* 定义cy位地址为0xd7 */ 注:位地址必须位于0x800xff之间。,三、内部ram中可位寻址对象的定义 ram的20h2fh单元可用bdata存储器类型访问,带有bdata类型的变量可以进行字或字节寻址,用sbit指定bdata变量的相应位后就可以进行位寻址。,例如,先定义变量数据类型和存储类型为: int bdata ibase; /* 定义整形变量ibase */ char bdata array4; /* 定义字符数组array4 */,定义可独立寻址访问的位: sbit mybit0 = ibase0; sbit mybit15 = ibase15; sbit ary07 = array07; sbit ary37 = array37;,访问示例: ibase = -1; /* 字寻址 */ array2 = a;/* 字节寻址 */ ary07 = 0; /* 位寻址 */ 用bit定义普通位变量时c51编译器会自行安排该位变量于可位寻址的bdata区。例如,bit mybit。 应注意的是,不能定义bit类型指针,也不能定义bit类型数组。,一、算术运算符和算术表达式 1、基本算术运算符 + 加法运算符; - 减法(取负)运算符; * 乘法运算符; / 除法运算符; % 取余(模)运算符。,9.2.4 c51的运算符和表达式,加、减和乘法符合一般的算术运算规则。 除法时,若是两个整数相除,其结果为整数,舍去小数部分;如果是两个浮点数相除,其结果为浮点数。 取余运算,则要求运算对象为整形。,求值要依运算符的优先级进行。算术运算符中取负运算优先级最高,其次为乘法、除法和取余。加法和减法优先级最低。 可根据需要采用括号来改变运算符的优先级。,2、自增、自减运算符 + 自增运算符; - 自减运算符。,+和-运算符只能用于变量,不能用于常量和表达式。 如,+j表示先加1,再取值;j+表示先取值,再加1。自减运算类同。,3、类型转换 运算符两侧的数据类型不同时,要转换成同种类型。方式有两种:,一是自动转换,是指编译器在编译时自动进行的类型转换。顺序为:bitcharintlongfloat,signedunsigned。 二是强制类型转换,如:(double)a ,将a 强制转换为double类型。,二、关系运算符和关系表达式,1、关系运算符 大于; = 大于等于;,= = 等于; != 不等于。,高优先级,低优先级,关系运算优先级低于算术运算,高于赋值运算。,2、关系表达式 关系表达式的值为逻辑值:真和假。c51中用0表示假,用1表示真。,三、逻辑运算符和逻辑表达式,1、逻辑运算符 & 逻辑与; | | 逻辑或; ! 逻辑非。 在三种逻辑运算中,逻辑非的优先级最高,且高于算术运算符;逻辑或的优先级最低,低于关系运算符,但高于赋值运算符。,2、逻辑表达式 逻辑表达式的值也为逻辑值:真和假。,四、位运算符 c51提供6种位运算符:, 位取反; 右移; & 位与; 位异或; | 位或。,优先级顺序为:位取反、左移和右移、位与、位异或、位或。,五、赋值和复合赋值运算符 “=”称为赋值运算符,作用是将一个数据的值赋给一个变量。 复合运算符如下:,+= 加法赋值; -= 减法赋值; *= 乘法赋值; /= 除法赋值; %= 取模赋值;,= 右移位赋值; &= 逻辑与赋值; |= 逻辑或赋值; = 逻辑异或赋值; = 逻辑非赋值。,一、条件语句 由关键字if构成。有3种条件语句: 1、if(条件表达式)语句 若条件表达式的结果为真(非0值),则执行后面的语句;反之若条件表达式的结果为假(0值),则不执行后面的语句。 例如: if(p1!= 0) c=20;,9.3 c51流程控制语句,9.3.1 c51选择语句,2、if(条件表达式)语句1 else 语句2 若条件表达式的结果为真(非0值),则执行语句1;反之若条件表达式的结果为假(0值),则执行语句2。,例如: if(p1!= 0) c=20; else c=0;,3、if(条件表达式1) 语句1 else if (条件表达式2)语句2 else if (条件表达式3)语句3 else if (条件表达式n)语句n else 语句n+1,此种形式的条件语句常用于实现多方向条件分支。,例如: if(a= 4) c=40; else if a= 3) c=30; else if a= 2) c=20; else if a= 1) c=10; else c=0;,二、开关语句 开关语句主要用于多分支的场合。一般形式为: switch (表达式) case 常量表达式1:语句1;break; case 常量表达式2:语句2;break; case 常量表达式n:语句n;break; default :语句n+1; ,一、while语句 一般形式为: while(条件表达式)语句;,9.3.2 c51循环语句,先检查条件,再决定是否执行后面的语句。如的结果一开始就为假,则后面的语句一次也不能执行。,二、do-while语句 一般形式为: do语句while(条件表达式);,先执行循环语句,再检查条件表达式的结果。,三、for语句 一般形式为: for(初值表达式;条件表达式;更新表达式)语句,先计算初值表达式,再检查条件表达式的结果。当满足条件时就执行循环体语句并计算更新表达式,然后再根据更新表达式的计算结果来判断循环条件是否满足,一直进行到循环条件表达式的结果为假(0值)时退出循环体。,四、if语句与goto语句结合 利用if语句与goto语句的结合,可以构成循环结构。可以有两种形式:,1、当型循环 形式为: loop:if(表达式) 语句 goto loop; ,2、直到型循环 形式为: loop:语句 if(表达式) goto loop; ,变量的指针就是该变量的地址。为了表示指针变量和它所指向的变量地址间的关系,可以利用运算符:*(取内容)和&(取地址)。,9.4 c51的指针类型,一般定义形式为: 变量 = * 指针变量 指针变量 = & 目标变量 取内容运算是将指针变量所指向的目标变量的值赋给左侧的变量;取地址运算是将目标变量的地址赋给左侧的变量。,指针变量中只能存放指针型数据(即地址),不要将一个非指针型的数据赋给一个指针变量。正确的赋值,例如: char data *p /* 定义指针变量 */ p = 30h /* 为指针变量赋值 */,c51编译器支持两种指针类型:一般指针和基于存储器的指针。,定义指针变量时,若未指定它所指向的对象的存储器类型时,该指针变量就被认为是一般指针。 一般指针占用3个字节:第一个字节存放该指针的存储器类型编码(由编译模式的默认值确定),第二和第三个字节分别存放该指针的高位和低位地址偏移量。编码为:,9.4.1 一般指针,例如:xdata 类型,地址为0x1234的指针表示为:第一字节为0x01,第二字节为0x12,第三字节为0x34。,一般指针所指向对象的存储空间位置在运行期间才能确定,在编译时无法优化存储方式,必须生成一般代码以保证对任意空间的对象进行存取。因此一般指针所产生的代码速度较慢。,一般指针可用于存取任何变量而不必考虑变量在80c51单片机存储空间的位置,许多c51库函数采用了一般指针。例如: char *xdata strptr; /* 位于xdata 空间的一般指针 */ int *data number;/* 位于data 空间的一般指针 */,定义指针变量时,若指定了它所指向的对象的存储类型时,该指针变量就被认为是基于存储器的指针。 基于存储器的指针可以高效访问对象,类型由c51源代码中存储器类型决定,且在编译时确定。由于不必为指针选择存储器,这些指针的长度可以为1个字节(idata *,data *,pdata *)或2个字节(code *,xdata *)。,9.4.2 基于存储器的指针,例如: char data * str; /* 定义指向data 空间char型数据的指针 */ int xdata * num; /* 定义指向xdata 空间int型数据的指针 */ long code * pow; /* 定义指向code 空间long型数据的指针 */,还可以在定义时指定指针本身的存储器空间位置。,例如: char data *xdata str; /* 指针本身在xdata空间 */ int xdata * data num; /* 指针本身在data空间 */ long code * idata pow; /* 指针本身在idata空间 */,基于存储器的指针长度比一般指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。,与普通的c语言程序类似,c51程序是有若干模块化的函数构成。函数是c51程序的基本模块,常说的子程序就是由函数来实现的。,9.5 c51的函数,用户可以根据需要定义自己的功能函数,也可以调用c51编译器提供的标准函数(库函数)来完成某种特定的功能。,9.5.1 c51函数的定义,函数的一般定义形式为: 返回值类型 函数名(形式参数列表)编译模式reentrantinterrupt nusing n 函数体 ,当函数没有返回值时,应用关键字void明确说明。,形式参数的类型要明确说明,对于无形参的函数,括号也要保留。,编译模式为small、copact或large,用来指定函数中局部变量和参数的存储器空间。,reentrant用于定义可重入函数。 interrupt n 用于定义中断函数,n为中断号,可以为031,通过中断号可以决定中断服务程序的入口地址。,using n 用于确定中断服务函数所使用的工作寄存器组,n为工作寄存器组号,取值为03。,9.5.2 c51函数的调用与参数传递,若被调函数是有参函数,则主调函数必须把被调函数所需的参数传递给被调函数。 传递给被调函数的数据称为实际参数,即实参。实参对形参的传递是单向的。 参数传递可采用寄存器、固定存储器位置方式。,寄存器参数传递使用的寄存器如表:,寄存器传递方式最多可以传递3个参数。这种参数传递可以产生高效的代码。可以用regparms和noregparms编译命令来控制。,当无寄存器可用时,或说明了“pragma noregparms”时,参数可以采用固定的存储器位置传递。在固定的存储器位置进行参数传递是c51的一个重要特征。在small模式下,参数传递在内部ram中完成。在compact和larger模式下,参数的传递要在外部ram中完成。 由于80c51单片机片内ram空间非常有限,所以c51编译器仅将函数的返回地址保存到堆栈中,不采用堆栈传递参数。但应注意,c51提供一种模拟堆栈,从而支持可重入函数的递归调用。,9.5.3 c51的库函数,c51编译器提供了丰富的库函数,使用这些库函数可以大大提高编程的效率。 每个库函数都在相应的头文件中给出了函数的原形,使用时只需在源程序的开始用编译命令 #include 将头文件包含进来即可。 常用的c51库函数参见附录c.2。,9.6 c51编程实例,9.6.1 80c51内部资源的编程 一、中断服务函数示例 c51利用中断函数,控制中断系统的相关资源,中断函数的定义形式为: void 函数名(void)interrupt n using m 函数体 n 表示中断源的编号,范围是031,常用的中断源对应的中断号,using 用于指定使用的工作寄存器组,m的范围是03。不设定工作寄存器组时,编译系统会将当前工作寄存器组的寄存器压入堆栈。 在应用程序中任何函数都不能调用中断服务函数,因为它是由系统调用的。,例 :在单片机应用系统中,外中断0引脚接一个开关,p1.0接一发光二级管。要求开关闭合一次,发光二极管的状态改变一次。程序为:,#include “reg51.h” #include “intrins.h” sbit p10=p10; void delay(void) int a = 5000; while(a - - )_nop_( ); ,void main() p10 = 0; ea = 1; ex0 = 1; while(1); ,void delay(void) int a = 5000; while(a - - )_nop_( ); void int_srv(void)interrupt 0 delay( ); if(int0 = =0) p10 = ! p10; while(int0 = =0); ,二、定时计数器编程示例 例 用t0方式1,产生10ms的定时,使p1.0引脚上输出周期为20ms方波,采用中断方式,设系统时钟频率为12 mhz。,解:1、计算计数初值: nt/ tcy 1010-3/110-310000 将 -(10000/256)送入th0中,-(10000%256)送入tl0。 2、t0方式控制字: m1m0=01,gate=0,c/ t =0,可取方式控制字为01h; 3、程序清单如下:,#include “reg51.h” sbit p10 = p10; void timer0(void)interrupt 1 p10 = ! p10; th0 = -(10000/256); tl0 = -(10000%256); ,void main(void) tmod = 0x01; p10 = 0; th0 = -(10000/256); tl0 = -(10000%256); ea = 1; et0 = 1; tr0 = 1; while(1); ,9.6.2 80c51扩展资源的编程,例 :微型打印机接口电路如图,一、通用并行口编程示例,实现程序为: # include “reg51.h” # include “absacc.h” # define uchar unsigned char # define comd8155 xbyte0x7f00 # define pa8155 xbyte0x7f01 # define pb8155 xbyte0x7f02 # define pc8155 xbyte0x7f03,sbit busy = p33; uchar code tab17 = 0xc7,0xe5,0xbb,0xaa,0x20,0xb3,0xf6,0xb0,0xe6,0xc9,0xe7,0x20,0x32,0x30,0x30,0x35,0x0a;/*清华 出版社 2005*/ uchar t1 = 17; void ptr(uchar d) /*打印字符函数*/ pa8155 = d; pc8155 = 0x00; /*产生选通脉冲*/ pc8155 = 0x01; while(busy); ,void main(void) comd8155 =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公司元旦节年会活动方案
- 公司员工压气球活动方案
- 公司员工运动活动方案
- 公司嘉年华年会活动方案
- 职业教学创意课件模板
- 公司小年会小活动方案
- 公司小舞台活动方案
- 航天工程师发射压力疏导
- 2025至2030年中国骨伤科用药行业运营现状及战略咨询研究报告
- 2025至2030年中国风机行业市场竞争态势及未来趋势研判报告
- 丝网除沫器小计算
- 制钵机的设计(机械CAD图纸)
- 《土木工程生产实习报告》
- 11分泌性中耳炎学习课程
- 明基逐鹿eHR白皮书(DOC 30页)
- 三年级下册美术课件-第15课色彩拼贴画|湘美版(共11张PPT)
- 水稻病虫统防统治工作总结
- 水在不同温度下的折射率、粘度和介电常数
- 四柱特高弟子班绝密资料——席学易
- 呼吸机基础知识最终版
- 广安市教育局文件材料归档范围及保管期限表
评论
0/150
提交评论