(1)实验只用了P2口,mov p0,#0和setb p1.0这两个指令是不是没用的?
因为51io默认是弱上拉高电平,可能是一上电就在叫,所以上来先关。
(2)为什么p2口有两次置0,有什么用?我觉得一次置0后,因为低电平有效,6个灯就全亮了啊
那个是没必要的,另外:注释说全灭呀,你程序和电路是不是不一样啊
(3)main中的lcall delay是不是控制程序main运行到loop的间隔,而loop中的lcall delay是控制灯亮的间隔?
lcalldelay是一段固定的时间(没开中断),在哪里掉用都是一样的时间,所以整了好几个。loop中是控制每次切换灯状态的时间。
(4)如果我要控制灯亮的间隔,是不是有两种方法,一是改变lcall delay指令的数目 二是改变delay 中的r7的初值?
djnz 是先减1再判,所以r7初值0已经最大了
(5)如果改变r7的初值,那么main中的间隔时间也改变,我单纯的只想改变灯亮的间隔时间,最好的方法是不是改变loop的lcall delay指令数目?
你可以设计几个不同的函数,但是以后学的深入了就少用这种死等的方法,没效率。
(6)tt这个程序是不是多余,没用的?因为我感觉没用到
tt不是程序,是个标号,对应后面有djnz ??tt
(7)做实验时,用示波器测了p2口的其中1个引脚,它是周期的图像,如果我只看程序,怎么算出一个灯的周期,主要是我不太通,delay延迟的时间?
这个得看你什么单片机,主频多少,核算出每个指令周期。特别的是不同的单片机指令周期差别很大,而且现在比较新的51都是流水线处理指令,一个指令多少时间不是特别好说。开了中断就更不好说了,所以以后净量少用。
(8)p2口有8个引脚,而实验单片机电路板只有6个灯,左移到0100 0000或1000 0000的情况,是不是会出现6个灯全亮的情况,但我感觉实验的时候,没出现这种情况,是真的不会出现,还是我粗心没发现?
是有的,这程序就没管那么多了。是亮还是灭你再核对一下。
问题有点多,但请讲解,谢谢了,自己学的有点苦难。
尽量用C吧这汇编学多了不划算,一换平台就全做废了。单片机五花八门多了去了。
;可以修改为以下状态
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV P2,#0
LOOP:
MOV R2,#6
MOV A,#01H
LOOP1:
MOV P2,A
LCALL DELAY
DJNZ R2,LOOP1
SJMP LOOP
DELAY:
MOV R7,#0
DLY:
MOV R6,#0
DJNZ R6,$
DJNZ R7,DLY
RET
END
(1)修改的程序就只用了P2口,其余未处理,原程序用其余口,应该有其他条件
(2)一次置0就可以了,从程序看是高有效。
(3)main中的lcall delay只是延时约130毫秒左右
(4)如果要控制灯亮的间隔,一是改变lcall delay指令的数目 二是改变delay 中的r7或R6的值
(5)改变间隔时间最好的方法是加传递参数,延时程序稍加修改就可以。
(6)tt这只是一个标号,含与延时函数中
(7)delay延迟的时间的计算按指令执行周期和循环次数就可以计算了
(8)p2口有8个引脚,而实验单片机电路板只有6个灯,所以上面程序稍稍做了修改。
你还是把指令集大概的,把常用理解一下好点,常用的也就十来条指令。入门选择一些简单点的程序,代码不要超过10行的,好理解一点,从最开始的置位,清除,延时,位移,慢慢的,写多了就知道了。