基于SDCC和Edsim51的代码仿真

实验一

1、要求

安装SDCC和Edsim51,采用汇编语言与C语言两种方式,在Edsim51虚拟开发板上点亮一个Led灯,并思考尝试让Led灯周期性闪烁。

2、实践

(1)点亮一个LED灯

C语言

下载完成SDCC和EdSim51后,我们先按问win+R键打开运行窗口,再输入cmd打开控制台,用cd 命令切换当前工作目录到 E:\根目录下, 用 mkdir 命令创建一个实验目录 led_test, 再切换当前工作目录到 E:\led_test 目录下。 创建或copy 下列C代码文件,在此目录下。

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

然后采用下列命令编译

sdcc --std-sdcc89 led1.c

注意:上面包含头文件 mcs51 目录下的 8051.h ,里面定义了各个寄存器的宏定义,比如 P1 、 TCON 等,不同公司的芯片其寄存器的地址可能不一样, edSim51 仿真的芯片采用的就是 mcs51 的8051芯 片。

另一个注意的地方是 main 函数是没有返回值的。

第三个注意的地方是程序里为了表示 P1 口的各个位( bit )的值,使用了 0b11111110 这样的二进制字面 量,这是非标准的 sdcc 扩展,为此,需要在编译的时候指定 --std-sdccxx 编译选项,这里 xx 需要按需 要替换为 89 、 99 、 11 、 2x 以适应不同标准,下面是一个参考命令:

sdcc --std-sdcc89 led1.c

如果编译成功的话,可以在当期目录下生成需要 led1.* 的文件,其中包括 ihx 文件: led1.ihx ,然后需要用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件,操作命令如下:

packihxled1.ihx>led1.hex

成功的话可以得到led1.hex执行程序,然后我们就可以用edSim51仿真器中的 load 按钮加载 hex 进行仿真 run。
在这里插入图片描述

汇编语言

汇编语言比较简单,因为LED0 接在P1.0端口上,8051中P1.0的地址固定为 90H,因此,对这个地址 (指针)对应的寄存器写入立即数 0(低电平),就可以是 LED0电路导通,亮灯。 对应的汇编命令是

MOV 90H, #0xFE
或者
MOV 0x90,#0xFE
或者
MOV 0x90,#254

注:在仿真运行之前,Edsim51的Update Frequency (刷新频率)要加大到10000或更高。
在这里插入图片描述

(2)让LED闪烁

C语言

按照上文中点亮一个Led时,使C语言程序借助SDCC 转换为二进制执行程序(.hex)进行仿真运行。

#include<mcs51/8051.h>
void Delay(unsigned int t); 
void main (void)
{
                 
while (1)         
  {
  P1=0b11111110;            
  Delay(10000);      
                     
  P1=0b11111111;           
  Delay(10000);
                     
  }
}	
void Delay(unsigned int t)
{
 while(--t);
}

运行结果可以看到Led闪烁。
在这里插入图片描述

汇编语言
LOOP:SETB 90H ;led0置1
	  LCALL DELAY ;调用延时函数
	  CLR 90H    ;led0置0
	  LCALL DELAY 
	  AJMP LOOP  ;跳转到LOOP
	
DELAY: MOV R7,#250 ;延时函数
D1:	   MOV R6,#250
D2:    DJNZ R6,D2
	   DJNZ R7,D1
	   RET  ;返回主函数
	   END ;指令结束

仿真运行后,可以看到Led在闪烁。
在这里插入图片描述

实验二

1、要求

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

2、实践

首先,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
 

实验三

1、要求

在Proteus中画出一个与Edsim51虚拟电路原理基本相同的电路,用Proteus仿真完成Led灯的点亮和闪烁,须分别采用以下方式:
(1)采用Proteus+SDCC 的C程序编程;
(2)采用Proteus+Keil C51 的C程序编程;
(3)采用Proteus 内置汇编语言编译的方式。

实践

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

LED点亮
#include<mcs51/8051.h>
void main()
{
    while (1) {
        P1 = 0b11111110;
    }
}

LED点亮,实验成功。
在这里插入图片描述

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

首先,选中AT89C51芯片,右键选择编辑源代码,然后在start:下面添加代码
在这里插入图片描述
LED闪烁,试验成功。
在这里插入图片描述

LED闪烁
  ORG 0000H
      SETB 90H ;led0置1
	  LCALL DELAY ;调用延时函数
      CLR 90H  ;led0置0 
	  LCALL DELAY 
	  AJMP Start  ;跳转到Start
	
DELAY: MOV R7,#250 ;延时函数
D1:	   MOV R6,#250
D2:    DJNZ R6,D2
	   DJNZ R7,D1
	   RET  ;返回主函数

在这里插入图片描述

总结

在使用SDCC和Edsim51的过程中,无疑是一个融合了学习、实践与探索的绝佳机会。这两者都是非常好用的工具,SDCC(Small Device C Compiler)作为一款优秀的C语言编译器,而Edsim51则是一个强大的51单片机仿真软件。

SDCC的编译效果相当出色,生成的代码不仅体积小,而且运行速度快,非常适合在资源有限的单片机上使用。

Edsim51为我提供了一个虚拟的51单片机环境,让我可以在没有实际硬件的情况下进行程序的调试和测试。这极大地降低了学习成本,也让我可以被硬件问题所困扰。。

在使用这两者进行学习和实践的过程中我也意识到,要想真正掌握它们,还需要不断地学习和实践。因为无论是SDCC还是Edsim51,都只是工具,真正重要的是我们如何使用这些工具去解决问题,去实现我们的想法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值