单片机原理及应用.ppt_第1页
单片机原理及应用.ppt_第2页
单片机原理及应用.ppt_第3页
单片机原理及应用.ppt_第4页
单片机原理及应用.ppt_第5页
已阅读5页,还剩166页未读 继续免费阅读

下载本文档

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

文档简介

第章汇编语言程序设计 本章内容 SingleChipMicrocomputer 4 0概述 4 2运算程序设计 4 3数据的拆拼和转换 4 1循环程序设计 4 5查表程序 4 6散转程序设计 4 7I O端口控制程序 4 8子程序调用时的参数传递 概述 最早人们只能用机器语言 二进制 编写程序 为了方便记忆 人们开始用助记符形式的汇编语言编写程序 称为低级语言 然后再用汇编系统将其翻译成机器语言 该过程称为汇编 为了用更接近人的语言编写程序 程序设计师们发明了高级语言 如 BASIC FORTRAN PASCAL C JAVA然后再用编译系统将其翻译成机器语言 该过程称为编译 机器只能识别机器语言 所以必须用编译系统将高级语言编写的源程序编译成机器语言 用汇编系统将用汇编语言编写的源程序汇编成机器语言 由低级或高级语言构成的程序称为源程序 由机器语言构成的程序称作目标程序 一 设计语言 源程序目标程序 低级语言 机器语言 汇编 高级语言 机器语言 编译 二 程序设计方法 一 程序设计 利用计算机能够接受的语言把解决问题的方法和步骤描述出来 也就是编制计算机的程序 人们常说的软件设计 对于单片机应用程序 我们可以把它看成是操作系统和应用软件的集合 二 程序设计步骤 用汇编语言编写一个程序的过程大致可分为以下几个步骤 1 分析问题 明确所要解决问题的具体要求 2 确定算法 根据实际问题的要求和指令系统的特点 决定所要采用的计算公式和计算方法 这就是常说的算法 算法是进行程序设计的依据 它决定了程序的正确性和程序的质量 3 制定程序框图 根据算法 制定出运算步骤的顺序 再把运算过程画成流程图 4 确定数据格式 分配工作单元 将程序框图进一步细化 5 根据流程图和指令系统 编写出汇编语言源程序 6 程序测试 由于单片机没有自开发功能 因而必须借助仿真器 以单步 断点 连续方式调试程序 直到完全正确为止 特别地 对于有硬件的应用系统 必须将软件和硬件结合起来调试 直到软件 硬件能协调一致 浑然一体为止 7 程序优化 这一环节很容易被广大设计人员所忽略 它是指从程序结构上对程序加以调整 精减一些冗余指令 以加快程序的执行速度 节省程序存储空间 从而提高系统的可靠性 三 程序设计实例引入 实例假设一个班有50个人 共有3门选修课 计算机算法服装CAD设计德语请找出 同时选了三门课的同学 问题的解决 第一步如何在计算机中表示选修某门课的所有同学 选修这门人数 学生的学号 这个过程实际上是设计数据结构的问题 问题的解决 第二步设计思路 找出同时选了三门课的同学 这个过程实际上是设计算法的过程 既构建模型 重复该过程 第三步 设计流程 几点启示 整体构思 构建整体流程框图 结构合理 流程清晰 简单明了 局部模块化 为什么要用流程图 符合人进行逻辑思考的习惯计算机从根本上来说 没有任何逻辑性 所以 你必须告诉它 先做什么 后做什么 遇到什么情况又该做什么 等等流程图设计本身是一个逐步求精的过程 最终将任务划分为若干能由机器指令实现的小模块 4 1循环程序设计 一 循环程序结构 开始 N 结束 Y 在单片机应用程序设计中 循环程序的使用非常广泛 单循环的结构如下图所示 其主体为循环体 由循环工作部分和修改控制变量构成 同其他语言一样 循环程序可以实现嵌套 构成多重循环 但切不可形成交叉 只能将整个循环程序作为外循环的循环体 二 循环程序设计举例 例1 延时程序设计 DELAY MOVR7 200 1个机器周期DE1 MOVR6 123 1NOP 1DE2 DJNZR6 DE2 2DJNZR7 DE1 2RET 2 如晶体振荡器频率为12MHz 则其延时时间为 1 1 1 2 123 2 200 2 50 003ms这是一个50ms的精确延时程序 DELAY ASM 在RAM中 从50H开始连续存放N个单字节无符号数 N存放的R2中 试编程求这N个数的和 结果放在R4R3中 程序清单如下 NSUM MOVR0 50HLOOP MOVA R3ADDA R0MOVR3 ACLRAADDCA R4MOVR4 AINCR0DJNZR2 LOOPRET 例2 数据求和 4 2运算程序设计 一 多字节加法 例4 3 1设有两个4字节的二进制数2F5BA7C3H和14DF35B8H 分别放在以40H和50H为起始地址的单元中 低位在低地址 试编程求这个数之和 结果放在以40H为起始地址的单元中 ORG0000HLJMPJAFAORG0100HJAFA MOVR0 40HMOVR1 50HMOVR2 04HLCALLJASUBLJMP 以上为主程序 JASUB CLRCJASUB1 MOVA R0ADDCA R1MOV R0 AINCR0INCR1DJNZR2 JASUB1RETEND MULADD ASM ADDCA RnADDCA directADDCA RiADDCA data 本程序适合于N个字节的两数求和 但并不严密 当最后一次加法有进位时并没有相应处理 实际应用时应根据实际情况稍作修改 例2 有两组BCD码分别存放在23H 22H单元和33H 32H单元 求它们的和并送入43H 42H单元中去 高位在前 低位在后 分析 0011 1000 0110 0101 0001 0001 1000 0111 BCD码83H BCD码11H 补 多字节BCD码加法 例2 有两组BCD码 如 1183H和5678H 分别存放在23H 22H单元和33H 32H单元 求它们的和 并送入43H 42H单元中去 高位在前 低位在后 解 流程图 框图 如何 请同学们自己绘制流程图 ORG0000HMOVA 22HADDA 32HDAAMOV42H AMOVA 23HADDCA 33HDAAMOV43H ASJMP END 此条加法指令可否改用带进位的 ADDC ORG2000HCLRCMOVA 22HADDA 32HDAAMOV42H AMOVA 23HADDCA 33HDAAMOV43H AEND 10000011 01010110 00010001 01111000 10000011 01111000 11111011 01100001 00010001 01010110 01100111 01101000 PC PC PC PC PC PC PC PC PC 11111011 01100001 PC 01101000 PC 01100111 多字节BCD码加法 与多字节加法程序类似 但需在加法指令后加一条十进制加法调整指令 主程序与前面相同 DADD CLRCJAD1 MOVA R0ADDCA R1DAAMOV R0 AINCR0INCR1DJNZR2 JAD1RET ORG0000HLJMPJABCDORG0100HJABCD MOVR0 40HMOVR1 50HMOVR2 04HLCALLDADDLJMP 以上为主程序 BCDADD ASM 二 多字节减法 多字节减法程序和多字节加法程序类似 只需将加法指令换为减法指令即可 例4 3 2在43H 40H依次存放被减数443ADD7BH 在53H 50H中依次存放减数14DF35B8H 试编程求二者之差 ORG0000HLJMPJIANORG0100HJIAN MOVR0 40HMOVR1 50HMOVR2 04HLCALLJIANSUBLJMP 以上为主程序 JIANSUB CLRCJIAN1 MOVA R0SUBBA R1MOV R0 AINCR0INCR1DJNZR2 JIAN1RETEND此程序也可以推广到N个字节的情况 四 多字节数乘法 MCS 51系列单片机指令系统仅能提供8位乘法指令若需进行8位以上的乘法运算 则需通过编程实现 设 R4 R3 中为十六位被乘数 R2中为8位乘数 其积存放在R7R6R5中 由于 R4 R3 R2 R4 256 R3 R2 R4 R2 256 R3 R2 R4 R2 256 R3 R2 CHENFA MOVA R2MOVB R3MULAB R3 R2 MOVR5 AMOVR6 BMOVA R2MOVB R4MULAB R2 R4 ADDA R6MOVR6 AMOVA BADDCA 00HMOVR7 ARET 五 多字节除法 51指令系统提供一条8位的除法指令 但要想用于多位除法运算则较为困难 因此 在进行多字节除法运算时 多采用手工算法相同的思路 被除数 除数 商数 除数 除数 除数 够减则商1 否则商0 够减则商1 否则商0并恢复余数 够减则商1 否则商0并恢复余数 以上为右移对齐的手工算法 计算机的算法仍采用这种方法 只不过是采用左移对齐的办法 称为 恢复余数法 被除数 除数 除法次数 R7 程序清单 DSUB MOVR7 08HDV1 CLRCMOVA R5RLCAMOVR5 AMOVA R6RLCA 被除数左移1位MOV07H CCLRCSUBBA R2JB07H GOU 07H 1 则够减JNCGOU C 0 则够减ADDA R2 恢复余数 AJMPDV2GOU INCR5 商1DV2 MOVR6 A 保存余数DJNZR7 DV1RET 本程序仅适用于商小于255的情况 即R6 R2 若商大于255 必须加以适当调整 本程序关键在于商只有 0 或 1 两种情况 因此 每次商 1 均采用左移后加1的方法来实现 4 3数据的拆拼和转换 在实际应用中 经常会遇到实际需要的数据格式同得到的数据格式不完全相符的情况 如采集到的数据 运算的结果 输出的数据等 这就需要对其进行适当的转换 以符合实际情况的要求 这就是通常所说的数据拆拼和转换 一 数据的拆拼 BBCD MOVA 7CHANLA 0FHMOVR5 AMOVA 7CH ANLA 0F0HSWAPAMOVR6 ARET 程序清单 例4 4 2拆拼前 20H X7X6X5X4X3X2X1X0拆拼后 21H X0X1X2X3X4X5X6X7 DESORT MOVA 20HMOVR6 AMOVR7 08HRESO CLRCMOVA R6RLCAMOVR6 AMOVA 21HRRCAMOV21H ADJNZR7 RESORET 补充内容 例1 将20H单元的两个压缩BCD码拆开变成ASCII码 存入21H 22H单元 假设20H中的BCD码为00110100 什么是BCD码 什么是ASII码 BCD码与ASII码关系 0011 压缩BCD码 0011 0011 0100 低四位ASII码 高四位ASII码 压缩BCD码拆开变成ASCII码 二进制与ASCII码的相互关系为 数字0 9对应的ASCII码为30H 39H 即加30H字母A F对应的ASCII码为41H 46H 即加37H 方法1 将BCD码除以10H 恰好是将BCD码分别移到了A B的低4位 然后再各自与30H相或 即成为ASCII码 方法2 利用半字节交换指令来实现 ORG0000HMOVA 20HMOVB 10HDIVABORLB 30HMOV22H BORLA 30HMOV21H ASJMP 简单程序例1 方法1 源程序如下 0011 0100 PC PC PC 00110100 00010000 PC 0011 0000 00000100 PC 00110100 PC PC PC 0011 PC ORG0000HMOVR0 20HMOVA 30HXCHDA R0MOV22H AMOVA R0SWAPAORLA 30HMOV21H ASJMP 简单程序例1 方法2 PC PC PC PC PC PC PC PC PC 源程序如下 0011 00100000 0011 0100 0000 0100 0011 0100 0011 0000 0011 0000 0011 PC 0011 二 数据的转换 在计算机内部 任何数据都是以二进制的形式存储 但是 当我们在作I O操作时 往往需要其它形式的数据格式 如ASCII码 BCD码 八进制数等 这就需要做一些数据格式的互换操作 1 ASCII码到二进制数的相互转换 二进制与ASCII码的相互关系为 数字0 9对应的ASCII码为30H 39H 即加30H字母A F对应的ASCII码为41H 46H 即加37H 1 ASCII到二进制的转换通过以上介绍的二者之间的关系 不难画出流程图 ASCTOHEX MOVA R2CLRCSUBBA 30HMOVR2 ACJNEA 0AH NEXTNEXT JCTOKSUBBA 07HTOK MOVR2 ARET 例4 4 3转换前R2为ASCII码 转换后R2为二进制 2 二进制到ASCII码 HEXTOASCII MOVA R2ANLA 0FHADDA 90HDAA 若R2 9 则加66H 且产生CyADDCA 40HDAAMOVR2 ARET 例4 4 4转换前R2为二进制 转换后R2为ASCII码 当二进制数 0AH时 加30H即得相应的ASCII 当二进制数介于0AH 0FH之间 包括0AH 0FH 则加37H即得到相应的ASCII 下例为另一算法 2 BCD码与二进制的相互转换 1 BCD到二进制的转换 3615 3 103 6 102 1 10 5 3 10 6 10 1 10 5 由压缩BCD码到非压缩BCD码的转换较为简单 在前面我们已经涉及 在此不再重复 例4 4 5如下图所示 非压缩BCD码 1FH 0EH R3 R2 二进制数 3615 3 103 6 102 1 10 5 3 10 6 10 1 10 5 R3R2 R0 MOVR0 43H 指向高位MOVR3 00H 结果单元清零MOVA R0MOVR2 A 转换初值送R2ML10 MOVA R2MOVB 0AHMULAB R2乘10MOVR2 A 暂存R2 10低位MOVA BXCHA R3 暂存R2 10高位MOVB 0AHMULAB R3 10ADDA R3 R3 10低位加MOVR3 A 为什么不处理B BCDHEX MOVR7 03H 计数初值 MOVA R0ADDA R2 结果与低单元相加MOVR2 AMOVA R3ADDCA 00H 加低位进位位MOVR3 A 保存结果DJNZR7 ML10RET 由于二位压缩BCD码的表示范围为0 9999 其对应二进制为0 270H 不会超过两个字节 因而不必考虑R3 10的高位 JAFA DECR0 指向下一位 例4 4 6如下图所示 2 二进制到BCD的转换 自学 如上图所示 双字节二进制数的表示范围为0 65535 因而需要5个BCD码位来表示 从二进制到BCD码 我们采用连减的办法 其原理如下 待转换的二进制数 104 不够减 恢复余数 再减103 以此类推 直到得到个位为止 104 2710H103 03E8H102 0064H10 0AH BBCD MOVR0 44H 数据指针MOVR7 04H 计数初值MOVDPTR PWTABMOVR6 00H 偏移量BBC1 MOVA R6MOVCA A DPTRMOVR4 A 查幂值表低位INCR6MOVA R6MOVCA A DPTRMOVR5 A 查幂值高位INCR6MOV R0 00H MOVA R2SUBBA R4 减低位MOVR2 AMOVA R3SUBBA R5 减高位MOVR3 AJCBBC3 不够减则恢复余数INC R0 够减则结果单元加1SJMPBBC2BBC3 MOVA R2ADDA R4 恢复余数低位MOVR2 AMOVA R3ADDCA R5 恢复余数高位MOVR3 A BBC2 CLRC DJNZR7 BBC1 未减完则继续MOVA R2MOV R0 A 保存个位RETPWTAB DB10H 27H 10000DB0E8H 03H 1000DB64H 00H 100DB0AH 00H 10 DECR0 指向下一单元 4 5查表程序 查表程序中一种常用的非数值运算程序 应用非常广泛 使用查表程序可以完成数据的补偿 计算 转换等各种功能 具有程序简单 执行速度快 精度高等优点 而这正是单片机在测控场合或智能化仪表中所需要的 一 以DPTR为基地址的查表程序 MOVCA A DPTR1 其操作步骤如下 初始化DPTR 将表格的首地址放入DPTR中 作为基地址 初始化ACC A中应该放所要查询的数据在表格中的顺序号 执行结果 在执行该指令后 A中存放的是在表格中查到的数据 注意事项 在查询表格时 若所要查询的数据是双字节的 则在初始化A中的数应为顺序号的2倍 且应执行两次本指令 对于单字节表格而言 表项的个数应不大于256个 若大于256时 则应适当修改DPTR的值 表格的存放位置 二 以PC为基地址的查表指令 MOVCA A PC表格存放地址 PC 偏移量 X 表项 1 操作步骤 1 将待查表的项数送给ACC 2 叠加偏移量 表头和当前PC的地址偏移量加到表项上 3 执行结果 2 注意事项 1 对于双字节表格 其处理方法与以DPTR为基地址的情况相同 2 对于单字节表格而言 其项数应不大于256 3 对于双字节表格而言 其项数应不大于128 三 两种方式的比较 1 PC仅能对所谓本地表格操作 即表格项数不得大于256 且偏移量可能随程序的变化而变化 计算较为麻烦 其优点是少用寄存器 2 DPTR使用起来非常灵活 表项数不受限制 且表格可以放在64K的任意地方 例4 5 1 设有一个巡回检测报警系统需对16路输入值进行比较 当每一路输入值超过该路的报警值时实现报警 函数Y的内存地址 函数表首地址 X 2 查表前 路数Xi在R2中 查表后的值存放在 R4R3 中 查表程序清单 TB1 MOVA R2ADDA R2 路数Xi 2 AMOVR3 A 保存ADDA data data MOVCA A PC 1XCHA R3 1ADDA data 1 2 data MOVCA A PC 1MOVR4 A 1RET 1TAB1 DW05F0H 0E89H 0A695H 1EAAHDW0D9BH 7F93H 0373H 26D7HDW2710H 9E3FH 1A66H 22E3HDW1174H 16EFH 33E4H 6CA0H 例4 5 2 自学 在一个温度测量装置中 测出的电压与温度为非线性关系 设测得的电压为X 用10位二进制数表示 现要求采用查表法实现线性化处理 分析 10位二进制位的表示范围为0 1023 因而有1024个电压值 从而可以建立一个表格 其项数为1024个 存放温度值Y的单元地址 表首地址 X 2 设测得的电压值已存放在20H 21H中 20H为高字节 查表后的温度值存放在22H 23H中 22H为高字节 例4 5 2程序清单 LTB2 MOVDPTR TAB2MOVA 21H 20H21H 2CLRCRLCAMOV21H AMOVA 20H 表首 20H21H 2RLCA 为什么不清CMOV20H AMOVA 21HADDA DPLMOVDPL AMOVA 20HADDCA DPH 为什么带进位加MOVDPH A 测得的电压值存放 20H21H 中 20H为高字节 查表后的温度值存放在 22H23H 中 22H为高字节 例4 5 2程序清单 续 CLRA 查表为什么清A MOVCA A DPTRMOV22H AINCDPTRCLRAMOVCA A DPTRMOV23H ARETTAB2 DW 温度表值DW 4 6散转程序设计 在程序设计中 不外有三种情况 顺序 循环和条件分支程序 其中顺序程序设计最为简单 而循环程序设计在前面已经学习过 分支程序 如下图所示 又可分为两大类 字节条件和位条件 即CJNE和JC JB JZ类指令 位条件转移指令很容易实现简单条件转移 当要实现多分支转移时 可以通过CJNE来实现 这就是所谓散转程序设计 但实现起来则较为麻烦 例4 6 1 测试P1口输入的100个数中0 9各数的概率分布程序 MOV40H 100READ MOVA P1CHK0 CJNEA 0 CHK1INC30HDJNZ40H READSJMPEENDCHK1 CJNEA 1 CHK2INC31HDJNZ40H READSJMPEENDCHK2 CJNEA 2 CHK3INC32HDJNZ40H READSJMPEEND CHK3 CJNEA 3 CHK4INC33HDJNZ40H READSJMPEENDCHK4 CJNEA 4 CHK5INC34HDJNZ40H READSJMPEENDCHK5 CJNEA 5 CHK6INC35HDJNZ40H READSJMPEEND 例4 6 1程序清单 CHK6 CJNEA 6 CHK7INC36HDJNZ40H READSJMPEENDCHK7 CJNEA 7 CHK8INC37HDJNZ40H READSJMPEENDCHK8 CJNEA 8 CHK9INC38HDJNZ40H READSJMPEEND CHK9 INC39HDJNZ40H READEEND SJMP 利用条件转移类指令来实现分支 程序较为简单 容易实现 但应特别注意的是 在分析问题时 一定要逻辑严密 充分判断出各种可能出现的条件标志 二 利用转移指令来实现的程序散转 JMP A DPTR其执行过程可以分为三步 1 将转移表首地址送入DPTR作为基地址 2 将条件标志单元内容装入A中作为变址 在装入前 还应根据转移表项内容作相应变化 3 实现转移 我们可以根据转移表的不同来分为三种散转程序 1 采用转移指令表的散转程序设计 这类散转程序的核心部分 转移表部分由无条件转移指令AJMP或LJMP构成 其转移范围分别为64K或2KBytes 例4 6 2要求根据R7的内容转向各个操作程序 即 R7 0 转向OPR0即 R7 1 转向OPR1即 R7 2 转向OPR2 即 R7 n 转向OPRn 例4 6 2程序清单 JUMP1 MOVDPTR JPTAB1MOVA R7ADDA R7 R7 2 A JNCNOAD 判断是否有进位 INCDPH 有加到高字节地址NOAD JMP A DPTRJPTAB1 AJMPOPR0AJMPOPR1 AJMPOPRn 例4 6 2注意事项 1 在本例中 由于AJMP指令的指令长度为2个字节 因而在散转时采用自加的方法使变址实现乘2 若改用LJMP指令 由于其指令长度为3字节 因而应使变址乘3来修下正 当修正产生进位时 要将进位加到DPH中 2 由于R7是单字节 因而散转点不能大于256个 为了克服此局限性 我们考虑 通过修改DPTR的办法来增加散转点 使这最大散转点N可达到N 最大存储容量 散转表首地址 3 例4 6 3要求根据R6R7中的数据转向对应的操作程序 P65 JUMP2 MOVDPTR JPTAB2MOVA R6MOVB 03H R6 3 BA MULABADDA DPHMOVDPH A 例4 6 3续 MOVA R7MOVB 03HMULABXCHA BADDA DPHMOVDPH AXCHA BJMP A DPTRJPTAB2 LJMPOPR0LJMPOPR1 LJMPOPRn 2 采用转向地址偏移量表散转程序 本方法的关键在于建立一个转向地址偏移量表 需要程序员认真计算 否则会产生错误 4 6 4要求按R7的内容转向5个操作程序 JUMP3 MOVA R7MOVDPTR TAB3MOVCA A DPTRJMP A DPTRTAB3 DBOPR0 TAB3DBOPR1 TAB3 DBOPR4 TAB3OPR0 OPR1 OPR2 本例的散转范围小于256 同上例一样 本例也可通过变通的方法 使这能在64K范围内实现散转 3 采用转向地址表的散转程序 P66 本方法的关键在于将散转点的地址直接建立表格 然后利用查表程序 从而实现散转 例4 6 5要求根据R7的内容转向相应的操作程序中去 设各操作程序有入口地址分别为OPR0 OPR1 OPRn 例4 6 5程序 MOVDPTR TAB4 指向地址表MOVA R7ADDA R7 R7 2JNCNADDINCDPH 加进位NADD MOVR3 AMOVCA A DPTR 查高位地址XCHA R3INCAMOVCA A DPTR 查低位地址MOVDPL AMOVDPH R3CLRAJMP A DPTR 实现散转 例4 6 5程序 续 TAB4 DWOPR0 低位字节在高地址DWOPR1DWOPR2 DWOPRn本例也能通过修改DPTR的方法来使散转点大于256个 三 采用 RET 指令的散转程序 本方法的关键在于将操作程序的目的地址压入椎栈 然后通过 RET 指令来将目的地址弹入到PC中 从而实现程序转移 即利用RET指令来代替两个POP指令 例4 6 6要求根据R7的内容转向各处操作程序 设各操作程序的转向地址分别为OPR0 OPR1 OPRn 例4 6 6程序 JUMP5 MOVDPTR TAB5MOVA R7ADDA R7 R7 2JNCNADDINCDPHNADD MOVR3 AMOVCA A DPTR 查高位地址XCHA R3INCAMOVCA A DPTRPUSHACC 低位地址PUSH03H PUSHR3高位地址 0区 RETTAB5 DWOPR0 转地址表DWOPR1 DWOPRn 小结 以上方法可灵活使用 需对地址差值进行计算的方法 其差值会因程序的变化而变化 使用时要小心从事 对于椎栈操作不太熟悉的同学 在使用 RET 实现散转时 更要小心谨慎 4 7I O端口控制程序 通过前面的学习 我们知道单片机有32个I O口可供编程者使用 由于结构上的原因 I O口作为输出时 由于端口具有锁存功能 不需外接锁存器 但是 当把它作为输入口时 虽然具有输入缓冲器 但不具有输入锁存器 因此在CPU完成读引脚前 输入的数据必须一直保持在引脚上 为此 我们需要借助一些特定的接口电路来实现输入功能 一 BCD拨码盘与单片机的接口 如右图所示 A为公共端 当A接VCC时 拨码盘输出正逻辑 当A接GND时 拨码盘输出负逻辑 其输出范围为0000 1001 因而称之为BCD拨码盘 类似于电度表的计量数字 BCD拨码盘与单片机的接口 BCD拨码盘与单片机的接口电路如右图所示 通过读取P1口的低四位即可获得BCD拨码盘的状态信息 二 多片BCD拨盘与单片机的接口 如图所示 通过对P1口的高四位进行扫描 使P1 4 P1 7依次为 0 然后查询P1口低四位的状态 从而得到拨盘的状态信息 由于拨盘在控制端为 0 时选中该位 因此拨盘的输出为反码 经与非门后 读出的状态信息为正码 三 拨码输入程序 将4位BCD码按千 百 十 个位依次读入 然后存放在30H 33H中 RDS MOVR0 30HMOVR2 7FHMOVR3 04HLOOP MOVA R2MOVP1 AMOVA P1ANLA 0FHMOV R0 AINCR1MOVA R2RRAMOVR2 ADJNZR3 LOOPRET 4 8子程序调用时的参数传递 在进行程序设计时 为保证程序的高效 可靠的运行 增加程序的可读性 可懂性 我们提倡结构化编程 而结构化编程的重要一点就是子程序的编制 在进行程序设计时 有些程序段是被多次使用到 但每次使用时 需要对某个寄存器的内容稍作修改 为了避免多次多次重复编写同样的程序 节省存储空间 我们就可以把这样的程序段独立出来 形成一个独立的子程序 每次要使用前 先对需要修改的寄存器进行修改后 用ACALL或LCALL调用 这里修改的寄存器我们称之为入口参数 子程序执行的结果 我们称之为出口参数 参数修改方式则称之为参数传递 一 通过寄存器传递参数 这种方法应用最为广泛 也最易使用 它是在调用子程序之前 对需要修改的寄存器预先修改后 再来调用子程序 例4 8 1试编程对30H 3AH单元清零 MAIN MOVR0 30HMOVR7 0AHLCALLSUBRT SUBRT MOVA 00HRESU MOV R0 AINCR0DJNZR7 RESURET 二 通过椎栈传递参数 例4 8 2试编程对30H 3AH单元清零 MAIN MOV70H 30HMOV71H 0AHPUSH70HPUSH71HLCALLSUBRT SUBRT POPDPHPOPDPLPOP07HPOP00HSUB1 MOVA 00HLOOP MOV R0 AINCR0DJNZR7 LOOP PUSHDPLPUSHDPHRET对于简单程序而言 这种方法反而较笨 较易引起混淆 三 利用数据指针传递参数 在这种方法中 待传递的参数不是放在调用指令之前 而是紧跟在调用指令之后 此法对参数量大的情况特加有用 例4 8 3将表格中的数据送打印机打印 MAIN ACALLPRINTDB THISISANEXAMPLEDB0AH 0DH 00HNEXT PRINT POPDPHPOPDPLPPP1 MOVA 00HMOVCA A DPTR 查表INCDPTRJZPPEND 判断是否结束PPP2 打印子程序 SJMPPPP1 未完则继续PPEND JMP A DPTR 转向主程序NEXT处 取代返回指 令 第章定时计数器及其应用 本章内容 SingleChipMicrocomputer 5 1定时 计数器工作原理及结构 5 3定时 计数器的工作方式 5 4定时 计数器的应用举例 5 2定时 计数器方式和控制寄存器 第五章MCS 51单片机内部定时 计数器及其应用 51系列单片机内部提供2个定时 计数器T0和T1 即可用作定时器 也可用作计数器 还可作为串行口的波特率发生器 定时 计数器同软 硬件结合使用 可给应用系统的设计带来很多方便之处 5 1定时 计数器的工作原理及结构 TRi 一 计数器的工作条件1 控制信号有效 1 2 有计数信号源 二 脉冲输入方式1 定时 C T 0 计数脉冲fosc 12 计数 C T 1 计数脉冲从Ti端输入 三 定时 计数器工作原理 1 定时方式 C T 0 当控制信号为 1 时 每一个机器周期 加1计数器做一次加1操作 直至加到全 1 再过一个机器周期 计数恢复为全 0 且TFi 1 2 计数方式 C T 1 当控制信号为 1 时 外部计数脉冲加在T0 P3 4 或T1 P3 5 引脚上 在该引脚上每产生一个下降沿 加1计数器做一次加1操作 直至加到全 1 再产生一个下降沿 计数恢复为全 0 且TFi 1 其计数频率 应不大于fosc 24 且正负脉冲宽度要均大于一个机器周期 四 定时 计数器是可编程的 定时 计数器的工作方式分别有8位 13位和16位三种长度 它在后台运行 程序的运行和定时 计数器的加1操作是并行的 我们可通过查询TFi的状态来了解它的工作情况 可通过预设计数器的初值来改变计数长度 五 定时 计数器的硬件构成 TMOD TCON分别控制定时 计数器的工作状态和工作方式 TH0 TL0 TH1 TL1分别为T0 T1的加1计数器 5 2定时 计数器的方式和控制寄存器 定时 计数器是可编程的 程序员只需对几个特殊功能寄存器进行简单的操作 既可完成对定时 计数器的操作 这几个特殊功能寄存器为TH1 TL1 TH0 TL0 TCON和TMODTH0 TL0和TH1 TL1分别是定时 计数器的计数核心 但加1计数器的运行则由TMOD和TCON来控制 一 定时器方式寄存器TMOD TMOD格式如下 1 定时 计数器工作方式选择位 1 定时 计数器工作方式选择位 2 C T功能选择 C T 0对内部脉冲计数 计数频率为fosc 12C T 1对Ti引脚输入脉冲计数 计数频率不大于fosc 24 GATE 0 由TRi来启动和停止定时 计数器GATE 1 TRi必须同INTi一起来启动和停止定时 计数器 即TRi INTi 1时 定时器启动 其中一个为 0 时 停止计数 注意 T0和T1的控制是严格独立的TMOD不能位寻址 使用时必须用字节传送指令 复位时 TMOD 0 二 定时 计数器控制寄存器TCON TCON格式如下 TFi 计数器溢出标志 计数器溢出时 由硬件对TFi置 1 并申请中断 进入中断后 由硬件自动清零 也可由软件清零 TRi 计数器运行控制位 由软件置 1 或清零来启动和停止计数器 二 定时 计数器控制寄存器TCON 其余位为有关中断的控制 以后再详讲 注意 T0和T1的控制是严格独立的TCON可位寻址 可分别用位名来进行寻址 不必记忆位地址 复位时 TCON 0 5 3定时 计数器的工作方式 通过前面的学习 我们可以知道 通过对C T的不同选择 可以选择内 外部脉冲计数方式 而对M1M0的设置 可以使T0和T1工作在四种工作方式 一 方式0 13位定时 计数器方式 由TLi 4 0 和THi 7 0 组成 T 213 A 12 fosc微秒 方式0 1 C T 0定时时间T 213 A 12 fosc微秒式中 A为定时器初值 2 C T 13 GATE 04 GATE 1 二 方式1 方式1为16位定时 计数器方式 由TLi 7 0 和THi 7 0 组成 其余与方式0相同 定时时间T 216 A 12 fosc微秒式中 A为定时器初值 三 方式2 方式2为能自动重置计数器初值的工作方式 TLi为8位计数器 THi为计数器初值暂存器 定时时间T 28 A 12 fosc微秒式中 A为定时器初值 四 方式3 方式3仅适用于T0 此时 TH0和TL0分别为2个8位计数器 TL0由T0的控制位来控制 而TH0则由T1的控制位来控制 而T1则可工作在方式0 1 2的任一方式 但其启动则由控制方式控制 将T1置为方式3时则停止计数 几种方式的区别 方式0 1 2仅在于位数不同 方式3则是增加了一个计数器资源而已 5 4定时 计数器的应用举例 定时 计数器是可编程的 在使用前 必须通过软件对其初始化 一 定时 计数器的初始化步骤 1 确定工作方式 对TMOD置初值2 置定时 计数器初值 即初始化TH0 TL0 TH1 TL1 在用作计数器时 除定量计数外 一般不设初值 计数 A 2n 待计数值定时 A 2n 定时值 fosc 123 如需中断 则开放中断 否则略去 4 启动定时 计数器 对TRi置 1 5 通过中断或TFi来获知定时 计数器的工作状态 6 停止定时 计数器 不需要再用时 应对TRi清零 二 应用举例 例5 4 1利用T1在P1 1口上输出周期为1ms的方波 假定fosc 6MHz根据要求可知 定时 计数器应工作在定时器方式 即C T 0定时时间应为0 5ms 方式0为13位方式 故其工作方式可为方式0 因而 TMOD 00H 定时时间T 213 X 12 6 106 500 微秒 X 7942 1F06 F806H 二 应用举例 由于TMOD和TCON在复位时均为 00 故不必对其重新置数 BEGIN MOVTL1 06HMOVTH1 0F8HSETBTR1LOOP JBCTF1 PTF0AJMPLOOPPTF0 MOVTH1 0F8HMOVTL1 06HCPLP1 1AJMPLOOP 二 方式2应用 例5 4 2由P3 4 T0 引脚输入低频脉冲信号 其重复周期大于1ms 要求在P3 4每发生一次负跳变时 由P1 0输出一个宽为500US的负同步脉冲 与此同时由P1 1输出一个宽为1ms的正同步脉冲 二 方式2应用 将T0工作在计数方式 初值设为0FFH 则每在P3 4上产生一个脉冲 T0溢出 然后将T0改为500US的定时方式 设晶振频率为6MHz 则500US定时器的初值X为 28 X 2 10 6 500 10 6由此可得 X 06H考虑到程序中标有 号指令执行的时间 将初值修正为0AH 例5 4 2程序 BEGIN MOVTMOD 06HMOVTH0 0FFHMOVTL0 0FFHCLRP1 1SETBTR0DEL1 JBCTF0 RESP1 检测外部信号跳变AJMPDEL1RESP1 CLRTR0MOVTMOD 02HMOVTH0 0AHMOVTL0 0AHSETBP1 1CLRP1 0SETBTR0 DEL2 JBCTF0 RESP2 检测第一次500USAJMPDEL2 例5 4 2程序 RESP2 SETBP1 0DEL3 JBCTF0 RESP3 检测第二次500USAJMPDEL3RESP3 CLRP1 1CLRTR0AJMPBEGIN 三 门控位的应用 GATE 1时 可测量INTi引脚上的脉冲的宽度 例5 4 3利用T0门控位测试INT0引脚上出现的正脉冲的宽度 并以机器周期的形式显示在显示器上 BEGIN MOVTMOD 09HMOVTL0 00HMOVTH0 00HWAIT1 JBP3 2 WAIT1 等待变低SETBTR0WAIT2 JNBP3 2 WAIT2 等待变高WAIT3 JBP3 2 WAIT3 等待变低CLRTR0MOVR0 DISBUFMOVA TL0XCHDA R0INCR0SWAPAXCHDA R0INCR0MOVA TH0 INCR0SWAPAXCHDA R0DIS LCALLDISUPAJMPDIS XCHDA R0 本章作业 1 2 3 4 8 第章单片机的系统扩展 本章内容 SingleChipMicrocomputer 6 1单片机最小应用系统 6 单片机的外部扩展性能 6 3程序存储器的扩展 概述 6 4数据存储器的扩展 6 5I O口的扩展 概述 51系列单片机在一个芯片上集成了许多硬件资源 它们能够完成复杂的软件工作和较为简单的硬件操作 在一定程度上相当于一台单板机的功能 但在完成一些复杂的控制时 就比不上单板机的功能强大了 在做一些智能仪器 仪表 小型检测和控制时 往往利用单片机的最小系统就能满足要求 但在大多数情况下 在构造一个工业控制系统时 最小系统一般不能满足系统的需求 这时 就必须在单片机外部扩展相应的芯片 以满足系统的要求 这就是系统扩展 单片机的系统扩展包括ROM扩展 RAM扩展 I O扩展 定时 计数器扩展 中断扩展及其它特殊功能的扩展 问题的提出 在单片机应用系统的设计中 往往出现RAM ROM或者I O口不够的情况 怎么办 ROM的扩展 RAM的扩展 并行I O口的扩展 6 1MCS 51单片机最小应用系统 原则上 一个单片机应用系统除必须具有单片机外 只要有振荡电路 复位电路和ROM就能工作了 当然 它们都不能没有电源提供 这就是单片机的最小应用系统 一 8051 8751 89C51 89C2051最小应用系统 特点 1 有大量I O线 在不需外部ROM的系统中 EA端应接VCC 2 内部RAM和ROM大小有限 但在数据量小的小系统中基本够用 3 应用系统开发具有特殊性 程序量较小 外部电路简单 我们推荐使用89C51或89C2051 晶振 复位电路 个并口 二 8031最小应用系统 由于8031内部无ROM 因此 由8031组成的最小应用系统必须在片外扩展ROM 与8051构成的最小系统相比 除均需要振荡电路和复位电路外 其EA端必须接地 6 单片机的外部扩展性能 宽度为16位 其高8位地址总线由P2口提供 低8位地址总线由P0口经地址锁存器锁存后提供 用作地址总线后的P2口不能再用作I O口使用 数据线由P0口提供 其宽度为8位 它为三态双向口 是使用最为频繁的通道 单片机与外部交换的数据 指令等大都经P0口传送 控制总线 EA PSEN RD WRALE 二 MCS 51单片机的系统扩展能力 1 地址范围0000H 0FFFFH 共64KBytes 2 空间重叠外部RAM和外部ROM地址空间重叠 但因其选通信号 访问指令不同 因而不会造成访问混乱 3 扩展I O与外部RAM统一编址单片机不再另外提供信号作扩展I O用 而是同外部RAM统一编址 因而会占用部分RAM地址空间 6 3程序存储器的扩展 在51系列单片机中 ROM的寻址范围为64KBytes 在片内无ROM或ROM空间不够的情况下 我们需要在片外扩展ROM 以满足系统和需求 6 3程序存储器的扩展 我们还是本着三总线的扩展方法来讲座其扩展方法 低8位地址则由P0口经地址锁存器后提供 片选则由P2口剩余部分经译码后提供 高8位地址由P2口直接提供 1 地址总线 2 数据总线 数据总线直接由P0口提供 3 控制总线 4 外部ROM访问时序 二 外部EPROM扩展电路1 使用单片的EPROM扩展电路 EPROM扩展实例 在8031单片机上扩展4KBEPROM D7Q7373D0Q0G 2 使用多片的EPROM扩展电路 注意 利用线选法时 电路简单 但地址线利用率较低 造成地址空间浪费 利用地址译码法时 地址空间完全利用 但电路比较复杂 在集成电路技术比较发达的今天 这种方法已不多用 可用1至2片即可达到最大扩展容量 如 6 4数据存储器的扩展 51单片机的片内RAM为128Bytes或256Bytes 一般情况下都能满足应用系统的需求 但当数据量较大时 就需要在片外扩展RAM 其最大容量可达64KBytes 由于片外扩展I O与外部RAM采用统一编址 因而外部RAM的实际容量有时不能达到64KBytes 一 数据存储器扩展的方法 数据存储器的扩展方法与程序存储器的扩展方法基本相同 我们还是本着三总线的扩展方法来讲解RAM的扩展方法 数据存储器扩展 1 低8位地址则由P0口经地址锁存器后提供 其余部

温馨提示

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

评论

0/150

提交评论