基于SDCC和Edsim51的代码仿真

基于SDCC和Edsim51的代码仿真

一.SDCC—在Edsim51虚拟开发板上点亮一个Led灯

(1)C语言方法

1.在devC++中新建一个C语言文件命名为led1.c,并写入代码

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

2.下载SDCC(尽可能不要安装在C盘,以免冲突)

官网:SDCC - Small Device C Compiler (sourceforge.net)

网盘:链接:https://pan.baidu.com/s/1ebS3vYLCohNkVfDhwChzGA
提取码:0708

3.打开命令提示符(Win+R+cmd或任务栏搜索中搜索关键字),用cd命令找到第(1)步中led1.c所在的文件目录

然后采用下列命令编译

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 文件,操作命令如下:

packihx led1.ihx > led1.hex

在这里插入图片描述

4.使用EdSim51进行仿真

下载完毕后,以Java ™ Platform SE binary方式打开

在这里插入图片描述

点击Load载入hex文件,把频率调至10000,点击run观察LED灯

在这里插入图片描述

(2)汇编语言方法

输入汇编指令直接编译

在这里插入图片描述

LED灯亮

在这里插入图片描述

二.SDCC—LED灯闪烁

(1)汇编语言

ORG 10 
START:SETB P1.0 
	  LCALL DELAY 
	  CLR P1.0    
	  LCALL DELAY 
	  AJMP START  
	
DELAY: MOV R7,#250 
D1:	   MOV R6,#250
D2:    DJNZ R6,D2
	   DJNZ R7,D1
	   RET  
	   END 

(2)C语言

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

结果:

在这里插入图片描述

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

MOV P0, #0FEH 汇编指令对应的机器指令是:74H FEH.

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

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

四. 用Proteus仿真完成Led灯的点亮和闪烁,分别使用三种方式

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

  1. c语言程序

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

    编译成功

    在这里插入图片描述

2.LED灯闪烁-c语言程序

#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程序编程.

1.LED灯点亮

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

2.LED灯闪烁

#include<reg51.h>
 
sbit led=P1^0;
void delay()
{
	unsigned int i,j;
	for(i=0;i<1000;i++)
	for(j=0;j<20;j++);
}
void main(void)
{
	while(1)
		{
			led=0;
			delay();
			led=1;
			delay();
		}
}

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

1.汇编—点亮一个灯

在这里插入图片描述

  ORG  0000H
  MOV P1,#0FEH

2.LED闪烁

 ORG 0000H 
CLR P1.0    
	  LCALL DELAY 
	  SETB P1.0 
	  LCALL DELAY 
	  AJMP START  
	
DELAY: MOV R7,#250 
D1:	   MOV R6,#250
D2:    DJNZ R6,D2
	   DJNZ R7,D1
	   RET 

五.总结

SDCC支持的C语言和Keil所用的C语言略有不同
SDCC免费开源,Keil所支持的C语言版本较老旧且需要付费。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值