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文件的,可以看我之前的博。这次的实验就到此为止,谢谢观看。