[51单片机]基于SDCC和Edsim51的代码仿真

目录

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

(1)安装SDCC和EdSim51.

(2)采用汇编语言与C语言两种方式点亮LED灯.

A.使用SDCC将C语言程序转换为执行程序(.hex)。

B.使用EdSim51进行仿真.

C.采用汇编语言点亮LED灯.

D.采用C语言点亮LED灯.

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

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

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

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

(1)参考附件中8051指令集大全手册.

(2)手工翻译转换为机器指令,与Edsim51 编译生成的机器码指令进行对比.

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

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

A.Led灯的点亮

B.Led灯的闪烁

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

A.Led灯的点亮

B.Led灯的闪烁

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

A.Led灯的点亮

B.Led灯的闪烁

四. 总结


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

(1)安装SDCC和EdSim51.

安装路径:

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

(2)采用汇编语言与C语言两种方式点亮LED灯.

A.使用SDCC将C语言程序转换为执行程序(.hex)。

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

源程序文件: led1.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 文件,操作命令如下:

packihx led1.ihx > led1.hex

成功的话可以得到 led1.hex 执行程序,然后我们就可以用 edSim51 仿真器中的 load 按钮加载 hex 进行仿真 run。 

这里是先在devc++中先建立了led.c,然后将led.c保存在SDCC文件夹中的bin文件夹中(led.c必须保存在bin中,否则会报错无法正确运行),然后在控制台中输入d:进入D盘中,再找到bin所在的地址,复制粘贴输入即可,后输入sdcc --std-sdcc89 led1.c,然后我们可以在bin文件夹中找到led1.ihx文件.

 然后需要用 sdcc 配套的工具程序 packihx 把ihx文件转换为 hex 文件,操作命令为packihx led1.ihx > led1.hex,成功的话可以得到 led1.hex 执行程序,然后我们就可以用 edSim51 仿真器中的 load 按钮加载 hex 进行仿真 run。

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

B.使用EdSim51进行仿真.

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

java -jar edsim51di.jar

(1) 打开控制台 

 

(2) 复制地址 

(3) 在控制台中进入jar文件所在文件夹,运行命令java -jar edsim51di.jar

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

C.采用汇编语言点亮LED灯.

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

MOV 90H, #0xFE

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

成功点亮LED灯.

D.采用C语言点亮LED灯.

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

(2) 点击Run,观察现象: 

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

LED灯发亮,试验成功. 

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

A. 采用汇编语言让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灯闪烁,试验成功.

B. 采用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);
	}
}

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

 LED灯闪烁,试验成功.

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

(1)参考附件中8051指令集大全手册.

链接:https://pan.baidu.com/s/1xEjh8YuECscZWiAUxg7XgQ 
提取码:0102

(2)手工翻译转换为机器指令,与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仿真完成Led灯的点亮和闪烁,分别使用三种方式

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

A.Led灯的点亮

c程序:

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

LED灯闪烁,试验成功:

B.Led灯的闪烁

c程序:

#include<mcs51/8051.h>
void delay(int i)			
{
	while (i--);	
}

void main()
{
	while (1) {
		P1 = 0b11111110;
		delay(50000);
		P1 = 0b11111111;
		delay(50000);
	}
}

LED灯闪烁,试验成功:

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

A.Led灯的点亮

c程序:

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

实验结果:

B.Led灯的闪烁

C语言代码:
 

#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灯闪烁,试验成功:

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

A.Led灯的点亮

汇编程序:

  ORG  0000H
      MOV P1,#0FEH

首先,选中AT89C51芯片,右键选择编辑源代码,然后在start:下面添加代码

LED灯闪烁,试验成功:

B.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灯闪烁,试验成功:

四. 总结

本次实验进一步熟悉了LED亮灯实验,熟练应用了SDCC编译,Edsim51仿真软件,Proteus画电路图,学会安装了SDCC和Edsim51,采用汇编语言与C语言两种方式,在Edsim51虚拟开发板上点亮一个Led灯,并成功让Led灯周期性闪烁;通过汇编语言与C语言分别在Edsim51软件与Proteus中成功点亮了LED灯,在Proteus中画出一个与Edsim51虚拟电路原理基本相同的电路,用Proteus仿真完成Led灯的点亮和闪烁,分别三种不同的方式完成实验,提升了硬件设计与硬件编程的能力。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值