基于51单片机的流水灯设计说明
- 格式:docx
- 大小:111.07 KB
- 文档页数:7
基于51单片机的流水灯设计
基本功能
利用AT89c51作为主控器组成一个LED 流水灯系统,实现8个 LED 灯的左、右循环显示。
硬件设计
图1.总设计图
C2
U1 C3
R1
10k
X1
*XTAL1
P0.0/AD0
P0.1/AD1 P0.2/AD2 XTAL2
P0.3/AD3 P0.4/AD4 P0.5/AD5
P0.6/AD6 RST
P0.7/AD7 P2.0/A8 P2.1/A9
P2.2/A10 PSEN P2.3/A11 ALE P2.4/A12 EA
P2.5/A13 P2.6/A14
P2.7/A15 P1.0/T2 P3.0/RXD P1.1/T2EX P3.1/TXD P1.2 P3.2/INT0 P1.3 P3.3/INT1 P1.4 P3.4/T0 P1.5 P3.5/T1 P1.6 P3.6/WR P1.7
P3.7/RD
4-. 39 2 38 3 37 4 36 5 35 6 34 7 33 8
RP1
33pF
33pF
1 2 30 31
3 4
1.单片机最小系统
1.1选用AT89C51的引脚功能
图 2. AT89C51
XTAL1:单芯片系统时钟的反向放大器输入端
XTAL2 :系统时钟的反向放大器输出端,一般在设计上只要在XTAL1 和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。
RESET :重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状 ^态。
P3:端口3是具有内部提升电路的双向I/O端口,通过控制各个
就构成了一个稳定的自激振荡器。 此电路采用12MHz 的石英晶体。
端口的高低电平了实现LED 流水灯的控制
1.2复位电路
如图所示,当按下按键时,就能完成整个系统的复位,使得程序 从新运行。
图3.复位电路
1.3时钟电路
时钟电路用于产生单片机工作所需要的时钟信号, 单片机本身就是一个复杂 的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制 下严格地按时序进行工作。
在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1, 输出端为引脚X2
,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,
—C4
图4.时钟电路2.流水灯部分
BUS4R6
10k BUS5R7
10k BUS6R8
10k
R9
10k D 1
10k
BUS3R5
D5-R ED
D7-RED
D6-RED
D8-RED
LED-RED
三.软件设计
3.1编程语言及编程软件的选择
本设计选择C语言作为编程语言。C语言虽然执行效率没有汇编语言咼,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,
数据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很
好的可重用性,可移植性等特点。而汇编语言使用起来并没有这么方便。
本设计选用了Keil作为编程软件,.Keil C51生成的目标代码效率非常
之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高
级语言的优势。
3.2 LED 灯的显示
LED灯在低电平,即I/O 口置‘ 0 '时,会亮,相反就灭。此设计就是通过程序来控制I/O 口的电平变化来实现流水灯左右循环闪烁。
四.程序
#in clude
#in clude< intrin s.h>
#defi ne uint un sig ned int
#defi ne uchar un sig ned char
#define kou P3
uchar code dp1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code dp2[]={0x80,0x40,0x20} ;
void delayms(uint z) // 延时函数
{
uint i,j;
for(i=z; i>0;i--)
for(j=110;j>0;j--);
}
void mai n()
{
int i;
for(i=0;i<8;i++)
{
kou=dp1[i]; delayms(500); }
for(i=0;i<7;i++)
{
}
kou=dp1[i]+0x80; delayms(500);
}
for(i=0;i<6;i++)
{
kou=dp1[i]+0x40; delayms(500);
}
for(i=0;i<5;i++)
{
kou=dp1[i]+0x20; delayms(500);
}
for(i=0;i<4;i++)
{
kou=dp1[i]+0x10; delayms(500);
}
for(i=0;i<3;i++)
{
kou=dp1[i]+0x08; delayms(500);
}
for(i=0;i<2;i++)
{
kou=dp1[i]+0x04; delayms(500);
}
for(i=0;i<1;i++)
{
kou=dp1[i]+0x02; delayms(500);
}
for(i=0;i<3;i++)
{ kou=0x00; delayms(500); kou=0xff; delayms(500);