一、51单片机
51单片机汇编语言
指令格式
【标号:】操作码 目的操作数 ,源操作数;注释
如:LOOP:MOV A, 33H;将33H输入到累加器A中
ORG xxxxH命令
是指向程序不同功能固定入口。
如:0000H----系统复位入口 0013H—外中断1入口
0003H—外部中断0入口 001BH—T1溢出中断入口
000BH—T0溢出中断入口 0023H串口中断入口
数据传送类指令
MOV direct, A; 累加器传送到直接地址
MOV A,#data; data就是数据,直接赋给A
逻辑运算类指令
RR A; 累加器循环右移
控制转移类指令
JMP @A+DPTR; 相对DPTR的无条件间接转移
DJNZ Rn,rel; 寄存器减1,不为0则转移
RET 从子程序转移
LJMP add16 无条件长转移
L CALL add16 长调用子程序
SJMP 无条件相对转移
SETB C 置位进位位
LOOP 循环指令
二、实验
(一) 点亮一个LED灯
程序
ORG 0100H
SETB P2.0
SJMP $ ;无条件相对转移 $就是本句语言的指针地址
;SJMP $,就是硬件部分
END
(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灯。
(二) 点亮LED流水灯
程序
汇编语言
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
要实现流水灯效果,只需要让累加器A中的1000 0000循环右移,中间加 以延时即可。延时要足够长,否则会看到所有的灯都是亮的。
延时程序分为两层的循环,D1和D2,分别用到R2、R3两个寄存器。两个八位寄存器,那对应的数字就是0~255,注意给寄存器传送立即数时不要超过255。
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灯的亮灭和流水灯的实现。
三、总结
在电子设计与工程领域,仿真平台与编程软件是工程师们不可或缺的工具。近期,我深入学习了Proteus仿真平台和Keil软件,并在这两款工具的使用中获得了不少感悟。
Proteus仿真平台以其直观的操作界面和强大的仿真能力给我留下了深刻印象。通过该平台,我可以轻松构建电路图,模拟电路的工作状态,从而验证设计的可行性。这一过程极大地提高了我对电路设计的理解和实践能力。
Keil作为一款强大的编程工具,为我的嵌入式系统开发提供了极大的便利。通过Keil,我可以编写、调试和编译嵌入式系统的程序代码,实现各种复杂的功能。在软件的使用过程中,我感受到了编程的魅力和挑战,也体会到了不断试错、优化代码的乐趣。
在使用这两款软件的过程中,我也遇到了一些困难和挑战。例如,在Proteus中构建复杂的电路图时,需要耐心和细心地调整各个元件的参数和连接关系;在Keil中编写程序时,也需要不断调试和优化代码以实现预期的功能。
回顾整个学习过程,我深感仿真平台和编程软件在电子设计与工程中的重要性。它们不仅提高了我的工作效率和准确性,还让我更加深入地理解了电子系统的工作原理和实现方式,也认识到了不断学习和探索的重要性,只有不断提升自己的技能和能力,才能更好地应对未来的挑战。