




已阅读5页,还剩58页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 1 补充一 单片机混合编程 1 汇编中调用C51程序 单片机C语言和汇编语言混合编程分为汇编中调用C51函数和C51程序中引用汇编在C51程序中使用汇编语言有两种情况 C51程序调用汇编程序模块的变量和函数和嵌入式汇编 在汇编程序中可以访问C51程序中的变量和函数 1 汇编中调用C51的变量 普通变量 变量名数组 数组名 偏移量 用 XX可以访问C语言程序中定义的变量XX 用 XX 3可以访问数组中的XX 3 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 2 2 对于函数 如在C51程序中定义了没有参数的函数fun1 则在汇编程序中用子程序调用指令调用fun1即可 如定义了有参数的函数fun2 则在汇编程序中调用时 子程序名用成 fun2 注意 为了能够让汇编语言访问到C语言中定义的变量和函数 在C程序中它们必须声明为外部变量 即加extern前缀 函数没有参数 函数名函数有参数 函数名 调用函数前要准备好参数 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 3 2 在C51中嵌入汇编程序 通过C51中的预处理指令 pragmaasm endasm语句来实现的 其格式如下 pragmaASM 汇编程序代码 pragmaENDASM 3 在C51中调用汇编程序 这种方法应用较多 C模块与汇编模块的接口较简单 分别用C51与A51对源程序进行编译 然后用L51将obj文件连接即可 关键问题在于C函数与汇编函数之间的参数传递和得到正确的返回值 以保证模块间的数据交换 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 4 混合汇编的参数传递与实现 混合汇编的参数传递 1 汇编程序调用C51函数的参数传递 如C51函数有参数 则汇编程序在调用C51函数前要准备好参数 在汇编程序中 C51函数最左边的一个参数由寄存器A传递 其他的参数按顺序通过堆栈给出 C51函数的返回值是返回到A寄存器或者由A寄存器给出的地址 2 在C51中嵌入汇编程序的参数传递 通过变量或特殊功能寄存器来实现 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 5 3 在C51中调用汇编程序的参数传递 难点 C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值的相关约定 C51中调用汇编程序进行参数传递的方式有两种 一种是通过寄存器传递参数 第二种是通过固定存储区传递 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 6 1 通过寄存器传递参数 最多可通过51单片机的工作寄存器传递3个参数 余下的通过固定存储区传递 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 7 2 通过固定存储区传递 用固定存储区传递参数给汇编程序 参数段首地址用段名 function name BYTE和 function name BIT保存 function name为函数的名称 其中 function name BIT保存位参数段首地址 function name BYTE保存别的参数段首地址 即使通过寄存器传递参数 参数也将在这些段中分配空间 并按声明的先后在每个段中顺序保存 3 函数返回值 函数返回值通常用寄存器传递 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 8 混合汇编的实现 1 C51中嵌入汇编程序的实现方法 includevoidmain void P2 1 pragmaasmMOVR7 10DEL MOVR6 20DJNZR6 DJNZR7 DEL pragmaendasmP2 0 第一步 在C文件中以如下方式嵌入汇编程序 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 9 第二步 在KeilC51软件的Project窗口右击嵌入汇编程序的C文件 在弹出的快捷菜单中选择Optionsfor 命令 选中右边的GenerateAssemblerSRCFile和AssembleSRCFile复选框 使检查框由灰色变成黑色 有效 状态 第三步 根据选择的编译模式 把相应的库文件 如Small模式时 是Keil C51 Lib C51S Lib 加入到工程中 该文件必须作为工程的最后文件 第四步 编译 即可生成目标代码 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 10 2 C51中调用汇编程序的实现方法 第一步 先用C语言程序编写出程序框架 如文件名为a1 c 注意参数 第二步 在KeilC51的Project窗口中右击该C语言文件 在弹出的快捷菜单中选择Optionsfor 右边的GenerateAssemblerSRCFile和AssembleSRCFile 使检查框由灰色变成黑色 有效 状态 第三步 根据选择的编译模式 把相应的库文件 如Small模式时 是Keil C51 Lib C51S Lib 加入工程中 该文件必须作为工程的最后文件 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 11 第四步 编译后将会产生一个SRC的文件 将这个文件扩展名改为ASM 这样就形成了可供C51程序调用的汇编程序 随后可在该文件的代码段中加入所需的指令代码 第五步 将该汇编程序与调用它的主程序一起加到工程文件中 这时工程文件中不再需要原来的C语言文件和库文件 主程序只需要在程序开始处用EXTERN对所调用的汇编程序中的函数作声明 在主程序中就可调用汇编程序中的函数了 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 12 reg51 h和reg52 h 实质上是没有区别的 都是一些特殊功能寄存器的申明sfrP0 0 x80 sfrP1 0 x90 sfrP2 0 xA0 sfrP3 0 xB0 sfrPSW 0 xD0 sfrACC 0 xE0 sfrB 0 xF0 补充二 头文件说明 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 13 absacc h 可使用其中定义的宏来访问绝对地址 包括 CBYTE XBYTE PWORD DBYTE CWORD XWORD PBYTE DWORD 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 14 ASSERT h ASSERT H定义assert调试宏 表达式结果正确性测试并可使程序中止 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 15 CTYPE h 包含有关字符分类及转换的各类信息如 ftolower ftoupperisalnumisalphaisasciiiscntrlisdigitisgraphislowerisprintispunctisspaceisupperisxdigittoasciitolowertoupper 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 16 ERRNO h 头文件errno h定义了一个全局的宏errno 它被展开为一个int类型的 左值 这意味着宏errno不一定是个对象的标识符 也可以展开为一个由函数返回的可以修改的 左值 比如int errno 简单来说 errno h只是为了提供了一种错误报告机制 比如 一个函数调用fopen 发生了错误 它可能就会去修改errno的值 这样外部的代码可以通过判断errno的值来区分fopen 内部执行时是否发生错误 并根据errno值的不同来确定具体的错误类型 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 17 FLOAT h 包含有关浮点运算的一些参数和函数 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 18 其他头文件 LIMIT H包含各环境参数 编译时间限制 数的范围等信息 MATH H说明数学运算函数 还定了HUGEVAL宏 说明了matherr和matherr子程序用到的特殊结构 SETJMP H定义longjmp和setjmp函数用到的jmpbuf类型 说明这两个函数 STDARG H定义读函数参数表的宏 如vprintf vscarf函数 STDDEF H定义一些公共数据类型和宏 STDIO H定义Kernighan和Ritchie在UnixSystemV中定义的标准和扩展的类型和宏 还定义标准I O预定义流 stdin stdout和stderr 说明I O流子程序 STDLIB H说明一些常用的子程序 转换子程序 搜索 排序子程序等 STRING H说明一些串操作和内存操作函数 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 19 inlude stdio h 与 inlude 双引号表示先在程序源文件所在目录查找 如果未找到则去系统默认目录查找 通常用于包含程序作者编写的头文件 尖括号表示只在系统默认目录或者括号内的路径查找 通常用于包含系统中自带的头文件有一个叫做math h的头文件 而你的源代码目录里也有一个你自己写的math h头文件 那么使用尖括号时用的就是系统里的 而使用双引号的话则会使用你自己写的那个 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 20 void void的字面意思是 无类型 void 则为 无类型指针 void 可以指向任何类型的数据 规则一如果函数没有返回值 那么应声明为void类型 凡不加返回值类型限定的函数 就会被编译器作为返回整型值处理 规则二如果函数无参数 那么应声明其参数为voidintfunction void return1 规则三小心使用void指针类型规则四如果函数的参数可以是任意类型指针 那么应声明其参数为void 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 21 规则五void不能代表一个真实的变量voida 错误function voida 错误 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 22 volatile 本意是 易变的 volatile定义的变量它的值在编译时是会改变的 跟const相反 而const定义的变量一直不会变的 用volatile声明的类型变量表示可以被某些编译器未知的因素更改 比如 操作系统 硬件或者其它线程等 遇到这个关键字声明的变量 编译器对访问该变量的代码就不再进行优化 从而可以提供对特殊地址的稳定访问 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 23 补充三 51汇编延时子程序说明 以12MHZ晶振为例 详细讲解MCS 51单片机中汇编程序延时的精确算法 指令周期 机器周期与时钟周期指令周期 CPU执行一条指令所需要的时间称为指令周期 它是以机器周期为单位的 指令不同 所需的机器周期也不同 时钟周期 也称为振荡周期 一个时钟周期 晶振的倒数 51单片机的一个机器周期 6个状态周期 12个时钟周期 51单片机的指令有单字节 双字节和三字节的 它们的指令周期不尽相同 一个单周期指令包含一个机器周期 即12个时钟周期 所以一条单周期指令被执行所占时间为12 1 12000000 1 s 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 24 程序分析 例150ms延时子程序 DEL MOVR7 200 DEL1 MOVR6 125 DEL2 DJNZR6 DEL2 DJNZR7 DEL1 RET 精确延时时间为 1 1 200 2 125 200 2 200 2 2 125 3 200 3 50603 s 50ms 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 25 计算过程 由 整理出公式 只限上述写法 延时时间 2 内循环 3 外循环 3 详解 DEL这个子程序共有五条指令 现在分别就每一条指令被执行的次数和所耗时间进行分析 第一句 MOVR7 200在整个子程序中只被执行一次 且为单周期指令 所以耗时1 s第二句 MOVR6 125从 看到 只要R7 1不为0 就会返回到这句 共执行了R7次 共耗时200 s第三句 DJNZR6 DEL2只要R6 1不为0 就反复执行此句 内循环R6次 又受外循环R7控制 所以共执行R6 R7次 因是双周期指令 所以耗时2 R6 R7 s 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 26 例21秒延时子程序 DEL MOVR7 10 DEL1 MOVR6 200 DEL2 MOVR5 248 DJNZR5 DJNZR6 DEL2 DJNZR7 DEL1 RET 对每条指令进行计算得出精确延时时间为 1 1 10 1 200 10 2 248 200 10 2 200 10 2 10 2 2 248 3 200 3 10 3 998033 s 1s 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 27 计算过程 由 整理得 延时时间 2 第一层循环 3 第二层循环 3 第三层循环 3 此式适用三层循环以内的程序 也验证了例1中式 第三层循环相当于1 的成立 注意 要实现较长时间的延时 一般采用多重循环 有时会在程式序里加入NOP指令 这时公式 不再适用 下面举例分析 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 28 例3仍以1秒延时为例 DEL MOVR7 101指令周期1DEL1 MOVR6 0FFH1指令周期10DEL2 MOVR5 80H1指令周期255 10 2550KONG NOP1指令周期128 255 10 326400DJNZR5 2指令周期2 128 255 10 652800DJNZR6 DEL22指令周期2 255 10 5100DJNZR7 DEL12指令周期2 10 20RET2延时时间 1 10 2550 326400 652800 5100 20 2 986883 s约为1s 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 29 过程 整理得 延时时间 3 第一层循环 3 第二层循环 3 第三层循环 3 结论 针对初学者的困惑 对汇编程序的延时算法进行了分步讲解 并就几种不同写法分别总结出相应的计算公式 只要仔细阅读例1中的详解 并用例2 例3来加深理解 一定会掌握各种类型程序的算法并加以运用 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 30 单片机的C语言编程 补充四 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 31 51系列单片机支持三种高级语言 即PL M C和BASIC 8052单片机内固化有解释BASIC语言 BASIC语言适用于简单编程而对编程效率运行速度要求不高的场合 PL M是一种结构化的语言 很象PASCAL PL M编译器好象汇编器一样产生紧凑的机器代码 可以说是高级汇编语言 但它不支持复杂的算术运算 无丰富库函数支持 学习PL M无异于学习一种新的语言 C语言是一种通用的程序设计语言 其代码率高 数据类型及运算符丰富 并具有良好的程序结构 适用于各种应用的程序设计 是目前使用较广的单片机编程语言 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 32 单片机的C语言采用C51编译器 简称C51 由C51产生的目标代码短 运行速度高 所需存储空间小 符合C语言的ANSI标准 生成的代码遵循Intel目标文件格式 而且可与A51汇编语言或PL M51语言目标代码混和使用 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 33 应用C51编程具有以下优点 1 C51管理内部寄存器和存贮器的分配 编程时 无需考虑不同存储器的寻址和数据类型等细节问题 程序由若干函数组成 具有良好的模块化结构 有丰富的子程序库可直接引用 从而大大减少用户编程的工作量 C语言和汇编语言可以交叉使用 汇编语言程序代码短 运行速度快 但复杂运算编程耗时 如果用汇编语言编写与硬件有关的部分程序 用C语言编写与硬件无关的运算部分程序 充分发挥两种语言的长处 可以提高开发效率 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 34 C51程序结构 同标准C一样 C51的程序由一个个函数组成 这里的函数和其他语言的 子程序 或 过程 具有相同的意义 其中必须有一个主函数main 程序的执行从main 函数开始 调用其他函数后返回主函数main 最后在主函数中结束整个程序而不管函数的排列顺序如何 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 35 C语言程序的组成结构如下所示 全局变量说明 可被各函数引用 main 主函数 局部变量说明 只在本函数引用 执行语句 包括函数调用语句 fun1 形式参数表 函数1 形式参数说明 局部变量说明执行语句 包括调用其他函数语句 funn 形式参数表 函数n 形式参数说明 局部变量说明执行语句 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 36 C语言的语句规则 1 每个变量必须先说明后引用 变量名英文大小写是有差别的 2 C语言程序一行可以书写多条语句 但每个语句必须以 结尾 一个语句也可以多行书写为好 3 C语言的注释用 表示 4 花括号必须成对 位置随意 可在紧挨函数名后 也可另起一行 多个花括号可以同行书写 也可逐行书写 为层次分明 增加可读性 同一层的 花括号对齐 采用逐层缩进方式书写 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 37 C51的数据类型 C51的数据有常量和变量之分 常量 在程序运行中其值不变的量 可以为字符 十进制数或十六进制数 用0 x表示 常量分为数值型常量和符号型常量 如果是符号型常量 需用宏定义指令 define 对其进行定义 相当于汇编的 EQU 伪指令 如 definePI3 1415那么程序中只要出现PI的地方 编译程序都译为3 1415 变量 在程序运行中其值可以改变的量 一个变量由变量名和变量值构成 变量名即是存贮单元地址的符号表示 而变量的值就是该单元存放的内容 定义一个变量 编译系统就会自动为它安排一个存贮单元 具体的地址值用户不必在意 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 38 C51变量的数据类型 无论哪种数据都是存放在存贮单元中的 每一个数据究竟要占用几个单元 即数据的长度 都要提供给编译系统 正如汇编语言中存放数据的单元要用DB或DW伪指令进行定义一样 编译系统以此为根据预留存贮单元 这就是定义数据类型的意义 C51编译器支持数据类型见表10 1 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 39 表10 1C51的数据类型 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 40 对表10 1作如下说明 1 字符型 char 整型 int 和长整型 long 均有符号型 signed 和无符号型 unsigned 两种 如果不是必须 尽可能选择unsigned型 这将会使编译器省却符号位的检测 使生成的程序代码比signed类型短得多 2 程序编译时 C51编译器会自动进行类型转换 例如将一个位变量赋值给一个整型变量时 位型值自动转换为整型值 当运算符两边为不同类型的数据时 编译器先将低级的数据类型转换为较高级的数据类型 运算后 运算结果为高级数据类型 3 51单片机内部数据存贮器的可寻址位 20H 2FH 定义为bit型 而特殊功能寄存器的可寻址位 即地址为X0H和X8H的SFR的各位 只能定义为sbit类型 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 41 关于指针型数据 1 关于指针型变量在汇编语言程序中 要取存贮单元m的内容可用直接寻址方式 也可用寄存器间接寻址方式 如果用R1寄存器指示m的地址 用 R1取m单元的内容 相对应的在C语言中用变量名表示取变量的值 相当于直接寻址 也可用另一个变量 如P 存放m的地址 P就相当于R1寄存器 用 P取得m单元的内容 相当于汇编的间接寻址方式 这里P即为指针型变量 下面表格表示两种语言将m单元的内容送n单元的对照语句 注 上表省略了汇编语言程序中对符号地址n和m用EQU伪指令进行具体地址定义的语句以及C语言对变量n m和指针变量P进行类型定义的语句 实际程序设计中 此步是不可缺少的 表中 为取地址运算符 为取内容运算符 表1O 2汇编语言和C语言的对照 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 42 2 指针型数据的类型由于C51是结合51单片机硬件的 51单片机的不同存贮空间 有不同的地址范围 即使对于同一外部数据存贮器 又有用 Ri分页寻址 Ri为八位 和用 DPTR寻址 DPTR为十六位 两种寻址方式 而指针本身也是一个变量 有它存放的存贮区和数据长度 因此 在指针类型的定义中要说明 被指的变量的数据类型和存贮类型 指针变量本身的数据类型 占几个字节 和存贮类型 即指针本身存放在什么存贮区 例如类型定义为data或idata 表示指针指示内部数据存贮器 而pdata表示指针指向外部数据存贮器 用 Ri间址 以上均为八位地址 而类型code xdata表示指针指向外部程序存贮器或外部数据存贮器指针 本身 即被指示地址 应为十六位长度 如果想使指针能适用于指向任何存贮空间 则可以定义指针为通用型 此时指针长度为3字节 第一字节表示存贮器类型编码 第二 三字节分别表示所指地址的高位和低位 第一字节表示的存贮器类型编码见表10 3 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 43 表10 3通用型指针的存贮类型编码 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 44 数据的存贮类型和存贮模式 数据的存贮类型C51是面向8XX51系列单片机及硬件控制系统的开发语言 它定义的任何变量必须以一定的存贮类型的方式定位在8XX51的某一存贮区中 否则便没有意义 因此在定义变量类型时 还必须定义它的存贮类型 C51的变量的存贮类型如表10 4所示 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 45 表10 4C51的变量的存贮类型 访问内部数据存贮器 idata 比访问外部数据存贮器 xdata 相对要快一些 因此 可将经常使用的变量置于内部数据存贮器中 而将较大及很少使用的数据变量置于外部数据存贮器中 例如定义变量x语句 datacharx 等价于chardatax 如果用户不对变量的存贮类型定义 则编译器承认默认存贮类型 默认的存贮类型由编译控制命令的存贮的模式部分决定 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 46 存贮器模式 存贮器模式决定了变量的默认存贮器类型 参数传递区和无明确存贮区类型的说明 C51的存贮器模式有SMALL LARGE和COMPACT 见表10 5 在固定的存贮器地址进行变量参数传递是C51的一个标准特征 在SMALL模式下参数传递是在内部数据存贮区中完成的 LARGE和COMPACT模式允许参数在外部存贮器中传递 C51同时也支持混合模式 例如在LARGE模式下生成的程序可将一些函数分页放入SMALL模式中从而加快执行速度 例如设C语言源程序为PROR C 若使程序中的变量类型和参数传递区限定在外部数据存贮区 有两种方法 方法1 用C51对PROR C进行编译时 使用命令C51PROR CCOMPACT 方法2 在程序的第一句加预处理命令 pragmacompact 表10 5存贮器模式 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 47 变量说明举例 datacharvar 字符变量var定位在片内数据存贮区 charcodeMSG PARAMETER 字符数组MSG 定位在程序存贮区 unsignedlongxdataarray 100 无符号长型数组定位在片外RAM区 每元素占4bytes floatidatax y z 实型变量x y z 定位在片内用间址访问的内部RAM区 bitlock 位变量Lock定位在片内RAM可位寻址区 unsignedintpdatasion 无符号整型变量sion定位在分页的外部RAM unsignedcharxdatavector 10 4 4 无符号字符型三维数组 定位在片外RAM区 sfrP0 0 x80 定义P0口 地址为80H charbdataflags 字符变量flags定位在可位寻址内部RAM区 sbitflag0 flags 0 定义flag0为flags 0 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 48 如果在变量说明时略去存贮器类型标志符 编译器会自动选择默认的存贮器类型 默认的存贮器类型由控制指令SMALL COMPACT和LARGE限制 例如如果声明charvar 则默认的存贮器模式为SMALL var放在data存贮区 如果使用COMPACT模式 var放入idata存贮区 在使用LARGE模式的情况下 var被放入外部数据存贮区 xdata存贮区 指针变量说明举例longxdata px 指针px指向long型xdata区 每个数据占四个单元 指针自身在默认存贮器 如不指定编译模式在data区 指针长度为2个字节 charxdata datapd 指针pd指向字符型xdata区 自身在data区 长度2字节 datacharxdata pd 与上例等效 dataint pn 和int datapn及intr pn等效 定义一个类型为int型的通用型指针 指针自身在data区长度为3字节 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 49 在上例的指针声明中包含如下几个内容 1 1 指针变量名 如px 前面冠以 表示px为指针型变量 此处 不带取内容之意 2 指针指向的存贮类型 即指向哪个存贮区 它决定了指针本身的长度 见表10 1 存贮类型声明的位置在数据类型和指针名 如 px 之间 如无次项声明 则此指针型变量为通用型 3 3 指针指向的存贮区的数据类型 即被指向的存贮区以多少个单元作一个数据单位 当程序通过指针对该区操作时 将按此规定的单元个数的内容作为一个数据操作 4 指针变量自身的存贮类型 即指针处于什么区与自身的长度无关 该声明可位于声明语句的开头 也可在 和变量名之间 此项由编译模式放在默认区 如无规定编译模式 通常在data区 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 50 C51对SFR 可寻址位 存储器和I O口的定义 特殊功能寄存器SFR定义C51提供了一种自主形式的定义方式 使用特定关键字sfr如sfrSCON 0 x98 串行通信控制寄存器地址98H sfrTMOD 0 x89 定时器模式控制寄存器地址89H sfrACC 0 xe0 A累加器地址E0H sfrP1 0 x90 P1端口地址90H 定义了以后 程序中就可以直接引用寄存器名 C51也建立了一个头文件reg51 h 增强型为reg52 h 在该文件中对所有的特殊功能寄存器的进行了sfr定义 对特殊功能寄存器的有位名称的可寻址位进行了sbit定义 因此 只要用包含语句 include 就可以直接引用特殊功能寄存器名 或直接引用位名称 要特别注意 在引用时特殊功能寄存器或者位名称必须大写 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 51 对位变量的定义 C51对位变量的定义有三种方法 1 将变量用bit类型的定义符定义为bit类型 如bitmn mn为位变量 其值只能是 0 或 1 其位地址C51自行安排在可位寻址区的bdata区 2 采用字节寻址变量 位的方法 如bdataintibase ibase定义为整型变量 sbitmybit ibase 15 mybit定义为ibase的D15位 这里位是运算符 相当于汇编中的 其后的最大取值依赖于该位所在的字节寻址变量的定义类型 如定义为char最大值只能为7 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 52 3 对特殊功能寄存器的位的定义方法1 使用头文件及sbit定义符 多用于无位名的可寻址位 例如 includesbitP1 1 P1 1 P1 1为P1口的第1位 sbitac ACC 7 ac定义为累加器A的第7位 方法2 使用头文件reg51 h 再直接用位名称 例如 includeRS1 1 RS0 0 方法3 用字节地址位表示例如sbitOV 0 xD0 2 方法4 用寄存器名 位定义例如sfrPSW 0 xd0 定义PSW地址为d0H sbitCY PSW 7 CY为PSW 7 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 53 C51对存贮器和外接I O口的绝对地址访问 1 对存贮器的绝对地址访问利用绝对地址访问的头文件absacc h可对不同的存贮区进行访问 该头文件的函数有 CBYTE 访问code区字符型 DBYTE 访问data区字符型 PBYTE 访问pdata或I O区字符型 XBYTE 访问xdata或I O区字符型 还有CWORD DWORD PWORD和XWORD四个函数 它们的访问区域同上 只是访问的类型为int型 例 include definecomXBYTE 0 x07ff 那么后面程序com变量出现的地方 就是对地址为07ffH的外部RAM或I O口进行访问 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 54 例2XWORD 0 0 x9988 即将9988H int类型 送入外部RAM的0号和1号单元 使用中要注意 absacc h一定要包含进程序 XBYTE必须大写 2 对外部I O口的访问由于单片机的I O口和外部RAM统一编址 因此对I O口地址的访问可用XBYTE MOVX DPTR 或PBYTE MOVX Ri 进行 例3XBYTE 0Xefff 0 x10 将10H输出到地址为EFFFH端口 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 55 C51的运算符 1 赋值运算符 将 的右边的值赋值给左边的变量 2 C51的算术运算符 加或正号 减或负号 乘号 除号 求余 优先级为 先乘除 后加减 先括号内 再括号外3 C51的关系运算符有六种 小于 大于 小于等于 大于等于 相等 不相等 优先级 前四个高 后二个 和 级别低 2020年1月26日星期日9时27分25秒 西南大学电子信息工程学院liudongz2003 56 4 C51的逻辑运算符有三种 逻辑表达式和关系表达式的值相同 以0代表假 以1代表真 以上三种运算的优先级见图10 1 5 C51的按位操作的运算符有六种 按位与 按位或 按位异或 位取反 位右移 注 补零移位 例1 a 0 xf0H 表达式a a值为0FH例2 a 0 xea 表达式a 2值为A8H 即a值左移两位 移位后空白位补0 6 自增 自减运算符 i i 在使用i之前 先使i值加1 减1 i i 在使用i之后 再使i值加1 减1 例设i原值为5j i则j值为6 i值也为6j i 则j值为5 i值为6 非 算术运算 关系运算 和 赋值运算 图10 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB61T 800-2014 玉米 金丹3号规范
- 借名按揭合同(标准版)
- 抵押车贷合同(标准版)
- 水库水位监测与预警方案
- 碎石加工厂废料与副产品处理方案
- 装修工程竣工验收方案
- 2026大参林医药集团股份有限公司校园招聘备考练习题库及答案解析
- 成都市和平街小学2025年公开招聘员额教师(2人)备考练习试题及答案解析
- 城乡供水工程施工进度控制方案
- 2025年度齐齐哈尔市铁锋区公开招聘合同制专职消防战斗员、驾驶员20人考试参考试题及答案解析
- 2025年机关事务管理局招聘考试大纲
- 主城区积水易涝点排水防涝管网更新改造工程可行性分析报告(参考模板)
- 早期现代舞课件
- 碳固持效应研究-洞察及研究
- 口腔医保政策解读
- 2024浙江艺术职业学院单招《数学》模拟题库附答案详解(精练)
- 油菜病虫害防治课件
- 小学一年级体育上册教案表格式
- 基于主题语境的高中英语以读促写教学设计研究
- 2025年海南省高考物理试卷(含答案解析)
- GB/T 45817-2025消费品质量分级陶瓷砖
评论
0/150
提交评论