1.设计思想
51单片机,4个输入按钮,用来选择4种流水灯模式,流水灯的速度一直处于变化之中(程序具有高度灵活性,只需要修改编码的数组即可任意组合大多数流水灯样式)。
2.原理图
3.流程图
4.详细代码
#include "reg51.h" //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit K1=P1^0;//按钮
sbit K2=P1^1;
sbit K3=P1^2;
sbit K4=P1^3;
u8 mode=0;//模式
u8 time=0;//计时
u8 flag=0;
u16 code moshi1[16]={//模式1LED点亮顺序
0x7fff,
0xbfff,
0xdfff,
0xefff,
0xf7ff,
0xfbff,
0xfdff,
0xfeff,
0xff7f,
0xffbf,
0xffdf,
0xffef,
0xfff7,
0xfffb,
0xfffd,
0xfffe
};
u16 code moshi2[16]={//模式2LED点亮顺序
0x7fff,
0x3fff,
0x1fff,
0x0fff,
0x07ff,
0x03ff,
0x01ff,
0x00ff,
0x007f,
0x003f,
0x001f,
0x000f,
0x0007,
0x0003,
0x0001,
0x0000
};
u16 code moshi3[16]={//模式3LED点亮顺序
0x7fff,//01111111 11111111
0x9fff,//10011111 11111111
0xc7ff,//11000111 11111111
0xe1ff,//11100001 11111111
0xf07f,//11110000 01111111
0xf81f,//11111000 00011111
0xfc0f,//11111100 00001111
0xfc1f,//11111100 00011111
0xf87f,//11111000 01111111
0xf03f,//11110000 00111111
0xfc1f,//11111100 00011111
0xff0f,//11111111 00001111
0xffc7,//11111111 11000111
0xfff3,//11111111 11110011
0xfffd,//11111111 11111101
0xfffe
};
u16 code moshi4[16]={//模式4LED点亮顺序
0x7fff,//01111111 11111111
0x9fff,//10011111 11111111
0xc7ff,//11000111 11111111
0xe7ff,//11100111 11111111
0xf7ff,//11110111 11111111
0xf9ff,//11111001 11111111
0xfc7f,//11111100 01111111
0xfe7f,//11111110 01111111
0xff7f,//11111111 01111111
0xff9f,//11111111 10011111
0xffc7,//11111111 11000111
0xffe7,//11111111 11100111
0xfff7,//11111111 11110111
0xfff3,//11111111 11110011
0xfffd,//11111111 11111101
0xfffe
};
//定义延时数组,任意规定延时时间,时间单位10ms
u8 code time1[16]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
u8 code time2[16]={1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1};
u8 code time3[16]={2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
u8 code time4[16]={3,4,5,4,3,4,5,4,3,4,5,4,3,4,5,4};
//主函数
void main()
{
//定时器0初始化
TMOD|=0X01;
TH0=0XD8; //给定时器赋初值,定时10ms
TL0=0XF0;
ET0=1;//打开定时器1中断允许
EA=1;//打开总中断
TR0=1;//打开定时器
while(1)
{
if(!K1 &&(mode!=0))//模式1
{
mode=0;time=0;flag=0;
while(!K1);
}
if(!K2&&(mode!=1))//模式2
{
mode=1;time=0;flag=0;
while(!K2);
}
if(!K3&&(mode!=2))//模式3
{
mode=2;time=0;flag=0;
while(!K3);
}
if(!K4&&(mode!=3))//模式4
{
mode=3;time=0;flag=0;
while(!K4);
}
}
}
//定时器中断
void Timer1() interrupt 3
{
if(mode==0)//模式1
{
if(time<time1[flag])
time++;
else
{
time=0;
P2=moshi1[flag]>>8;//点亮led
P0=moshi1[flag];
if(flag<15)//下一个状态,一共16个状态
flag++;
else
flag=0;
}
}
if(mode==1)//模式2
{
if(time<time2[flag])
time++;
else
{
time=0;
P2=moshi2[flag]>>8;//点亮led
P0=moshi2[flag];
if(flag<15)//下一个状态,一共16个状态
flag++;
else
flag=0;
}
}
if(mode==2)//模式3
{
if(time<time3[flag])
time++;
else
{
time=0;
P2=moshi3[flag]>>8;//点亮led
P0=moshi3[flag];
if(flag<15)//下一个状态,一共16个状态
flag++;
else
flag=0;
}
}
if(mode==3)//模式4
{
if(time<time4[flag])
time++;
else
{
time=0;
P2=moshi4[flag]>>8;//点亮led
P0=moshi4[flag];
if(flag<15)//下一个状态,一共16个状态
flag++;
else
flag=0;
}
}
TH1=0XD8; //给定时器赋初值,定时10ms
TL1=0XF0;
}
版权声明:本文为qq_55433305原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。