单片机--第五章:C语言程序设计分解课件

PPT
  • 阅读 42 次
  • 下载 0 次
  • 页数 41 页
  • 大小 461.502 KB
  • 2022-11-24 上传
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
此文档由【小橙橙】提供上传,收益归文档提供者,本网站只提供存储服务。若此文档侵犯了您的版权,欢迎进行违规举报版权认领
单片机--第五章:C语言程序设计分解课件
可在后台配置第一页与第二页中间广告代码
单片机--第五章:C语言程序设计分解课件
可在后台配置第二页与第三页中间广告代码
单片机--第五章:C语言程序设计分解课件
可在后台配置第三页与第四页中间广告代码
单片机--第五章:C语言程序设计分解课件
单片机--第五章:C语言程序设计分解课件
还剩10页未读,继续阅读
【这是免费文档,您可以免费阅读】
/ 41
  • 收藏
  • 违规举报
  • © 版权认领
下载文档25.00 元 加入VIP免费下载
文本内容

【文档说明】单片机--第五章:C语言程序设计分解课件.ppt,共(41)页,461.502 KB,由小橙橙上传

转载请保留链接:https://www.ichengzhen.cn/view-44629.html

以下为本文档部分文字说明:

第5章MCS-51C语言程序设计5.1C语言与MCS-51单片机C语言是一种通用的计算机程序设计语言,代码效率高,数据类型和运算符丰富,有良好的程序结构,适用于各种应用系统的程序设计,是目前使用较广的单片机编程语言。本章重点介绍在单片机上使用MCS-51C语

言的特殊数据类型、存储模式、程序的结构、混合编程。5.1.1C语言程序开发过程一般的C语言开发套件中,包括编译器、连接器和符号转换程序。编译器将源程序翻译为可重定位的目标代码文件(也可产生等价的汇编语言程序);连接器将目标代码文件连接为绝对目

标文件;符号转换程序可将绝对目标文件转换为IntelHEX格式文件,编程到程序存储器中运行。若使用提供了集成开发环境(IntegratedDevelopmentEnvironment,IDE)的套件,则编辑、编译、连接、符号转换、甚至调试可在一个窗口中完成。如America

nAutomation、Auocet、BSO/TASKING、DUNFIELDSHAREWARE、KEIL/Franklin等。5.1.2C语言的特点C语言是一种模块化、结构化程序设计语言,符合ANSIC标准,可以产生紧凑的目标码,具体优点:(1)不必详细了

解单片机的指令系统(2)仅要求对MCS-51存储器结构有初步了解(3)寄存器分配、不同存储器区域的寻址及数据类型等细节由编译程序管理(4)程序具有规范的结构和固有的模块化思想(5)运算符和关键字用接近于自然语言的方式表示(6)提供包含大量标准子程序的函数库,具有较强的数据处

理能力(7)在对执行效率要求较高的场合,可以嵌入汇编,也可以与汇编语言协同开发5.1.3单片机C语言的移植C语言在单片机中的应用移植面临的具体问题:(1)MCS-51存储器的哈佛结构,加上内部有位寻址空间,对存储器变量的使用提出了挑战。(2)内部的数据存储器和程序存储器空间相对太小

,而外部还可扩展存储容量,编译程序如何根据实际情况合理使用这些空间(3)内部各功能单元采用特殊功能寄存器集中管理,在C语言中如何实现寄存器访问(4)MCS-51单片机派生种类繁多,硬件配置不统一,但是要求必须能够使用C语言操控所有

硬件资源(5)MCS-51内部只有一个堆栈,且存储空间有限,传统的利用堆栈传递参数的方法难以奏效5.2单片机C语言的扩充MCS-51单片机有着与通用CPU截然不同的体系结构、硬件资源和运算特性针对单片机独有的一些功能特点,绝大多数的MCS-51的C语言编译程序对标准C语言

进行了一些扩充5.2.1C语言运算符算术运算符:+,-,*,/,%关系运算符:>,<,>=,<=,==,!=逻辑运算符:!,&&,||赋值运算符:*=、/=、%=、+=、-=、<<=、>>=、&=、Λ=、¦=、++、--(位移动、异或、位或)强制运算符强制转换表达式中的类型转换算术

表达式中的运算转换赋值转换输出转换函数调用转换5.2.1C语言运算符intunsignedintlongintdoublefloatchar,short存储长度较短存储长度较长总趋势:算术表达式中的类型转换转

换规则5.2.2数据类型数据类型位数字节数范围bit10~1signedchar81-128~+127unsignedchar810~255enum枚举变量8/161/2-128~+127或-32768~+32767signedshor

t162-32768~+32767unsignedshort1620~65535signedint162-32768~+32767unsignedint1620~65535signedlong324-214748

3648~+21473647unsignedlong3240~4294967295float/double32/644/8±1.175494E-38~±3.402823E+38sbit10~1sfr810~255sfr161620~6553

55.2.2数据类型例:unsignedcharin_data;8位unsignedlonglog_time;32位bitok_flag;1位5.2.3存储器类型存储器类型与硬件存储器空间的对应关系code程序存储器;使用MOVC@A+DPTR指令访问data直接寻址的内部数

据存储器;访问速度最快(128字节)idata间接访问的内部数据存储器;可以访问所有的内部存储器空间(256字节)bdata可位寻址的内部数据存储器;可以字节方式也可以位方式访问(16字节)xdata外部数据存储器(64KB),通过M

OVX@DPTR指令访问pdata外部数据存储器的一页(256字节),使用MOVX@Ri指令访问5.2.3存储器类型例指出以下变量的存储位置chardatavar1;charcodetext[]="ENTERPARAMETER";unsignedlongxdat

aarray[100];floatidatax,y,z;unsignedintpdatadimension;unsignedcharxdatavector[10][4][4];charbdataflags;

5.2.4存储模式1.SMALL模式:所有的变量默认存放于内部RAM中,相当于定义时使用了data类型所有对象(包括堆栈)必须能够存入内部RAM的128字节5.2.4存储模式2.COMPACT模式:所有变量默认存放于外部

RAM的一页中,相当于定义时使用了pdata类型这种存储模式可以满足最多256字节的变量对变量的访问必须使用间接寻址方式编译程序产生的机器码使用@R0和@R1作为变量的指令操作数5.2.4存储模式3.LARGE模式:所有变量默认存放于外部RAM中,最多可以有64

KB,相当于定义时使用了xdata类型数据指针DPTR用来寻址变量这种访问方式效率不高,特别是当变量长度超过一个字节时5.2.4存储模式现在常用的C编译程序通常允许使用混合模式不管存储模式如何,把经常使用的变量强制存放于内部RAM。大块数据则存放于

外部RAM,而将其指针存放于内部RAM中,可以使用存储器类型说明符指定5.2.5硬件资源访问1.特殊功能寄存器:使用sfr、sfr16和sbit数据类型访问特殊功能寄存器特殊功能寄存器中的位使用sbit类型可以定义

可位寻址SFR中的位sfrP0=0x80;地址sfrACC=0xE0;实际地址sbitCY=0xD7;位地址5.2.5硬件资源访问2.内部RAM中的位寻址资源定义一个变量时若指定了bdata存储器类型,C编译程序会在内部RAM的位寻址区为其分配存储空间这个变量中的位也可以单独访问,但必须先

行定义unsignedcharbdatadata8;位寻址区变量sbitlsb=data8^0;data8的最低位5.2.5硬件资源访问3.指定绝对地址的变量使用_at_满足这一要求,其格式如下。[存储器类型]变量类型变量名_at_地址常数;xdataunsignedcharbuff_a

t_0x2000;5.2.5硬件资源访问4.存储器绝对地址的访问absacc.h中包含了一些宏定义,使用这些宏可以显示使用存储器绝对地址,如#defineCBYTE((unsignedcharvolatilecode*)0)CBYTE代表程序存储器地址0000H的字节单元把每个存储

区定义成一个字节或字数组,对指定地址的访问使用数组元素引用的形式5.2.6指针1.基于存储器的指针与源程序中存储器类型有关,编译时即可确定其长度。这种指针的长度可以为1个字节(data*、idata*、pdata*)或2个字节(code*、xdata*)chardata*str;指向data字符

的指针intxdata*num;指向整形数据longcode*pow;指向长整形代码5.2.6指针chardata*str;指向data字符的指针intxdata*num;指向整形数据longcode*pow;

指向长整形代码上述三个指针变量长度分别为1、2、2字节。指针变量自身所占用的存储位置还能定义chardata*xdatastr;intxdata*datanum;longcode*idatapow;5.

2.6指针2.通用指针与标准C语言指针的定义相同使用3个字节存储指针内容(地址值)。第一个字节存放存储器类型,第二和第三节分别存放该指针所指对象地址的高字节和低字节5.2.6指针2.通用指针一般指针包括3个

字节:1个字节存储类型和2个字节偏移地址,即地址+0+1+2内容存储器类型偏移地址高位字节偏移地址低位字节其中,第一字节代表了指针的存储器类型,存储器类型编码如下:存储器类型idataxdatapdatadatacode值123455.2.6指针char*

str;指向字符的指针int*num;指向整形数据的指针第1字节放存储器类型,2、3字节放该指针所指对象地址的高、低字节。xdataintx;x位于外部RAM中int*datapx,*datapy;px=&x;赋值

语句,px指向xpy=0x021234;py指向外部RAM的1234H单元*px=1000;单元内容赋值1000*py=-1;单元内容赋值FFFFH5.3C语言程序结构单片机C语言程序与标准C程序一样,具有固有的模块化思想各种功能由函数实现整体上就

是一个函数逐级调用的树状结构程序的入口为main函数,在每个函数内部可以使用结构化程序设计技术的三种结构5.3.1函数1.函数定义[返回值类型]函数名称(参数表)[{small|compact|large}

][reentrant][interruptn][usingn]若省略返回值类型部分,默认为整型(int)可以指定该函数的存储模式,以取代默认值若使用了using,编译程序将产生切换工作寄存器组的代码对于有返回值的函数,不能使用using

,因为返回值是通过寄存器传递的5.3.1函数参数个数char或字节指针int或2字节指针long或float通用指针1R7R6、R7R4~R7R1~R32R7R5R4、R5R6、R7R4~R7R1~R33R7R5R3R

2、R3R4、R5R6、R7R1~R32.参数传递参数用于向函数传递数据,作为函数的输入。传统C语言中参数是通过堆栈传递的,单片机中是通过存储器或寄存器传递的。传递参数的寄存器分配5.3.1函数3.返

回值总是通过寄存器送回的返回值类型寄存器描述bitCY标志–char,unsignedchar,或1字节指针R7–int,unsignedint,或2字节指针R6&R7最高有效位在R6中,最低有效位在R7中long或unsignedlongR4~R7最高有效位在R4中,最低有效位在R7中f

loatR4~R732位IEEE格式通用指针R1~R3存储器类型在R3中,最高有效位在R2中,最低有效位在R1中5.3.1函数4.内部函数和外部函数如果一个函数只能在其定义的文件中被调用,称之为内部函数定义内部函数时,需用static存储类说明符。内部函数也称作静态

函数定义内部函数可以使它只局限于所在的文件,当在不同文件中有同名的函数时互不干扰允许在其他文件中调用的函数为外部函数,可以使用extern存储类说明符指明。函数定义时,默认为外部函数。5.3.1函数5.可重入函数C编译程序通常将函数的局部变量分配在存储器的固定位置如果正

在执行该函数时发生了中断,而中断服务程序中也调用该函数,先前的局部变量值便会被破坏。类似的情况在实现函数递归调用时也会发生定义为可重入函数后,编译程序产生能够保护局部变量的代码reentrant5.3.1函

数6.中断处理函数中断服务程序,是CPU响应中断后要执行的一段程序,在C语言中组织成一个函数的形式编写中断处理函数时,程序员仅需关心中断类型号和寄存器组的选择,编译程序会自动产生中断向量和返回地址的入栈及出栈代码interruptusing5.3.1函数7.intr

insic函数一些常用的只进行简单处理的函数,LCALL或ACALL的执行代价太高intrinsic函数是一类用汇编语言代码实现的短小函数,若有对intrinsic函数的调用,编译程序将会直接用被调用函数代码替换函数调用语句5.3.2流程控制1.分支

if语句switch-case结构2.循环goto语句while结构do…while结构for结构break和continue语句5.3.3输入与输出一些C开发环境提供了流式输入/输出函数,可以实现通过串行口或用

户自定义I/O接口的输入/输出操作,例如getchar、gets、scanf、putchar、puts、printf等输入/输出功能需要调用_getkey和putchar两个函数,这两个函数的默认实现是通过串行口实

现的如果使用输入/输出函数,还需要在程序中加入一些代码,以便调用时已经对串行口进行了适当的初始化工作5.3.4程序的入口在main函数执行之前,已经做了一些初始化若有在main函数执行之前就应当初始化的资源,或者需要将存储区

初始化为特定的值,可以在STARTUP.A51中修改或添加代码单片机程序的入口其实还是0000H,在STARTUP.A51中初始化代码的最后一条指令才转向main函数执行5.4C语言与汇编语言的混合编程5.4C语言与汇编语言的混合编程C语言调用汇编语言程序时,被调用函数(汇编

语言函数)要在调用函数(C语言函数)所在文件中说明。对于汇编语言程序有以下要求(1)要使用SEGMENT伪指令定义可重定位的CODE段(2)要根据不同情况对函数名进行转换(3)须使用PUBLIC伪指令将被调用函数说明为外部可用函数(4)若有参数传递,按规则使用参

数(5)若有返回值,按照规则存入寄存器5.4C语言与汇编语言的混合编程函数首部符号名说明voidfunc(void)FUNC无参数传递或不含寄存器参数的函数名不作改变voidfunc(char)_FUNC带寄存器参数的函数名加“_”前缀voidfunc(void

)reentrant_?FUNC可重入函数前加“_?”前缀混合编程例:编写汇编语言函数max,参数为两个8位无符号数,功能是求出其中的大数返回。在C语言中可按以下的方式声明和调用externunsignedcharmax(unsigned,unsigned);voidmain(

void){unsignedcharx,y;x=130;y=131;x=max(x,y);while(1);}两个参数分别在R7和R5中传递到子程序,返回值应保存在R7中。混合编程PUBLIC_MAX;声明MIXEDSEGMENTCODE;定义一个可重定

位的段RSEGMIXED;选择MIXED为当前段_MAX:MOVA,R7;第一个参数CLRCSUBBA,R5;减去第二个参数JNC_MAX_RET;无借位,第一个参数值大MOVA,R5;有借位,第二个

参数值大MOVR7,A;返回值在R7_MAX_RET:RETEND

小橙橙
小橙橙
文档分享,欢迎浏览!
  • 文档 25747
  • 被下载 7
  • 被收藏 0
相关资源
广告代码123
若发现您的权益受到侵害,请立即联系客服,我们会尽快为您处理。侵权客服QQ:395972555 (支持时间:9:00-21:00) 公众号
Powered by 太赞文库
×
确认删除?