单片机调速流水灯

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;		
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值