分类:
2008-09-22 00:03:02
单片机的学习重在实践,自主!
至于是8051,还是PIC还是。。。自己查去。。。
如果想学单片机,基本配置:PC,还有一套能用的编程试验板,能用就行,没必要太好的,在此又MC1000为例,简单的连上网线,打开连接器——start up--选择com1口,波特率11520,——
废话不多说,先写一个简单的流水灯程序:
要想做流水灯,首先让灯亮起来。
ORG 0000H /*ORG伪指令,相当于程序的指针*/
AJMP MAIN /*AJMP 绝对转移指令*/
ORG 0030H
MAIN:SETB P1.5 /*置低电平,LED阵列有上拉电阻,接口在下,低电平亮*/
LCALL DELAY /*调用DELAY*/
CLR P1.5 /*清零*/
LCALL DELAY
LJMP MAIN /*长转移重新进入MAIN,跌入死循环*/
/*××××××××以下部分为延迟子程序,相当于..等待..××××××××××*/
DELAY: MOV R7,#0FFH /*给寄存器R7立即数30H*/
D1: MOV R6,#255 /*给寄存器R7立即数255*/
D2: DJNZ R6,D2 /*减1转移指令*/
DJNZ,R7,D1
RET
END
最后的RET是子程序结束标志,END是整个程序结束的标志,也是伪指令。
现在打断一下,来介绍一下这个DELAY倒底是等多长时间,
几个名词:机器周期,就是机器访问一次存储器所用的时间;
晶振周期,就是机器周期的来源,振荡源的周期,一个机器周期包括12个晶振周期;
若按一个
需要2μs,则上面的DELAY时间=0FFH*255*2μs=130ms。
好了,接着继续。上面只是一个LED闪闪的程序,而想让它漂亮些就接着往下看吧!
如果要想让很多灯闪起来,就要有一点的数电基础,没有的先跟着我来恶补一下:
LED电路中具有VCC,上拉电阻,故低电位亮,也是就二进制里的0,而8个这样的灯排在一块儿,如果想让某一个灯亮的话,就是1111 1110,而想让两个灯亮则是1111 1100,只有有几个0,则就可以让几个同时灯亮,还可以调节它们的相对位置。如:10101010则是一亮一暗的搭配。
好了, 现在我们来做一个真正的流水灯:
还是一样的开头:
ORG 0000H
AJMP START
ORG 0030H
START:MOV P1,#0FEH /*就是刚才所说的11111110给P1口*/
MOV A,P1
RL A /*这个是新的指令,意思是左移1位,就是把11111110左移成11111101自
MOV P1,A 己理解*/
LCALL DELAY
LJMP
DELAY: MOV R7,#0FFH
D1: MOV R6,#0FFH
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
这个程序其实没有什么新内容,效应果是八个灯交替闪亮,当然如果你看懂了上面的程序,可以创造不团的效果,不过是自己做出来效果那就感觉不一样了,会很有成就感的(只是对于FRESHMAN来说的,老手别笑)
扩展一些内容吧:
ORG 0000H
AJMP
ORG 0100H
START:MOV P1,#055H
MOV P2,#055H
MOV A,P1
RL A
MOV P1,A
LCALL DELAY
MOV A,P0
RR A
MOV P0,A
LCALL DELAY
LJMP
/*依然是那个DELAY*/
DELAY: MOV R7,#0FFH
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ,R7,D1
RET
END
延时程序再多说一句:
如果想等待更长的时间怎么办呢?多次调用DELAY,呵呵,这也算一种方法,但是要是想延长DELAY时间呢?
多增加循环的次数。
DELAY: MOV R7,#0FFH
D1: MOV R6,#255
D2: MOV R5,#05H /*不建议很长时间,自己考虑*/
D3: DJNZ R5,D3
DJNZ R6,D2
DJNZ,R7,D1
RET
END
自己计算一下这次的等待时间。
最后再加一个循环跑圈的流水灯,第一次接触这东西的时候开发,如有雷同,纯属巧合!
要达到效果是让灯P1.0一直跑到P1.7然后转移到P0.7再到P0.0继续到P1.0如此往复,行成一个圆。
ORG 0000H
AJMP START1
ORG 0100H
START1: MOV P1,#0FEH
MOV P0,#OFFH
LOOP1: LCALL DELAY
MOV R4,#007H
L1: MOV A,P1
RL A
MOV P1,A
LCALL DELAY
JNZ R4,L1
START2: MOV P1,#0FFH
MOV P0,#07FH /*注意这里是7FH,因为是循环*/
LOOP2:LCALL DELAY
MOV R3,#007H
L2:MOV A,P0
RR A
MOV P0,A
LCALL DELAY
DJNZ R3,L2
LJMP START1
DELAY: MOV R7,#0FFH
D1: MOV R6,#255
D2: DJNZ R6,D2
DJNZ,R7,D1
RET
END
自己做出来,才是硬道理!MEACHEAL