沉浸式学习51单片机(2)--基于SDCC和Edsim51的代码仿真

实验一

一.一个Led灯的点亮

(一)汇编语言

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

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

注:在仿真运行之前,Edsim51的Update Frequency (刷新频率)要加大到10000或更高。

(二)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。

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

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

实验二

(一)要求

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

(二)实践

汇编代码示例(点亮Led1灯):

MOV P1.0, #0 ; 将P1.0口的值设置为0

手工翻译的机器指令可能如下所示(以Intel HEX格式表示):

:020000040000FA ; 起始地址设为0x0000 
:10000000FF300001FF3000027F300003FF30008D 
:04001000FF300011 ; 结束地址设为0x0010 
:00000001FF ; 结束

实验三 Proteus仿真完成Led灯的点亮和闪烁

一.采用Proteus+SDCC 的C程序编程

(一)LED灯的点亮

1.代码示例
#include<mcs51/8051.h>
void main()
{
    while (1) {
        P1 = 0b11111110;
    }
}
2.实验结果展示

 (二)LED灯的闪烁

1.代码示例
#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灯的点亮

1.代码示例
#include<reg52.h>
 
void main ()
{
	
    while (1) {
        P1 = 0xFE;
    }
}
2.实验结果展示

 (二)LED灯的闪烁

1.代码示例
#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();
		}
}

2.实验结果展示

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

 (一)LED灯的点亮

1.代码示例

2.实验结果展示

 (二)LED灯的闪烁

1.代码示例
  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  ;返回主函数

2.实验结果展示

四.总结 

学习基于SDCC和Edsim51的代码仿真是一次非常有意义的体验。通过使用SDCC编写C代码,并在Edsim51中进行仿真,我能够深入了解嵌入式系统的开发和调试过程。
首先,使用SDCC编写C代码相比于汇编语言更加高效和易于理解。SDCC提供了丰富的C语言特性和标准库支持,使得编写嵌入式程序更加方便。通过使用C语言,我能够更快速地实现功能,并且代码的可读性也得到了提升。
其次,Edsim51作为一款基于8051单片机的仿真器,为我提供了一个可视化的调试环境。在Edsim51中,我可以逐步执行程序并观察每一步的执行结果,从而更好地理解程序的运行过程。同时,我还可以通过设置断点和监视寄存器等功能来调试程序,大大提高了调试效率。
通过这次学习,我不仅掌握了使用SDCC编写嵌入式C代码的技能,还学会了如何使用Edsim51进行代码仿真和调试。这些经验对我今后在嵌入式系统开发领域的学习和工作都将大有裨益。我期待着进一步深入学习和实践,不断提升自己在嵌入式系统开发方面的能力。

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 学习51单片机和C语言编程,可以帮助我们更深入地理解嵌入系统的原理和工作方。对于初学者来说,掌握一份适合自己的学习资料非常重要。 要学习51单片机-C语言版,可以阅读《手把手教你学51单片机-C语言版pdf》这本电子书,这本书内容丰富,讲解详细,配合实例编程,非常适合初学者自学。以下是学习本书的几个关键点: 第一,掌握基本的硬件知识,包括单片机的结构和特性,尤其是各种寄存器的作用和配置方法。 第二,了解C语言编程基础,尤其是语法、数据类型、运算符、控制结构、函数等,这是编写单片机程序的基础。 第三,通过实例编程加强对知识的理解和运用能力。例如,可以尝试写一些简单的IO控制、定时器中断、串口通讯等程序。 第四,可以搭配相应的开发板和开发环境进行实践学习。例如,可以使用STC89C51开发板和Keil或SDCC开发环境。 总之,《手把手教你学51单片机-C语言版pdf》这本电子书是一个不错的学习资料,但也需要具备一定的基础知识和耐心,可以结合其他资料和实践不断提高自己的能力。 ### 回答2: 学习51单片机-c语言版, 需要基础的C语言编程知识。在学习前,先要熟悉C语言的数据类型、循环、判断及函数等语法结构,并掌握C语言的编写方法。 在学习51单片机-c语言版之前,需要准备好学习环境,如下载并安装Keil软件, 安装并关联好相应的单片机模拟器。Keil软件中有类似于记事本的编辑窗口用来编写C语言代码, 以及编译,调试和下载程序到单片机等功能。 在学习时,可以选择一些简单的例程开始学习,逐步理解其代码逻辑,了解基本的寄存器操作和中断等知识。可以从LED灯等简单的实验开始,逐渐增加难度和功能的复杂度。 同时,可以参考一些权威的学习资料如《单片机原理与应用》、《51单片机学习与应用》等相关书籍,或结合网络资源进行学习。在学习过程中,需要勤加练习,多编写代码进行实践,同时多与他人交流学习体会和技术问题。通过坚持不断的学习和练习,便可以逐步掌握51单片机-c语言版编程技巧,提高自己的单片机应用开发能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值