程序实例
1.单片机控制单个LED闪烁发光
这个例子是让LED闪烁,即让LED交替亮与灭。要让接在P1.0引脚上的LED闪烁,实际上就是要LED亮一段时间,再灭一段时间,然后再亮,再灭。。。。换一个说法就是说P1.0周而复始地输出高电平、低电平。
单个闪烁程序如下:
;主程序
MAIN: SETB P1.0 (1)
CALL DELAY (2)
CLR P1.0 (3)
CALL DELAY (4)
JMP MAIN (5)
延时子程序
DELAY:MOV R7,#250 (6)
D1: MOV R6,#250 (7)
D2: DJNZ R6,D2 (8)
DJNZ R7,D1 (9)
RET (10)
END (11)
程序分析:
(1).将P1.0置位为高电平,即让LED熄灭.
(2).调用延时子程序.
(3)将P1.0置位为低电平,即让LED亮
(4).调用延时子程序
(5).跳转到主程序
(6).延时子程序开始,将立即数250传送给寄存器R7.
(7).将立即数250传送给寄存器R6.
(8).将R6中的内容减一后判断,若为0则程序向下执行;若不为0则跳转到D2处(即本行)执行.
(9).将R7中的内容减一后判断,若为0则程序向下执行,若不为0则跳转到D1处执行.
(10).返回调用子程序处.
(11).程序结束.
延时程序的分析
1) MOV
这条指令的意思是传递数据.在指令MOV R7,#250中,R7是接收者,250是被传递的数.这一条指令的意思是:将数据250送到R7中去.因此,执行完这条指令后,R7单元中的值是250.在250前面有个#号,这条指令称之为立即数传递指令,而#后面的数被称为立即数.
2) DJNZ
这条指令后面跟着的两个符号,一个是R6,,一个是D2.R6是寄存储器,D2是标号.DJNZ指令的执行过称如下:将后面第一个参数中的值减1,然后看这个值是否等于0.如果等于0,就往下一条知令执行,如果不等于0,则转移到第二个参数所指定的位置去执行,在这里是转移到由D2所标识的那条指令去执行.该条指令最终执行的结果是:指令被执行了250次(因为次前R6中已被送入了一个数:250).
在执行完DJNZ R6,D2(即R6中的值等于0)之后,转去执行下一条指令,即DJNZ R7,D1。由于R7中的值不为0,所以减1后转去D1标号处,即执行MOV R6,#250这条指令。这样,R6中又被送入了250这个数,然后再去执行DJNZ R6,D2,最终的结果是DJNZ R6,D2这条指令将被执行了250×250=62500次,从而实现了延时。
3)RET
子程序在执行过程中如果遇到这条指令,就会回到主程序,到调用这段程序指令的下一条指令继续执行。
2.控制8个LED闪烁发光
程序如下:
MAIN: MOV P1,#0FFH (1)
CALL DELAY (2)
MOV P1,#00H (3)
CALL DELAY (4)
JMP MAIN (5)
DELAY:MOV R7,#250 (6)
D1: MOV R6,#250 (7)
D2: DJNZ R6,D2 (8)
DJNZ R7,D1 (9)
RET (10)
END (11)
程序分析:
(1).将立即数0FFH送到P1口,即让P1口的LED全熄灭.(P1.0~P1.7)
(2).调用延时子程序.
(3)将立即数00H送到P1口,即让P1口的LED全亮(P1.0~P1.7)
(4).调用延时子程序
(5).跳转到主程序
(6).延时子程序开始,将立即数250传送给寄存器R7.
(7).将立即数250传送给寄存器R6.
(8).将R6中的内容减一后判断,若为0则程序向下执行;若不为0则跳转到D2处(即本行)执行.
(9).将R7中的内容减一后判断,若为0则程序向下执行,若不为0则跳转到D1处执行.
(10).返回调用子程序处.
(11).程序结束.
程序分析
P1是P1.0~P1.7全体的代表,一个符号P1表示了以P1.开头的8个引脚。MOV指令的用途是数据传递,即把0FFH送到P1端口和把00H送到P1端口,那么0FFH和00H又分别代表什么含义呢?0FFH用二进制表示就是11111111B,而00H用二进制表示就是00000000B。因此,送0FFH就是让所有P1.X引脚输出高电平,即让LED全灭,而送00H就是让LED全亮。
程序中的数字FFH前面有一个0,这是汇编软件所要求的,对于十六进制而言,除了0~9这10个数字外,还用了A~F作为基本数字。如果用来表示数字的第一个字符不是0~9这10个阿拉伯数字中的一个,就要在它前面加一个0,表示这是一个数字,而不是字符。
3.用单片机实现流水灯。
流水灯是一种常见的装饰,常用于舞台,最简单的流水灯就是各个灯依次发光。用单片机实现这一功能很方便。
用单片机流水灯程序
ORG 0000H
JMP SHART
SHART:MOV A,#0FEH
LOOP: MOV P1,A
RL A
CALL DELAY
JMP LOOP
DELAY:MOV R7,#250
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET
END
就这么简单的几行程序,就能实现奇妙的流水灯效果,的确不错。
程序分析
这段程序中的RL A是一条左移指令,它的用途是把A累加器中的值循环左移。设A=11111110,则在执行一次RL A指令后,A中的值变为11111101,执行第二次后,就变为11111011,也就是各位数字不断向左移,而最右一位由最左一位移入。
4. 能左右循环的流水灯。
ORG 0000H
JMP AGAIN
AGAIN:MOV SP,#60H
LOOP: CLR C
MOV A,#11111111B
MOV R4,#8
LOOPL:RLC A
MOV P1,A
CALL DELAY
DJNZ R4,LOOPL
MOV R4,#8
LOOPR:RRC A
MOV P1,A
CALL DELAY
DJNZ R4,LOOPR
JMP LOOP
DELAY:MOV R5,#50
D1: MOV R6,#50
D2: MOV R7,#100
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
程序说明
1) 程序由地址0000处开始执行。
2) 跳到AGAIN处
3) 设置堆盏指针至RAM地址60H
4) 进位标志清除
5) 加载初值,使LED全部熄灭
6) 设定左移计数值 移8次
7) 累加器内的值左移一位
8) 累加器的值送到P1口
9) 延时0.5秒 50×50×(100×2)=0.5MS
10)继续左移共8次
11)设定右移计数值 移8次
12)累加器内的值右移一位
13)累加器的值送到P1口
14)延时0.5秒 50×50×(100×2)=0.5MS
15)继续右移共8次
16)再执行循环
17)将立即数50送入寄存器R5
18)将立即数50送入寄存器R6
19)将立即数100送入寄存器R7
20)将R7中的内容减一后判断,若为0则程序向下执行,若不为0则跳转到本行执行.
21)将R6中的内容减一后判断,若为0则程序向下执行,若不为0则跳转到D2处执行.
22)将R5中的内容减一后判断,若为0则程序向下执行,若不为0则跳转到D1处执行.
23)返回调用主程序处
24)程序结束
单片机教程,五系列(55讲)电子书全集下载论坛精选:
单片机学习,C51单片机入门经典30课 前言
http://bbs.huazhoucn.com/Topic.aspx?id=2694
单片机学习,C51单片机入门经典30课 第一课
http://bbs.huazhoucn.com/Topic.aspx?id=2695
单片机学习,C51单片机入门经典30课 第二课
http://bbs.huazhoucn.com/Topic.aspx?id=2696
单片机学习,C51单片机入门经典30课 第三课
http://bbs.huazhoucn.com/Topic.aspx?id=2697
单片机学习,C51单片机入门经典30课 第四课
http://bbs.huazhoucn.com/Topic.aspx?id=2698
单片机学习,C51单片机入门经典30课 第五课
http://bbs.huazhoucn.com/Topic.aspx?id=2699
单片机学习,C51单片机入门经典30课 第六课
http://bbs.huazhoucn.com/Topic.aspx?id=2700
单片机学习,C51单片机入门经典30课 第七课
http://bbs.huazhoucn.com/Topic.aspx?id=2701
单片机学习,C51单片机入门经典30课 第八课
http://bbs.huazhoucn.com/Topic.aspx?id=2702
单片机学习,C51单片机入门经典30课 第九课
http://bbs.huazhoucn.com/Topic.aspx?id=2703
单片机学习,C51单片机入门经典30课 第十课
http://bbs.huazhoucn.com/Topic.aspx?id=2704
单片机学习,C51单片机入门经典30课 第十一课
http://bbs.huazhoucn.com/Topic.aspx?id=2705
单片机学习,C51单片机入门经典30课 第十二课
http://bbs.huazhoucn.com/Topic.aspx?id=2706
单片机学习,C51单片机入门经典30课 第十三课
http://bbs.huazhoucn.com/Topic.aspx?id=2707
单片机学习,C51单片机入门经典30课 第十四课
http://bbs.huazhoucn.com/Topic.aspx?id=2708
单片机学习,C51单片机入门经典30课 第十五课
http://bbs.huazhoucn.com/Topic.aspx?id=2709
单片机学习,C51单片机入门经典30课 第十六课
http://bbs.huazhoucn.com/Topic.aspx?id=2710
单片机学习,C51单片机入门经典30课 第十七课
http://bbs.huazhoucn.com/Topic.aspx?id=2711
单片机学习,C51单片机入门经典30课 第十八课
http://bbs.huazhoucn.com/Topic.aspx?id=2712
单片机学习,C51单片机入门经典30课 第十九课
http://bbs.huazhoucn.com/Topic.aspx?id=2713
单片机学习,C51单片机入门经典30课 第二十课
http://bbs.huazhoucn.com/Topic.aspx?id=2556
单片机学习,C51单片机入门经典30课 第二十一课
http://bbs.huazhoucn.com/Topic.aspx?id=2715
单片机学习,C51单片机入门经典30课 第二十二课
http://bbs.huazhoucn.com/Topic.aspx?id=2716
单片机学习,C51单片机入门经典30课 第二十三课
http://bbs.huazhoucn.com/Topic.aspx?id=2717
单片机学习,C51单片机入门经典30课 第二十四课
http://bbs.huazhoucn.com/Topic.aspx?id=2718
单片机学习,C51单片机入门经典30课 第二十五课
http://bbs.huazhoucn.com/Topic.aspx?id=2719
单片机学习,C51单片机入门经典30课 第二十六课
http://bbs.huazhoucn.com/Topic.aspx?id=2720
单片机学习,C51单片机入门经典30课 第二十七课
http://bbs.huazhoucn.com/Topic.aspx?id=2721
单片机学习,C51单片机入门经典30课 第二十八课
http://bbs.huazhoucn.com/Topic.aspx?id=2722
单片机学习,C51单片机入门经典30课 第二十九课
http://bbs.huazhoucn.com/Topic.aspx?id=2723
单片机学习,C51单片机入门经典30课 第三十课
http://bbs.huazhoucn.com/Topic.aspx?id=2724
单片机学习,C51单片机入门经典30课 附录
http://bbs.huazhoucn.com/Topic.aspx?id=2731