1.使用汇编语言实现单个LED灯的点亮
首先在Protues中完成电路图的绘制。先使用Proteus建立一个工程以便绘制电路图,建立的过程中生成一个AT89C51的芯片,然后在工具栏中选择对应组件,进行硬件部分的绘制,以便执行汇编语言的程序,最后在芯片的一个端口上接入一个LED灯和适当的电阻,并接地。大致电路图如下图所示。
接着进入Keil进行汇编语言的编写和运行,编译完成后生成对应的hex文件。编写汇编语言时,根据绘制电路图时选择的连接LED灯的端口,在编写时写上对应的端口,跳转到对应的地址,实现LED灯的点亮。汇编语言代码如下所示。
ORG 0100H
SETB P2.0
SJMP $ ;无条件相对转移 $就是本句语言的指针地址
;SJMP $,就是硬件部分
END`
最后将生成的hex文件录入电路图中的芯片中,运行电路,就可以观察到LED灯被点亮了。
2.使用51C语言实现LED流水灯点亮
先使用Proteus建立一个工程以绘制电路图,在建立的过程中添加AT89C51芯片,以便完成LED灯1的流水线发光,添加好后,会自动在电路中生成AT89C51芯片。接着在左边工具栏内选择对应组件进行电路图的绘制。分别连接8个LEd灯以及电阻防止击穿,并接入电源,同时给线路和元件进行命名以便代码的编写。大致电路图如下图所示。
然后进入Keil完成c语言的编译。定义一个delay延时函数以便观察LED灯的变化情况,led函数来进行LED灯的闪烁,将代号定义为一个16进制数表示的2进制数并用“~”进行取反,然后循环依次将“0”向左移位,当对应元器件处于低电位时发光,高电位时熄灭。编译完成后生成对应hex文件。51C语言代码如下所示。
#include"reg51.h"
sbit LED0=P2^0;
void delay(unsigned int t)
{
unsigned int i=0,j=0;
for(i=0;i<t;i++)
{
for(j=0;j<120;j++);
}
}
void led()
{
int i=0;
for(i=0;i<8;i++)
{
P2=~(0x01<<i);//0000 0001 -> 0000 0010
delay(200);
}
}
void main()
{
while(1)
{
led();
}
}
最后将生成的hex文件导入芯片中,运行电路,便能看到LED流水灯发光。
3.使用汇编语言实现LED流水灯点亮
与实现单个LED灯的点亮一样,先新建过程生成AT89C51芯片并进行硬件部分的绘制,接着在工具栏内选择对应组件进行电路图的绘制,分别连接8个LEd灯以及电阻防止击穿,并接入电源,同时给线路和元件进行命名以便代码的编写。大致电路图如下图所示。
接着进行汇编语言的编写,要实现流水灯效果,需要让累加器A中的1000 0000循环右移,中间加以延时。延时程序分为两层的循环,D1和D2,分别用到R2、R3两个寄存器。两个八位寄存器,那对应的数字就是0~255注意给寄存器传送立即数时不要超过255。编译完成后生成对应hex文件。汇编语言代码如下所示。
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV A,#80H
LOOP:
MOV P2,A
LCALL DELAY
RR A
LJMP LOOP
DELAY:
MOV R2,#255
D1:MOV R3,#250
D2:DJNZ R3,D2 ;寄存器减1,不为0 则转移
DJNZ R2,D1
RET
END
最后将生成的hex文件导入芯片中,运行电路,便能看到LED流水灯发光。
4.总结
对于Proteus的使用,本次完成了LED灯的单个点亮以及流水线发光,对于电路图的绘制和平时的差不多,进展的比较顺利,主要是代码的编写,最开始使用c语言编写,鉴于之前的基础,上手比较容易,只是多了一些头文件来适应Proteus的工程。然后是51汇编语言的编写,选择对应汇编语言已经有了一定程度的认识,能较好的理解汇编语言的含义,但对于汇编语言仍需要多加练习。