一、 采用汇编语言与C语言两种方式在Edsim51模拟开发板上点亮一个Led灯,另要实现Led灯闪烁。
(1) 汇编语言点亮Led
汇编语言点亮Led代码如下:
MOV 90H,#0xFE
在Edsim51模拟器中进行模拟,点击NEW,输入上述指令,点击RUN(点击运行后变为Pause)可以看到Led灯亮起。
(2) C语言点亮Led
C语言实现点亮Led灯代码如下:
#include<mcs51/8051.h>
void main()
{
while(1){
P1=0b11111110;
}
}
首先在D盘下新建led_test文件夹,将上述实现点亮Led灯源代码保存为led1.c文件并保存在led_test文件夹下,打开window命令行窗口,使用cd命令打开到led_test文件夹下。
使用下列命令进行编译:
sdcc --std-sdcc89 led1.c
编译成功后led1.c所在目录下会生成多个文件,ihx,rst,lst…等文件,然后,我们使用下列命令将ihx文件转换为hex文件,操作命令如下:
packihx led1.ihx > led1.hex
执行成功即可得到----led1.hex文件。然后我们打开Edsim51模拟器,将Update Ereq改为50000然后点击NEW,点击Load,然后打开led_test选择刚刚生成的led1.hex文件加载进去然后点击RUN ,可以看到Led被点亮。
(3) 汇编语言实现Led闪烁
汇编语言实现Led闪烁代码如下:
ORG 10 ;起始地址
LOOP:SETB P1.0 ;端口置1
LCALL DELAY ;调用延时函数
CLR P1.0 ;端口置0
LCALL DELAY ;调用函数
AJMP LOOP ;跳转到LOOP
DELAY: MOV R7,#250 ;延时函数
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET ;返回主函数
END ;指令结束
按照之前步骤点击NEW,将代码输入然后点击RUN,即可使Led闪烁:
(4) C语言实现Led闪烁
C语言实现Led灯闪烁代码如下:
#include<mcs51/8051.h>
void delay();
void main()
{
while(1)
{
P1=0xfe;
delay();
P1=0xff;
delay();
}
}
之后参考(2)中转换生成hex方法唯一不同的是将闪烁代码源文件命名为led2.c然后将指令中led1.c改为led2.c,即可得到led2.hex文件,然后在Edsim51模拟器中点击NEW点击Load,选择刚刚生成在led_test目录下的led2.hex文件,然后点击运行,即可实现Led闪烁:
二、 参考8051指令集大全手册进行手工翻译(一)中点亮Led汇编语言为机器码指令,与Edsim51编译生成机器码指令进行对比。
(一)中使用的汇编语言:
MOV 90H,#0xFE
(1) 手工翻译机器码
MOV:74
90H:90
#0xFE
(2) Edsim51编译生成机器码
MOV:75
90H:90
#0xFE:FE
三、 在Proteus里使用不同方式实现Led灯点亮和闪烁的仿真实验。
首先在Proteus中画一个与Edsim51虚拟电路原理基本相同的电路。
(1) 采用Proteus+SDCC 的C程序编程;
点亮:选择之前生成的led1.hex文件加载到AT89C51中然后点击运行,即可点亮:
闪烁:将之前C语言实现闪烁的代码生成的led2.hex文件加载到AT89C51中即可使Led闪烁:
(2) 采用Proteus+Keil C51 的C程序编程;
点亮:
点亮代码如下:
#include<reg51.h>
void main()
{
while(1){
P1=0xFE;
}
}
在KeilC51中新建工程然后添加含有上述代码的led1.c文件到工程中然后生成led1.hex文件然后在proteus中把led1.hex加载到AT89C51中编译运行即可点亮Led:
闪烁:
闪烁代码如下:
#include<reg51.h>
void delay(unsigned int t);
void main()
{
while(1)
{
P1=0xfe;
delay();
P1=0xff;
delay();
}
}
void delay(unsigned int t)
{
while(--t);
}
然后在Keil中生成led2.hex文件将其加载到AT89C51中即可有Led闪烁效果:
(3) 采用Proteus 内置汇编语言编译的方式。
右键点击芯片出现如下图选项选择编辑源代码选项,然后在Start处编写代码:
点亮:
点亮代码如下:
ORG 0000H
MOV 90H,#0FEH
编辑完代码后点击编译运行,会出现编译成功,然后跳转到原理图可以看到点亮效果。
闪烁:
Led闪烁代码如下:
ORG 0000H ;起始地址
SETB P1.0 ;端口置1
LCALL DELAY ;调用延时函数
CLR P1.0 ;端口置0
LCALL DELAY ;调用函数
AJMP Start ;跳转到Start
DELAY: MOV R7,#250 ;延时函数
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET ;返回主函数
同样右键选择编辑源代码在Start处编写代码然后编译运行即可看到Led闪烁效果。