单片机C语言编程规范ppt课件.ppt_第1页
单片机C语言编程规范ppt课件.ppt_第2页
单片机C语言编程规范ppt课件.ppt_第3页
单片机C语言编程规范ppt课件.ppt_第4页
单片机C语言编程规范ppt课件.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51单片机C语言编程规范 学习单片机C语言的必要性 随着单片机性能的不断提高 C语言编译调试工具的不断完善 以及现在对单片机产品辅助功能的要求 对开发周期不断缩短的要求 使得越来越多的单片机编程人员转向使用C语言 因此有必要在单片机课程中讲授 单片机C语言 C语言编程的优势 1 语言简洁 紧凑 使用方便 灵活 2 运算符丰富 3 数据结构丰富 具有现代化语言的各种数据结构 4 可进行结构化程序设计 5 可以直接对计算机硬件进行操作 6 生成的目标代码质量高 程序执行效率高 7 可移植性好 8 容易实现模块化开发9 方便调试与维护程序 C语言与汇编的区别 用汇编语言编写单片机程序时 必须要考虑其存储器的结构 尤其要考虑其片内数据存储器 特殊功能寄存器是否正确合理的使用 以及按照实际地址端口数据的处理 用C51编写程序 不像汇编语言那样需要具体地组织 分配存储器资源 只是C51对数据类型和变量的定义 必须要与单片机的存储结构相关联 否则编译器不能正确地映射定位 单片机C语言与ANSI的区别 用C51编写单片机程序 与用ANSIC编写程序的不同之处是 需要根据单片机存储器结构及内部资源 定义相应的数据类型和变量 其它的语法规定 程序结构及程序设计方法 都与ANSIC相同 C语言的程序结构 C语言程序采用函数结构 每个C语言程序由一个或多个函数组成 在这些函数中至少应包含一个主函数main 也可以包含一个main 函数和若干个其它的功能函数 不管main 函数放于何处 程序总是从main 函数开始执行 执行到main 函数结束则结束 可以在main 函数中调用其它函数 其它函数也可以相互调用 但main 函数只能调用其它的功能函数 而不能被其它的函数所调用 功能函数可以是C语言编译器提供的库函数 也可以是由用户定义的自定义函数 在编制C程序时 程序的开始部分一般是预处理命令 函数说明和变量定义等 C语言与89C51单片机 用C语言编写的89C51单片机应用程序 不用像汇编语言那样须具体组织 分配存储器资源和处理端口数据 但在C语言编程中 对数据类型与变量的定义 必须要与单片机的存储结构相关联 否则编译器不能正确地映射定位 C语言编写单片机应用程序时 需根据单片机存储结构及内部资源定义相应的数据类型和变量 而标准的C语言程序不需要考虑这些问题 C语言与89C51单片机 C51包含的数据类型 变量存储模式 输入输出处理 函数等方面与标准的C语言有一定的区别 其它的语法规则 程序结构及程序设计方法等与标准的C语言程序设计相同 现在支持89C51系列单片机的C语言编译器有很多种 如AmericanAutomation Avocet BSO TASKING DUNFIELDSHAREWARE KEIL Franklin等 各种编译器的基本情况相同 但具体处理时有一定的区别 其中KEIL Franklin以它的代码紧凑和使用方便等特点优于其它编译器 现在使用特别广泛 本章主要以KEIL编译器介绍89C51单片机C语言程序设计 C51程序结构 C51的语法规定 程序结构及程序设计方法都与标准的C语言程序设计相同 但C51程序与标准的C程序在以下几个方面不一样 1 C51中定义的库函数和标准C语言定义的库函数不同 标准的C语言定义的库函数是按通用微型计算机来定义的 而C51中的库函数是按89C51单片机相应情况来定义的 2 C51中的数据类型与标准C的数据类型也有一定的区别 在C51中还增加了几种针对89C51单片机特有的数据类型 C51程序结构 3 C51变量的存储模式与标准C中变量的存储模式不一样 C51中变量的存储模式是与89C51单片机的存储器紧密相关 4 C51与标准C的输入输出处理不一样 C51中的输入输出是通过89C51串行口来完成的 输入输出指令执行前必须要对串行口进行初始化 5 C51与标准C在函数使用方面也有一定的区别 C51中有专门的中断函数 C51数据类型 C51的数据类型分为基本数据类型和组合数据类型 情况与标准C中的数据类型基本相同 但其中char型与short型相同 float型与double型相同 另外 C51中还有专门针对于89C51单片机的特殊功能寄存器型和位类型 C51数据类型 特殊功能寄存器型 这是C51扩充的数据类型 用于访问89C51单片机中的特殊功能寄存器数据 它分sfr和sfr16两种类型 其中 sfr为字节型特殊功能寄存器类型 占一个内存单元 利用它可以访问89C51内部的所有特殊功能寄存器 sfr16为双字节型特殊功能寄存器类型 占用两个字节单元 利用它可以访问89C51内部的所有两个字节的特殊功能寄存器 在C51中对特殊功能寄存器的访问必须先用sfr或sfr16进行声明 位类型 这也是C51中扩充的数据类型 用于访问MCS 51单片机中的可寻址的位单元 在C51中 支持两种位类型 bit型和sbit型 它们在内存中都只占一个二进制位 其值可以是 1 或 0 其中 用bit定义的位变量在C51编译器编译时 在不同的时候位地址是可以变化的 而用sbit定义的位变量必须与89C51单片机的一个可以寻址位单元或可位寻址的字节单元中的某一位联系在一起 在C51编译器编译时 其对应的位地址是不可变化的 位类型 格式如下 sbit位变量名 位地址 如位地址为位直接地址 其取值范围为0 x00 0 xff 如位地址是可位寻址变量带位号或特殊功能寄存器名带位号 则在它前面须对可位寻址变量或特殊功能寄存器进行定义 字节地址与位号之间 特殊功能寄存器与位号之间一般用 作间隔 位类型 在C51中 为了用户处理方便 C51编译器把89C51单片机的常用的特殊功能寄存器和特殊位进行了定义 放在一个 reg51 h 或 reg52 h 的头文件中 当用户要使用时 只须要在使用之前用一条预处理命令 include把这个头文件包含到程序中 然后就可使用殊功能寄存器名和特殊位名称 数据转换 在C51语言程序中 有可能会出现在运算中数据类型不一致的情况 C51允许任何标准数据类型的隐式转换 1 自动转换转换规则是向高精度数据类型转换 向有符号数据类型转换 如字符型变量与整型变量相加时 则位变量先转换字符型或整型数据 然后相加 2 强制转换像ANSIC一样 通过强制类型转换的方式进行转换 如 unsignedintb floatc 数据转换 隐式转换的优先级顺序如下 bit char int long floatsigned unsigned也就是说 当char型与int型进行运算时 先自动对char型扩展为int型 然后与int型进行运算 运算结果为int型 C51除了支持隐式类型转换外 还可以通过强制类型转换符 对数据类型进行人为的强制转换 C5l编译器除了能支持以上这些基本数据类型之外 还能支持一些复杂的组合型数据类型 如数组类型 指针类型 结构类型 联合类型等这些复杂的数据类型 在后面将相继介绍 C51数据的存储 MCS 51单片机只有bit和unsignedchar两种数据类型支持机器指令 而其它类型的数据都需要转换成bit或unsignedchar型进行存储 为了减少单片机的存储空间和提高运行速度 要尽可能地使用unsignedchar型数据 一 位变量的存储bit和sbit型位变量 直接存于RAM的位寻址空间 包括低128位和特殊功能寄存器位 C51数据的存储 二 字符变量的存储字符变量 char 无论是unsignedchar数据还是signedchar数据 均为1个字节 能够被直接存储在RAM中 可以存储在0 0 x7f区域 也可以存储在0 x80 0 xff区域 与变量的定义有关 unsignedchar数 可直接被MSC 51接受signedchar数据 用补码表示 需要额外的操作来测试 处理符号位 使用的是两种库函数 代码量大 运算速度降低 C51数据的存储 三 整型变量的存储整型变量 int 不管是unsignedint数据还是signedint数据 均为2个字节 其存储方法是高位字节保存在低地址 在前面 低位字节保存在高地址 在后面 例如 整型变量的值为0 x1234 在内存中的存放如右图所示 signedint数据用补码表示 C51数据的存储 四 长整型变量的存储长整型变量 long 为4个字节 其存储方法与整型数据一样 是最高位字节保存的地址最低 在最前面 最低位字节保存的地址最高 在最后面 如长整型变量的值为0 x12345678 在内存中的存放方法如右图所示 不管是unsignedlong数据还是signedlong数据 C51数据的存储 五 浮点型变量的存储浮点型变量 fload 占4个字节 用指数方式表示 其具体格式与编译器有关 对于KeilC 采用的是IEEE 754标准 具有24位精度 尾数的最高位始终为1 因而不保存 具体分布为 1位符号位 8位阶码位 23位尾数 如下图所示 C51数据的存储 符号位S 1表示负数 0表示正数 阶码 用移码表示 如 实际阶码 126用1表示 实际阶码0用127表示 即实际阶码数加上127得到阶码的表达数 阶码数值范围 126 128 C51数据的存储 例如 浮点数 12 5符号位为1 12 5的二进制数1100 1 1 1001E 0011 阶码数值为 3 127 130 10000010B 尾数为1001 因此 其十六进制数为0 xC1480000 则存储结构如右图所示 C51变量 C51变量定义的一般格式为 存储类型 数据类型 存储区 变量名1 初值 变量名2 初值 或 存储类型 存储区 数据类型变量名1 初值 变量名2 初值 可见变量 非位变量 的定义由4部分组成 即在变量定义时 指定变量4种属性 变量存储种类 存储种类是指变量在程序执行过程中的作用范围 C51变量的存储种类有四种 分别是自动 auto 外部 extern 静态 static 和寄存器 register 1 auto 使用auto定义的变量称为自动变量 其作用范围在定义它的函数体或复合语句内部 当定义它的函数体或复合语句执行时 C51才为该变量分配内存空间 结束时占用的内存空间释放 自动变量一般分配在内存的堆栈空间中 定义变量时 如果省略存储种类 则该变量默认为自动 auto 变量Inta 2 extern 使用extern定义的变量称为外部变量 在一个函数体内 要使用一个已在该函数体外或别的程序中定义过的外部变量时 该变量在该函数体内要用extern说明 外部变量被定义后分配固定的内存空间 在程序整个执行时间内都有效 直到程序结束才释放 3 static 使用static定义的变量称为静态变量 它又分为内部静态变量和外部静态变量 在函数体内部定义的静态变量为内部静态变量 它在对应的函数体内有效 一直存在 但在函数体外不可见 这样不仅使变量在定义它的函数体外被保护 还可以实现当离开函数时值不被改变 外部静态变量上在函数外部定义的静态变量 它在程序中一直存在 但在定义的范围之外是不可见的 如在多文件或多模块处理中 外部静态变量只在文件内部或模块内部有效 4 register 使用register定义的变量称为寄存器变量 它定义的变量存放在CPU内部的寄存器中 处理速度快 但数目少 C51编译器编译时能自动识别程序中使用频率最高的变量 并自动将其作为寄存器变量 用户可以无需专门声明 五 特殊功能寄存器变量89C51系列单片机片内有许多特殊功能寄存器 通过这些特殊功能寄存器可以控制89C51系列单片机的定时器 计数器 串口 I O及其它功能部件 每一个特殊功能寄存器在片内RAM中都对应于一个字节单元或两个字节单元 在C51中 允许用户对这些特殊功能寄存器进行访问 访问时须通过sfr或sfr16类型说明符进行定义 定义时须指明它们所对应的片内RAM单元的地址 格式如下 sfr或sfr16特殊功能寄存器名 地址 sfr用于对89C51单片机中单字节的特殊功能寄存器进行定义 sfr16用于对双字节特殊功能寄存器进行定义 特殊功能寄存器名一般用大写字母表示 地址一般用直接地址形式 具体特殊功能寄存器地址见前面内容 C51的运算符及表达式 在表达式的后边加一个分号 就构成了表达式语句 如 a b 9 x 8 y 7 k 可以一行放一个表达式形成表达式语句 也可以一行放多个表达式形成表达式语句 这时每个表达式后面都必须带 号 另外 还可以仅由 个分号 占一行形成一个表达式语句 这种语句称为空语句 C51的运算符及表达式 空语句在程序设计中通常用于两种情况 1 在程序中为有关语句提供标号 用以标记程序执行的位置 例如采用下面的语句可以构成一个循环 repeat gotorepeat 2 在用while语句构成的循环语句后面加一个分号 形成一个不执行其它操作的空循环体 这种结构通常用于对某位进行判断 当不满足条件则等待 满足条件则执行 复合语句 复合语句是由若干条语句组合而成的一种语句 在C51中 用一个大括号 将若干条语句括在一起就形成了一个复合语句 复合语句最后不需要以分号 结束 但它内部的各条语句仍需以分号 结束 复合语句的一般形式为 局部变量定义 语句l 语句2 复合语句 复合语句在执行时 其中的各条单语句按顺序依次执行 整个复合语句在语法上等价于一条单语句 因此在C51中可以将复合语句视为一条单语句 通常复合语句出现在函数中 实际上 函数的执行部分 即函数体 就是一个复合语句 复合语句中的单语句一般是可执行语句 此外还可以是变量的定义语句 说明变量的数据类型 在复合语句内部语句所定义的变量 称为该复合语句中的局部变量 它仅在当前这个复合语句中有效 利用复合语句将多条单语句组合在 起 以及在复合语句中进行局部变量定义是C51语言的一个重要特征 C51程序基本结构与相关语句 C51的基本结构 一 顺序结构二 选择结构三 循环结构C51的相关语句 一 ifelseSwitch case二 whiledowhilefor三 break continue四 return 函数 函数定义的一般格式如下 函数类型函数名 形式参数表 reentrant interruptm usingn 形式参数说明 局部变量定义函数体 前面部件称为函数的首部 后面称为函数的尾部 格式说明 1 函数类型函数类型说明了函数返回值的类型 2 函数名函数名是用户为自定义函数取的名字以便调用函数时使用 3 形式参数表形式参数表用于列录在主调函数与被调用函数之间进行数据传递的形式参数 函数的调用与声明 函数调用的一般形式如下 函数名 实参列表 对于有参数的函数调用 若实参列表包含多个实参 则各个实参之间用逗号隔开

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论