1.安装Proteus8软件,使用AT89C51单片机的外部引脚,点亮1个LED灯。采用汇编指令完成。
2.采用多个LED,设计一个LED流水灯电路,分别用51汇编语言和C语言编程,实现流水灯正常工作。
一、使用AT89C51单片机的外部引脚,点亮1个LED灯。采用汇编指令。
1.首先使用Proteus8绘制原理图
(1)打开Proteus8软件创建新工程,点击这两处皆可创建新工程。
(2)然后编辑名称及其路径,点击浏览可更改路径,勾选新工程(默认),点击下一步。
(3) 创建原理图,默认选择DEFAULT,再点击下一步。
(4)创建PCB,默认选择DEFAULT,不需要可以先以选择不创建,再点击下一步。
(5)选择创建固件项目,选择AT89C51,然后继续下一步。
(6)最后点击完成。
(7)点击原理图绘制,开始绘制原理图,点击P选择元器件。
(8)在1处输入所需要的元件名称,选择所需要的元件。
本次所需要的元件如下图,接地点击框起来的图标选择GROUND(电源选择OPOWER)即可。
最终所画电路原理图:
2.接下来开始编写代码,需要使用到Keil C51来编写程序
(1)打开Keil软件,点击Project,点击New uVision Project …
(2)给文件命名,选择存储位置并保存
(3) 在这里输入AT89C51,选择对应的芯片,点击OK
(4)点击是
(5) 点击左上角新建文件,并在对应区域编写代码
汇编语言代码:
ORG 0100H
SETB P2.0
SJMP $ ;无条件相对转移 $为本句语言的指针地址
;SJMP $,就是硬件部分
END
(6)点击左上方保存,并给文件起名,加.asm后缀(必须加!!!),点击保存
(7)右键点击 Source Group 1 ,再点击 Add Existing Files to Group “Source Group 1”…
(8) 文件类型选择All files(*.*),选中刚刚创建的 main.asm文件,并点击 Add 。
(9) 此文件夹下main.asm文件就被添加了
(10)点击魔法棒,在弹出的窗口内选择 Output ,再勾选 Create HEX File ,然后点击 OK。
(11)点击左上角编译,编译成功下面会显示0个错误,这就生成了.hex 文件。
3.最后开始仿真
(1)回到Proteus8软件的原理图,双击 AT89C51 芯片后,在弹出的窗口的编辑元件一栏选择从刚才 keil 软件编译后的路径中添加的 .hex 文件,再点击 OK 。
(2)点击开始按钮开始仿真
仿真结果:
二、使用AT89C51单片机的外部引脚,实现LED流水灯。
步骤和第一个相同,所需要的元件如下:
电路原理图:
1. 汇编语言代码:
ORG 0h
MOV P0, #0FFh ; ??? P0 ??????
LOOP:
MOV P0, #0FEh ; ????? LED
CALL DELAY_MS ; ??????
MOV P0, #0FDh ; ?????? LED
CALL DELAY_MS
MOV P0, #0FBh
CALL DELAY_MS
MOV P0, #0F7h
CALL DELAY_MS
MOV P0, #0EFh
CALL DELAY_MS
MOV P0, #0DFh
CALL DELAY_MS
MOV P0, #0BFh
CALL DELAY_MS
MOV P0, #07Fh
CALL DELAY_MS
SJMP LOOP ; ????
DELAY_MS:
MOV R7, DPL ; ???????? R7 ???
DELAY_LOOP_OUTER:
MOV R6, #200 ; ????????
DELAY_LOOP_INNER:
NOP ; ???????
NOP
NOP
DJNZ R6, DELAY_LOOP_INNER ; ???
DJNZ R7, DELAY_LOOP_OUTER ; ???
RET
END
仿真结果:
2.c语言代码:
用c语言代码时保存代码需要加.c后缀,区别于汇编语言的.asm后缀
//51单片机编程常用的头文件
#include <reg51.h>
#include <intrins.h>
//延迟函数
void delay_ms(int a)
{
int i,j;
for(i=0;i<a;i++)
{
for(j=0;j<1000;j++) _nop_();
}
}
void main(void)
{
while(1)
{
P0=0xfe;
delay_ms(50);
P0=0xfd;
delay_ms(50);
P0=0xfb;
delay_ms(50);
P0=0xf7;
delay_ms(50);
P0=0xef;
delay_ms(50);
P0=0xdf;
delay_ms(50);
P0=0xbf;
delay_ms(50);
P0=0x7f;
delay_ms(50);
}
}
仿真结果: