目录
一.使用AT89C51点亮LED灯
(一)AT89C51简介
1.基本介绍
AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
图1.系统原理图
2.特性
AT89C51 提供以下标准功能:
4k 字节Flash 闪速存储器,256字节片内数据存储器(00H -7FH为片内RAM,80H-FFH为特殊功能寄存器SFR),32 个I/O 口线,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。
3.管脚
图2.管脚图
VCC | 提供电压 |
GND | 接地 |
P0口 | P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 |
P1口 | P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。 |
P2口 | P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。 |
P3口 | P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口同时为闪烁编程和编程校验接收一些控制信号 |
P3.0 RXD | 串行输入口 |
P3.1 TXD | 串行输出口 |
P3.2 /INT0 | 外部中断0 |
P3.3 /INT1 | 外部中断1 |
P3.4 T0 | 计时器0外部输入 |
P3.5 T1 | 计时器1外部输入 |
P3.6 /WR | 外部数据存储器写选通 |
P3.7 /RD | 外部数据存储器读选通 |
RST | 复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。 |
ALE/PROG | 访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。在FLASH编程期间,此引脚用于输入编程脉冲。在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时, ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 |
/PSEN | 外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。 |
/EA/VPP | 当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。 |
XTAL1 | 反向振荡放大器的输入及内部时钟工作电路的输入。 |
XTAL2 | 来自反向振荡器的输出。 |
(二) 使用AT89C51点亮LED灯
1.单个LED灯的点亮
(1)设计原理
(2)汇编程序
ORG 0100H
SETB P2.0
SJMP $
END
①ORG xxxxH命令
②数据传送类指令
③逻辑运算类指令
④控制转移类指令
(3)设计图
图3.设计图
2.LED流水灯电路
(1)设计原理
图4.流水灯设计图
(2)用51汇编语言实现
代码如下:
ORG 000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH //1111 1110 OFEH
LOOP: //1111 1101 OFDH
MOV P0,A //0111 1111 7FH
//1111 1110 OFEH
LCALL DELAY
RL A
SJMP LOOP
DELAY:
MOV R7,#255
D1:
MOV R6,#250
DJNZ R6,$
DJNZ R7,D1
RET
END
(3)用C语言编程实现
代码如下:
#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);
}
}
(4)实验成果图
图5.实验结果图
二.总结
这次的电路仿真实验对我来说是一次宝贵的学习机会。通过实践,我更加深入地了解了Proteus电路仿真平台和Keil软件编译器的使用方法。这两个工具在电路设计和嵌入式系统开发中扮演着至关重要的角色。我发现它们的操作界面清晰简洁,功能丰富,使用起来确实十分方便。
然而,尽管我已经初步掌握了它们的基本操作,但我也意识到要想更加熟练地运用这些工具,我还需要深入学习和实践。因此,我计划通过上网查阅更多的资料,阅读相关的教程和案例,进一步提升自己的技能水平。
在这次实验中,我不仅学会了如何在Proteus中仿真电路,还学习到了汇编语言的基础知识。虽然我之前主要使用C语言进行编程,但对于汇编语言的学习让我受益匪浅。我意识到每种编程语言都有其独特的特点和优势,只有深入学习并实践,才能真正体会到它们的魅力所在。
综上所述,这次电路仿真实验不仅让我对Proteus和Keil有了更深入的了解,也开拓了我的编程视野,让我更加全面地理解了嵌入式系统开发的相关知识。我期待未来能够通过持续的学习和实践,不断提升自己的技能水平,为将来的项目和研究做好充分的准备。