单片机要正常运作,事先需编制程序,再把程序放入存贮器中,然后由cpu执行该程序。程序是由指令组成的,指令的基本组成是操作码和操作数。单片机的品种很多,设计时怎样表示操作码和操作数,都有各自的规定,再有指令代码也各不相同,因此,必须对所选单片机的全部指令,也就是所谓“指令系统”,有足够的了解。各个系列的单片机虽然有不同的指令系统,但也有其共同性。掌握一种单片机的指令系统,对其它系列单片机可以起到触类旁通的作用。mcs-51单片机应用广泛,派生品种多,具有代表性,所以,这里以mcs-51系列的指令系统为例说明“指令”的组成和应用。
1、mov a,#20h
这条指令表示把20h这个数送入累加器a中(一个特殊功能寄存器)。
2、add a,70h
这条指令表示把累加器a中的内容(在上例中送入的#20h)和存贮器中地址为70h单元中的内容(也是一个数字),通过算术逻辑单元(英文缩写为alu)相加,并将结果保留在a中。这里mov、add等称为操作码,而a、#20h、70h等均称为操作数。在汇编语言程序中,操作码通常由英文单词缩写而成,这样有助于记忆,所以又称助记符。如mov就是英文单词move的缩写,含有搬移的意思;而add即为英文单词,其意为相加。因此,对于略懂英语的用户,掌握单片机指令的含意是较为方便的。操作数有多种表示法,如以上的#20h称为立即数,即20h就是真正的操作数。而70h是存贮器中某个单元的地址,在该单元中,放着操作数(比如说是3ah),add a,70h不是将70h和a中的内容相加,而是从存贮器70h单元中将3ah取出和a中的内容相加。由上可知,要找到实际操作数,有时就要转个弯,甚至转几个弯,这个过程称为寻址,mcs-51共有7种寻址方式,现介绍如下:
一、立即寻址:操作数就写在指令中,和操作码一起放在程序存贮器中。把“#”号放在立即数前面,以表示该寻址方式为立即寻址,如#20h。
二、寄存器寻址:操作数放在寄存器中,在指令中直接以寄存器的名字来表示操作数的地址。例如mov a,r0就属于寄存器寻址,即将r0寄存器的内容送到累加器a中。
三、直接寻址:操作数放在单片机的内部ram某单元中,在指令中直接写出该单元的地址。如前例的add a,70h中的70h。
四、寄存器间接寻址:操作数放在ram某个单元中,该单元的地址又放在寄存器r0或r1中。
如果ram的地址大于256,则该地址存放在16位寄存器dptr(数据指针)中,此时在寄存器名前加@符号来表示这种间接寻址。如mov a,@ r0。其它还有变址寻址、相对寻址、位寻址等。
五、位寻址(即可寻找某位的内容)功能,适于按位进行逻辑运算的位处理器。除128字节ram、4k字节rom和中断、串行口及定时器模块外,还有4组i/o口p0~p3,余下的就是cpu的全部组成。把4krom换为eprom就是8751的结构,如去掉rom/eprom部分即为8031的框图,如果将rom置换为flash存贮器或eeprom,或再省去某些i/o,即可得到51系列的派生品种,如89c51、at89c2051等单片机的框图。
单片机寻址方式越多,找操作数越方便,单片机的功能就越强。