51单片机C语言程序精彩设计.ppt_第1页
51单片机C语言程序精彩设计.ppt_第2页
51单片机C语言程序精彩设计.ppt_第3页
51单片机C语言程序精彩设计.ppt_第4页
51单片机C语言程序精彩设计.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

四川师范大学成都学院 51单片机原理及应用第五章C51语言程序设计 4学时 主讲教师 刘强 我们以前学过C语言 现在对它的子集C51也进行了总结性快速复习和扩充学习 学习语言 仅仅这样不够 还必须读C51源程序范文 从范文中加深对语言法则的理解 认识并熟悉语言元素 学习C语言的用语范例 理解语言和单片机硬件行为的关联 据反映 这是难点 学习程序结构的组织 流程图设计 积累编程的通常技巧和算法 课程中 范例阅读量不大 就尤其要精读 深入体会和领悟 入木三分 力透纸背 尽量作到读懂人家的成熟的软件 领悟 总结 模仿和借鉴 进一步作到能够根据自己实际的需要对成熟的软件模块进行仿写 借代 适配性修改 拼装 在编程实践中逐步提高编程能力 英语教育专家说 英语不是教出来的 而是学出来的 那么 C51编程能力也类似 不是背C语言 条文 背出来的 是读程序 读 出来的 是编程序 编 出来 是在做项目编程序 调试程序的实践中形成和提高的 C51数据类型 P114 例1 typedef的使用 typedefunsignedintWORD typedefunsignedcharBYTE BYTEa1 0 x12 WORDa2 0 x1234 例2 define的使用 defineWORDunsignedint defineBYTEunsignedcharBYTEa1 0 x12 WORDa2 0 x1234 例3 define的使用 defineU8unsignedchar defineU16unsignedintU8a1 0 x12 U16a2 0 x1234 存储种类是指变量在程序执行过程中的作用范围 C51变量的存储种类有四种 分别是自动 auto 外部 extern 静态 static 和寄存器 register 1 auto 使用auto定义的变量称为自动变量 其作用范围在定义它的函数体或复合语句内部 当定义它的函数体或复合语句执行时 C51才为该变量分配内存空间 结束时占用的内存空间释放 自动变量一般分配在内存的堆栈空间中 定义变量时 如果省略存储种类 则该变量默认为自动 auto 变量 2 extern 使用extern定义的变量称为外部变量 在一个函数体内 要使用一个已在该函数体外或别的程序中定义过的外部变量时 该变量在该函数体内要用extern说明 外部变量被定义后分配固定的内存空间 在程序整个执行时间内都有效 直到程序结束才释放 三 存储种类 3 static 使用static定义的变量称为静态变量 它又分为内部静态变量和外部静态变量 在函数体内部定义的静态变量为内部静态变量 它在对应的函数体内有效 一直存在 但在函数体外不可见 这样不仅使变量在定义它的函数体外被保护 还可以实现当离开函数时值不被改变 外部静态变量上在函数外部定义的静态变量 它在程序中一直存在 但在定义的范围之外是不可见的 如在多文件或多模块处理中 外部静态变量只在文件内部或模块内部有效 4 register 使用register定义的变量称为寄存器变量 它定义的变量存放在CPU内部的寄存器中 处理速度快 但数目少 C51编译器编译时能自动识别程序中使用频率最高的变量 并自动将其作为寄存器变量 用户可以无需专门声明 四 存储类型 C51存储类型及其大小和值域 28 1 256 1 255 216 1 65536 1 65535 例3 变量定义存储种类和存储器类型相关情况 chardatavarl 在片内RAM低128B定义用直接寻址方式访问的字符型变量var1 intidatavar2 在片内RAM256B定义用间接寻址方式访问的整型变量var2 autounsignedlongdatavar3 在片内RAM128B定义用直接寻址方式访问的自动无符号长整型变量var3 externfloatxdatavar4 在片外RAM64KB空间定义用间接寻址方式访问的外部实型变量var4 intcodevar5 在ROM空间定义整型变量var5 unsignedcharbdatavar6 在片内RAM位寻址区20H 2FH单元定义可字节处理和位处理的无符号字符型变量var6 MCS 51系列单片机片内有许多特殊功能寄存器 通过这些特殊功能寄存器可以控制MCS 51系列单片机的定时器 计数器 串口 I O及其它功能部件 每一个特殊功能寄存器在片内RAM中都对应于一个字节单元或两个字节单元 在C51中 允许用户对这些特殊功能寄存器进行访问 访问时须通过sfr或sfr16类型说明符进行定义 定义时须指明它们所对应的片内RAM单元的地址 格式如下 sfr或sfr16特殊功能寄存器名 地址 sfr用于对MCS 51单片机中单字节的特殊功能寄存器进行定义 sfr16用于对双字节特殊功能寄存器进行定义 特殊功能寄存器名一般用大写字母表示 地址一般用直接地址形式 具体特殊功能寄存器地址见第二章 例4 特殊功能寄存器的定义 sfrPSW 0 xd0 定义80C51的状态字寄存器PSW 地址为0XD0 sfrSCON 0 x98 定义80C51的串行控制寄存器SCON 地址为0X98 sfrTMOD 0 x89 定义80C51的定时器模式寄存器TMOD 地址为0X89 sfrP1 0 x90 定义80C51的P1口 地址为0X90 sfr16DPTR 0 x82 sfr16T0 0X8A 五 特殊功能寄存器变量 80C51特殊功能寄存器 SFR 在C51中 允许用户通过位类型符定义位变量 位类型符有两个 bit和sbit 可以定义两种位变量 bit位类型符用于定义一般的可位处理位变量 格式 bit位变量名 在格式中可以加上各种修饰 但注意存储器类型只能是bdata data idata 只能是片内RAM的可位寻址区 严格来说只能是bdata 例5 bit型变量的定义 bitdataa1 bitbdataa2 bitpdataa3 bitxdataa4 bit p bitstring 5 六 位变量 sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位 定义时须指明其位地址 可以是位直接地址 可以是可位寻址变量带位号 也可以是特殊功能寄存器名带位号 格式 sbit位变量名 位地址 如位地址为位直接地址 其取值范围为0 x00 0 xff 如位地址是可位寻址变量带位号或特殊功能寄存器名带位号 则在它前面须对可位寻址变量或特殊功能寄存器进行定义 字节地址与位号之间 特殊功能寄存器与位号之间一般用 作间隔 例6 sbit型变量的定义 sbitOV 0 xd2 sbitCY oxd7 unsignedcharbdataflag sbitflag0 flag 0 sfrP1 0 x90 sbitP1 0 P1 0 sbitP1 1 P1 1 sbitP1 2 P1 2 sbitP1 3 P1 3 sbitP1 4 P1 4 sbitP1 5 P1 5 sbitP1 6 P1 6 sbitP1 7 P1 7 例7 利用位逻辑运算指令编程实现下面硬件逻辑电路的功能 ORG0000HMOVC P1 0ANLC P1 1CPLCORLC P1 2MOV0F0H CMOVC P1 3ORLC P1 4ANLC 0F0HCPLCMOVP1 5 CEND 汇编语言 先来看看第三章我们遇到的一个例子 接下来用C语言来实现 includesbitC 0 x90 sbitD 0 x91 sbitE 0 x92 sbitF 0 x93 sbitG 0 x94 sbitH 0 x95 voidmain void P1 0 x1F while 1 H C sbitC 0 x90 0 sbitD 0 x90 1 sbitE 0 x90 2 sbitF 0 x90 3 sbitG 0 x90 4 sbitH 0 x90 5 sbitC P1 0 sbitD P1 1 sbitE P1 2 sbitF P1 3 sbitG P1 4 sbitH P1 5 方法2 方法3 上式也可以90H x 这是一个条件恒为真的无尽循环结构 思考 为什么要构造这个无尽循环结构 此例题是按位操作的实例 在C51中 为了用户处理方便 C51编译器把MCS 51单片机的常用的特殊功能寄存器和特殊位进行了定义 放在一个 reg51 h 或 reg52 h 的头文件中 当用户要使用时 只须要在使用之前用一条预处理命令 include把这个头文件包含到程序中 然后就可使用殊功能寄存器名和特殊位名称 includeVoidmain 成于大气信达天下 C51中常用的头文件 Reg51 h 定义单片机的特殊功能寄存器和端口 Absacc h 外部绝对地址访问函数库 Stdio h 标准输入输出函数库 Math h 标准数学函数库 Ctype h 字符函数库 Stdlib h 数学函数库 String h 字符串数组函数库 七 存储模式 C51编译器支持三种存储模式 SMALL模式 COMPACT模式和LARGE模式 不同的存储模式对变量默认的存储器类型不一样 1 SMALL模式 SMALL模式称为小编译模式 在SMALL模式下 编译时 函数参数和变量被默认在片内RAM中 存储器类型为data 2 COMPACT模式 COMPACT模式称为紧凑编译模式 在COMPACT模式下 编译时 函数参数和变量被默认在片外RAM的低256字节空间 存储器类型为pdata 3 LARGE模式 LARGE模式称为大编译模式 在LARGE模式下 编译时函数参数和变量被默认在片外RAM的64K字节空间 存储器类型为xdata 八 绝对地址的访问 一 采用C51中的预定义宏C51编译器提供了一组宏定义来对51系列单片机的code data pdata和xdata空间进行绝对寻址 规定只能以无符号数方式访问 定义了8个宏定义 其函数原型如下 defineCBYTE unsignedcharvolatile 0 x50000L defineDBYTE unsignedcharvolatile 0 x40000L definePBYTE unsignedcharvolatile 0 x30000L defineXBYTE unsignedcharvolatile 0 x20000L defineCWORD unsignedintvolatile 0 x50000L defineDWORD unsignedintvolatile 0 x40000L definePWORD unsignedintvolatile 0 x30000L defineXWORD unsignedintvolatile 0 x20000L 这些函数原型放在absacc h文件中 使用时须用预处理命令把该头文件包含到文件中 形式为 include 其中 CBYTE以字节形式对code区寻址 DBYTE以字节形式对data区寻址 PBYTE以字节形式对pdata区寻址 XBYTE以字节形式对xdata区寻址 CWORD以字形式对code区寻址 DWORD以字形式对data区寻址 PWORD以字形式对pdata区寻址 XWORD以字形式对xdata区寻址 例9 绝对地址对存储单元的访问 include 将绝对地址头文件包含在文件中 include 将寄存器头文件包含在文件中 defineucharunsignedchar 定义符号uchar为数据类型符unsignedchar defineuintunsignedint 定义符号uint为数据类型符unsignedint voidmain void ucharvar1 uintvar2 var1 XBYTE 0 x0005 XBYTE 0 x0005 访问片外RAM的0005字节单元 var2 XWORD 0 x0002 XWORD 0 x0002 访问片外RAM的000字单元 while 1 二 通过指针访问 采用指针的方法 可以实现在C51程序中对任意指定的存储器单元进行访问 例10 通过指针实现绝对地址的访问 defineucharunsignedchar 定义符号uchar为数据类型符unsignedchar defineuintunsignedint 定义符号uint为数据类型符unsignedint voidfunc void uchardatavar1 ucharpdata dp1 定义一个指向pdata区的指针dp1 uintxdata dp2 定义一个指向xdata区的指针dp2 uchardata dp3 定义一个指向data区的指针dp3 dp1 0 x30 dp1指针赋值 指向pdata区的30H单元 dp2 0 x1000 dp2指针赋值 指向xdata区的1000H单元 dp1 0 xff 将数据0 xff送到片外RAM30H单元 dp2 0 x1234 将数据0 x1234送到片外RAM1000H单元 dp3 给变量var1赋值0 x20 例11 查找零的个数C51程序 includevoidmain unsignedcharxdata p 0 x2000 指针p指向2000H单元 intn 0 i for i

温馨提示

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

评论

0/150

提交评论