单片机原理与应用系统设计第04章 单片机程序设计基础-01.ppt_第1页
单片机原理与应用系统设计第04章 单片机程序设计基础-01.ppt_第2页
单片机原理与应用系统设计第04章 单片机程序设计基础-01.ppt_第3页
单片机原理与应用系统设计第04章 单片机程序设计基础-01.ppt_第4页
单片机原理与应用系统设计第04章 单片机程序设计基础-01.ppt_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

2020 3 4 1 第4章单片机程序设计基础 单片机原理与应用系统设计 电子工业出版社 2009 7欧伟明何静凌云刘剑等编著 2020 3 4 2 本章主要内容 汇编语言的特点及语句格式汇编语言程序的基本结构汇编语言的伪指令与汇编汇编语言程序设计举例C51高级语言程序设计 2020 3 4 3 4 1汇编语言的特点及语句格式 汇编语言的特点汇编语言的语句格式 2020 3 4 4 4 1 1汇编语言的特点 助记符指令与机器指令一一对应 所以用汇编语言编写的程序占用存储空间小 运行速度快 可编写出最优化程序汇编语言是面向计算机的 所以汇编语言的程序设计人员必须对计算机硬件有相当深入的了解 汇编语言能直接访问存储器和接口电路 也能处理中断 所以汇编语言能直接管理和控制硬件设备 各种计算机都有自己的汇编语言 不同计算机的汇编语言之间不能通用 所以汇编语言缺乏通用性 程序不易移植 2020 3 4 5 4 1 2汇编语言的语句格式 常用的字段分界符有冒号 逗号 和分号 请注意 字段分界符要在英文输入状态下键入 操作码是汇编语句格式中唯一不能空缺的部分 用于规定语句执行的操作内容 操作数用于表明指令操作的数据或数据存放的地址 操作数分为目的操作数和源操作数 操作数可以是空白 注释不属于语句的功能部分 只是对语句的解释说明 标号 操作码 目的操作数 源操作数 注释 2020 3 4 6 4 2汇编语言程序的基本结构 3种基本形式 顺序结构分支结构循环结构 2020 3 4 7 4 2 1顺序结构例程 START MOVR0 30H 被加数地址送R0MOVR1 33H 加数地址送R1MOVA R0ADDA R1 低字节相加MOV R0 A 保存低字节结果INCR0INCR1MOVA R0ADDCA R1 中间字节相加MOV R0 A 保存中间相加结果INCR0INCR1MOVA R0ADDCA R1 高字节相加MOV R0 A 保存高字节相加结果CLRAADDCA 00HMOV00H A 保存进位RET 2020 3 4 8 4 2 2分支结构 可分成单分支 双分支和多分支几种 条件成立 程序段A 下条指令 条件成立 程序段A 程序段B K 0 K 1 K 2 Y 分支0 Y 分支1 Y 分支2 N N N 2020 3 4 9 4 2 2分支结构例程 ORG0100HSTART CLRCMOVDPTR 2000H 设置数据指针MOVXA DPTR 取第一个数MOVR2 A 暂存于R2INCDPTR 数据指针加1MOVXA DPTR 取第二个数SUBBA R2 两数比较JNCLOOP1 第二个数大则转LOOP1XCHA R2 第一个数大则交换LOOP0 INCDPTRMOVX DPTR A 存大数RETLOOP1 MOVXA DPTRSJMPLOOP0 2020 3 4 10 4 2 3循环结构 有先执行后判断和先判断后执行两种结构 2020 3 4 11 4 2 3循环结构例程 START MOVR0 20H R0指向片内RAM数据串首地址MOVDPTR 2000H DPTR指向片外RAM数据串首地址MOVR7 32 最大数据长度32BytesLOOP0 MOVA R0XRLA 24H 判断是否为字符 JZLOOP1MOVA R0MOVX DPTR AINCR0INCDPTRDJNZR7 LOOP0LOOP1 RET 2020 3 4 12 程序中数据的表示形式 二进制数 末尾以字母B标识十进制数 末尾以字母D标识或将字母D省略 十六进制数 末尾以字母H标识 但应注意以字母A F开头时应在其前面加上数字 0 在C51语言程序中 前面加 0 x 标识 ASCII码 以单引号标识 如 AB 1245 2020 3 4 13 4 3汇编语言的伪指令与汇编 伪指令是由程序员发给汇编程序的命令 也称为汇编命令或汇编程序控制指令 只有在汇编前的源程序中才有伪指令 汇编后得到的目标程序 机器码 中没有与伪指令相应的机器代码 汇编程序能识别并对汇编过程进行某种控制的汇编命令 无对应的可执行目标码 用指令系统编写的汇编语言程序称为源程序 必须将其翻译成机器码 称为目标程序 单片机方可执行 源程序转换成目标程序的过程 是由通用计算机执行一种特定的翻译程序 称为汇编程序 自动完成的 这个翻译过程称为汇编 2020 3 4 14 4 3 1伪指令 起始地址设定ORG表达式向汇编程序说明下面紧接的程序段或数据段存放的起始地址 表达式常为16进制地址 可已定义的标号地址 源程序的开始 要设置一条ORG伪指令来指定该程序在存储器中存放的起始位置 省略ORG 则该程序段从0000H单元开始存放 可以多次使用ORG伪指令 但要求地址值由小到大依序排列 不允许空间重叠 2020 3 4 15 4 3 1伪指令 汇编结束END汇编程序遇到END伪指令后即结束汇编 2020 3 4 16 4 3 1伪指令 EQU赋值命令 字符名称 EQU 赋值项 赋值项 可以是常数 地址 标号或表达式 其值为8bits或16bits二进制数 赋值后的字符名称可以作立即数使用 也可以作地址使用 2020 3 4 17 4 3 1伪指令 DB定义字节命令 标号 DB 8bits数据表 1 8bits数据就是字节数据 可以是1字节常数或字符 或用单引号括起来的字符串 例如 DB Howareyou 2 把字符串中的字符按其ASCII码存于连续的程序存储器单元中 2020 3 4 18 4 3 1伪指令 DW定义字命令 标号 DW 16bits数据表 存放时 数据字的高8bits在前 低地址 低8bits在后 高地址 例如 DW AB 存入数据为41H 42HDW A 存入数据为00H 41H 2020 3 4 19 4 3 1伪指令 BIT位定义命令 字符名称 BIT 位地址 位地址 可以是绝对地址 也可以是符号地址 即位符号名称 例如 SDABITP1 0把P1 0的位地址赋给变量SDA 在其后的编程中 SDA就可以作为位地址P1 0使用 2020 3 4 20 4 3 2汇编语言的汇编 1 用一种计算机的汇编程序去汇编另一种计算机的源程序的汇编过程 被称为交叉汇编 2 单片机的源程序要经过交叉汇编才能获得目标程序 3 单片机源程序的编辑和交叉汇编 可以在单片机开发环境 如Keil Vision2 中完成 2020 3 4 21 子程序及其调用 子程序的调用对于通用性的问题 例如 数值转换 数值计算等 往往要进行多次 宜将其设计成子程序 1 子程序在执行时需要由其它程序来调用2 执行完后又需要把执行流程返回到调用的主程序 调用时注意 一是现场的保护和恢复 二是主程序与子程序的参数传递 2020 3 4 22 现场保护与恢复 子程序经常用到R0 R7 A DPTR 以及PSW等 而这些单元中的内容在调用结束后的主程序中仍有用 所以需要进行保护 即现场保护 在执行完子程序 返回继续执行主程序前恢复其原内容 称为现场恢复 保护与恢复的方法有以下两种 1 在主程序中实现 2 在子程序中实现 2020 3 4 23 参数传递 1 利用累加器或寄存器 2 先把子程序需要的数据送入A或指定的工作寄存器中 3 当子程序执行时 可从指定的单元中取得数据 执行运算 子程序也可以用同样的方法把结果传送给主程序 传递参数的方法有三种 2020 3 4 24 4 4汇编语言程序设计举例 算术运算程序数制转换程序定时程序查表程序数据极值查找程序 单片机程序设计举例 宜在软件开发环境 如Keil Vision2 中进行讲解 2020 3 4 25 4 4 1算术运算程序 多字节数的加 减运算注意 合理地运用进位 借位 标志不带符号的多字节数加法程序 例4 4设有两个4字节的二进制数 分别存放在片内以30H和50H为起始地址的单元中 先存放低字节 求这两个数的和 并将结果存入以30H为起始地址的单元中 2020 3 4 26 4 4 1算术运算程序 多字节数的加 减运算注意 合理地运用进位 借位 标志不带符号的两个多字节数的减法程序 例4 5设有两个N字节无符号数 分别存放在片内RAM单元中 低字节在前 高字节在后 由R0指定被减数单元地址 由R1指定减数单元地址 要求将差值存入原被减数单元中 假定最高字节没有借位 2020 3 4 27 不带符号的两个多字节数的减法程序 CLRCMOVR2 N 设定N字节LOOP MOVA R0 从低位取出被减数1个字节SUBBA R1 两位数相减MOV R0 A 保存差INCR0 修改指针INCR1DJNZR2 LOOP 没减完则继续RET 2020 3 4 28 4 4 1算术运算程序 多字节数的乘法 除法运算双字节无符号数乘法程序 例4 7假设被乘数存放于R6和R7中 乘数存放于R4和R5中 要求乘积存放于40H 43H单元中 低字节在前 2020 3 4 29 4 4 1算术运算程序 多字节数的乘法 除法运算计算机除法运算采用 左移被除数相除法 双字节无符号数除法程序 例4 8假设被除数存放于40H 41H中 除数存放于44H 45H中 要求将商存放于40H 41H单元中 余数存放于42H 43H单元中 低字节在前 2020 3 4 30 4 4 2数制转换程序 十六进制数转换成ASCII码的程序 例4 9在片内RAM20H单元中 存放有2位十六进制数 将其转换成ASCII码 并存放于21H和22H两个单元中 程序如下 2020 3 4 31 MOVSP 3FHTRAN PUSH20H 十六进制数进栈LCALLHASC 调用转换子程序POP21H 第一位转换结果送21H单元SWAPA 高低半字节交换PUSHACC 交换后的十六进制数进栈LCALLHASC POP22H 第二位转换结果送22H单元RETHASC DECSP 跨过断点保护对象DECSPPOPACC 弹出转换数据ANLA 0FH 屏蔽高4位ADDA 7 修改变址寄存器内容MOVCA A PC 查表PUSHACC 查表结果进栈INCSP 修改堆栈指针回到断点保护内容INCSPRETASCTAB DB 0123456789ABCDEF ASCII码表 2020 3 4 32 4 4 2数制转换程序 ASCII码转换成十六进制数的程序 例4 10将片外RAM30H 3FH单元中的ASCII码依次转换成十六进制数 并存入片内RAM的60H 67H单元中 程序如下 2020 3 4 33 TRANST MOVR0 30H 设置ASCII码地址指针MOVR1 60H 设置十六进制数地址指针MOVR7 8 需拼装的十六进制数的个数LOOP1 LCALLTRAN 调用转换子程序SWAPAMOV R1 A 存于内部RAMINCR0LCALLTRANXCHDA R1 十六制数拼装INCR0INCR1DJNZR7 LOOP1RETTRAN CLRCMOVXA R0 取ASCII码SUBBA 30H 减去30HCJNEA 10 LOOP2SJMPLOOP3LOOP2 JCDONELOOP3 SUBBA 7 想一想为什么要减去7DONE RET 2020 3 4 34 4 4 3定时程序 单循环定时程序 MOVR7 timeLOOP NOPNOPDJNZR7 LOOPRETNOP指令的机器周期为1 DJNZ指令的机器周期为2 则一次循环共4个机器周期 如果单片机的晶振频率为6MHz 则一个机器周期是2 S 所以一次循环的延迟时间为8 S 定时程序的延迟时间是循环程序段执行时间的整数倍 该程序的延迟时间为8 time S 这个程序的最长延迟时间为2048 S 2020 3 4 35 4 4 3定时程序 较长时间的定时程序 MOVR7 time1LOOP1 MOVR6 time2LOOP2 NOPNOPDJNZR6 LOOP2DJNZR7 LOOP1RET为了加长定时时间 通常采用多重循环的方法 如下面的双重循环定时程序 最长可延时262914个机器周期 即525828 S或大约526mS 设晶振频率为6MHz 2020 3 4 36 4 4 4查表程序 2条查表指令 MOVCA A DPTRMOVCA A PC这两个MOVC指令的功能是完全相同的 它们在不改变DPTR和PC的状态下 只根据A的内容就可以取出表格中的数据 但这两条指令在具体使用上也存在差异 前一条指令的基址寄存器DPTR能提供16bits基址 而且还能在使用前给DPTR赋值 查表空间可达64KB 后一条指令是以PC作为基址寄存器 虽然也能提供16bits地址 但PC不能被赋值 所以其基址值是固定的 由于A的内容为8bits无符号数 所以只能在当前指令下面的256个地址单元内进行查表 即数据只能放在该指令后面的256个地址单元之内 而且表格只能被程序段所使用 2020 3 4 37 例4 11设有一个巡回检测报警装置 需要对16路输入值进行比较 当每一路输入值等于或超过该路的报警值时 实现报警 下面根据这一要求 编制一个查表程序 设Xi为路数 查表是Xi按0 1 2 15取路数 表中报警值是2字节数 依Xi顺序列成表格 放在TAB中 进入查表程序之前 路数Xi放在R2中 其输入值存于R0 R1中 查表结果若允许报警 将P1 0置1 否则清0 程序如下 2020 3 4 38 TB1 MOVA R2 取路数XiADDA R2MOVR2 AMOVDPTR TAB 取数据表首地址MOVCA A DPTR 查表取出高字节MOVR4 A 高字节送R4INCR2MOVA R2MOVCA A DPTR 查表取出低字节MOVR3 A 低字节送R3CLRCMOVA R0 当前输入值与报警值比较SUBBA R3MOVA R1SUBBA R4JNCLOOPCLRP1 0RETLOOP SETBP1 0RETTAB DW05F0H 0E89H 0A69H 1EAAHDW0D9BH 7F93H 0373H 26D7HDW2710H 9E3FH 1A66H 22E3HDW1174H 16EFH 33E4H 6CA0HEND 2020 3 4 39 程序编制的方法和技巧 程序编制的步骤 一 预完成任务的分析 功能要求技术指标硬件资源和工作环境 二 进行算法的优化 速度内存使用 2020 3 4 40 程序编制的步骤 三 程序总体设计及流程图绘制 清晰的流程图是正确编制应用程序的基础和条件 是一个良好的编程习惯 总流程图 程序的逻辑结构 各程序模块间的相互关系 局部流程图 程序模块的具体实施细节 2020 3 4 41 开始 结束 判断分支 程序流向 工作任务 程序连接 程序流向 常用的流程图符号 2020 3 4 42 编制程序的方法和技巧 一 采用模块化程序设计方法 主程序 子程序如 发送 接收 延时 打印和显示等 模块化的优点 便于程序设计和调试便于程序优化和分工提高程序阅读性和可靠性 2020 3 4 43 编制程序的方法和技巧 二 尽量采用循环结构和子程序 长度减小 内存空间减少 避免 死循环 注意循环初值和结束条件 子程序用到的寄存器内容应压栈保护 并注意堆栈操作的压入和弹出的平衡 中断处理子程序除了要保护程序中用到的寄存器外 还应保护标志寄存器 2020 3 4 44 4 5C51高级语言程序设计 C51的标识符与关键字C51语言的数据类型C51变量的存储种类和存储器类型C51的运算符和表达式C51语言的基本语句C51函数C51语言与汇编语言混合编程的方法编写C51语言应用程序的基本原则C51高级语言程序设计举例 2020 3 4 45 4 5 1C51的标识符与关键字 标识符标识符由字母 数字 下划线等组成 第一个字符必须是字母或下划线 说明 1 标识符用来标识源程序中某个对象的名字 这些对象可以是语句 数据类型 函数 变量 数组等 2 C51语言是一种区分大小写的高级语言 3 C51语言中有一些库函数的标识符是以下划线开头的 所以编程者一般不要以下划线开头来命名标识符 4 在C51编译器中 只支持标识符的前32个字符为有效标识 2020 3 4 46 4 5 1C51的标识符与关键字 关键字关键字是编程语言保留的特殊标识符 它们具有固定名称和含义 在程序编写过程中不允许将关键字另做它用 说明 1 在C51语言中 除了有ANSIC标准的32个关键字以外 还根据单片机的特点扩展了相关的关键字 2 在C51语言的文本编辑中编写C51语言程序时 系统可以把关键字用不同的颜色显示 3 表4 1按用途列出了标准C语言ANSIC的关键字 4 表4 2列出了C51编译器扩展的关键字 2020 3 4 47 4 5 2C51语言的数据类型 数据类型数据是MCS 51单片机操作的对象 是具有一定格式的数字或数值 数据的不同格式就称为数据类型 数据按照一定的数据类型进行排列 组合和架构后称为数据结构 说明 C51语言与标准C语言的数据类型基本相同 但增设了位型 取消了布尔型 大体可以分为基本数据类型 构造数据类型 指针类型 空类型 其实 两者的使用方法基本类似 C51语言的数据类型如表4 3所示 2020 3 4 48 表4 3C51语言的数据类型 2020 3 4 49 4 5 3C51变量的存储种类和存储器类型 变量变量是一种在程序执行过程中 其值可以改变的量 C51语言规定 变量必须先定义后使用 对变量进行定义的格式如下 存储种类 数据类型 存储器类型 变量名表 说明 每个变量都有一个变量名 在内存中占据一定的存储单元 地址 并在该内存单元中存放该变量的值 变量名应符合标识符的要求 各变量名之间用逗号 分隔 从而构成变量名表 2020 3 4 50 变量的存储种类存储种类是指变量在程序执行过程中的作用范围 变量的存储种类有4种 autoexternstaticregister 2020 3 4 51 变量的存储器类型存储器类型和存储种类是完全不同的概念 存储种类是指变量在程序执行过程中的作用范围 而存储器类型指明该变量所处的单片机内存空间 C51编译器能识别以下存储器类型 如表4 4所示 2020 3 4 52 表4 4C51编译器能识别的存储器类型 2020 3 4 53 存储模式C51编译器允许采用3种存储模式 小编译模式Small 紧凑编译模式Compact 大编译模式Large 存储模式确定了变量在内存中的地址空间 在Small模式下 变量存放在单片机的内部RAM中 在Compact模式和Large模式下 变量存放在单片机外部RAM中 在Small模式下 未说明变量的存储器类型时 该变量被默认存放到data区 存储模式的软件定义实例如下 pragmasmall small模式下 变量的存储器类型为片内直接寻址RAM区 2020 3 4 54 4 5 4C51的运算符和表达式 运算符运算符是完成某种特定运算的符号 按照需要运算对象的多少 运算符分为单目运算符 双目运算符 三目运算符 分别需要1 2 3个运算对象 表达式表达式是由运算符和运算对象所组成的具有特定含义的式子 C51语言是一种表达式语言 在表达式后面加分号 就构成了一个表达式语句 2020 3 4 55 运算符 1 赋值运算符赋值运算符 的功能是给变量赋值 利用赋值运算符将一个变量与一个常数或表达式连接起来的式子称为赋值表达式 在赋值表达式的后面加分号 就构成了赋值语句 a 0 xa8 语句功能为将常数0 xa8赋给变量a 2020 3 4 56 运算符 2 算术运算符C51的算术运算符有以下5个 其中 只有取正运算符和取负运算符是单目运算符 其他的是双目运算符 加或取正运算符 减或取负运算符 乘运算符 除运算符 模 取余 运算符例如8 5 3 即8除以5的余数是3 2020 3 4 57 运算符 3 关系运算符C51的关系运算符有以下6个 大于 大于等于 小于等于 测试等于 测试不等于 2020 3 4 58 运算符 4 逻辑运算符C51的逻辑运算符有以下3个 逻辑与 格式 条件式1 条件式2只有当条件式1和条件式2都为真时 该逻辑表达式的值才为1 否则为0 逻辑或 格式 条件式1 条件式2只要条件式1和条件式2中 有一个为真时 该逻辑表达式的值就为1 否则为0 逻辑非 格式 条件式将条件式的结果取反 条件式为真时 该逻辑表达式的值为0 条件式为假时 该逻辑表达式的值为1 2020 3 4 59 运算符 5 位运算符C51的位运算符有以下6个 按位与 按位或 按位异或 按位取反 右移 2020 3 4 60 运算符 6 复合运算符双目运算符与赋值运算符 一起组成复合赋值运算符 称为复合运算符 C51的复合运算符有11个 加运算并赋值 减运算并赋值 乘运算并赋值 除运算并赋值 取余运算并赋值 右移并赋值 按位与并赋值 按位或并赋值 按位异或并赋值 按位取反并赋值 2020 3 4 61 运算符 7 指针和地址运算符取内容和取地址运算的一般形式为 变量 指针变量指针变量 目标变量 2020 3 4 62 运算符 自增减运算符自增减运算符的作用是使变量值自动加1或减1 例如 m m在使用变量m之前 先使变量m值加 减 1 m m 在使用变量m之后 再使变量m值加 减 1 2020 3 4 63 4 5 5C51语言的基本语句 语句的概念C51语言的语句用来向计算机系统发出操作指令 C51语句是以分号 作为标志的 C51语言是一种结构化编程语言 C51语言的语句主要用来实现顺序结构 选择结构 循环结构 2020 3 4 64 控制语句 if else 条件语句for 循环语句while 循环语句do while 循环语句continue结束本次循环的语句break中止执行开关语句switch或循环的语句switch case多分支选择语句goto无条件转向语句return函数返回语句 2020 3 4 65 空语句 即只有一个分号 的语句 空语句什么也不做 C51语言程序中的语句以分号为标志 如果一个语句少了分号 则编译器会提示出现语法错误 而语句多了分号 编译器认为是一个空语句 运行并不会出错 系统将绕过它执行下面的语句 2020 3 4 66 表达式语句 表达式后面加上分号就构成一个表达式语句 例如 函数调用语句是表达式语句之一 2020 3 4 67 复合语句 可以把多条语句用花括号 括起来 就构成了复合语句 多用于if for等语句中 从语法的角度看 复合语句可以视为1条语句 2020 3 4 68 选择结构 C51语言中 提供if语句和switch语句两种选择结构 一般来说 if语句适用于二选一 switch语句适用于多选一 2020 3 4 69 if语句 3种基本格式 格式1 if 表达式 语句 格式2 if 表达式 语句1else语句2 格式3 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 else语句n注意 在if语句中 如果需要执行的语句不止1条 要用花括号 组合成复合语句 在if语句的选择结构中 else子句与最靠近它的if配对 但是用花括号 可以改变配对 2020 3 4 70 例4 14输入3个数 找出其中最小数 程序如下 includemain intx y z min printf inputx y z scanf d d d 2020 3 4 71 switch语句 switch case常量表达式1 语句1break case常量表达式2 语句2break case常量表达式n 语句nbreak default 语句n 1 对于switch语句 需要注意3点 常量表达式 的值必须是整型 字符型 枚举类型 break语句用于跳出switch语句 在switch语句中 多个case语句可以共用一个执行语句 也可以每个case语句用一个相同的执行语句 从而达到相同的执行结果 2020 3 4 72 循环结构 C51语言提供3种循环语句结构 for循环while循环do while循环 2020 3 4 73 for循环 格式 for 表达式1 表达式2 表达式3 循环体语句执行过程如下 求解表达式1 求解表达式2 若其值为真 则执行for后面的循环体语句 如果是复合语句 那么执行完整个复合语句 如果不是复合语句 只执行for后面的1条语句 求解表达式2 若其值为假 那么跳过for循环语句 求解表达式3 转到第 步 继续执行 直到表达式2的值为假时结束循环 2020 3 4 74 例4 15求1到100的整数的和 for循环语句实现的程序如下 unsignedintsum1to100 void unsignedintn sum sum 0 for n 1 n 100 n sum sum n return sum 2020 3 4 75 while循环 格式 while 表达式 循环体语句执行过程如下 表达式是循环能否执行的条件 为真时执行循环体语句 为假时退出while循环 在循环体语句中 应该有使循环最终能结束的语句 否则是无限循环 循环体如果包含1个以上的语句 应该用花括号 括起来 以复合语句形式出现 如果不加花括号 则while语句的范围只到while后面的第一个分号 处 2020 3 4 76 例4 16求1到100的整数的和 while循环语句实现的程序如下 unsignedintn sum sum 0 while n 100 sum sum n n 2020 3 4 77 do while循环 格式 do循环体语句while 表达式 执行过程如下 先执行1次循环体语句 当表达式的值为非0时 返回第 步继续执行循环体语句 如此反复 直到表达式的值等于0时 循环结束 2020 3 4 78 4 5 6C51函数 函数的概念 函数 与汇编语言中的 子程序 过程 的意义相同 是按照一定格式编写的完成一定功能的代码段 在构成C51语言程序的若干个函数中 必有一个是主函数main C51语言程序的执行从主函数main 开始 主函数main 可以根据需要来调用函数 当函数执行完时 就发出返回指令 return 而主函数用其后面的指令来恢复主程序流的继续执行 函数在使用前要先定义 2020 3 4 79 函数的定义 概念 创建函数称为函数的定义 函数定义的过程就是给出函数原型 functionprototype 无参函数的定义返回值数据类型标识符函数名 函数体语句 有参函数的定义返回值数据类型标识符函数名 形式参数列表 形式参数说明 函数体语句 2020 3 4 80 函数的定义 空函数的定义返回值数据类型标识符函数名 说明 空函数被调用时 CPU什么也不做 定义空函数的目的不是为了执行某种操作 而是为了以后程序功能的扩充 在一个复杂的C程序设计之初 往往只将最基本的功能模块的函数编写好 而将非基本功能模块的函数用空函数先占好位置 以后再用编写好的函数代替它 这样做 程序的结构清晰 可读性好 以后扩充新功能也方便 2020 3 4 81 函数的定义 中断函数的定义返回值数据类型标识符函数名 形式参数列表 interruptn usingm 中断服务程序语句体 说明 中断函数由单片机中断系统自动调用 用户在主程序或函数中 不能调用中断函数 关键字interrupt后面的n是中断号 n的取值范围为0 31 C51编译器从8n 3处产生中断矢量 89S51单片机的中断源 中断号 中断矢量的关系如表4 5所示 2020 3 4 82 表4 589S51的中断源 中断号 中断矢量 2020 3 4 83 函数的调用 函数调用的一般形式为 函数名 实际参数列表 说明 如果被调用函数是有参函数 则主调函数必须把被调用函数所需的参数传递给被调用函数 传递给被调用函数的数据称为实际参数 简称实参 2020 3 4 84 函数的调用 具体来说 函数调用有3种形式 函数调用语句例如 print message 函数值作为表达式的一个运算对象例如 result 8 max a b 函数参数被调用函数作为另一个函数的实际参数 例如 m min a max u v 2020 3 4 85 4 5 7C51语言与汇编语言混合编程的方法 主要介绍C51语言程序如何调用汇编语言程序的方法 在C51语言和汇编语言混合编程中 必须约定两个规则 即函数命名规则和参数传递规则 2020 3 4 86 函数命名规则 表4 6函数名的转换规则 2020 3 4 87 参数传递规则 表4 7在汇编语言中接收函数输入参数的寄存器 2020 3 4 88 参数传递规则 表4 8函数返回值数据类型与寄存器的对照表 2020 3 4 89 例4 18能被C51语言程序调用的汇编语言子程序实例 在C51语言中 该汇编语言子程序称为函数 函数名为clrmem 该函数不传递参数 NAMECLRMEM 汇编语言子程序名称为CLRMEM PR CLRMEM CLRMEMSEGMENTCODE 存储区声明为代码区CODEPUBLICCLRMEM 输出函数名RSEG PR CLRMEM CLRMEM 该函数可被链接器放置在任何地方 程序功能 内存RAM区清0 入口参数 无 出口参数 无 CLRMEM MOVR0 7FHCLRALOOP MOV R0 ADJNZR0 LOOPRETEND 2020 3 4 90 4 5 8编写C51语言应用程序的基本原则 采用清晰的书写方法采用模块化的程序设计方法一个C语言函数就可以认为是一个模块采用预处理命令的方式定义常数优化算法提高程序执行效率 2020 3 4 91 4 5 8C51高级语言程序设计举例 例4 19单片机点对点双机串行通信 图4 2单片机点对点的双机串行通信 2020 3 4 92 不妨以串行口工作方式1进行双机串行通信 其中一个单片机发送信息 另一个单片机接收信息 通信波特率为1200bps 假设双机的晶振频率为11 0592MHz 下面为了叙述的方便 不妨设甲机发送 乙机接收 为了保证通信的准确与畅通 双机之间应遵循一些约定 通信开始 甲机发送信号 AA 乙机接收到该信号后应答 BB 表示同意接收数据 甲机收到 BB 后 即可发送数据 设发送数据块长度为10Bytes 数据缓冲区为buffer 数据发送完毕后 要立即发送校验和 乙机收到的数据存储到乙机的数据缓冲区buffer 收齐一个数据块后 再接收甲机发送来的校验和 并将接收到的校验和与乙机根据接收到的数据而计算得到的校验和进行比较 若相等 说明通信完成 乙机回答 00 若比较不相等 说明接收不正确 乙机回答 FF 以示要求甲机重新发送数据 定时器 计数器T1作为波特率发生器使用 运行在定时工作方式2 并且波特率不培增即SMOD 0 经计算可得出T1初值为0E8H 2020 3 4 93 以下为双机串行通信程序 该程序可以在甲机 乙机中运行 需要注意的是 如果为发送方 则在源程序中将常量Select TR定义为1 如果为接收方 则定义为0 程序中主函数main 根据常量Select TR的设置 调用发送函数send 和接收函数receive 分别实现发送数据和接收数据的功能 include defineucharunsignedchar defineSelect TR1 Select TR 1时接收数据 Select TR 0时发送数据ucharidatabuffer 10 定义全局变量uchardatacheak sum voidserial initialize void 函数声明voidsend ucharidata data buffer voidreceive ucharidata data buffer main serial initialize 串行口初始化if Select TR 0 send buffer 发送数据else receive buffer 接收数据 2020 3 4 94 串行口初始化函数原型 voidser

温馨提示

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

评论

0/150

提交评论