基于51单片机的流水灯设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的流水灯设计

一.基本功能

利用AT89c51作为主控器组成一个LED流水灯系统,实现8个LED 灯的左、右循环显示。

二.硬件设计

图1.总设计图

1.单片机最小系统

1.1选用AT89C51的引脚功能

图2. AT89C51

XTAL1:单芯片系统时钟的反向放大器输入端。

XTAL2:系统时钟的反向放大器输出端,一般在设计上只要在XTAL1和XTAL2上接上一只石英震荡晶体系统就可以工作了,此外可以在两引脚与地之间加入20PF的小电容,可以使系统更稳定,避免噪音干扰而死机。

RESET:重置引脚,高电平动作,当要对晶体重置时,只要对此引脚电平提升至高电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

P3:端口3是具有内部提升电路的双向I/O端口,通过控制各个

端口的高低电平了实现LED流水灯的控制。

1.2复位电路

如图所示,当按下按键时,就能完成整个系统的复位,使得程序从新运行。

1.3时钟电路

时钟电路用于产生单片机工作所需要的时钟信号,单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。

在AT89C51芯片内部有一个高增益反相放大器,其输入端为芯片引脚X1,输出端为引脚X2,在芯片的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。此电路采用12MHz的石英晶体。

图4.时钟电路

2.流水灯部分

图5.流水灯电路

三.软件设计

3.1编程语言及编程软件的选择

本设计选择C语言作为编程语言。C语言虽然执行效率没有汇编语言

高,但语言简洁,使用方便,灵活,运算丰富,表达化类型多样化,数

据结构类型丰富,具有结构化的控制语句,程序设计自由度大,有很好

的可重用性,可移植性等特点。而汇编语言使用起来并没有这么方便。

本设计选用了Keil作为编程软件,.Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高

级语言的优势。

3.2 LED灯的显示

LED灯在低电平,即I/O口置‘0’时,会亮,相反就灭。此设计就是通过程序来控制I/O口的电平变化来实现流水灯左右循环闪烁。

四.程序

#include

#include

#define uint unsigned int

#define uchar unsigned 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 main()

{

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);

}

}

相关文档
最新文档