




已阅读5页,还剩60页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章MCS 51单片机的接口技术与C语言编程 单片机技术与应用 8051单片机支持的编程语言 汇编语言PL M语言BASIC语言C语言C 语言 MCS 51单片机的C语言编程 对单片机的指令系统不要求了解 仅要求对8051的存储器结构有一定了解 寄存器分配 不同存储器的寻址及数据类型等细节可由编译器管理 程序有规范的结构 可分成不同的函数 这种方式可使程序结构化 具有将可变的选择与特殊操作组合在一起的能力 改善了程序的可读性 提供的库包含许多标准子程序 具有较强的数据处理能力 由于具有方便的模块化编程技术 使已编好程序可容易地移植 1 1 C语言与汇编语言相比 有如下优点 1 2 编译器 开发套件和IDE 1 编译器 由源代码文件生成目标文件 2 开发套件 包含了编译器 链接器等开发工具的组合包 3 IDE IntegratedDevelopmentEnvironment集成开发环境 将项目管理 源代码编辑和程序编译 链接 调试等各种工具组合在一个功能强大的环境中 具有良好人机界面 8051单片机所使用的C语言编译器简称为Cx51 例如包含Cx51 Ax51 BL51 LIB51 OH51 RTX51等 Keil Vision3IDE Keil Vision3IDE Cx51 exe KeilC51开发套件v7 50 C51的程序结构 includevoiddelay voidmain delay P0 0 x33 例 文件led c内的代码如下 程序的入口函数名固定 且与书写的位置无关有且仅有一个 库函数或用户自定义的函数可以有若干个 C51程序大体上是若干函数的集合 C51的程序结构 C51自带的常用头文件 reg51 h51单片机SFR定义math h常用数学运算stdio h基本输入输出 串口 intrins h本征函数absacc h绝对地址寻址 C语言编程的三大要素 数据数据类型 数据结构 存储类型运算算术运算 关系运算 逻辑运算 位操作控制顺序结构 选择结构 循环结构 函数 C51的数据类型 位变量的使用不能定义成一个指针 如不能定义 bit pointer 不存在位数组如不能定义 bitb array 位变量定义时 存储类型只允许为data bdata或者idata 如果将位变量的存储类型定义成其它类型都将导致编译出错 char数据类型 单片机应用中ASCII字符和字符串的使用比较少 因为很少需要大量的文本信息 因此在单片机常用中定义为unsignedchar和char的变量常用来表示数值 数据类型的使用 单片机系统总存储空间往往比较有限 因此在实际使用中应注意节约存储空间 对于8位单片机 8位的数据类型是运算最快的 而对于16位单片机 8位的数据和16位的数据运算速度可能是一样的 常量 又称为标量 常量的值在程序执行过程中不能改变 符号常量 不是严格意义上的常量 只是一个宏 使用 define语句定义定义在ROM里的常量使用 code 关键字定义的数据定义在RAM里的常量使用 const 关键字定义的数据 在C51中常量的定义有3种方式 常量和变量 常量和变量 在C51中常量的使用 9 P0 constA C 0 x008F758014MOVP0 0 x80 0 x1410 P1 constB C 0 x00929000A2MOVDPTR constB 0 x00A2 C 0 x0095E4CLRAC 0 x009693MOVCA A DPTRC 0 x0097F590MOVP1 0 x90 A11 P2 constC C 0 x00998508A0MOVP2 0 xA0 constC 0 x08 include defineconstA20unsignedcharcodeconstB 20 unsignedcharconstconstC 20 常量和变量 在C51中常量的使用 1 符号常量 常用 是一个宏 在编译时被当作指令的立即数 2 定义在ROM中的常量 常用 存放在ROM中 掉电不丢失 访问需要MOVC指令 和16位地址 访问速度较慢 常用于查表法 3 定义在RAM中的常量存放在RAM中 访问较快 但占用RAM资源 掉电丢失 需要在单片机上电时进行初始化 占用代码 include defineconstA20unsignedcharcodeconstB 20 unsignedcharconstconstC 20 变量 在程序执行过程中 其值可以改变的量称为变量 变量只能存放在RAM中 数据类型 存储器类型 变量名 初值 例 unsignedcharxdataFlag 0 x0F C51的变量的定义 常量和变量 C51数据的存储类型 在讨论C51的数据类型的时候 必须理解数据的存储类型和它与8051单片机存储器结构的关系 访问片内RAM data bdata idata 比访问片外RAM xdata pdata 要快 因此可将常用变量置于片内RAM 而将规模较大 或不常用数据置于片外RAM unsignedcharidatastep 1 3 0 x04 0 x02 0 x01 unsignedcharcodestep 2 6 0 x04 0 x06 0 x02 0 x03 0 x01 0 x05 定义变量时如果省略 存储器类型 选项 则按编译时使用的存储器模式SMALL COMPACT 或LARGE来使用默认的存储器类型 SMALL 默认存储类型为data 访问速度最快 容量小COMPACT 默认存储类型为pdataLARGE 默认存储类型为xdata 访问效率最低 代码长 容量大 一般使用SMALL模式 对部分容量大的变量 手动指定存储器类型 如定义为xdata类型 C51数据的存储模式 sfrmy sfr location location范围从0 x80 0 xFFsfrP0 0 x80 8051片内RAM有21个SFR 地址80H 0FFH 对SFR只能用直接寻址方式 C51提供了对SFR直接寻址的定义方法 该方法与标淮C语言不兼容 只适用C51 sfr定义 特殊功能寄存器字节寻址sfrSCON 0 x98 sfrTMOD 0 x89 sfr16T2 0 xCC 805l特殊功能寄存器 SFR 及其C5l定义 sbit 绝对定址的位元sbitmy flag location location范围从0 x00 0 x7F 0 x80 0 xFFsbit定义 应用1 SFR sfrPSW 0 xD0 sbitOV PSW 2 sbitCY PSW 7 sbitOV 0 xD0 2 sbitCY 0 xD0 7 sbitOV 0 xD2 sbitCY 0 xD7 sfrP1 0 x90 sbitP1 0 P1 0 P1 0 0 P1 0 1 P1 0 P1 0 P1 0 P1 0 sbitEA 0 xAF 应用2 位寻址区 charbdatamy flags 配合bdata使用sbitflag0 my flags 0 位变量 BIT 及其C51定义 算术运算 关系运算 逻辑运算 位运算 805l运算器具有位处理能力 布尔处理 可以提高硬件处理速度自增 减 C51的运算符 算术运算 defineN4unsignedcharLEDBuf N unsignedlonga unsignedchari a 1234 for i 0 i 4 i LEDBuf i a 10 a 10 程序的不足 1 变量a的值发生了变化2 程序不通用 需修改 defineN实现 C51的算术运算 0 C51的运算符 运算 0 0 00 1 11 0 11 1 1位置位unsignedchara a 0 x01 C51的运算符 运算 0 0 00 1 11 0 11 1 0位取反unsignedchara a 0 x01 unsignedchara 0 xAA b 0 x55 c d c a b a d b a b C51的运算符 运算 0 1 1 0 C51的运算符 运算 a 15 a 2 则a 3 a a 4程序的结果是 13voidmain void unsignedinta 3 b 10 printf d n a 1 C51的运算符 右移 宏的使用 define语句的应用 宏的定义此处使用 define语句定义了一个符号常量PI 它的值是3 1415926 宏的使用定义好符号常量PI后 在编程中使用这个符号 它就等价于3 1415926 如 a PI 2 等价于a 3 1415926 2 例 definePI3 1415926 宏的分类 1 固定不变的宏这一类宏所代表的值或表达式在整个C文件中始终保持不变 如 defineCONST20 defineucharunsignedchar defineD1 ONP2 1 02 带有参数的宏这一类宏所代表的表达式根据所传递的参数的不同而发生变化 它与函数的形式类似 但有着本质的区别 如 definesetbit var bit var 0 x01 bit define语句的应用 宏的使用 2 带有参数的宏 definesetbit var bit var 0 x01 bit setbit i 1 k i 1 i 1 k 0 x01 i 1 宏的使用 宏的意义 替换 几个常用的宏 defineucharunsignedchar defineuintunsignedint defineulongunsignedlong define符号常量名常量 数字或字符等 defineCONST20a a CONST definesetbit var bit var 0 x01 bit setbit P2 1 P2 0 x01 1 a a 20 宏的使用 位运算符综合应用 definesetbit var bit var 0 x01 bit 定义置位函数 defineclrbit var bit var 0 x01 bit 定义位清零函数 definecheckbit var bit var 0 x01 bit 定义位查询函数 definexorbit var bit var 0 x01 bit 定义位取反函数 C51的流程控制 略 2 LED的控制实例 sbit的使用 分析电路 1 由图 D3由IO引脚P2 2控制 2 由硬件电路可知 当IO口输出逻辑电平 0 时对应的LED点亮 当IO口输出逻辑电平 1 时LED熄灭 例 如上图所示电路图 要求编程控制发光二极管D3点亮 普通发光二极管只需要几个mA的电流就可以点亮 includesbitD3 P2 2 voidmain D3 0 点亮LEDwhile 1 循环 挂起 按要求编程 引用含有SFR符号定义的头文件 定义符号D3为P2口的第2位D3可以换为其他自定义符号 作用相同 如 sbitP2 2 P2 2 点亮发光二极管的功能语句 while 1 无限循环 用于程序的反复执行或者程序挂起 很重要 使用tab或者空格 使程序结构清晰 便于阅读 适当加入注释 使编程思路清晰 便于阅读和后期的修改 sbit的使用 while 1 循环 includesbitD3 P2 2 voidmain D3 0 点亮LEDwhile 1 循环 挂起 while 1 D3 0 可以实现相同的功能 while 1 循环 如果主函数中没有while 1 循环会出现怎么样的情况 include voidmain while 1 循环 读取按键代码 例 使用单片机作为控制器 设计一个数学计算器 例 使用单片机作为控制器 设计一个数学计算器 voidmain while 1 while 1 循环 计算器 或其它基于按键操作的设备 自动测量仪器 工业自动化控制等设备 while 1 循环 while 1 do While 1 while 1 循环 例 如题设所示电路图 要求编程控制发光二极管D1实现闪烁变化 分析电路 1 由图 D1由IO引脚P2 0控制 2 由硬件电路可知 当IO口输出逻辑电平 0 时对应的LED点亮 当IO口输出逻辑电平 1 时LED熄灭 while 1 循环 按要求编程 includesbitD1 P2 0 voidmain while 1 无限循环 D1 0 点亮D1 1 熄灭 问题 闪烁频率有多快 人眼能分辨出来吗 如何降低频率 比如说使闪烁频率变为每秒闪烁1次 加入延时 while 1 循环 延时的设计 要求 实现发光二极管每秒钟闪烁1次 分析设计要求 1 每秒钟闪烁1次 即亮0 5秒 灭0 5秒 如此循环 2 设计难点 如何实现0 5秒的计时 延迟 延时 思路之一 单片机执行语句需要时间 单片机每条语句执行所需的时间是确定的 指令周期 通过编程使单片机执行一些指令 可以实现延时 晶振为12MHz时 1个机器周期为1us 单周期指令的指令周期为1us双周期指令的指令周期为2us 依此类推 设计目标 0 5s 500ms 500000us 考虑使用循环语句 unsignedchari j for i 20 i 0 i for j 248 j 0 j MOVR6 20D1 MOVR7 248DJNZR7 DJNZR6 D1 延时的设计 MOVR6 20D1 MOVR7 248DJNZR7 DJNZR6 D1 单周期指令 1us单周期指令 1us双周期指令 2us双周期指令 2us 设晶振12MHz 延时的设计 10ms延迟的编程实现 unsignedchari j for i 20 i 0 i for j 248 j 0 j 设晶振12MHz unsignedchari j for i 10 i 0 i for j 248 j 0 j 设晶振6MHz 延时的设计 500ms延迟的编程实现 设晶振12MHz uchari j k for k 50 k 0 k for i 20 i 0 i for j 248 j 0 j MOVR5 50D1 MOVR6 20D2 MOVR7 248DJNZR7 DJNZR6 D2DJNZR5 D1 延时的设计 500ms延迟的编程实现 设晶振12MHz uchari j k for k 50 k 0 k for i 20 i 0 i for j 248 j 0 j 应用于延时精度要求一般的场合 延时的设计 通常设计一个任意ms延迟的延迟函数 自定义函数 voiddelay unsignedcharucData unsignedchari j k for k ucData k 0 k for i 20 i 0 i for j 248 j 0 j 延时的设计 例 如题设所示电路图 要求编程控制发光二极管D1实现闪烁变化 闪烁频率1Hz 分析电路 略 按要求编程 includesbitD1 P2 0 voiddelay unsignedcharucData unsignedchari j k for k ucData k 0 k for i 20 i 0 i for j 248 j 0 j voidmain while 1 无限循环 D1 0 点亮delay 50 0 5秒延迟D1 1 熄灭delay 50 延时的设计 多个LED的控制 巧用移位指令 分析电路 1 由图 D1 D8分别由IO引脚P2 0 P2 7控制 2 依次循环点亮即 P2 0 P2 1 P2 2 P2 7 P2 0 3 考虑以字节为单位控制IO口状态 例 如题设所示电路图 要求编程控制8个发光二极管以1s的间隔依次循环点亮 includevoiddelay unsignedcharucData voidmain while 1 P2 0 xfe 点亮D1delay 100 P2 0 xfd 点亮D2delay 100 P2 0 xfb 点亮D3delay 100 P2 0 xf7 点亮D4delay 100 P2 0 xef 点亮D5delay 100 P2 0 xdf 点亮D6delay 100 P2 0 xbf 点亮D7delay 100 P2 0 x7f 点亮D8delay 100 voiddelay unsignedcharucData unsignedchari j k for k ucData k 0 k for i 20 i 0 i for j 248 j 0 j 按要求编程 多个LED的控制 巧用移位指令 D1点亮 D2点亮 D3点亮 D4点亮 D5点亮 D6点亮 D7点亮 D8点亮 考虑使用位左移指令 多个LED的控制 巧用移位指令 includevoiddelay unsignedcharucData voidmain unsignedchari ucTemp while 1 ucTemp 0 x01 for i 8 i 0 i P2 ucTemp delay 100 ucTemp ucTemp 1 使用移位指令和流程控制语句简化编程 赋初值 P2口输出 延时 移位 00000001111111100000001011111101 多个LED的控制 巧用移位指令 查表法的使用 如上题 适当使用移位指令可以简化位操作编程 但移位指令不是万能的 有些情况下使用移位指令往往力不从心 如 例 如题设所示电路图 要求编程控制8个发光二极管按如下方式实现变换闪烁 左移两次 右移两次 向外扩展两次 向内收缩两次 闪烁两次 左移 右移 向外扩展 向内收缩 闪烁 includevoiddelay unsignedcharucData voidmain while 1 P2 0 xfe 点亮D1delay 100 P2 0 xfd 点亮D2delay 100 方法一 使用移位指令 可以完成左移 右移的控制 但是在完成向外扩展和向内收缩的控制上比较麻烦 方法二 查表法的使用 unsignedcharcodeucTable 0 xFF 0 xFE 0 xFD 0 xFB 0 xF7 0 xEF 0 xDF 0 xBF 0 x7F 左移两次0 xFF 0 xFE 0 xFD 0 xFB 0 xF7 0 xEF 0 xDF 0 xBF 0 x7F 0 xFF 0 x7F 0 xBF 0 xDF 0 xEF 0 xF7 0 xFB 0 xFD 0 xFE 右移两次0 xFF 0 x7F 0 xBF 0 xDF 0 xEF 0 xF7 0 xFB 0 xFD 0 xFE 0 xFF 0 x18 0 x24 0 x42 0 x81 0 x42 0 x24 0 x18 扩展两次0 xFF 0 x18 0 x24 0 x42 0 x81 0 x42 0 x24 0 x18 0 x00 0 xFF 闪烁两次0 x00 0 xFF 0 x01 结束码 查表法 预先将复杂而又有规律的控制代码或者数据定义成一个数组 在程序执行过程中依次访问数组中的数据 可以使用简洁的语句实现复杂的控制动作 从而达到节约程序代码空间 增加程序可读性和便于修改的目的 查表法的使用 includeunsignedcharcodeucTable voiddelay unsignedcharucData voidmain unsignedchari while 1 i 0 索引值赋初值
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 公路建设人员健康管理方案
- 2025年营养员考试题目及答案
- 2025年蚌埠淮上实验幼儿园幼儿教师招聘备考练习试题及答案解析
- 2025浙江财经大学东方学院招聘7人考试参考试题及答案解析
- 储备物资存储环境控制与优化方案
- 非婚生子女抚养协议书合同范本
- 2025江苏师范大学招聘工作人员56人(第二批)备考练习试题及答案解析
- 2025年生物内脏专项题目及答案
- 2025西安未央区未央宫社区卫生服务中心招聘(4人)备考练习题库及答案解析
- 2025浙江宁波市慈溪技师学院(慈溪杭州湾中等职业学校)招聘派遣制13人备考练习试题及答案解析
- 佛山市顺德区容桂街道专业电镀产业发展规划(2023-2035年)环境影响报告书(简本)
- 高效人员管理的5大核心思路与方法
- 《物业管理条例》教学课件
- TCNAS 28─2023成人住院患者静脉血栓栓塞症的预防护理
- (高清版)DB3301∕T 0046-2017 智精残疾人托养机构护理服务规范
- 基层司法所规范化建设
- 经济学基础课件 项目三 支付结算法律制度
- 城市低空安全监管平台解决方案
- 员工入职申请表(完整版)
- 销售述职竞聘报告
- 超市安全知识培训内容
评论
0/150
提交评论