




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/12/2,1,第4章80C51单片机C语言程序设计,C51对标准C的扩展,4.1,C51的指针,4.2,C51的函数,4.3,C51与汇编程序的接口,4.4,2019/12/2,2,4.1C51对标准C的扩展,4.1.1C51的数据类型,数据是计算机操作的对象,包含常量和变量。,C51扩展了ANSIC,以适应单片机的结构和特点。,数据类型就是数据的格式,它决定数据的值域范围、占用存储单元的个数及能参与哪种运算。,编写C51程序,先要确定数据类型、储存分区应尽可能采用无符号格式(unsigned)C51中,多字节数据采用“大端对齐”格式,数据起始字节置于高地址端,2019/12/2,3,C51数据类型表,2019/12/2,4,bit定义位变量名字,编译器在位寻址区自动分配该位变量;Sbit声明位变量的名字和地址,地址是确定的(SFR区确定位、位寻址区变量的某确定位)。,几点说明:,unsignedcharbdataibase;sbitmybitf=ibase0;,sbitCY=0 xD7;,bitflag1=0;,含义:赋值,含义:声明,2019/12/2,5,4.1.2C51数据的存储分区,经常使用的变量应该置于片内RAM中,要用bdata、data、idata来定义不常使用的变量或规模较大的变量应该置于片外RAM中,要用pdata、xdata来定义,bitbdataflags;/位变量flags定位在片内位寻址区chardatavar;/字符变量var定位在片内RAM区floatidatax,y;/实型变量x,y定位在片内间址RAM区unsignedcharpdataz;/无符号字符变量z定位在片外分页间址RAM区,2019/12/2,7,编译模式默认的变量存储分区,4.1.3C51的编译模式,未对变量存储分区定义时,C51编译器采用默认存储分区。例如:charvar;/SMALL模式时,var定位于data存储区/COMPACT模式时,var定位于pdata存储区/LARGE模式时,var定位于xdata存储区,2019/12/2,9,4.1.4用_at_定义变量绝对地址,用关键字“_at_”定义变量存放的首地址,idatainty_at_0 x30;/idata区域整型变量y的首地址为0 x30,例如:,又如:,xdatacharstring20_at_0 x3000;/xdata中字符型数组string的首地址为0 x3000,注意,C51编程时不要轻易使用绝对地址定位变量。,2019/12/2,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空间,基于存储器的指针长度比通用指针短,可以节省存储器空间,运行速度快,但它所指对象具有确定的存储器空间,兼容性不好。,数据,数据分区,2019/12/2,12,定义时未指定所指向的数据的存储分区。也称通用指针。,4.2.2未定义数据存储分区的指针-通用指针,通用指针占3个字节第一字节存放该指针的默认存储器类型编码(见表)第二字节存放该指针的高位地址偏移量第三字节存放该指针的低位地址偏移量,存储器类型编码,2019/12/2,13,通用指针定义示例:,char*xdatastrptr;/指针本身存于xdata空间,它指向char型数据int*datanumber;/指针本身存于data空间,它指向int型数据,由于指向对象的存储空间在编译时无法确定(运行时确定),因此必须生成通用代码以保证对任意空间的对象进行存取。所以通用指针生成的代码速度较慢。,指针,char型数据,指针分区,2019/12/2,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生成代码,2019/12/2,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;,要进行以下设置:,2019/12/2,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;d
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版商铺店面房屋租赁合同(含节假日客流保障条款)
- 2025版绿色能源项目商务合作保密协议文本
- 2025版全新定制化团队建设服务合同范本
- 2025年度危化品安全操作人员资质认证服务协议
- 2025年度高考复读生代理招生服务合同范本
- 2025年度店面转让合同范本:包含品牌使用权约定
- 2025年二手房买卖合同附带租客权益保障
- 2025年度商铺物业管理与公共安全服务合同范本
- 2025版环保产业商务合同范本
- 2025版快速救援拖车服务合同范本
- 房地产 中国高标仓物流市场报告2025年上半年
- 2025年职业技能鉴定-劳动关系协调员-劳动关系协调员高级(三级)历年参考题库含答案解析(5套)
- 2025国资国企穿透式监管白皮书
- 消防系统工程施工技术全流程攻略
- 2025年玻璃钢行业当前发展趋势与投资机遇洞察报告
- 成品油安全知识培训课件
- 2025年新闻记者资格证及新闻写作相关知识考试题库附含答案
- 2025年期权开户考试题库及答案(内附考试信息)
- 2025-2026学年湘鲁版(2024)小学英语四年级上册(全册)教学设计(附目录)
- 2025年山东省统一高考英语试卷(新高考Ⅰ)
- 2025四川成都农商银行招聘综合柜员岗4人模拟试卷带答案详解
评论
0/150
提交评论