第一章 单片机设计_第1页
第一章 单片机设计_第2页
第一章 单片机设计_第3页
第一章 单片机设计_第4页
第一章 单片机设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

第一章单片机设计导论

何宾2023.07单片机程序设计语言

--分层结构按从顶层到底层的顺序将单片机的程序设计分为四个层次,包括高级语言、汇编语言、机器指令和微指令底层顶层机器指令汇编语言高级语言微指令单片机程序设计语言

--分层结构根据MCU内CPU所使用ISA的指令格式,软件工具链将使用C语言或汇编语言所编写的程序代码最终转换为可以运行在CPU上的以二进制格式表示的机器指令比如,在基于8051和80251处理器核的单片机应用程序开发过程中,在使用C语言或汇编语言编写完程序代码后,就可以通过KeilμVision软件开发环境中集成的工具链(包括C编译器、汇编器和链接器),将高级语言和汇编语言转换为以二进制形式表示的机器指令单片机程序设计语言

--分层结构程序设计的最低层次为微指令,微指令(也称为微指令控制序列)为MCU中CPU内部的控制信号序列根据机器指令所要实现的功能,CPU设计人员将其转换为CPU内部的控制信号序列,这个控制信号序列也是以二进制序列表示的,与二进制逻辑“1”(高电平)和逻辑“0”(低电平)对应单片机程序设计语言

--设计实例从本质上,使用C语言编写程序代码实际上是从高层次对计算机的逻辑行为进行建模,即只需要将MCU完成的逻辑行为表达清楚即可,不需要知道MCU在硬件底层是如何完成具体的逻辑行为设计实例

--高级语言在KeilμVision软件集成开发环境中,可以使用C语言对MCS-51和MCS-251核的MCU进行应用开发

代码清单1-1对于两个8位数进行加法运算的C语言描述voidmain(){ volatilecharconsta=10,b=80;volatilecharc; c=a+b;}设计实例

--高级语言在代码清单1-1给出的代码中,main()表示主函数,{}表示main函数的作用范围。在main函数中:定义了两个字符型(char)常量a和b,它们的值分别为10和80定义了一个字符型(char)变量c在字符型char前面的关键字volatile用于告诉C编译器,不要对常量a和b,以及变量c进行优化通过赋值语句c=a+b,让常量a和常量b进行相加,相加的结果保存到变量c中显然,在C语言代码中,只需要描述a加上b这个算术运算即可,无需知道在MCU的CPU是如何完成a加上b这个运算的。设计实例

--汇编语言在keilμVision中使用编译器工具在二进制模式(BinaryMode)对该代码进行编译和链接后,生成可执行代码在KeilμVision调试器工具下打开Disassembly窗口,在窗口中可以看到C语言所对应的汇编语言助记符指令和机器指令设计实例

--汇编语言C语言中的两条类型声明语句:

volatilecharconsta=10,b=80;volatilecharc;汇编语言指令实现的功能MOVA,#c(0x0A)将立即数0x0A加载到累加器A中MOVa(0x0008),R11将累加器A(累加器A=寄存器R11)的数据保存到数据存储器地址为0x0008的单元MOVA,#0x50将立即数0x50加载到累加器A中MOVb(0x0009),R11将累加器A(累加器A=寄存器R11)的数据保存到数据存储器地址为0x0009的单元设计实例

--汇编语言C语言中的加法和赋值语句:c=a+b;

汇编语言指令实现的功能MOVR7,b(0x0009)将数据存储器地址为0x0009单元的数据加载到寄存器R7,即(R7)=0x50MOVSWR4,R7将8位寄存器R7的内容加载到16位寄存器WR4中,高8位符号扩展,即(WR4)=0x50MOVR7,a(0x0008)将数据存储器地址为0x0008单元的数据加载到寄存器R7,即(R7)=0x0AMOVSWR6,R7将8位寄存器R7的内容加载到16位寄存器WR6中,高8位符号扩展,即(WR6)=0x0AADDWR6,WR4将16位寄存器WR4的值和16位寄存器WR6的值相加,结果保存在16位寄存器WR6中,即(WR4)+(WR6)=0x50+0x0A=0x5A,(WR6)=0x5AMOVc(0x000A),R7将WR6寄存器的低8位的值(即寄存器R7的值),保存到数据存储器地址为0x000A的单元设计实例

--汇编语言(反)汇编指令由操作码和操作数两部分组成操作码说明该指令要实现的功能,比如MOV,表示移动数据;ADD,表示算术加法操作。对于MCS-251MCU的汇编指令来说,每条汇编指令的格式为

操作码目的操作数,源操作数操作码和目的操作数之间用空格分隔目的操作数和源操作数之间用逗号分隔操作码后面跟着目的操作数,目的操作数的右侧是源操作数设计实例

--汇编语言对于下面的汇编指令ADDWR6,WR416位寄存器WR6为目的操作数,16位寄存器WR4为源操作数在该操作中,源操作数和目的操作数的内容进行相加,相加的结果保存在目的操作数中对于下面的汇编指令MOVSWR6,R716位寄存器WR6为目的操作数,8位寄存器R7为源操作数在该操作中,将源操作数R7中的8位数据移动到16位目的操作数WR6中,对于WR6中的高8位,根据源操作数R7中的最高位进行符号扩展。设计实例

--汇编语言

从上面的分析可知,汇编语言是对机器指令的一种形式上的“抽象”在汇编语言指令中,使用类似MOV和ADD这种英文单词的缩写来描述指令的功能(即操作码),用英文符号表示操作数,这些符号比较简单易于被软件开发人员记住,因此称它们为“助记符”因此,将汇编语言指令称为汇编助记符指令与下面介绍的机器指令相比,汇编语言助记符就显得非常容易记忆了设计实例

--汇编语言与使用高级语言相比较,使用汇编助记符描述MCU的具体操作需要对MCU内的CPU的结构和ISA非常清楚,也就是需要掌握机器底层的原理与C语言相比,汇编语言更接近机器指令,因此汇编语言的运行效率要比C语言高。设计实例

--机器指令在二进制模式下,汇编语言和机器指令对应的关系汇编助记符指令机器指令(以十六进制数表示)机器指令字节个数MOVA,#c(0x0A)740A2MOVa(0x0008),R11A57AB300085MOVA,#0x5074502MOVb(0x0009),R11A57AB300095MOVR7,b(0x0009)A57E7300095MOVSWR4,R7A51A273MOVR7,a(0x0008)A57E7300085MOVSWR6,R7A51A373ADDWR6,WR4A52D323MOVc(0x000A),R7A57A73000A5设计实例

--机器指令从上表可知,汇编助记符指令对应的机器指令的长度是不一样的,有2个字节、3个字节和5个字节,这符合CISC的典型特征,也就是MCS-251的指令长度是可变的设计实例

--机器指令下面对上表中的汇编助记符指令MOVSWRj,Rm所对应的机器指令进行分析该指令对应的机器指令编码格式下图所示图中,tttt为寄存器WRj的编号j除以2得到值的二进制表示,即j/2=“tttt”;ssss为寄存器Rm编号值m的二进制表示,即m=“ssss”寄存器WR4的编号为4,4/2=2的二进制表示为”0010“,即为tttt的二进制编码;寄存器R7的编号为7,该编号的二进制表示为”0111“,即为ssss的二进制编码根据该指令的编码规则,对于二进制模式,需要在图1.5给出的二进制编码前添加前导的二进制序列10100101(即十六进制数A5)00011010

ttttssss设计实例

--机器指令根据上图给出的机器指令编码格式,得到该指令的机器指令编码为二进制序列“0001101000100111”,等效的十六进制数表示为1A27对于二进制模式,在该十六进制数的前面添加A5,即得到十六进制数A51A27设计实例

--机器指令下面对表中的汇编助记符指令ADDWRjd,WRjs所对应的机器指令进行分析图中,tttt为寄存器WRjd的编号jd除以2得到值的二进制表示,即jd/2=“tttt”;TTTT为寄存器js的编号js除以2得到值的二进制表示,即js/2=“TTTT”比如,寄存器WR6的编号为6,6/2=3的二进制表示为”0011“,即为tttt的二进制编码;寄存器WR4的编号为4,4/2=2的二进制表示为”0010“,即为TTTT的二进制编码根据该指令的编码

温馨提示

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

评论

0/150

提交评论