欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载  

    80C51的C语言程序设计教学课件PPT单片机.ppt

    • 资源ID:3817094       资源大小:786.53KB        全文页数:58页
    • 资源格式: PPT        下载积分:8
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要8
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    80C51的C语言程序设计教学课件PPT单片机.ppt

    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 10×10-3/1×10-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 = 0x0f;/*送命令字*/ prt(0x1c); /*送中文打印方式命令字高字节*/ prt(0x26); /*送中文打印方式命令字低字节*/ EA = 1; EX1 = 1; while(1); void int1(void)interrupt 2 using 1 uchar i; EA = 0; for(i = 0;i t1;i +)prt(tabi); EA = 1; EX1 = 0; ,二、A/D转换接口编程示例,例 ADC0809与单片机的接口电路如图,查询方式采集数据的应用程序为: # include “reg51.h” # include “absacc.h” # define uchar unsigned char # define IN0 XBYTE0x7ff8 sbit ad_busy = P33;,void main(void) static uchar idata ad10 ; ad0809(ad); ,void ad0809(uchar idata *x) uchar i; uchar xdata * ad_adr; ad_adr = & IN0; for(i = 0;i 8;i +) * ad_adr = 0; /*启动转换*/ i = i; /*延时等待*/ i = i; while(ad_busy !=0); xi = * ad_adr; /*存转换结果*/ ad_adr +; /*下一通道*/ ,思考题及习题,1、C51应用程序具有怎样的结构? 2、C51支持的数据类型有哪些? 3、C51支持的存储器类型有哪些?与单片机存储器有何对应关系? 4、C51有哪几种编译模式?每种编译模式的特点如何? 5、中断函数是如何定义的?各种选项的意义如何? 6、C51应用程序的参数传递有哪些方式?特点如何? 7、一般指针与基于存储器的指针有何区别? 8、关键字bit与sbit的意义有何不同? 9、汇编程序与C51程序在应用系统开发上有何特点?,

    注意事项

    本文(80C51的C语言程序设计教学课件PPT单片机.ppt)为本站会员(yyf)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开