基于SDCC和Edsim51的代码仿真、点亮LED实验

一、软件准备:

(一)Proteus仿真软件

(二)SDCC3.0版本:可以从Proteus中下载的到

(三)Edsim51

二、在Edsim51虚拟开发板上点亮一个Led灯,尝试让Led灯周期性闪烁。

(一)使用C语言点亮LED灯

1.使用SDCC将C语言文件转化为可执行文件

(1)下载安装好SDCC程序,首先找到安装SDCC的文件位置。在该目录下,创建C语言程序文件,放在文件bin目录下

源代码:命名led1.c

/* LED1.c source code */
#include<mcs51/8051.h>
void main()
{
  while(1){
    P1=0b11111110;
  }
}

(2)创建好文件后,使用win+R键打开运行窗口,输入cmd进入控制台,输入D:切换到你存储的盘上。

(3)使用cd命令,切换当前工作目录到根目录下

cd D:\Proteus\仿真程序_软件模拟器\SDCC3.0\SDCC\bin

(4)找到bin所在的地址,复制粘贴输入即可,后输入sdcc --std-sdcc89 led1.c,然后我们可以在bin文件夹中找到led1.ihx文件.

(5)需要用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件,操作命令为packihx led1.ihx > led1.hex,成功的话可以得到 led1.hex 执行程序.

 控制台显示packihx:read 19 lines,wrote 14:OK即表明程序转换成功,这时bin文件夹中应该有一个led1.hex文件.

2.使用EdSim51进行仿真.

(1)从edsim51网站下载最新版的edsim51程序压缩包,解压后可看到edsim51di.jar文件。直接双击即可打开,或者在控制台中进入jar文件所在文件夹,运行下面的命令即可。

打开代码:

java -jar edsim51di.jar

(2)打开EdSim51,打开之后我们不可以关闭控制台,因为控制台关闭,EdSim51也会关闭,所以将控制台最小化即可.

(3)进入EdSim51中,点击Load,将led1.hex文件打开(注意改变文件类型为Intel HEX Files才能找到led1.hex文件):

(4)导入可执行文件后,这样显示,则代表文件成功导入。

(5) 点击Run,观察现象: 灯并没有亮

发现发现灯不亮,后将更新频次增加到10000,观察现象:

LED成功点亮。

(二)在EdSim51中使用汇编语言进行仿真点亮LED灯.

(1)在EdSim51中点击New按钮,输入如下汇编语言:

MOV 90H, #0xFE

点击Save按钮,再点击Run,观察现象:

LED成功点亮。

(三)采用汇编语言与C语言两种方式让Led灯周期性闪烁.

1.采用汇编语言让Led灯周期性闪烁

代码如下:

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 ;指令结束

点击Run,观察现象:

LED成功点亮并闪烁。

2.采用C语言让Led灯周期性闪烁

C语言代码如下:

#include<mcs51/8051.h>
void delay(int i)			
{
	while (i--);	
}
 
void main()
{
	while (1) {
		P1 = 0b11111110;
		delay(50000);
		P1 = 0b11111111;
		delay(50000);
	}
}
 

与上文步骤类似,编写C语言文件,并使用SDCC转化文件为可执行文件。

将led2.c转换为led2.hex后Load到EdSim51中,将更新频次改变到50000更加便于观察,进行试验,观察现象:

导入C语言文件:

将更新频次改变到50000更加便于观察:

发现LED灯成功点亮并闪烁。

三、在Edsim51,把汇编语言点亮Led1灯的代码,手工翻译转换为机器指令,与Edsim51 编译生成的机器码指令进行对比,查看是否一致。

(一)手工翻译转换为机器指令,与Edsim51 编译生成的机器码指令进行对比.
首先,MOV 指令的操作码是 MOV A, immediate,即 74H。
立即数 0xFE 转换为十六进制为 FEH。
因此,MOV P0, #0FEH 汇编指令对应的机器指令是:74H FEH.

Edsim51 编译生成的机器码指令为:

CODE   MNEMONIC           HEX VALUE
-------------------------------------
0000   MOV A, #FEH        74 FE
0002   MOV P1, A          F5
 

指令一致

四、在Proteus中画出一个与Edsim51虚拟电路原理基本相同的电路,用三种方式实现Proteus仿真完成Led灯的点亮和闪烁

(一)采用Proteus+SDCC 的C程序编程

1.LED灯点亮:

C语言代码:

/* LED1.c source code */
#include<mcs51/8051.h>
void main()
{
  while(1){
    P1=0b11111110;
  }
}

进入Proteus,根据之前的步骤,创建工程,做出仿真元件图,双击单片机,选择第一步创建好的HEX可执行文件,观察LED灯点亮情况:

LED灯成功点亮。

2.LED灯闪烁:

双击51单片机,选择LED2可执行文件,源文件代码如下:

#include<mcs51/8051.h>
void delay(int i)			
{
	while (i--);	
}
 
void main()
{
	while (1) {
		P1 = 0b11111110;
		delay(50000);
		P1 = 0b11111111;
		delay(50000);
	}
}

观察运行结果:

记住要修改接线灯的位置:如图所示

LED灯成功闪烁:

(二)采用Proteus+Keil C51 的C程序编程

1.LED灯点亮:

Keil C51 的C程序:代码:

#include<reg52.h>
 
void main ()
{
	
    while (1) {
        P1 = 0xFE;
    }
}

结果:LED灯成功点亮

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();
		}
}

观察LED点亮闪烁情况:

LED灯成功闪烁。

(三)采用Proteus 内置汇编语言编译的方式

1.LED的点亮:

汇编程序:

  ORG  0000H
      MOV P1,#0FEH

采用Proteus 内置汇编语言:

LED灯成功点亮。

2.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  ;返回主函数

编写:

结果显示:

.LED成功闪烁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值