标题:
红外遥控RGB LED跳变渐变定色 单片机源码与原理图
[打印本页]
作者:
51hei呜呜
时间:
2018-10-14 15:33
标题:
红外遥控RGB LED跳变渐变定色 单片机源码与原理图
单片机源程序如下:
//============================================================================
//================翼芯科技 红外遥控LED========================================
//============================================================================
// 此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知
// 严禁随意用于商业目的,违者必究,后果自负
//程序说明:本程序用于实现红外遥控LED,IC插到U9位置.
//文件名称:main.C
//版本: 1.0
//C编译器: keil 8.05
// FFH FEH FDH FCH
// FBH FAH F9H F8H
// F7H F6H F5H F4H
// F3H F2H F1H F0H
// EFH EEH EDH ECH
// EBH EAH E9H E8H
//=============================================================================
#include <STC12C5AXX.H>
#define uchar unsigned char
#define uint unsigned int
#define BIT_32 32
sbit RED1 = P0^0; //红色IO口定义
sbit GREEN1 = P0^1; //绿色IO口定义
sbit BLUE1 = P0^2; //蓝色IO口定义
sbit IRIN = P3^7;
bit SYNOK,ADDROK,FLAGERR,LOK;
bit FLAG_MODE;
bit FLAG_ON;
unsigned long int BYTE1;
uchar LCOUNT,HCOUNT,HLCOUNT,BITCOUNT;
uchar code TAB1[7]={1,2,4,3,6,5,7}; //跳变数据
uchar code TAB_RGB[3]={200,150,100}; //单色红绿蓝白数据
uchar code TAB_DAT1[3][4]={{184,154,124, 94},
{138,118, 98, 78},
{ 88, 74, 60, 46}};
uchar code TAB_DAT2[3][4]={{ 26, 50, 74, 98},
{ 18, 36, 54, 72},
{ 12, 24, 36, 48}};
uchar DPTR;
uchar PWM_HL;
uchar REPEAT;
uchar MODE;
uchar IR_CODE;
uint T_DELAY;
uchar DIM1,DIM2;
uchar COL1;
uchar R_DAT,G_DAT;B_DAT;
uchar R_BUF,G_BUF,B_BUF;
/******************************************************************
- 功能描述:红外按键函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
KEY_SET()
{
IR_CODE=(BYTE1>>24);
if(IR_CODE==0xF4) // 跳变1
{
FLAG_MODE=1;
MODE=0;
T_DELAY=1000;
return;
}
if(IR_CODE==0xF0) // 跳变2
{
FLAG_MODE=1;
MODE=0;
T_DELAY=3000;
return;
}
if(IR_CODE==0xEC) // 渐变1
{
FLAG_MODE=1;
MODE=1;
REPEAT=4;
return;
}
if(IR_CODE==0xE8) // 渐变2
{
FLAG_MODE=1;
MODE=1;
REPEAT=12;
return;
}
if(IR_CODE==0xFD) //OFF
{
FLAG_ON=0;
return;
}
if(IR_CODE==0xFC) //ON
{
FLAG_ON=1;
}
if(IR_CODE==0xFB) //红色
{
MODE=2;
FLAG_MODE=1;
R_DAT=250;G_DAT=0;B_DAT=0;
}
if(IR_CODE==0xFA) //绿色
{
MODE=2;
FLAG_MODE=1;
R_DAT=0;G_DAT=250;B_DAT=0;
}
if(IR_CODE==0xF9) //蓝色
{
MODE=2;
FLAG_MODE=1;
R_DAT=0;G_DAT=0;B_DAT=250;
}
if(IR_CODE==0xF8) //白色
{
MODE=2;
FLAG_MODE=1;
R_DAT=250;G_DAT=250;B_DAT=250;
}
if(IR_CODE==0xF7) //黄1
{
MODE=2;
FLAG_MODE=1;
R_DAT=200;G_DAT=200;B_DAT=0;
}
if(IR_CODE==0xF3) //黄2
{
MODE=2;
FLAG_MODE=1;
R_DAT=200;G_DAT=100;B_DAT=0;
}
if(IR_CODE==0xEF) //黄3
{
MODE=2;
FLAG_MODE=1;
R_DAT=200;G_DAT=150;B_DAT=0;
}
if(IR_CODE==0xEB) //黄4
{
MODE=2;
FLAG_MODE=1;
R_DAT=200;G_DAT=200;B_DAT=0;
}
if(IR_CODE==0xF6) //青1
{
MODE=2;
FLAG_MODE=1;
R_DAT=0;G_DAT=200;B_DAT=200;
}
if(IR_CODE==0xF2) //青2
{
MODE=2;
FLAG_MODE=1;
R_DAT=0;G_DAT=200;B_DAT=100;
}
if(IR_CODE==0xEE) //青3
{
MODE=2;
FLAG_MODE=1;
R_DAT=0;G_DAT=200;B_DAT=150;
}
if(IR_CODE==0xEA) //青4
{
MODE=2;
FLAG_MODE=1;
R_DAT=0;G_DAT=200;B_DAT=200;
}
if(IR_CODE==0xF5) //紫1
{
MODE=2;
FLAG_MODE=1;
R_DAT=200;G_DAT=0;B_DAT=200;
}
if(IR_CODE==0xF1) //紫2
{
MODE=2;
FLAG_MODE=1;
R_DAT=100;G_DAT=0;B_DAT=200;
}
if(IR_CODE==0xED) //紫3
{
MODE=2;
FLAG_MODE=1;
R_DAT=150;G_DAT=0;B_DAT=200;
}
if(IR_CODE==0xE9) //紫4
{
MODE=2;
FLAG_MODE=1;
R_DAT=200;G_DAT=0;B_DAT=200;
}
}
/******************************************************************
- 功能描述:R G B输出
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
SET_RGB(uchar LED_REG)
{
uchar LEDDATA;
LEDDATA=LED_REG;
if(LEDDATA&0X01) //输出红色
RED1=1;
else
RED1=0;
if(LEDDATA&0X02) //输出绿色
GREEN1=1;
else
GREEN1=0;
if(LEDDATA&0X04) //输出蓝色
BLUE1=1;
else
BLUE1=0;
}
/******************************************************************
- 功能描述:延时函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
delayms(uint x)
{
uint t;
while(x--)
for(t=1500;t>0;t--)
{
while(FLAG_ON==0)
{RED1=0;GREEN1=0;BLUE1=0;}
if(FLAG_MODE)return;
}
}
/******************************************************************
- 功能描述:PWM_输出
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
SHADE()
{
uchar i,CNT;
for(i=REPEAT;i>0;i--)
{
while(FLAG_ON==0)
{RED1=0;GREEN1=0;BLUE1=0;}
for(CNT=0;CNT<=PWM_HL;CNT++)
{
(R_DAT>CNT)? (RED1=1): (RED1=0);
(G_DAT>CNT)? (GREEN1=1):(GREEN1=0);
(B_DAT>CNT)? (BLUE1=1):(BLUE1=0);
if(FLAG_MODE)return;
}
}
}
/******************************************************************
- 功能描述:定时器0中断,中断时间为0.1MS,实现按键检测.
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
void TIME0_INT() interrupt 1
{
TH0 = (65535-200)/256;
TL0 = (65535-200)%256;
//=====================检测高电平====================================================
if(FLAGERR==1) //解码失败,初始化参数
{
LCOUNT=0;
HCOUNT=0;
LOK=0;
FLAGERR=0;
SYNOK=0;
BITCOUNT=BIT_32;
}
if(IRIN==0)
{
LCOUNT++; //高电平计数器++
if(LOK==1) //第一个高电平
{
LOK=0;
if(SYNOK==1) //同步码 Ok
{
HLCOUNT=LCOUNT+HCOUNT; //检测高低计数值判定
if((3<HLCOUNT)&&(HLCOUNT<40)); //高低电平小于2560,大于1152,ok; 18
else
{
FLAGERR=1; //错误退出
return;
}
if(12<HCOUNT)
BYTE1=(BYTE1>>1)|0x80000000; //为1
else
BYTE1=(BYTE1>>1)|0x00000000; //为0
LCOUNT=0;
HCOUNT=0;
BITCOUNT--;
if(BITCOUNT==0) //解出了一次码
{
SYNOK=0; //同步清零
BITCOUNT=BIT_32; //码的位数
KEY_SET();
}
}
else
{
if((10<HCOUNT)&(HCOUNT<60)) //低电平大于6.4ms,小于12.8ms,同步码电平ok; 80-100,OK
{
SYNOK=1;
LCOUNT=0;
HCOUNT=0;
}
else
{
FLAGERR=1;
}
}
}//end LOK
}//END IRIN==0;
else //检测高电平的宽度==低电平计数
{
HCOUNT++;
if(LOK==1)
return;
if(SYNOK)
{
if((1<LCOUNT)&(LCOUNT<25)) //低电平大于256us,小于2048,高电平ok;
{
LOK=1;
}
else
{
FLAGERR=1;
}
}
else
{
if((60<LCOUNT)&(LCOUNT<120)) //低电平大于6MS,小于9MS, 同步低电平ok;
{
LOK=1;
}
else
{
FLAGERR=1;
}
} //END ELSE
} //EDN ELSE
}
/******************************************************************
- 功能描述:主函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
void main()
{
TMOD = 0x01; //定时器0工作在16位的定时模式.
TH0 = (65535-200)/256; //定时器0高位设定
TL0 = (65535-200)%256; //定时器0低位设定
IE = 0x82; //开总中断和定时器0中断
TR0 = 1; //开定时器0
P0M1=0x00; //设置P2输出口为推挽输出
P0M0=0x07;
P3M1=0X80; //P3.7为输入
P3M0=0X00;
P0=0;
PWM_HL=200;
REPEAT=8;
T_DELAY=2000;
FLAG_ON=1;
DIM1=1;
while(1)
{
switch (MODE)
{
case 0:
for(DPTR=0;DPTR<7;DPTR++) //跳变
{
SET_RGB(TAB1[DPTR]);
delayms(T_DELAY); //延时1秒
if(FLAG_MODE)
{
FLAG_MODE=0;
break;
}
}break;
case 1:
R_DAT=PWM_HL;G_DAT=0;B_DAT=0;
for(G_DAT=0;G_DAT<=PWM_HL;G_DAT++) //红变黄
{
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
for(R_DAT=PWM_HL;R_DAT>0;R_DAT--) //黄变绿
{
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
for(B_DAT=0;B_DAT<=PWM_HL;B_DAT++) //绿变青
{
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
for(G_DAT=PWM_HL;G_DAT>0;G_DAT--) //青变蓝
{
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
for(R_DAT=0;R_DAT<=PWM_HL;R_DAT++) //蓝变紫
{
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
for(G_DAT=0;G_DAT<=PWM_HL;G_DAT++) //紫变白
{
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
for(G_DAT=PWM_HL;G_DAT>0;G_DAT--) //白变红
{
B_DAT--;
SHADE();
}if(FLAG_MODE){FLAG_MODE=0;break;}
case 2:
SHADE();if(FLAG_MODE){FLAG_MODE=0;break;}
default:break;
}//mode
}
}
复制代码
所有资料51hei提供下载(含原理图):
http://www.51hei.com/bbs/dpj-137471-1.html
作者:
qzyhlf
时间:
2019-1-8 18:29
好资料,51黑有你更精彩!!!
作者:
mingjian78
时间:
2019-9-3 10:38
少SFR位定义及亮度加,亮度减程序
作者:
lidie
时间:
2019-9-3 18:54
请问51单片机IO口怎样连接WS2811灯条
作者:
mingjian78
时间:
2019-9-5 15:23
lidie 发表于 2019-9-3 18:54
请问51单片机IO口怎样连接WS2811灯条
单片机频率需大于27MHZ及以上,定义好单片机IO口,编好程序并下载,5V供电单片机及WS2811,直接接WS2811信号输入口就可控制。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1