基于SDCC和Edsim51的代码仿真。

一、 采用汇编语言与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闪烁效果。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值