当前位置:文档之家› 花样流水灯设计

花样流水灯设计

一、原理图设计的目的:
利用AT89C51,通过控制按键来实现六种流水灯花样的转换,实现花样流水灯的设计,同时通过外部中断0,来控制流水灯的速度。

二、各器件的功能作用:
1、AT89C51
AT89C51有40个引脚,每个引脚都有其功能。

本次设计中,利用P0口当输出口,输出低电平来驱动发光二极管点亮。

利用P1.0~P1.5六个引脚,通过按键接地,然后采用扫描的方式,判断哪个引脚所接按键按下,从而来控制六种流水灯的花样。

利用P3.2引脚外接按键接地,通过控制按键来减慢流水灯的速度,利用P3.3引脚外接按键接地,通过控制按键来提高流水灯的速度。

利用P3.7输出低电平,导通三极管Q1,从而给八个发光二极管的阳极加高电平,一旦P0口输出低电平就可以驱动发光二极管。

2、八个发光二极管:
通过八个发光二极管来实现流水灯的变化,用低电平驱动发光二级管亮,同时,用高电平使其熄灭。

3、按键
通过P1.0-P1.5外接的按键来实现流水灯各种花样的变化,当按键按下时,驱动一种流水灯花样的闪烁。

同时,利用按键来提供外部中断,当按下按键时,产生一个外部中断,向CPU申请中断,CPU 响应其中断,因此可以用按键来实现提高流水灯闪烁的速度。

通过在RST口处加上一个按钮手动复位电路,利用复位按钮可以使运行中的流水灯复位到初始的状态。

4、排阻
因为P0口作为输出口时需要外接上拉电阻
三、设计原理图:
四、程序如下:
#include<reg51.h> //51系列单片机定义文件#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数
void delay(uint);//声明延时函数
void main(void)
{
uint i;
uchar temp;
TCON=0x05;
IE=0x85;
PX1=1;
PX0=0;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动
{
P0=temp;
delay(100);//调用延时函数
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动{
P0=temp;
delay(150);//调用延时函数
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮{
P0=temp;
delay(150); //调用延时函数
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮{
P0=temp;
delay(150); //调用延时函数temp>>=1;
}
temp=0x03;
for(i=0;i<4;i++) //两个流水灯顺序点亮{
P0=temp;
delay(150);
temp<<=2;
}
temp=0x30;
for(i=0;i<3;i++) //两个流水灯反向点亮{
P0=temp;
delay(150);
temp>>=2;
}
temp=0x07;
for(i=0;i<3;i++) //3个
{
P0=temp;
temp<<=3;
}
temp=0xe0;
for(i=0;i<3;i++) //3流水灯反向点亮{
P0=temp;
delay(150);
temp>>=3;
}
temp=0x0f;
for(i=0;i<3;i++) //4ge
{
P0=temp;
delay(150);
temp<<=4;
}
temp=0xf0;
for(i=0;i<3;i++) //4流水灯反向点亮{
delay(150);
temp>>=4;
}
}
}
void int0() interrupt 0
{
uint i;
uchar temp;
while(1)
{
temp=0x01;
for(i=0;i<8;i++) //8个流水灯逐个闪动{
P0=temp;
delay(800);//调用延时函数
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++) //8个流水灯反向逐个闪动{
P0=temp;
delay(800);//调用延时函数
temp>>=1;
}
temp=0xFE;
for(i=0;i<8;i++) //8个流水灯依次全部点亮{
P0=temp;
delay(800); //调用延时函数
temp<<=1;
}
temp=0x7F;
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮{
P0=temp;
delay(800); //调用延时函数
temp>>=1;
}
temp=0x03;
for(i=0;i<4;i++) //两个流水灯顺序点亮
{
P0=temp;
delay(800);
temp<<=2;
}
temp=0x30;
for(i=0;i<3;i++) //两个流水灯反向点亮{
P0=temp;
delay(800);
temp>>=2;
}
temp=0x07;
for(i=0;i<3;i++) //3个流水灯顺序点亮{
P0=temp;
delay(800);
temp<<=3;
}
temp=0xe0;
for(i=0;i<3;i++) //3个流水灯反向点亮{
P0=temp;
delay(800);
temp>>=3;
}
}
temp=0x0f;
for(i=0;i<3;i++) //4个流水灯顺序点亮{
P0=temp;
delay(800);
temp<<=4;
}
temp=0xf0;
for(i=0;i<3;i++) //4流水灯反向点亮{
P0=temp;
delay(800);
temp>>=4;
}
.. . . .. }
void delay(uint t) //定义延时函数
{
register uint bt;
for(;t;t--)
for(bt=0;bt<255;bt++);
}
. . . .v。

相关主题