⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 led灯带控制.c

📁 RGB-三基色LED灯带控制-测试成功
💻 C
字号:
/***********************************************/
/*************电摩LED灯带控制,三基色5050LED灯带********/
#include "reg52.h"

/*************河北正定欢迎您-少占鱼*QQ:411656434********/
/*************三个NMOS增强型,对地开关控制灯带RGB三根线********/
/***********************************************/
#define uchar unsigned char 
#define uint  unsigned int

/***********************************************/
sbit RedLed=P3^5;
sbit GreenLed=P3^7;
sbit BlueLed=P3^4;	   
/***********************************************/
uint RedLedDuty;   //最大10000
uint GreenLedDuty; //最大10ms
uint BlueLedDuty;  //最大10ms
uint T0InterCnt;  //定时器中断计数
uint T0flag;
bit  ShaCheFlag;
uint ShaCheCnt;
/***********************************************/
void LiuShuiDeng();
void DanSeJianAn();
void DanSeJianLiang();
void ShanShuo(uint R,uint G,uint B,uint DelayTime,uint Count);
void LiangDuPeiZhi(uint R,uint G,uint B);
void LedInit();
void delayms(uint k);
void delays(uint k);
/***********************************************/
void main()
{
	ShaCheCnt=0;
	ShaCheFlag=0;
	delayms(1000);
	T0InterCnt=0;
	RedLed=1;
	GreenLed=1;
	BlueLed=1;
	delays(3);
	T0InterCnt=0;
	RedLed=0;
	GreenLed=0;
	BlueLed=0;
	delays(3);
	LedInit();
	while(1)
	{
		//外部中断里用了闪烁函数,函数里有延时函数,测试发现,会出现外部中断几次后,程序卡死。加入初始化后解决。
		LedInit();	//一个整循环完毕后,下次循环之前最好重新初始化一下,防止某些地方关闭中断后,不再开启,陷入死循环
		if(ShaCheCnt<3)
		LiuShuiDeng();
		if(ShaCheCnt<3)
		DanSeJianAn();	
		if(ShaCheCnt<3)	
		ShanShuo(1,0,0,100,30);
		if(ShaCheCnt<3)
		ShanShuo(0,1,0,100,30);
		if(ShaCheCnt<3)
		ShanShuo(0,0,1,100,30);
		if(ShaCheCnt<3)
		DanSeJianLiang();
		if(ShaCheCnt<3)
		{
			RedLed=1;
			GreenLed=1;
			BlueLed=1;
			delays(3);
		}
		if(ShaCheCnt<3)
		ShanShuo(1,1,1,100,50);
		delays(2);
	}

}

/***********************************************/
void LedInit()
{
	EA=0;	 	//关闭EA 
	T0flag=0;
	T0InterCnt=0;
	TMOD=0x02;//T0方式2 
	TH0=100%256;
	TL0=100%256;	
	EX1=1;
	IT1=0; //外部中断边沿触发 
	ET0=1; //开T0中断 
	TR0=1; 
	EA=1;
}
/***********************************************/
// 外部按键中断 1 
void ExInt1()  interrupt 2 using 2	//外部中断1		  
{
	TR0=0; //关闭定时器,出了外部中断再继续计数。防止某些卡死现象
	EA=0;
	ShaCheFlag=!ShaCheFlag;
	ShaCheCnt++;
	if(ShaCheCnt>6)
	ShaCheCnt=0;
	if(ShaCheCnt==1)
    ShanShuo(0,0,1,100,6);
	if(ShaCheCnt==2)
    ShanShuo(1,0,1,100,6);
	if(ShaCheCnt==3)
    ShanShuo(0,1,1,100,6);
	if(ShaCheCnt==4)
	ShanShuo(1,0,0,100,6);
	if(ShaCheCnt==5)
    ShanShuo(1,1,0,100,6);
	TR0=1;
	EA=1;
}


/***********************************************/
void time0() interrupt 1 using 2//定时器0中断 
{   
	T0InterCnt++;
	if(T0InterCnt*100>=RedLedDuty)
	{
	  RedLed=0;
	}
    if(T0InterCnt*100>=GreenLedDuty)
	{
	  GreenLed=0;
	}
    if(T0InterCnt*100>=BlueLedDuty)
	{
	  BlueLed=0;
	}
	if(T0InterCnt*100>10001)
	{
		T0InterCnt=0;
		T0flag=1;
		EA=0;
		TR0=0;
		TF0=0;
	}
}

/**************七彩流水灯***********************/
void LiuShuiDeng()
{
	uint WaitCnt;
	T0InterCnt=0;
	RedLed=0;
	GreenLed=0;
	BlueLed=0;
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(10000,0,0);	  //红
		while(!T0flag);
	}
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(10000,1000,0); //橙
		while(!T0flag);
	}
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(10000,3000,0); //黄
		while(!T0flag);
	}
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(0,10000,0);	  //绿
		while(!T0flag);
	}
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(0,10000,5000);	//青
		while(!T0flag);
	}
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(0,0,10000);	  //蓝
		while(!T0flag);
	}
	WaitCnt=200;
	while(WaitCnt--)
	{
		LiangDuPeiZhi(10000,0,10000);  //紫
		while(!T0flag);
	}

}

/***************单色渐暗***************************/
void DanSeJianAn()
{
	uint DecTime,WaitTime,j;
	T0InterCnt=0;
	RedLed=0;
	GreenLed=0;
	BlueLed=0;
	delays(2);
	DecTime=10000;
	WaitTime=100;
	while(WaitTime)
	{
	  for(j=0;j<15;j++)
	  {
		LiangDuPeiZhi(DecTime,0,0);	  //红
		while(!T0flag);
		T0flag=0;
	  }
	  DecTime-=100;
	  WaitTime--;	  
	}

	delays(2);
	DecTime=10000;
	WaitTime=100;
	while(WaitTime)
	{
	  for(j=0;j<15;j++)
	  {
		LiangDuPeiZhi(0,DecTime,0);	  //绿
		while(!T0flag);
		T0flag=0;
	  }
	  DecTime-=100;
	  WaitTime--;  
	}
	delays(2);
	DecTime=10000;
	WaitTime=100;
	while(WaitTime)
	{
	  for(j=0;j<15;j++)
	  {
		LiangDuPeiZhi(0,0,DecTime);	  //蓝
		while(!T0flag);
		T0flag=0;
	  }
	  DecTime-=100;
	  WaitTime--;
	}

}

/**************单色渐亮*****************************/
void DanSeJianLiang()
{
	uint AddTime,WaitTime,j;
	T0InterCnt=0;
	RedLed=0;
	GreenLed=0;
	BlueLed=0;
	AddTime=0;
	WaitTime=100;
	while(WaitTime)
	{
	  for(j=0;j<15;j++)
	  {
	  	LiangDuPeiZhi(AddTime,0,0);	  //红
		while(!T0flag);
		T0flag=0;
	  }
	  AddTime+=100;
	  WaitTime--;
	}
	delays(2);
	AddTime=0;
	WaitTime=100;
	while(WaitTime)
	{
	  for(j=0;j<15;j++)
	  {
	  	LiangDuPeiZhi(0,AddTime,0);	  //绿
		while(!T0flag);
		T0flag=0;
	  }
	  AddTime+=100;
	  WaitTime--;
	}
	delays(2);
	AddTime=0;
	WaitTime=100;
	while(WaitTime)
	{
	  for(j=0;j<15;j++)
	  {
	  	LiangDuPeiZhi(0,0,AddTime);	  //蓝
	    while(!T0flag);
		T0flag=0;
	  }
	  AddTime+=100;
	  WaitTime--;
	}

}

/***************单灯闪烁*****************************/
void ShanShuo(uint R,uint G,uint B,uint DelayTime,uint Count)
{
	T0InterCnt=0;
	RedLed=R;
	GreenLed=G;
	BlueLed=B;
	
	while(Count--)
	{
		RedLed=R;
		GreenLed=G;
		BlueLed=B;
		delayms(DelayTime);
		if(R)
		{
			RedLed=!RedLed;	  	 //红	
		}
		if(G)
		{
			GreenLed=!GreenLed;	  //绿	
		}
	    if(B)
		{
			BlueLed=!BlueLed;	  //蓝	
		}
		delayms(DelayTime);
	}

}
/***********************************************/

void LiangDuPeiZhi(uint R,uint G,uint B)
{
	EA=0;	 	//关闭EA 
	RedLed=0;
	GreenLed=0;
	BlueLed=0;
	T0InterCnt=0;
	RedLedDuty=R;//
	if(RedLedDuty<1)
	{
		RedLed=0;
	}
	else
	 RedLed=1;
	
	GreenLedDuty=G;
	if(GreenLedDuty<1)
	{
		GreenLed=0;
	}
	else
	 GreenLed=1;
		
	BlueLedDuty=B;
	if(BlueLedDuty<1)
	{
		BlueLed=0;
	}
	else
	BlueLed=1;

	T0flag=0;
	T0InterCnt=0;
	TR0=1; 
	EA=1;
}

/*************************************************/
//延时函数 
void delayms(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
  {
    for(j=0;j<730;j++)
     {;}
   }
}
/***********************************************/
void delays(uint k)
{
uint data i,j,m;
for(m=0;m<k;m++)
 {
  for(i=0;i<1000;i++)
  {
    for(j=0;j<800;j++)
     {;}
   }
 }
}

/***********************************************/






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -