RSS

单片机基础讲解

发布时间:2006-12-08 关键字: 讲解 基础 指令 程序 存储器 数据 单元
程序实例
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)程序结束

上一页 1 2 3 4 5 6 7 8 9 10下一页
[收藏] [推荐] [评论] [打印] [关闭]
3
上一篇:没有了
下一篇:AT89C52内部寄存器一览表
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
热点关注
相关文章