单片机原理及应用(C51编程).ppt

上传人:sh****n 文档编号:12817189 上传时间:2020-05-26 格式:PPT 页数:33 大小:932KB
返回 下载 相关 举报
单片机原理及应用(C51编程).ppt_第1页
第1页 / 共33页
单片机原理及应用(C51编程).ppt_第2页
第2页 / 共33页
单片机原理及应用(C51编程).ppt_第3页
第3页 / 共33页
点击查看更多>>
资源描述
2020/5/26,1,第4章80C51单片机C语言程序设计,C51对标准C的扩展,4.1,C51的指针,4.2,C51的函数,4.3,C51与汇编程序的接口,4.4,2020/5/26,2,4.1C51对标准C的扩展,4.1.1C51的数据类型,数据是计算机操作的对象,包含常量和变量。,C51扩展了ANSIC,以适应单片机的结构和特点。,数据类型就是数据的格式,它决定数据的值域范围、占用存储单元的个数及能参与哪种运算。,编写C51程序,先要确定数据类型、储存分区应尽可能采用无符号格式(unsigned)C51中,多字节数据采用“大端对齐”格式,数据起始字节置于高地址端,2020/5/26,3,C51数据类型表,2020/5/26,4,bit定义位变量名字,编译器在位寻址区自动分配该位变量;Sbit声明位变量的名字和地址,地址是确定的(SFR区确定位、位寻址区变量的某确定位)。,几点说明:,unsignedcharbdataibase;sbitmybitf=ibase0;,sbitCY=0 xD7;,bitflag1=0;,含义:赋值,含义:声明,2020/5/26,5,4.1.2C51数据的存储分区,经常使用的变量应该置于片内RAM中,要用bdata、data、idata来定义不常使用的变量或规模较大的变量应该置于片外RAM中,要用pdata、xdata来定义,bitbdataflags;/位变量flags定位在片内位寻址区chardatavar;/字符变量var定位在片内RAM区floatidatax,y;/实型变量x,y定位在片内间址RAM区unsignedcharpdataz;/无符号字符变量z定位在片外分页间址RAM区,2020/5/26,7,编译模式默认的变量存储分区,4.1.3C51的编译模式,未对变量存储分区定义时,C51编译器采用默认存储分区。例如:charvar;/SMALL模式时,var定位于data存储区/COMPACT模式时,var定位于pdata存储区/LARGE模式时,var定位于xdata存储区,2020/5/26,9,4.1.4用_at_定义变量绝对地址,用关键字“_at_”定义变量存放的首地址,idatainty_at_0 x30;/idata区域整型变量y的首地址为0 x30,例如:,又如:,xdatacharstring20_at_0 x3000;/xdata中字符型数组string的首地址为0 x3000,注意,C51编程时不要轻易使用绝对地址定位变量。,2020/5/26,10,4.2C51的指针,对于一个变量a,利用/定义指针变量Pp=30H;/指针变量赋值,30H为片内RAM地址x=*p;/30H单元的内容送给变量x,*P,指针变量,数据变量,4.2.1已定义数据存储分区的指针,定义时就指定了所指向数据的存储分区。,该指针占1个字节(idata*,data*,pdata*)或2个字节(code*,xdata*),示例:,chardata*str;/指针str指向的char型数据存于data空间intxdata*num;/指针num指向的int型数据存于xdata空间,基于存储器的指针长度比通用指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。,数据,数据分区,2020/5/26,12,定义时未指定所指向的数据的存储分区。也称通用指针。,4.2.2未定义数据存储分区的指针-通用指针,通用指针占3个字节第一字节存放该指针的默认存储器类型编码(见表)第二字节存放该指针的高位地址偏移量第三字节存放该指针的低位地址偏移量,存储器类型编码,2020/5/26,13,通用指针定义示例:,char*xdatastrptr;/指针本身存于xdata空间,它指向char型数据int*datanumber;/指针本身存于data空间,它指向int型数据,由于指向对象的存储空间在编译时无法确定(运行时确定),因此必须生成通用代码以保证对任意空间的对象进行存取。所以通用指针生成的代码速度较慢。,指针,char型数据,指针分区,2020/5/26,14,4.2.3利用指针进行绝对地址访问,unsignedchardata*p;p=0 x40;*p=0 x55;/数据0 x55送入内部RAM的0 x40单元,例如:,C51编译器提供了一组宏定义实现对80C51绝对地址的访问。这组宏定义原型放在absacc.h文件中,形如:,#defineDBYTE(unsignedcharvolatiledata*)0),从而使DBYTE用于以字节形式对data区访问,可以写成:,*(DBYTE)=0 x55H;或,DBYTE0=0 x55H;,与此类似:CBYTE用于以字节形式对code区进行访问;PBYTE用于以字节形式对pdata区进行访问;XBYTE用于以字节形式对xdata区进行访问。CWORD、DWORD、PWORD和XWORD用于以字形式对code区、data区、pdata区和xdata区进行访问。,4.2.4C51程序编写示例,【例4-1】将30H至3FH共16个RAM单元初始化为“55H”。,#include#includevoidmain(void)unsignedchari;for(i=0;i=15;i+)DBYTE0 x30+i=0 x55;while(1);,编译系统自动连接了startup.a51生成代码一是将内部RAM的00H7FH清0;二是设置堆栈指针SP。,有全局变量赋值时编译系统会自动连接init.a51生成代码,C:0 x0000020011LJMPC:0011C:0 x0003E4CLRAC:0 x0004FFMOVR7,AC:0 x00057430MOVA,#0 x30C:0 x00072FADDA,R7C:0 x0008F8MOVR0,AC:0 x00097655MOVR0,#0 x55C:0 x000B0FINCR7C:0 x000CBF10F6CJNER7,#0 x10,C:0005C:0 x000F80FESJMPC:000FC:0 x0011787FMOVR0,#0 x7FC:0 x0013E4CLRAC:0 x0014F6MOVR0,AC:0 x0015D8FDDJNZR0,C:0014C:0 x0017758107MOVSP,#0 x07C:0 x001A020003LJMPC:0003,反汇编如下:,编译系统自动连接了startup.a51生成代码一是将内部RAM的00H7FH清0;二是设置堆栈指针SP。,另:全局变量赋值时编译系统会自动连接init.a51生成代码,2020/5/26,19,4.3C51的函数,4.3.1C51函数的定义,一般形式:,返回值类型函数名(形式参数列表)编译模式reentrantinterruptnusingn函数体,编译模式为SMALL、COPACT或LARGEreentrant用于定义可重入函数interruptn用于定义中断函数,n为中断号,可以为031usingn确定工作寄存器组,取值为03,【例4-2】延时nMs函数示例(晶振11.0592MHz)。,voidDelayMs(unsignedintn)/延时函数unsignedcharj;while(n-)for(j=0;j113;j+);,调试:Registers窗口中的sec值。,4.3.2C51函数定义的选项,编译模式,SMALL模式:变量默认在片内RAM;COMPACT模式:变量默认在片外RAM的页内;LARGE模式:变量默认在片外RAM的64KB范围。,reentrant定义为重入函数,ANSIC中,函数默认都是可重入的C51函数默认是不可重入的,使用可重入函数会消耗较多的存储器资源,应该尽量少用。,interruptn定义中断函数,常用的中断源对应的中断号,usingn确定中断服务函数所使用的工作寄存器组,【例4-3】中断函数定义示例,#includesbitP10=P10;voidIntSrv(void)interrupt0if(INT0=0)/测开关状态P10=!P10;while(INT0=0);,4.3.3C51的库函数,常用的C51库函数参见附录B.2,【例4-4】C51库函数调用示例。,#include“intrins.h”/在intrins.h中有对函数_nop_()的定义voidDelay(void)inti=5000;while(i-)_nop_();,【例4-5】C51标准输入输出函数调用示例。,#include#includevoidInitSPort(void)SCON=0 x50;/串口方式1,允许接收TMOD=0 x20;/T1方式2(自动重装)TH1=0 xFD;/波特率9600TR1=1;/启动T1TI=1;/发送中断置1,voidmain(void)InitSPort();printf(HelloWorldn);while(1);,标准I/O的重定向!,在调试状态:ViewSerialWindowsUART#1,4.4C51与汇编程序的接口,4.4.1在C51程序中嵌入汇编指令,【例4-6】利用预编译指令。,#includereg51.hvoidInit(void);voidmain()while(1)Init();,voidInit(void)#pragmaasmMOVR7,#16MOVR1,#20HMOVA,#55HLP:MOVR1,AINCR1DJNZR7,LP#pragmaendasmreturn;,要进行以下设置:,2020/5/26,27,将嵌有汇编语句的源文件加入工程文件,将鼠标指向该文件,选择右键菜单“optionforinsertasm.c”。将属性properties书签下的“GenerateAssemblerSRCFile”与“AssembleSRCFile”选项置成“”。再加入库文件(如C51S.LIB),然后编译。,4.4.2在C51程序中调用汇编子程序,【例4-7】不含参数传递的子程序调用。先构造汇编语言源文件:,d1ms:MOVR6,#249;DL:NOP;1sNOP;1sDJNZR6,DL;2s,循环内约1msRETEND,?PR?d1ms?EP4_7BSEGMENTCODEPUBLICd1msRSEG?PR?d1ms?EP4_7B,注:d1ms对应C51的d1ms()EP4_7B对应ep4_7b.asm,编写C51语言程序如下,完成汇编子程序调用:#includesbitP2_0=P20;externvoidd1ms(void);voidmain()for(;)P2_0=0;d1ms();/*调用汇编子程序*/P2_0=1;d1ms();/*调用汇编子程序*/,主调函数要向被调函数传递所需的参数传递给被调函数的数据称为实参实参向形参的传递是单向的参数传递可以采用寄存器、固定存储器位置方式,参数传递,寄存器参数传递,SMALL模式下,在内部RAM中完成COMPACT模式下,在外部RAM中完成LARGER模式下,在外部RAM中完成,固定存储器位置参数传递,80C51单片机不采用堆栈传递参数。但C51提供一种模拟堆栈,从而支持可重入函数的递归调用。,函数返回值使用的寄存器,ThankYou!,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!