完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
单片机的指令系统:单片机自学(二) 1、指令的格式:“标号:操作码助记符[(目的操作数),(源操作数)];注释” 我们已知,要让计算机工作,就得给计算机发指令,并且我们从上一课已知,计算机要完成你所给定的任务,必须为其编写相应的程序(所有指令的集合),计算机是机器只识别机器语言,机器语言是一种用二进制代码“0”和“1”的形式表示的,而如果我们使用者要用这种语言编写指令,将是繁琐费时和困难重重的;为此人们发明了汇编语言,汇编语言是一种用助记符来表示的面向机器的程序设计语言。汇编语句与机器指令是一一对应的,具体的汇编语句格式如上:助记符格式,如MOV P1,#0FFH,这样就方便使用和记忆了。 2、汇编 我们写指令使用汇编格式,而计算机只懂机器码格式,所以要将我们写的汇编格式的指令转换为机器码格式,这种转换有两种方法:手工汇编和机器汇编。手工汇编实际上就是查表,因为这两种格式纯粹是格式不同,所以是一一对应的,查一张表格就行了。不过手工查表不仅麻烦而且随着程序的长度增加完成的可能性越小,所以就有了计算机编译软件,用计算机软件来替代手工查表,这就是机器汇编,所以你起码要在你电脑中安装一种编译软件,如:KeilC51MedWin等,可在网上下载,如直接输入MedWin搜索。当然要将你编写的程序放进如89C51单片机芯片中让它完成你想的任务,还要烧写芯片,烧写芯片是由编程器来完成的,所以你要购买一款编程器,如TOP851等; 序号 寻址方式 相应存储器空间 51汇编指令共有111条,按指令的功能分为五大类:
数据传递类指令 MOV A,direct;direct就是指的直接地址 MOV A,@Ri ;间接寻址R0、R1 MOV A,#data ;将立即数data送到A中 下面我们通过一些例子加以说明: MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。 MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。 MOV A,@R0 ;先看R0中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。如执行命令前R0中的值为30H,则是将30H单元中的值送入A中。 MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。
2)以工作寄存器Rn为目的操作的指令 MOV Rn,A; MOV Rn,direct;三字节指令 MOV Rn,#data;三字节指令 这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。 3)以直接地址为目的操作数的指令 MOV direct,A ;如: MOV 30H,A MOV direct,Rn ;如:MOV 30H,R5 MOV direct1,direct2 ;如:MOV 20H,30H MOV direct,@Ri ;如:MOV 30H,@R1 MOV direct,#data;如: MOV 20H,#68H;将立即数68H送入以20H为地址的单元中 (4)以间接地址为目的操作数的指令 MOV @Ri,A; 例:MOV @R0,A MOV @Ri,direct ;MOV R1,30H MOV @Ri,#data; MOV @R0,#68H (5)十六位数的传递指令 MOV DPTR,#data16;将16位的地址送入数据指针DPTR中 8051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。其中高8位送入DPH,低8位送入DPL。例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。反之,如果我们分别向DPH,DPL送数,则结果也一样。如有下面两条指令:MOV DPH,#12H,MOV DPL,#34H。则就相当于执行了MOV DPTR,#1234H。
2、累加器A与片外RAM之间的数据传递类指令(存储器扩展时使用,初学者可以不去掌握) MOVX A,@Ri MOVX @Ri,A MOVX A,@DPTR MOVX @DPTR,A 说明: 1)在51中,与外部存储器RAM打交道的只可以是A累加器。所有需要送入外部RAM的数据必需要通过A送去,而所有要读入的外部RAM中的数据也必需通过A读入。在此我们可以看出内外部RAM的区别了,内部RAM间可以直接进行数据的传递,而外部则不行,比如,要将外部RAM中某一单元(设为0100H单元的数据)送入另一个单元(设为0200H单元),也必须先将0100H单元中的内容读入A,然后再送到0200H单元中去。
MOVC A,@A+DPTR;64k地址 本指令是将ROM中的数送入A中。本指令也被称为查表指令,常用此指令来查一个已做好在ROM中的表格 说明: 此条指令引出一个新的寻址方法:变址寻址。本指令是要在ROM的一个地址单元中找出数据,显然必须知道这个单元的地址,这个单元的地址是这样确定的:在执行本指令立脚点DPTR中有一个数,A中有一个数,执行指令时,将A和DPTR中的数加起为,就成为要查找的单元的地址。 查找到的结果被放在A中,因此,本条指令执行前后,A中的值不一定相同。 例:有一个数在R0中,要求用查表的方法确定它的平方值(此数的取值范围是0-5) MOV DPTR,#TABLE MOV A,R0 MOVC A,@A+DPTR . . TABLE: DB 0,1,4,9,16,25 设R0中的值为2,送入A中,而DPTR中的值则为TABLE,则最终确定的ROM单元的地址就是TABLE+2,也就是到这个单元中去取数,取到的是4,显然它正是2的平方。其它数据也可以类推。 堆栈操作指令 PUSH direct;入栈操作将direct中的内容送入堆栈中 POP direct;出栈操作将堆栈中的内容送回到direct中 首先将SP中的值加1,然后把SP中的值当作地址,将direct中的值送进以SP中的值为地址的RAM单元中。例: MOV SP,#6FH MOV A,#10 MOV B,#20 PUSH ACC PUSH B 执行第一条PUSH ACC指令是这样的:将SP中的值加1,即变为70H,然后将A中的值送到70H单元中,因此执行完本条指令后, 内存70H单元的值就是10,同样,执行PUSH B时,再将SP+1,即变为71H,然后将B中的值送入到71H单元中,即执行完本条指令后,71H单元中的值变为20。 POP指令的执行是这样的,首先将SP中的值作为地址,并将此地址中的数送到POP指令后面的那个direct中,然后SP减1。 接上: POP B POP ACC 执行过程是:将SP中的值(现在是71H)作为地址,取71H单元中的数值(现在是20),送到B中,所以执行完本条指令后B中的值是20,然后将SP减1,因此本条指令执行完后,SP的值变为70H,然后执行POP ACC,将SP中的值(70H)作为地址,从该地址中取数(现在是10),并送到ACC中,所以执行完本条指令后,ACC中的值是10。 以上的操作看起来无意义,实际上在执行PUSH ACC后,就将刚才程序运算的结果保护起来,累加器ACC可以做别的运算了而不影响上一段程序运算的结果,在多任务处理时堆栈很有用。
*在学习下一课算术运算之前先学习一下由于加、减、乘、除四则运算所影响的标志位; MCS-51有一个程序状态字寄存器PSW,用来保存指令执行结果的标志,供程序查询和判别。PSW是特殊功能寄存器中的一个,其格式如下: D7位 D6 D5 D4 D3 D2 D1 D0位
PSW。7---(CY)既是累加器C,又是进位标志CY、如果操作结果在最高位有进位输出(加法时)或借位输入(减法时),置位CY,否则清“0”CY; |
|
相关推荐
1 个讨论
|
|
《DNESP32S3使用指南-IDF版_V1.6》第四十六章 SD卡模拟U盘实验
566 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-移植前准备之git管理内核源码
2023 浏览 0 评论
【瑞萨RA2L1入门学习】+ MacOS安装e2studio
943 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-本地仓库管理之分支间的操作
859 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】3D 图形显示
717 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12286 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-2-10 21:57 , Processed in 0.547133 second(s), Total 36, Slave 30 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191