目标概述:
根据我们之前所学的相关内容,我们将仍然使用Proteus、Keil软件,以及现在新接触的Edsim51软件和编译器SDCC,共同实现点亮LED灯的操作。
首先我们看到在Edsim51软件中,LED灯的连接如下图:
可以看到左侧的LED 0~7 灯连接在 8051 的 P1 口,而且是共阳极连接,也就是 P1 各口设置为低电平( 即为 0 )时,相应的灯就会亮,下面的程序点亮LED 0 灯(其他灯灭)。
一、汇编语言
汇编语言比较简单,因为LED0 接在P1.0端口上,8051中P1.0的地址固定为 90H,因此,对这个地址 (即指针)对应的寄存器写入立即数 0(即低电平),就可以是 LED0电路导通,亮灯。 对应的汇编命令是:(三条中的任意一条代码都可以)
MOV 90H, #0xFE
MOV 0x90,#0xFE
MOV 0x90,#254
任选一条代码,粘贴上去后,根据箭头所指操作,点击 run 即可完成点亮。第二张图即编译运行后的界面所示。可以看到代码区域以及在运行;同时左下角对应 0 的方格亮起,即代表点亮成功。
思考题:MOV 90H, #0xFE 为什么 操作数之前要加上 # ? 如果去掉 # 后,又是什么含义?结果正常吗?
答:在汇编语言中,#符号通常用于表示立即数(immediate value)。在指令 MOV 90H, #0xFE 中, #0xFE 表示将立即数 0xFE 移动到地址为90H的内存单元中。
如果去掉#符号,指令将变成 MOV 90H, 0xFE ,这意味着将存储在地址 0xFE 处的内容移动到地址90H的内存单元中。因为它不再是一个立即数,而是一个内存地址,这样做可能会导致其他结果,以至于无法正常运行。
注意事项:在仿真运行之前,Edsim51的Update Frequency (刷新频率)要加大到10000及以上才可以正常运行。
二、C语言
由于Edsim51软件的局限性,它只可以编译汇编语言。因此,对于C语言编写的程序,需要借助其他的C编译器转换为汇编和二进制执行程序(.hex 文件)才能正常的仿真运行(比如 SDCC for 8051 或 Keil for 8051)。这里我们用 SDCC 4.3.0 为例演示。
其下载地址:Small Device C Compiler (SDCC) download | SourceForge.net
这里我们将其安装到 D 盘中,方便后续演示,如果有安装其他版本的 SDCC 记得先卸载。安装完成之后,其编译链工具程序在 bin 文件夹下:
首先我们先在 bin 文件下新建一个文本文件,在该文件内编写C语言程序,然后保存为 " .c " 后缀文件。
具体代码如下:
#include<mcs51/8051.h>
void main()
{
while(1){
P1=0b11111110;
}
}
然后我们使用 win+R 打开windows 命令行窗口,输入 cmd ,然后用cd 命令切换当前工作目录到 D:\ 根目录下,然后用下例指令编译刚才的c文件(这里我的文件为 led01.c ),具体指令、操作如下:
D: //转到D盘
cd D:\SDCC 4..3.0\bin //打开文件目录下
sdcc --std-sdcc89 led01.c //编译
packihx led1.ihx > led1.hex //把ihx文件转换为 hex 文件
可以看到以及出现我们需要的 " .hex " 文件。
然后我们在根据箭头指示,点击 " New " 和 " Load ",选择我们生成的 " .hex " 文件。
再点击 " Run " 即可运行仿真。
值得注意,这次在仿真运行之前,Edsim51的Update Frequency (刷新频率)要加大到50000。
附文:可能遇到的 " .c " 文件转换问题
其中有些电脑的配置或者系统原因等,直接在文件还后面添加 " .c " 无法转换为c语言文件,则要使用下面一种方法:
即,把保存类型改为 "所有文件" ,编码改为 " ANSI " ,然后再保存,就可以成功保存为c文件。