




已阅读5页,还剩63页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章共六节 主要介绍 0 2C51的数据类型与运算 0 1单片机的C语言 0 3C51流程控制语句 0 4C51的指针类型 0 5C51的函数 0 6C51编程实例 0 1 1C51程序开发概述 一 采用C51的优点 编译器能自动完成变量的存储单元的分配 编程者可以专注于应用软件的设计 可以对常用的接口芯片编制通用的驱动函数 对常用的功能模块和算法编制相应的函数 可以方便地进行信号处理算法和程序的移植 从而加快单片机应用系统的开发速度 当代码长度超过4KB以上时 C51比汇编语言更具有明显的优势 0 1单片机的C语言 二 C51程序开发过程 0 1 2C51程序结构 预处理命令全局变量说明 函数1说明 函数n说明 main 局部变量说明 执行语句 函数调用 实际参数表 函数1 形式参数说明 局部变量说明 执行语句 函数调用 实际参数表 函数n 形式参数说明 局部变量说明 执行语句 函数调用 实际参数表 KeilCx51扩展关键字 0 2C51的数据类型与运算 0 2 1C51的数据类型 说明 Float 浮点型 Sfr 可以定义8051单片机的所有内部8位特殊功能寄存器 Sfr16 可以定义8051单片机内部16位特殊功能寄存器 bit 可以定义位量 sbit 可以定义8051内部RAM中的可寻址位或特殊功能寄存器中的可寻址位 常量与变量 常量 整型常量 1234 5678 0 x1a 345L浮点型常量 2 3465 123e4字符型常量 a b 字符串型常量 1a2b3c 常量定义 defineconst60 变量 格式 存储种类 数据类型 存储器类型 变量名表 AutoStaticExternRegister DataBDataIDataPDataXDataCode UnsignedCharSignedCharUnsignedIntSignedintUnsignedlongSignedlongFloatBitSfrSfr16sbit 0 2 2C51的数据的存储器类型 应用程序中使用的任何数据 变量和常量 必须以一定的存储器类型定位于单片机的相应的存储区域中 访问片内RAM比访问片外RAM的速度要快得多 所以对于经常使用的变量应该置于片内RAM中 即用bdata data idata来定义 对于不经常使用的变量或规模较大的变量应该置于片外RAM中 即用pdata xdata来定义 例如 bitbdataflags 位变量flags定位在片内RAM的位寻址区 chardatavar 字符变量var定位在片内RAM区 floatidatax y z 实型变量x y z定位在片内间址RAM区 sfrP1 0 x90 定义P1口地址为90H 如果用户不对变量的存储器类型进行定义 C51编译器采用默认的存储器类型 默认的存储器类型由编译控制命令中的存储模式指令限制 例如 charvar 在SMALL模式时 var定位data存储区 在COMPACT模式时 var定位pdata存储区 在LARGE模式时 var定位xdata存储区 0 2 380C51硬件结构的C51定义 一 特殊功能寄存器的定义80C51单片机内部有21个特殊功能寄存器 为了对它们能够进行直接访问 C51编译器利用扩充的关键字sfr和sfr16对这些特殊功能寄存器进行定义 sfr的定义方法为 sfr特殊功能寄存器名 地址常数 例如 sfrSCON 0 x90 定义串行口控制寄存器 地址为0 x90 sfrP0 0 x80 定义P0口 地址为0 x80 sfr16T2 0 xCC 定义80C52的T2L地址为0 xCC T2H地址为0 xCD 二 特殊功能寄存器中特定位的定义在C51中利用关键字sbit定义可独立寻址访问的位变量 如定义80C51单片机SFR中的一些特定位 定义方法分别为 1 sbit位变量名 特殊功能寄存器名 位的位置 0 7 如 sfrPSW 0 xD0 定义PSW寄存器地址为0 xD0 sbitOV PSW 2 定义OV位为PSW 2 地址为0 xD2 sbitCY PSW 7 定义CY位为PSW 7 地址为0 xD7 2 sbit位变量名 字节地址 位的位置 0 7 如 sbitOV 0 xD0 2 定义OV位地址为0 xD2 sbitCY 0 xD0 7 定义CY位地址为0 xD7 注 字节地址作为基地址 必须位于0 x80 0 xFF之间 3 sbit位变量名 位地址 如 sbitOV 0 xD2 定义OV位地址为0 xD2 sbitCY 0 xD7 定义CY位地址为0 xD7 注 位地址必须位于0 x80 0 xFF之间 三 内部RAM中可位寻址对象的定义当位对象位于80C51单片机内部RAM的20H 2FH单元时 可以利用C51编译器提供的bdata存储器类型进行访问 带有bdata类型的变量可以进行字或字节寻址 用sbit指定bdata变量的相应位后就可以进行位寻址 例如 先定义变量的数据类型和存储类型为 intbdataibase 在位寻址区定义一个整形变量ibase charbdataarray 4 在位寻址区定义一个字符数组array 4 然后 利用sbit定义可独立寻址访问的对象位 sbitmybit0 ibase 0 mybit0定义为ibase的第0位 sbitmybit15 ibase 15 mybit15定义为ibase的第15位 sbitary07 array 0 7 ary07定义为ary 0 的第7位 sbitary37 array 3 7 ary37定义为ary 3 的第7位 访问示例 ibase 1 字寻址 array 2 a 字节寻址 ary07 0 位寻址 用关键字bit定义普通位变量时C51编译器会自行安排该位变量于可位寻址的bdata区 例如 bitmybit 应注意的是 不能定义bit类型指针 也不能定义bit类型数组 一 算术运算符和算术表达式1 基本算术运算符 加法运算符 减法 取负 运算符 乘法运算符 除法运算符 取余 模 运算符 0 2 4C51的运算符和表达式 在这些运算符中 加 减和乘法符合一般的算术运算规则 除法运算时 如果是两个整数相除 其结果为整数 舍去小数部分 如果是两个浮点数相除 其结果为浮点数 而对于取余运算 则要求两个运算对象均为整型数据 求一个算术运算表达式的值时 要依运算符的优先级进行 算术运算符中取负运算优先级最高 其次为乘法 除法和取余 加法和减法优先级最低 也可以根据需要 在算术表达式中采用括号来改变运算符的优先级 2 自增 自减运算符 自增运算符 自减运算符 和 运算符只能用于变量 不能用于常量和表达式 如 j表示先加1 再取值 j 表示先取值 再加1 自减运算类同 3 类型转换运算符两侧的数据类型不同时 要转换成同种类型 转换方式有两种情况 一是自动转换 是指编译器在编译时自动进行的类型转换 顺序为 bit char int long float signed unsigned 二是强制类型转换 如 double a 将a强制转换为double类型 二 关系运算符和关系表达式1 关系运算符大于 大于等于 等于 不等于 关系运算即比较运算 其优先级低于算术运算 高于赋值运算 在以上6种关系运算中 前4种优先级相同 处于高优先级 后2种优先级相同 处于低优先级 2 关系表达式关系表达式的值为逻辑值 真和假 C51中用0表示假 用1表示真 三 逻辑运算符和逻辑表达式 1 逻辑运算符 逻辑与 逻辑或 逻辑非 在三种逻辑运算中 逻辑非的优先级最高 且高于算术运算符 逻辑或的优先级最低 低于关系运算符 但高于赋值运算符 2 逻辑表达式逻辑表达式的值也为逻辑值 真和假 四 位运算符C51提供6种位运算符 位与 位或 位异或 位取反 右移 位运算的优先级顺序为 位取反 左移和右移 位与 位异或 位或 五 赋值和复合赋值运算符符号 称为赋值运算符 其作用是将一个数据的值赋给一个变量 赋值表达式的值就是被赋值变量的值 在赋值运算符的前面加上其它运算符可以构成复合赋值运算符 在C51中共有10种复合运算符 加法赋值 减法赋值 乘法赋值 除法赋值 取模赋值 右移位赋值 逻辑与赋值 逻辑或赋值 逻辑异或赋值 逻辑非赋值 六 逗号运算符 一 条件语句条件语句由关键字if构成 有3种条件语句 1 if 条件表达式 语句若条件表达式的结果为真 非0值 则执行后面的语句 反之若条件表达式的结果为假 0值 则不执行后面的语句 例如 if p1 0 c 20 0 3C51流程控制语句 0 3 1C51选择语句 2 if 条件表达式 语句1else语句2若条件表达式的结果为真 非0值 则执行语句1 反之若条件表达式的结果为假 0值 则执行语句2 例如 if p1 0 c 20 else c 0 3 if 条件表达式1 语句1elseif 条件表达式2 语句2elseif 条件表达式3 语句3 elseif 条件表达式n 语句nelse语句n 1 此种形式的条件语句常用于实现多方向条件分支 例如 if a 1 c 10 elseif a 2 c 20 elseif a 3 c 30 elseif a 4 c 40 else c 0 二 开关语句开关语句主要用于多分支的场合 一般形式为 switch 表达式 case常量表达式1 语句1 break case常量表达式2 语句2 break case常量表达式n 语句n break default 语句n 1 开关语句执行时 将switch后面表达式的值与case后面各个常量表达式的值逐个进行比较 若匹配则执行相应case后面的语句 然后执行break语句 break语句的功能是中止当前语句的执行 使程序跳出switch语句 若没有匹配的情况 则执行语句n 1 一 while语句一般形式为 while 条件表达式 语句 0 3 2C51循环语句 若条件表达式的结果为真 非0值 程序就重复执行后面的语句 一直执行到条件表达式的结果变为假 0值 时为止 这种循环结构是先检查条件表达式给出的条件 再根据检查的结果决定是否执行后面的语句 如果条件表达式的结果一开始就为假 则后面的语句一次也不能执行 二 do while语句一般形式为 do语句while 条件表达式 该结构的特点是先执行给定的循环语句 然后再检查条件表达式的结果 当条件表达式的值为真 非0值 则重复执行循环体语句 直到条件表达式的值变为假 0值 时为止 对于此种结构 在任何条件下 循环体语句至少会被执行一次 三 for语句一般形式为 for 初值表达式 条件表达式 更新表达式 语句 该语句执行时 先计算初值表达式 作为循环控制变量的初值 再检查条件表达式的结果 当满足条件时就执行循环体语句并计算更新表达式 然后再根据更新表达式的计算结果来判断循环条件是否满足 一直进行到循环条件表达式的结果为假 0值 时退出循环体 四 if语句与goto语句结合利用if语句与goto语句的结合 可以构成循环结构 可以有两种形式 1 当型循环形式为 loop if 表达式 语句gotoloop 2 直到型循环形式为 loop 语句if 表达式 gotoloop 在C51中可以定义指针类型的变量 变量的指针就是该变量的地址 为了表示指针变量和它所指向的变量地址间的关系 可以利用运算符 取内容 和 取地址 一般定义形式为 变量 指针变量指针变量 目标变量取内容运算是将指针变量所指向的目标变量的值赋给左侧的变量 取地址运算是将目标变量的地址赋给左侧的变量 0 4C51的指针类型 必须注意 指针变量中只能存放指针型数据 即地址 不要将一个非指针型的数据赋给一个指针变量 正确的赋值示例如 chardata p 定义指针变量 p 30H 为指针变量赋值 30H为片内RAM地址 C51编译器支持两种指针类型 一般指针和基于存储器的指针 0 4C51的指针类型 定义指针变量时 若未指定它所指向的对象的存储器类型时 该指针变量就被认为是一般指针 一般指针占用3个字节 第一个字节存放该指针的存储器类型编码 由编译模式的默认值确定 第二和第三个字节分别存放该指针的高位和低位地址偏移量 编码为 0 4 1一般指针 例如 xdata类型 地址为0 x1234的指针表示为 第一字节为0 x01 第二字节为0 x12 第三字节为0 x34 一般指针所指向对象的存储空间位置在运行期间才能确定 在编译时无法优化存储方式 必须生成一般代码以保证对任意空间的对象进行存取 因此一般指针所产生的代码速度较慢 一般指针可用于存取任何变量而不必考虑变量在80C51单片机存储空间的位置 许多C51库函数采用了一般指针 例如 char xdatastrptr 位于xdata空间的一般指针 int datanumber 位于data空间的一般指针 定义指针变量时 若指定了它所指向的对象的存储类型时 该指针变量就被认为是基于存储器的指针 基于存储器的指针可以高效访问对象 类型由C51源代码中存储器类型决定 且在编译时确定 由于不必为指针选择存储器 这些指针的长度可以为1个字节 idata data pdata 或2个字节 code xdata 0 4 2基于存储器的指针 例如 chardata str 定义指向data空间char型数据的指针 intxdata num 定义指向xdata空间int型数据的指针 longcode pow 定义指向code空间long型数据的指针 还可以在定义时指定指针本身的存储器空间位置 例如 chardata xdatastr 指针本身在xdata空间 intxdata datanum 指针本身在data空间 longcode idatapow 指针本身在idata空间 基于存储器的指针长度比一般指针短 可以节省存储器空间 运行速度快 但它所指对象具有确定的存储器空间 兼容性不好 与普通的C语言程序类似 C51程序是有若干模块化的函数构成 函数是C51程序的基本模块 常说的子程序就是由函数来实现的 0 5C51的函数 用户可以根据需要定义自己的功能函数 也可以调用C51编译器提供的标准函数 库函数 来完成某种特定的功能 0 5 1C51函数的定义 函数的一般定义形式为 返回值类型函数名 形式参数列表 编译模式 reentrant interruptn usingn 函数体 当函数没有返回值时 应用关键字void明确说明 形式参数的类型要明确说明 对于无形参的函数 括号也要保留 编译模式为SMALL COPACT或LARGE 用来指定函数中局部变量和参数的存储器空间 reentrant用于定义可重入函数 可重入 reentrant 函数可以由多于一个任务并发使用 而不必担心数据错误 相反 不可重入 non reentrant 函数不能由超过一个任务所共享 interruptn用于定义中断函数 n为中断号 可以为0 31 通过中断号可以决定中断服务程序的入口地址 usingn用于确定中断服务函数所使用的工作寄存器组 n为工作寄存器组号 取值为0 3 0 5 2C51函数的调用与参数传递 寄存器传递方式最多可以传递3个参数 这种参数传递可以产生高效的代码 这一特性可以用REGPARMS和NOREGPARMS编译命令来控制 若被调函数是有参函数 则主调函数必须把被调函数所需的参数传递给被调函数 传递给被调函数的数据称为实际参数 即实参 实参对形参的传递是单向的 即只能将实参传递给形参 参数传递可以采用寄存器 固定存储器位置方式 寄存器参数传递使用的寄存器如表 当无寄存器可用时 或说明了 pragmaNOREGPARMS 时 参数可以采用固定的存储器位置传递 在固定的存储器位置进行参数传递是C51的一个重要特征 在SMALL模式下 参数传递在内部RAM中完成 在COMPACT和LARGER模式下 参数的传递要在外部RAM中完成 由于80C51单片机片内RAM空间非常有限 所以C51编译器仅将函数的返回地址保存到堆栈中 不采用堆栈传递参数 但应注意 C51提供一种模拟堆栈 从而支持可重入函数的递归调用 0 5 3C51的库函数C51编译器提供了丰富的库函数 使用这些库函数可以大大提高编程的效率 每个库函数都在相应的头文件中给出了函数的原形 使用时只需在源程序的开始用编译命令 include将头文件包含进来即可 常用的C51库函数参见附录C 2 0 6C51编程实例 0 6 180C51内部资源的编程一 中断服务函数示例C51编译器支持在C51源程序中应用中断函数 进而控制单片机中断系统的相关资源 中断函数的定义形式为 void函数名 void interruptn usingm 函数体 这里interrupt表示该函数是中断服务函数 n表示对应的中断源的编号 范围是0 31 常用的中断源对应的中断号 关键字using用于指定使用的工作寄存器组 m的范围是0 3 指定工作寄存器组后 所有被中断调用的过程都必须使用同一个寄存器组 否则参数传递就会发生错误 不设定工作寄存器组时 编译系统会将当前工作寄存器组的8个寄存器都压入堆栈 应注意的是 在应用程序中任何函数都不能调用中断服务函数 因为它是由系统调用的 例在一80C51单片机应用系统中 外中断0引脚接一个开关 并行端口线P1 0接一个发光二级管 要求系统的功能是 开关闭合一次 发光二极管的状态改变一次 相应的程序为 voidmain P10 0 EA 1 EX0 1 while 1 include reg51 h include intrins h voiddelay void inta 5000 while a nop voidint srv void interrupt1 delay if INT0 0 P10 P10 while INT0 0 二 定时计数器编程示例例利用定时 计数器T0的方式1 产生10ms的定时 并使P1 0引脚上输出周期为20ms的方波 采用中断方式 设系统时钟频率为12MHz 解 1 计算计数初值X 由于晶振为12MHz 所以机器周期Tcy为1 S 因此 N t Tcy 10 10 3 1 10 6 10000因计数器是向上计数 计数到10000时溢出 所以计数器初值为 10000 应将 10000 256 送入TH0中 10000 256 送入TL0中 2 求T0的方式控制字TMOD M1M0 01 GATE 0 C 0 可取方式控制字为01H 3 程序清单如下 include reg51 h sbitP10 P1 0 voidtimer0 void interrupt1 P10 P10 TH0 10000 256 TL0 10000 256 voidmain void TMOD 0 x01 P10 0 TH0 10000 256 TL0 10000 256 EA 1 ET0 1 TR0 1 while 1 0 6 280C51扩展资源的编程一 通用并行口编程示例例利用8155作为微型打印机与单片机间的接口电路如图所示 应用程序为 include reg51 h include absacc h defineucharunsignedchar defineCOMD8155XBYTE 0 x7f00 definePA8155XBYTE 0 x7f01 definePB8155XBYTE 0 x7f02 definePC8155XBYTE 0 x7f03 sbitBUSY P3 3 ucharcodetab 17 0 xc7 0 xe5 0 xbb 0 xaa
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业互联网与设备能耗管理的融合创新
- 工业4.0背景下的网络安全策略
- 工业4.0背景下的企业管理新趋势
- 工业4.0时代的生产战略变革
- 嵌入式系统中的资源管理技术
- 展览会场宣传推广与市场分析
- 展览活动中的观众互动设计
- 财务报表分析在新零售中的价值
- 展览搭建与撤场安全操作规程
- 小学语文教学中的创新思维培养
- 现金盘点表完整版
- 军标类型整理文档
- 国开电大 管理概论 形考任务一(画组织结构图)
- 2023年高三新高考英语复习备考策略及方法指导(深度课件)
- 高层建筑施工基坑工程勘察及支护结构选型培训
- 304不锈钢管材质证明书
- 预拌混凝土及原材料检测理论考试题库(含答案)
- 公开招聘社区居委专职工作人员考试笔试、面试题集及相关知识(11套试题含答案)
- 《植物生理学》课件第三章+植物的光合作用
- 游泳馆网架翻新施工组织方案设计
- 有机化学所有的命名--超全.
评论
0/150
提交评论