基于SDCC和Edsim51的代码仿真
一. 采用汇编语言与C语言两种方式,在Edsim51虚拟开发板上点亮一个Led灯,并思考尝试让Led灯周期性闪烁。
(1)用汇编语言点亮一个Led灯
在EdSim51中点击New按钮,输入如下汇编语言之一:
MOV 90H, #0xFE
或
MOV 0x90, #0xFE
或
MOV 0x90,c#254
然后点击Save按钮,再点击Run就好了。
(2)用C语言点亮一个Led灯
在SDCC的bin文件夹中新创文本文件复制以下代码到文本中,并改名为LED.c;
#include<mcs51/8051.h>
void main()
{
while(1)
{
P1=0b11111110;
}
}
然后在键盘上按win+R键打开运行窗口,在运行窗口中输入cmd打开控制台,用cd命令切换当前工作目录到E:\根目录下,采取以下命令编译:
sdcc --std-sdcc89 led.c
结果是得到点亮一个LED灯C语言代码的执行文件—led.hex文件,然后在Edsim51中选择load按钮,将SDCC文件中bin文件夹里的执行文件led.hex加载进软件当中,最后点击按钮run进行仿真。
(3)Led灯周期性闪烁
我们将如下代码带入EdSim51中:
ORG 10 ;起始地址
START: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 ;
END ;
然后就可以使Led灯周期性闪烁了。
二. 在Edsim51,把汇编语言点亮Led1灯的代码,手工翻译转换为机器指令,与Edsim51 编译生成的机器码指令进行对比,查看是否一致。
Edsim51编译生成的机器码指令为:
CODE MNEMONIC HEX VALUE
-------------------------------------
0000 MOV A, #FEH 74 FE
0002 MOV P1, A F5
三. 在Proteus中画出一个与Edsim51虚拟电路原理基本相同的电路,用Proteus仿真完成Led灯的点亮和闪烁,须分别采用以下方式:
(1)采用Proteus+SDCC 的C程序编程;
Led灯点亮
#include<mcs51/8051.h>
void main()
{
while (1) {
P1 = 0b11111110;
}
}
Led灯闪烁
#include<mcs51/8051.h>
void delay(int i)
{
while (i--);
}
void main()
{
while (1) {
P1 = 0b11111110;
delay(50000);
P1 = 0b11111111;
delay(50000);
}
}
(2)采用Proteus+Keil C51 的C程序编程;
Led灯点亮
#include<reg52.h>
void main ()
{
while (1) {
P1 = 0xFE;
}
}
Led灯闪烁
#include<reg51.h>
sbit led=P1^0;
void delay()
{
unsigned int i,j;
for(i=0;i<1000;i++)
for(j=0;j<5;j++);
}
void main(void)
{
while(1)
{
led=0;
delay();
led=1;
delay();
}
}
(3)采用Proteus 内置汇编语言编译的方式。
Led灯点亮
ORG 0000H
MOV P1,#0FEH
Led灯闪烁
ORG 0000H ;起始地址
CLR P1.0 ;端口置0
LCALL DELAY ;调用延时函数
SETB P1.0 ;端口置1
LCALL DELAY ;调用函数
AJMP START ;跳转到START
DELAY: MOV R7,#250 ;延时函数
D1: MOV R6,#250
D2: DJNZ R6,D2
DJNZ R7,D1
RET ;返回主函数