1.汇编语言
汇编语言指令格式
[标号:] 操作码 [第一操作数] [,第二操作数] [,第三操作数] [;注释]
此处用到的51单片机汇编指令
1.ORG xxxxH命令
是指向程序不同功能固定入口。
如:0000H----系统复位入口 0013H—外中断1入口
0003H—外部中断0入口 001BH—T1溢出中断入口
000BH—T0溢出中断入口 0023H串口中断入口
2.数据传送类指令
MOV direct, A; 累加器传送到直接地址
MOV A,#data; data就是数据,直接赋给A
3.逻辑运算类指令
RL A; 累加器循环左移
4.控制转移类指令
JMP @A+DPTR; 相对DPTR的无条件间接转移
DJNZ Rn,rel; 寄存器减1,不为0则转移
RET 从子程序转移
LJMP add16 无条件长转移
L CALL add16 长调用子程序
SJMP 无条件相对转移
SETB C 置位进位位
LOOP 循环指令
2.点亮一个LED灯
汇编程序:
(1)ORG 0100H:在汇编语言中,ORG(Origin)指令用于程序的起始地址。因此在该代码中,
ORG 0100H 设置的起始地址为0x0100
(2)SETB P2.0:把P2.0置1,使接入P2.0端口的LED灯亮。
(3)SJMP $:为无条件相对转移指令
硬件部分:
电路图设计原理:
点亮一个LED灯的电路设计原理是先引入一个AT89C51芯片,然后将LED灯接入芯片的某一个端口,在这里是将LED接入P2.0端,最后把代码生成的hex文件导入芯片中,来控制P2.0端,从而点亮LED灯。
3.LED流水灯电路
汇编程序:
ORG 000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH //1111 1110 OFEH
LOOP: //1111 1101 OFDH
MOV P0,A //0111 1111 7FH
//1111 1110 OFEH
LCALL DELAY
RL A
SJMP LOOP
DELAY:
MOV R7,#255
D1:
MOV R6,#250
DJNZ R6,$
DJNZ R7,D1
RET
END
要实现流水灯效果,只需要让累加器A中的1000 0000循环左移,中间加以延时即可。延时要足够长,否则会看到所有的灯都是亮的。延时程序用到R6、R7两个寄存器。两个八位寄存器,那对应的数字就是0~255,注意给寄存器传送立即数时不要超过255。
“ MOV P0,A ”该代码的含义是将累加器A中的值传送给P0端,点亮为D1的LED,再通过延时和左移依次点亮后面的LED。“SJMP LOOP ”为无条件跳转到LOOP,实现循环点亮LED。
C语言编程:
#include <reg51.h>
#include <intrins.h>
void delay_ms(int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<1000;j++) _nop_();
}
}
void main(void)
{
while(1)
{
P0=0xfe;
delay_ms(50);
P0=0xfd;
delay_ms(50);
P0=0xfb;
delay_ms(50);
P0=0xf7;
delay_ms(50);
P0=0xef;
delay_ms(50);
P0=0xdf;
delay_ms(50);
P0=0xbf;
delay_ms(50);
P0=0x7f;
delay_ms(50);
}
}
首先写了一个delay_ms的延迟函数,其次在main函数中通过while循环,把地址为0xfe的P0端口置为1,接入该端口的LED灯点亮,延时一段时间后,地址为0xfe的端口置为0,LED灯灭;把地址为0xfd的P0端口置为1,该端口的LED灯点亮,然后依次让接入P0端口的LED灯点亮,从而完成流水灯的设计。
硬件部分:
电路图设计原理:
实现LED流水灯的电路原理主要是首先将LED依次接入到AT89C51芯片的P0端,拉一条总线进行连接,通过编号形成一一对应的关系,然后将汇编程序或C语言编程生成的hex文件导入到此芯片中来控制P0端的输入和输出,从而间接控制LED灯的亮灭和流水灯的实现。
整体效果:
LED灯会从D1到D8依次点亮
接控制LED灯的亮灭和流水灯的实现。
4.总结
通过此次的电路仿真实验,加强了对Proteus电路仿真平台和Keil软件编译器的了解,更能熟练地运用到实践中,它们使用起来十分方便,不过要更加熟练地掌握,还需要上网查阅更多的资料。在流水灯的仿真过程中,我也学习到了除C语言外的汇编语言。每种语言都需要我们深入地去学习,才能体会到它的魅力。