基于SDCC和Edsim51的代码仿真测试

1、Edsim51汇编点亮led灯与周期闪烁led灯

1.汇编点灯

刚开始使用Edsim时,必须得将刷新频率调高

点灯代码

MOV 90H, #0xFE

 解释:

mov ;操作码,作用有很多,当前作用为传递值

90H ;为内存地址,也是P1口的地址

#0xFE ;立即数,转为二进制:11111110,可以理解为只有p1.0口变为了低电平,所以能使p1.0口连接的led灯亮起

2、汇编闪烁

闪烁代码:

LOOP:SETB 90H ;led0置1
	  LCALL YANCHI ;调用延迟函数
	  CLR 90H    ;led0置0
	  LCALL YANCHI ;调用延迟函数
	  AJMP LOOP  ;跳转到LOOP
	
YANCHI: MOV R7,#250 ;延时函数,道理与while双循环一样
D1:	   MOV R6,#250 ;
D2:    DJNZ R6,D2  ;若R6不为0则一直减下去
	   DJNZ R7,D1  ;再回到D1处,直到减指令进行了250*250次结束
	   RET  ;返回主函数
	   END ;指令结束,不过该程序无法结束

解释在代码注释中。

2、在SDCC的帮助下实现使用C语言完成点亮与闪烁

1、打开SDCC与点灯

先用Win+R打开终端,然后跳到SDCC的文件夹bin内

接着在bin文件夹里创建一个txt的文档,在里面输入下述代码

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

 

 接着回到终端,输入一下指令

sdcc --std-sdcc89 led.c

 若情况与此相同则说明成功

此时bin文件夹中就会出现很多led为名的文件,我们需要的只有led.ihx

再在终端输入下指令

packihx led.ihx > led.hex

 

 在文件夹中就会出现我们需要的hex文件

那接下来就可以用Edsim来读取led.hex并启动了

随后的效果就是led1.0处被点亮

2、闪烁

闪烁比较简单,只需要修改原本led.c中的代码然后在再一边过程就行。

代码:

#include<mcs51/8051.h>

void delay_ms(int a)
	{
		int i,j;
		for(i=0;i<a;i++)
		{
			for(j=0;j<1000;j++) _nop_();
	
		}
	}

void main()
{
  while(1){
    P1=0b11111110;
    delay_ms(50);
    p1=0b11111111;
    delay_ms(50);
  }
}

3、对于电灯、Edsim翻译的机械指令与手工翻译的有何不同之处

首先我们要进行手工翻译,点灯的汇编语言例如:MOV 90H, #0xFE

MOV的操作码为75;90H的机器码为90 ;#0xFE的机器码为FE。

所以MOV 90H #0xFE的机器指令为 75 90 FE

再让我们打开Edsim,输入MOV 90H #0xFE并运行,然后查看翻译的机械指令

可以发现Edsim翻译的机械指令和手动翻译的机械指令是一样的。

4、尝试proteus与SDCC与keil不同的组合的配合方式实现点灯与闪烁

对于使用过proteus的人来说,在SDCC的操作完成后看到hex为扩展名的文件时肯定很亲切,因为这样生成的hex文件也可以在proteus中使用,但因为涉及的操作太多,若想回忆proteus如何使用的hex文件的,可以看我之前的博。这次的实验就到此为止,谢谢观看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值