Bootstrap

Proteus仿真并点亮LED灯

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语言外的汇编语言。每种语言都需要我们深入地去学习,才能体会到它的魅力。

;