单片机原理ppt课件.ppt_第1页
单片机原理ppt课件.ppt_第2页
单片机原理ppt课件.ppt_第3页
单片机原理ppt课件.ppt_第4页
单片机原理ppt课件.ppt_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

第4章MCS 51单片机程序设计 4 1MCS 51单片机汇编语言简介汇编语言的形式 1 汇编语言格式 ORG0000HSTART MOVA 00H A0MOVR2 0AH R210MOVR1 03H R13LOOP ADDA R1 AA R1DJNZR2 LOOP 若R2 10 则LOOPNOPSJMP END 2 1 标号字段位于语句的开头 指明指令操作码地址 2 操作码字段必选项不可缺 由汇编程序生成目标代码 3 操作数字段操作数或操作数地址 通常有单 双和无操作数3种形式 表示形式有5种1 二进制十进制十六进制形式MOVA 10001010BMOVA 138MOVA 8AH 3 若16进制A F 则需前加0 如MOVA 0FFH2 工作寄存器和特殊功能寄存器3 标号地址如MOVA M14 带加减算符表达式如MOVA M1 15 采用 符如SJMP 4 注释字段任选项 以 开始 不产生机器码 汇编语言构成1 指令性语句 产生机器代码2 指示性语句即伪指令 不产生机器代码 4 几个汇编概念汇编语言程序 用汇编语言编写的 完成特定功能的指令序列 汇编程序 能将汇编语言源程序转换成机器语言目标程序的系统软件 汇编语言程序到机器语言程序的转换过程称为汇编 有两种1 手工汇编 人工查指令表汇编 用于设计短小程序或调试程序的场合 2 机器汇编 用汇编程序进行汇编 汇编的主要任务 1 确定程序中每条汇编语言指令的指令机器码 2 确定每条指令在存储器中的存放地址 3 提供错误信息 4 提供目标执行文件 OBJ HEX 和列表文件 LST 5 4 2MCS 51单片机汇编语言常用伪指令 伪指令是放在汇编语言源程序中用于指示汇编程序如何对源程序进行汇编的指令 它不同于指令系统中的指令 指令系统中的指令在汇编程序汇编时能够产生相应的指令代码 而伪指令在汇编程序汇编时不会产生代码 只是对汇编过程进行相应的控制和说明 常用的伪指令只有几条 1 ORG伪指令格式 ORG地址 十六进制表示 这条伪指令放于一段源程序或数据的前面 汇编时用于指明程序或数据从程序存储空间什么位置开始存放 ORG伪指令后的地址是程序或数据的起始地址 例4 1 ORG1000HSTART MOVA 7FH 指明后面的程序从程序存储器的1000H单元开始存放 6 2 DB伪指令格式 标号 DB项或项表DB伪指令用于定义字节数据 可以定义一个字节 也可定义多个字节 字义多个字节时 两两之间用逗号间隔 定义的多个字节在存储器中是连续存放的 定义的字节可以是一般常数 也可以为字符 还可以是字符串 字符和字符串以引号括起来 字符数据在存储器中以ASCII码形式存放 在定义时前面可以带标号 定义的标号在程序中是起始单元的地址 例4 2 ORG3000HTAB1 DB12H 34HDB 5 A abc 汇编后 各个数据在存储单元中的存放情况如下 7 3 DW伪指令格式 标号 DW项或项表这条指令与DB相似 但用于定义字数据 项或项表指所定义的一个字在存储器中占两个字节 汇编时 机器自动按高字节在前 低字节在后 即高字节存放在低地址单元 低字节存放在高地址单元 例4 3 ORG3000HTAB2 DW1234H 5678H汇编后 各个数据在存储单元中的存放情况如下 8 4 DS伪指令格式 标号 DS数值表达式该伪指令用在存储器中保留一定数量的字节单元 保留存贮空间主要为以后存放数据 保留的字节单元数由表达式的值决定 例4 4 ORG2000HTAB1 DB12H 34HDS4HDB 5 汇编后 存储单元中的分配情况如下 9 5 EQU伪指令格式 符号EQU项该伪指令的功能是将指令中的项的值赋予EQU前面的符号 项可以是常数 地址标号或表达式 以后可以通过使用该符号使用相应的项 例4 5 TAB1EQU1000HTAB2EQU2000H汇编后TAB1 TAB2分别等于1000H 2000H 程序后面使用1000H 2000H的地方就可以用符号TAB1 TAB2替换 用EQU伪指令对某标号赋值后 该符号的值在整个程序中不能再改变 6 bit伪指令格式 符号bit位地址bit该伪指令用于给位地址赋予符号 经赋值后可用该符号代替bit后面的位地址 例4 6 PLGbitF0AIbitP1 0定义后 在程序中位地址F0 P1 0就可以通过FLG和AI来使用 10 7 END伪指令格式 END该指令放于程序最后位置 用于指明汇编语言源程序的结束位置 当汇编程序汇编到END伪指令时 汇编结束 END后面的指令 汇编程序都不予处理 一个源程序只能有一个END命令 否则就有一部分指令不能被汇编 11 4 3MCS 51系列单片机汇编程序设计 4 3 1数据传送程序例 4 7 把片内RAM的40H 4FH的16字节的内容传送到片外RAM的2000H单元位置处 ORG1000HMOVR0 40HMOVDPTR 2000HMOVR2 16LOOP MOVA R0MOVX DPTR AINCR0INCDPTRDJNZR2 LOOPRET 12 4 3 2运算程序 例4 8 多字节无符号数加法 设从片内RAM30H单元和40H单元有两个16字节数 把它们相加 结果放于30H单元开始的位置处 设结果不溢出 处理过程 用R0作指针指向30H单元 用R1作指针指向40H单元 用R2为循环变量 初值为16 在循环体中用ADDC指令把R0指针指向的单元与R1指针指向的单元相加 加得的结果放回R0指向的单元 改变R0 R1指针指向下一个单元 循环16次 在第一次循环前应先将CY清零 程序流程图和程序如下 13 程序 ORG1000HMOVR0 30HMOVR1 40HMOVR2 16CLRCLOOP MOVA R0ADDCA R1MOV R0 AINCR0INCR1DJNZR2 LOOPEND 14 4 3 3数据的拼拆和转换 例4 9 设在30H和31H单元中各有一个8位数据 30H x7x6x x4x x2x1x0 3lH y7y6y y4y y2y1y0现在要从30H单元中取出低5位 并从31H单元中取出低3位完成拼装 拼装结果送40H单元保存 并且规定 40H y2y1y0 x4x x2x1x0利用逻辑指令ANL ORL RL等来完成数据的拼拆 处理过程 将30H单元的内容高3位屏蔽 31H单元内容的低5位屏蔽 高低四位交换 左移一位 然后与30H单元的内容相或 拼装后放到40H单元 程序如下 ORG0100HMOVA 30HANLA 00011111BMOV30H AMOVA 31HANLA 00000111BSWAPA 15 RLAORLA 40HMOV40H AEND 16 例4 11 一位十六进制数转换成ASC1I码 一位十六进制数有十六个符号0 9 A B C D E F 其中 0 9的ASCII码为30H 39H A F的ASCII码为41H 46H 转换时 只要判断十六进制数是在0 9之间还是在A F之间 如在0 9之间 加30H 如在A F之间 加37H 就可得到ASCII码 设十六进制数放于R2中 转换的结果放于R2中 程序如下 ORG0200HMOVA R2CLRCSUBBA 0AH 减去0AH 判断在0 9之间 还是在A F之间MOVA R2JCADD30 如在0 9之间 直接加30HADDA 07H 如在A F之间 先加07H 再加30HADD30 ADDA 30HMOVR2 AEND 17 例4 12 一位十六进制数转换8段式数码管显示码 一位十六进制数0 9 A B C D E F的8段式数码管的共阴极显示码为3FH 06H 5BH 4FH 66H 6DH 7DH 07H 7FH 67H 77H 7CH 39H 5EH 79H 71H 由于数与显示码没有规律 不能通过运算得到 只能通过查表方式得到 数放在R2中 查得的显示码也放于R2中 用MOVCA A DPTR查表 程序如下 ORG0200HCONVERT MOVDPTR TAB DPTR指向表首址MOVA R2 转换的数放于 MOVCA A DPTR 查表指令转换MOVR2 ARETTAB DB3FH 06H 5BH 4FH 66H 6DH 7DH 07HDB7FH 67H 77H 7CH 39H 5EH 79H 71H 显示码表在这个例子中 编码是一个字节 只通过一次查表指令就可实现转换 如编码是两个字节 则需要用两次查表指令才能查得编码 第一次取得低位 第二次取得高位 18 例4 13 在一温度控制系统中 温度0 100C每一个温度值都已经通过温度传感器测得一个两字节的标准电压值 现在R2中给出一个0 100C的温度值 取得它的标准电压值放于R3 R4中 低字节放在R3中 高字节放在R4中 通过用MOVCA A DPTR查表 两个字节分两次取得 由DPTR指向表首 由放于R2中的温度值得到所查的电压值相对于表首位置的位移量放于累加器A中 由于每一个电压值为两个字节 位移量须用R2中的温度值乘以2得到 第一次取得低字节 第二次位移量加1后查表取得高字节 分别放于R3 R4中 程序如下 ORG0300HCHECK MOVDPTR TAB 指向表首MOVA R2 温度值送ARLA 乘2得位移量MOVR1 A 位移量暂存于R1中MOVCA A DPTRMOVR3 A 第一次查得内容送R3MOVA R1 取出暂存的位移量送A 19 INCA 指向高字节MOVCA A DPTRMOVR4 A 第二次查得内容送R4RETTAB DW0056H 0059H 0067H 0076H 电压值表 3 5 3多分支转移 散转 程序 一 用多分支转移指令JMP A DPTR实现的多分支转移程序 例4 14 现有128路分支 分支号分别为0 127 要求根据R2中的分支信息转向各个分支的程序 即当 R2 0 转向OPR0 R2 1 转向OPRl R2 127 转向OPR127 20 先用无条件转移指令 AJMP 或 LJMP 按顺序构造一个转移指令表 执行转移指令表中的第n条指令 就可以转移到第n个分支 将转移指令表的首地址装入DPTR中 将R2中的分支信息装入累加器A形成变址值 然后执行多分支转移指令JMP A DPTR实现转移 程序清单如下 MOVA R2RLA 分支信息乘2MOVDPTR TAB DPTR指向转移指令表首址JMP A DPTR 转向形成的散转地址TAB AJMPOPR0 转移指令表AJMPOPR1 AJMPOPR127 转移指令表中的转移指令是由LJMP指令构成 21 程序如下 ORG0200HMOVDPTR TAB DPTR指向转移指令表首址MOVA R2 分支信息放累加器A中MOVB 3MULAB 分支信息乘3XCHA BADDA DPH 高字节调整到DPH中MOVDPH AXCHA BJMP A DPTR 转向形成的散转地址TAB LJMPOPR0 转移指令表LJMPOPR1LJMPOPR2 LJMPOPR127 22 转移指令表中的转移指令是由AJMP指令构成 如果分支数大于128个 如分支数有256个 ORG0200HMOVDPTR TAB DPTR指向转移指令表首址MOVA R2 分支信息放累加器A中RLA 分支信息乘2JNCNEXTINCDPH 高字节调整到DPH中NEXT JMP A DPTR 转向形成的散转地址TAB LJMPOPR0 转移指令表LJMPOPR1LJMPOPR2 LJMPOPR127 23 二 采用RET指令实现的多分支程序 用RET指令实现多分支程序的方法是 先把各个分支的目的地址按顺序组织成一张地址表 在程序中用分支信息去查表 取得对应分支的目的地址 按先低字节 后高字节的顺序压入堆栈 然后执行RET指令 执行后则转到对应的目的位置 例4 15 用RET指令实现根据R2中的分支信息转到各个分支程序的多分支转移程序 设各分支的目的地址分别为addr00 addr01 addr02 addrFF 程序如下 MOVDPTR TAB3 DPTR指向目的地址表MOVA R2 分支信息放累加器A中RLA 分支信息乘2JNCNEXTINCDPH 高字节调整到DPH中NEXT MOVR3 A 变址放于R3中暂存MOVCA A DPTR 取目的地址低8位PUSHACC 低8位地址入栈 24 MOVA R3 取出R3中变址到累加器AINCA 加1得到目的地址高8位单元的变址MOVCA A DPTR 取转向地址低8位PUSHACC 高8位地址入栈RET 转向目的地址TAB3 DWaddr00 目的地址表DWaddrD0l DWaddrFF上述程序执行后 将根据R2中的分支信息转移到对应的分支程序 25 4 3 5延时程序设系统时钟频率为12MHZ 下面是延时10ms的程序DEL10ms MOVR6 20 1个机器周期DEL1 MOVR7 249 1个机器周期DJNZR6 2个机器周期DJNZR6 DEL1 2个机器周期RET 2个机器周期 26 4 5MCS 51单片机内部资源及编程 MCS 51单片机的内部资源主要有并行I O口 定时器 计数器 串行接口以及中断系统 MCS 51单片机的大部分功能就是通过对这些资源的利用来实现的 下面分别对其介绍 并用汇编语言和C语言分别给出相应例子 4 5 1并行口应用与编程 例4 25 利用单片机的P1口接8个发光二极管 P0口接8个开关 编程实现 当开关动作时 对应的发光二极管亮或灭 只须把P0口的内容读出后 通过P1口输出即可 汇编程序 ORG0100HMOVP0 0FFHLOOP MOVA P0MOVP1 ASJMPLOOP 27 4 5 2定时 计数器的初始化编程及应用 一 定时 计数器的编程 MCS 51单片机定时 计数器初始化过程如下 1 根据要求选择方式 确定方式控制字 写入方式控制寄存器TMOD 2 根据要求计算定时 计数器的计数值 再由计数值求得初值 写入初值寄存器 3 根据需要开放定时 计数器中断 后面须编写中断服务程序 4 设置定时 计数器控制寄存器TCON的值 启动定时 计数器开始工作 5 等待定时 计数时间到 到则执行中断服务程序 如用查询处理则编写查询程序判断溢出标志 溢出标志等于1 则进行相应处理 28 二 定时 计数器的应用 通常利用定时 计数器来产生周期性的波形 利用定时 计数器产生周期性波形的基本思想是 利用定时 计数器产生周期性的定时 定时时间到则对输出端进行相应的处理 如产生周期性的方波只须定时时间到对输出端取反一次即可 例4 26 设系统时钟频率为12MHZ 用定时 计数器T0编程实现从P1 0输出周期为500 s的方波 分析 从P1 0输出周期为500 s的方波 只须P1 0每250 s取反一次则可 当系统时钟为12MHZ 定时 计数器T0工作于方式2时 最大的定时时间为256 s 满足250 s的定时要求 方式控制字应设定为00000010B 02H 系统时钟为12MHZ 定时250 s 计数值N为250 初值X 256 250 6 则TH0 TL0 06H 29 汇编程序 ORG0000HLJMPMAINORG000BH 中断处理程序CPLP1 0RETIORG0100H 主程序MAIN MOVTMOD 02HMOVTH0 06HMOVTL0 06HSETBEASETBET0SETBTR0SJMP END C语言程序 include 包含特殊功能寄存器库sbitP1 0 P1 0 voidmain TMOD 0 x02 TH0 0 x06 TL0 0 x06 EA 1 ET0 1 TR0 1 while 1 voidtime0 int void interrupt1 中断服务程序 P1 0 P1 0 1 采用中断处理方式的程序 30 2 采用查询方式处理的程序 汇编程序 ORG0000HLJMPMAINORG0100H 主程序MAIN MOVTMOD 02HMOVTH0 06HMOVTL0 06HSETBTR0LOOP JBCTF0 NEXT 查询计数溢出SJMPLOOPNEXT CPLP1 0SJMPLOOPSJMP END C语言程序 include 包含特殊功能寄存器库sbitP1 0 P1 0 voidmain chari TMOD 0 x02 TH0 0 x06 TL0 0 x06 TR0 1 for if TF0 TF0 0 P1 0 P1 0 查询计数溢出 31 如果定时时间大于65536 s 这时用一个定时 计数器直接处理不能实现 这时可用两个定时 计数器共同处理或一个定时 计数器配合软件计数方式处理 例4 27 设系统时钟频率为12MHZ 编程实现从P1 1输出周期为1s的方波 根据例5 2的处理过程 这时应产生500ms的周期性的定时 定时到则对P1 1取反就可实现 由于定时时间较长 一个定时 计数器不能直接实现 可用定时 计数器T0产生周期性为10ms的定时 然后用一个寄存器R2对10ms计数50次或用定时 计数器T1对10ms计数50次实现 系统时钟为12MHZ 定时 计数器T0定时10ms 计数值N为10000 只能选方式1 方式控制字为00000001B 01H 初值X X 65536 10000 55536 1101100011110000B则TH0 11011000B D8H TL0 11110000B F0H 32 1 用寄存器R2作计数器软件计数 中断处理方式 汇编程序 ORG0000HLJMPMAINORG000BHLJMPINTT0ORG0100HMAIN MOVTMOD 01HMOVTH0 0D8HMOVTL0 0F0HMOVR2 00HSETBEASETBET0SETBTR0SJMP INTT0 MOVTH0 0D8H MOVTL0 0F0HINCR2CJNER2 32H NEXTCPLP1 1MOVR2 00HNEXT RETIEND 33 C语言程序 include 包含特殊功能寄存器库sbitP1 1 P1 1 chari voidmain TMOD 0 x01 TH0 0 xD8 TL0 0 xf0 EA 1 ET0 1 i 0 TR0 1 while 1 voidtime0 int void interrupt1 中断服务程序 TH0 0 xD8 TL0 0 xf0 i if i 50 P1 1 P1 1 i 0 34 2 用定时 计数器T1计数实现 定时 计数器T1工作于计数方式时 计数脉冲通过T1 P3 5 输入 设定时 计数器T0定时时间到对T1 P3 5 取反一次 则T1 P3 5 每20ms产生一个计数脉冲 那么定时500ms只须计数25次 设定时 计数器T1工作于方式2 初值X 256 25 231 11100111B E7H TH1 TL1 E7H 因为定时 计数器T0工作于方式1 定时 则这时方式控制字为01100001B 61H 定时 计数器T0和T1都采用中断方式工作 汇编程序如下 ORG0000HLJMPMAINORG000BHMOVTH0 0D8HMOVTL0 0F0HCPLP3 5RETI ORG001BHCPLP1 1RETI 35 ORG0100HMAIN MOVTMOD 61HMOVTH0 0D8HMOVTL0 0F0HMOVR2 00HMOVTH1 0E7HMOVTL1 0E7HSETBEASETBET0SETBET1SETBTR0SETBTR1SJMP END C语言程序如下 include 包含特殊功能寄存器库sbitP1 1 P1 1 sbitP3 5 P3 5 voidmain 36 TMOD 0 x61 TH0 0 xD8 TL0 0 xf0 TH1 0 xE7 TL1 0 xE7 EA 1 ET0 1 ET1 1 TR0 1 TR1 1 while 1 voidtime0 int void interrupt1 T0中断服务程序 TH0 0 xD8 TL0 0 xf0 P3 5 P3 5 voidtime1 int void interrupt3 T1中断服务程序 P1 1 P1 1 37 4 5 4MCS 51中断系统的应用 例4 32 某工业监控系统 具有温度 压力 PH值等多路监控功能 中断源的连接如图5 26所示 对于P

温馨提示

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

评论

0/150

提交评论