比如说,你在P2端口接了8个灯,然后你想让这8个灯间隔亮灭,要做到这件事,对于标准的51单片机来说,就是把01010101或10101010送入P2端口就行了,汇编很简单,一个命令,直接送:
ORG 0000H
START:
MOV P2,#10101010B
END
编译、下载、运行,完事。
第一条ORG 0000H,并不是单片机要执行的内容,是告诉编译器,以下程序编译成二进制代码后,存在程序存储器中的位置,是从0000H这个地址开始的。
第二条START,这个也不是单片机要执行的内容,而是告诉编译器,下面的内容是正式程序的开始。
第三条MOV P2,#10101010B,这个就是单片机要执行的动作了,这个动作,就是把位于此条语句最后面的10101010B这个字节,送入P2这个单元之中。语句中的#,表示这个数据不是地址值,而是一个要直接送到接收单元的数值。
第四条END,告诉编译器,后面没有程序了,编译任务到上面那句就结束了。
其实第三条的写法,有两个问题,第一个问题,单片机是不认识什么P1、P2的,它只知道数据,因为在单片机内,不管是存储数据还是处理数或者是进行功能设置的所有的单元,都只是用数据编制了地址,你得给它数据地址,它才能去找这个单元,所谓的P2只是我们编程人给这个端口取的一个好记的俗名,它的实际地址,我们可以查表,知道是0A0H。这里我们用了P2而却通过了程序,原因在于我们所用的编译器之中,事先已经把P2这个俗名,与0A0H给联系起来了。如果你的编译器里没有给联系起来,那么这条语句可以这样写:MOV 0A0H,#10101010B,当然,一般我们会在程序前面给它起一个好记的名字,也就是定义;第二个问题,单片机也不认识什么MOV,它还是只认识数据,单片机中的所有命令,都是以数据的形式来表达的,通过查表,我们知道这个命令的值是75H,之所以写成MOV也以通过程序,也是因为编译器把这条语句整个看完之后,将其与75H给联系起来了,为什么说编译器要看完整条语句,因为其中的#会影响到编译结果。
于是,整个程序在编译之后,就只有三个字节:75、A0、AA,这个可以在STC下载器中观察到。所以,如果你想直接用数据编程而不用MOV什么的,这第三条也可以这样写:DB 75H,0A0H,0AAH(就是10101010,不需要#),这里的DB也不是单片机要执行的工作,而是告诉编译器:这个后面有一些数据,这些数据嘛,你不用翻译了,直接照抄就是了。
再解释一下这条指令中的75H,这条语句表达了一个单片机要执行的动作,而75H则是表达这个动作的全部具体内容(75H称作这条语句或者命令的操作码),它的具体动作内容,就是把存储在它本身位置之后第二个单元中的数据,作为直接数据而不是地址,送入一个片内数据存储单元之中,这个接收单元的地址值,就存在紧随操作码单元之后的的程序存储器单元之中。75H还有一个含意,就是表明在其之后的第三个单元之中存放的是下一条操作码。
为什么说51汇编很简单,因为它的设计就是按人做事的一套方法程序来的,我们之所以觉得学起来难,是因为一是现有的教材没按这个思路来;二是汇编这个编程工具估计是个机械男做的,不太合我们的习惯;三是现有中文教材中一些名词起得,太不接地气,比如说所谓的数据总线这个名词,很不符合中文的表达方式,其实它就是单片机内各单元之间传送数据包括指令的公用通道,大家都可以用,为什么称为公用通道,因为有些单元之间是有私用通道的,目的是为了快速运行,所以,你觉得这个名词该如何取才最容易一看就懂而又简洁?还有就是特殊功能寄存器这个名词,也让人看不明白,其实在51机教材中它大致包含三个部,一个部分就是端口控制单元,一个部分就是单片机功能设置单元,还有一个部分就是运行状况标志单元。
单片机的工作,基本就是操作各个存储和处理数据的单元,以及为调整单片机的功能对功能设置单元进行设置、对标志单元进行处理等等。要操作某个单元,首先就是要找到其地址;对于不同单元之间的数据传输,则在找到其地址之后,就是查单片机的设计手册,看其对这两个单元之间的传输是如何设计的,要做到这个,一需要知道存储器的物理种类,51机有程序存储器、片内数据据存储器、片外数据存储器三种物理区分。二是要知道所有存储器的地址编制规则,51单片机中,程序存储器自己单独一套,地址编号从0开始,最大65535,最多65536个单元;片内数据存储器有点意思,也是自己一套,从0开始,最大255,可它最多可以有256+128个单元;片外数据存储器也是自己一套,从0开始,16位地址也是大65535,最多65536个单元。三是要知道该单片机所设计的单元的地址表达方式,这个说起来比较长,具体可以结合几种寻址方式来理解,51机可以在操作码后面的数据(操作数)中指出,但必须要在操作码中指出后面的操作数指的是什么,象我们上面所举例子,操作码就明确指出了其后第一个操作数是接收数据的单元的地址,第二个操作数是要直接传给接收单元的数据,也就是说被传输的数据的地址在操作码所在程序存储器单元之后的第二个单元之中。
这里说说片内数据存储器的怪,其缘于其编址的方式虽然是从0到255,但128以上高128个单元却分为了两个物理存储部分,这两部分地址编号是一样的从128到255,但以不同的寻址方式来区分,教材所称的特殊功能寄存器部分只能采用直接的寻址方式,而另一部分则只能用间接寻址方式来操作,这部分完全交给用户用作在运行过程中存储数据,也所以,51机中用户可以操作用来存储数据的片内数据存储单元是256个。
另外说一句,不同的单片机有不同的设计方式,比如说对于STM32,对于其单元的编址,不管什么存储器种类,它是统一编址的,全部在0到4G这个范围内。
PS1:说句有争议的话,从汇编入门51机包括其原理很容易,初中文化就可以了,可惜的是没有合适的教材。
PS2:只取不予是不对的,于是特懒的我,写了这点东西,算是对本坛的回报,嗯,花费三个多小时。PS3:提一个观点,单片机就是个电子电路,它不认识什么数值数据,也就是并不认识什么0什么1,它只是人类利用了电子电路的电平高与低这个特征来设计的一个功能性电路,所以,它只知道电位高低。由此,提一个建议,在对“特殊功能寄存器”进行操作时,为了便于理解,可以不用什么十进制十六进制,而是直接用二进制,好理解好修改。
|