




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020 2 14 1 第4章80C51单片机C语言程序设计 C51对标准C的扩展 4 1 C51的指针 4 2 C51的函数 4 3 C51与汇编程序的接口 4 4 2020 2 14 2 4 1C51对标准C的扩展 4 1 1C51的数据类型 数据是计算机操作的对象 包含常量和变量 C51扩展了ANSIC 以适应单片机的结构和特点 数据类型就是数据的格式 它决定数据的值域范围 占用存储单元的个数及能参与哪种运算 编写C51程序 先要确定数据类型 储存分区应尽可能采用无符号格式 unsigned C51中 多字节数据采用 大端对齐 格式 数据起始字节置于高地址端 2020 2 14 3 C51数据类型表 2020 2 14 4 bit定义位变量名字 编译器在位寻址区自动分配该位变量 Sbit声明位变量的名字和地址 地址是确定的 SFR区确定位 位寻址区变量的某确定位 几点说明 unsignedcharbdataibase sbitmybitf ibase 0 sbitCY 0 xD7 bitflag1 0 含义 赋值 含义 声明 2020 2 14 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 2 14 7 编译模式默认的变量存储分区 4 1 3C51的编译模式 未对变量存储分区定义时 C51编译器采用默认存储分区 例如 charvar SMALL模式时 var定位于data存储区 COMPACT模式时 var定位于pdata存储区 LARGE模式时 var定位于xdata存储区 2020 2 14 9 4 1 4用 at 定义变量绝对地址 用关键字 at 定义变量存放的首地址 idatainty at 0 x30 idata区域整型变量y的首地址为0 x30 例如 又如 xdatacharstring 20 at 0 x3000 xdata中字符型数组string的首地址为0 x3000 注意 C51编程时不要轻易使用绝对地址定位变量 2020 2 14 10 4 2C51的指针 对于一个变量a 利用 a表示变量a的地址 则语句p a 表明把a的地址赋给了指针变量p 则 p指向了变量a 可以用 P表示变量a 指针变量的定义char p 定义指针变量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 2 14 12 定义时未指定所指向的数据的存储分区 也称通用指针 4 2 2未定义数据存储分区的指针 通用指针 通用指针占3个字节第一字节存放该指针的默认存储器类型编码 见表 第二字节存放该指针的高位地址偏移量第三字节存放该指针的低位地址偏移量 存储器类型编码 2020 2 14 13 通用指针定义示例 char xdatastrptr 指针本身存于xdata空间 它指向char型数据int datanumber 指针本身存于data空间 它指向int型数据 由于指向对象的存储空间在编译时无法确定 运行时确定 因此必须生成通用代码以保证对任意空间的对象进行存取 所以通用指针生成的代码速度较慢 指针 char型数据 指针分区 2020 2 14 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 或 DBYTE 0 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 DBYTE 0 x30 i 0 x55 while 1 编译系统自动连接了startup a51生成代码一是将内部RAM的00H 7FH清0 二是设置堆栈指针SP 有全局变量赋值时编译系统会自动连接init a51生成代码 C 0 x0000020011LJMPC 0011C 0 x0003E4CLRAC 0 x0004FFMOVR7 AC 0 x00057430MOVA 0 x30C 0 x00072FADDA R7C 0 x0008F8MOVR0 AC 0 x00097655MOV R0 0 x55C 0 x000B0FINCR7C 0 x000CBF10F6CJNER7 0 x10 C 0005C 0 x000F80FESJMPC 000FC 0 x0011787FMOVR0 0 x7FC 0 x0013E4CLRAC 0 x0014F6MOV R0 AC 0 x0015D8FDDJNZR0 C 0014C 0 x0017758107MOVSP 0 x07C 0 x001A020003LJMPC 0003 反汇编如下 编译系统自动连接了startup a51生成代码一是将内部RAM的00H 7FH清0 二是设置堆栈指针SP 另 全局变量赋值时编译系统会自动连接init a51生成代码 2020 2 14 19 4 3C51的函数 4 3 1C51函数的定义 一般形式 返回值类型函数名 形式参数列表 编译模式 reentrant interruptn usingn 函数体 编译模式为SMALL COPACT或LARGEreentrant用于定义可重入函数interruptn用于定义中断函数 n为中断号 可以为0 31usingn确定工作寄存器组 取值为0 3 例4 2 延时nMs函数示例 晶振11 0592MHz voidDelayMs unsignedintn 延时函数 unsignedcharj while n for j 0 j 113 j 调试 Registers窗口中的sec值 4 3 2C51函数定义的选项 编译模式 SMALL模式 变量默认在片内RAM COMPACT模式 变量默认在片外RAM的页内 LARGE模式 变量默认在片外RAM的64KB范围 reentrant定义为重入函数 ANSIC中 函数默认都是可重入的C51函数默认是不可重入的 使用可重入函数会消耗较多的存储器资源 应该尽量少用 interruptn定义中断函数 常用的中断源对应的中断号 usingn确定中断服务函数所使用的工作寄存器组 例4 3 中断函数定义示例 includesbitP10 P1 0 voidIntSrv void interrupt0 if 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 HelloWorld n while 1 标准I O的重定向 在调试状态 ViewSerialWindowsUART 1 4 4C51与汇编程序的接口 4 4 1在C51程序中嵌入汇编指令 例4 6 利用预编译指令 include reg51 h voidInit void voidmain while 1 Init voidInit void pragmaasmMOVR7 16MOVR1 20HMOVA 55HLP MOV R1 AINCR1DJNZR7 LP pragmaendasmreturn 要进行以下设置 2020 2 14 27 将嵌有汇编语句的源文件加入工程文件 将鼠标指向该文件 选择右键菜单 optionfor insertasm c 将属性properties书签下的 GenerateAssemblerSRCFile 与 AssembleSRCFile 选项置成 再加入库文件 如C51S LIB 然后编译 4 4 2在C51程序中调用汇编子程序 例4 7 不含参数传递的子程序调用 先构造汇编语言源文件 d1ms MOVR6 249 DL NOP 1 sNOP 1 sDJNZR6 DL 2 s 循环内约1msRETEND PR d1ms EP4 7BSEGMENTCODEPUBLICd1msRSEG PR d1ms EP4 7B 注 d1ms对应C51的d1ms EP4 7B对应ep4 7b asm 编写C51语言程序如下 完成汇编子程序调用 includesbitP2 0 P2 0 externvoidd1ms void voidmain for P2 0 0 d1ms 调用汇编子程序 P2
温馨提示
- 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年酒店餐饮部早餐服务外包合同范本
- 病历书写基本规范-课件
- 华住酒店集团讲义
- 送货不达应急预案
- 牙体牙髓病治疗常用器械及其使用-课件
- 机动车维修竣工出厂合格证样式
- 广东省地质灾害危险性评估报告
- GB/T 32486-2016舞台LED灯具通用技术要求
- 锚杆工程隐蔽验收记录
- 整套教学课件《现代心理与教育统计学》研究生
- 油漆安全技术说明书(MSDS)
- RBA(原EICC)ERT应急准备与响应培训课件
评论
0/150
提交评论