标题:
单片机控制RGB LED七彩跳变+渐变的转换电路原理图+源程序
[打印本页]
作者:
51hei呜呜
时间:
2018-10-14 15:35
标题:
单片机控制RGB LED七彩跳变+渐变的转换电路原理图+源程序
单片机源程序如下:
//============================================================================
//======翼芯科技 LED七彩跳变+渐变转换=======指拨开关SW2的1位拨向上============
//============================================================================
// 此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知
//程序说明:本程序用于实现LED七彩跳变+渐变转换,按KEY3为跳变,按KEY4为渐变,不同步.IC插到U9位置.指拨开关SW2的1位拨向上.
//文件名称:main.C
//日期: 2011/01/23
//版本: 1.0
//C编译器: keil 8.05
//=============================================================================
#include <STC12C5AXX.H>
#define uchar unsigned char
#define uint unsigned int
sbit RED1 = P0^0; //红色IO口定义
sbit GREEN1 = P0^1; //绿色IO口定义
sbit BLUE1 = P0^2; //蓝色IO口定义
sbit KEY3 = P3^2; //按键3
sbit KEY4 = P3^3; //按键4
bit FLAG_MODE;
uchar T_CNT3;
uchar T_CNT4;
uchar MODE;
uchar code TAB1[7]={1,2,4,3,6,5,7}; //跳变数据
uchar code TAB2[14]={1,3,3,2,2,6,6,4,4,5,5,7,7,1}; //跳变数据 {1,3,2,6,4,5,7,1}; //跳变数据
uchar DPTR;
uchar PWM_HL;
uchar REPEAT;
uchar PWM_H;
uchar PWM_L;
/******************************************************************
- 功能描述:定时器0中断,中断时间为1MS,实现按键检测.
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
void TIME0_INT() interrupt 1
{
TH0 = (65535-2000)/256;
TL0 = (65535-2000)%256;
if (T_CNT3 !=0)
{
T_CNT3--;
if (T_CNT3==0 && KEY3==0)
{
MODE=0;
FLAG_MODE=1;
}
}
else if (KEY3==0) T_CNT3=10;
if (T_CNT4 !=0)
{
T_CNT4--;
if (T_CNT4==0 && KEY4==0)
{
MODE=1;
FLAG_MODE=1;
}
}
else if (KEY4==0) T_CNT4=10;
}
/******************************************************************
- 功能描述:红绿蓝LED输出
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
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--)
{
if(FLAG_MODE)
{
return;
}
}
}
/******************************************************************
- 功能描述:延时函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
delayus(uint x)
{
uint t;
while(x--)
for(t=15;t>0;t--);
}
/******************************************************************
- 功能描述: PWM输出
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
SHADE()
{
uchar i,j;
for(i=REPEAT;i>0;i--) //重复次数
{
for(j=PWM_HL;j>0;j--) //PWM减
{
if(FLAG_MODE)
{
return;
}
PWM_H=j; //PWM_H值
PWM_L=PWM_HL-j+1; //PWM_L值
SET_RGB(TAB2[DPTR]);
for(;PWM_H>0;PWM_H--)
delayus(1);
SET_RGB(TAB2[DPTR+1]); //输出
for(;PWM_L>0;PWM_L--)
delayus(1);
} //j
} //i
}
/******************************************************************
- 功能描述:主函数
- 隶属模块:无
- 函数属性:无
- 参数说明:无
- 返回说明:无
- 注:.....
******************************************************************/
void main()
{
TMOD = 0x01; //定时器0工作在16位的定时模式.
TH0 = (65535-2000)/256; //定时器0高位设定
TL0 = (65535-2000)%256; //定时器0低位设定
IE = 0x82; //开总中断和定时器0中断
TR0 = 1; //开定时器0
//M1:M0 0:0为标准51;0:1输出;1:0输入;1:1开漏输出
P0M1=0X00; //P0口设为推挽输出
P0M0=0XFF;
P0=0;
MODE=0;
FLAG_MODE=0;
PWM_HL=250;
REPEAT=1;
while(1)
{
switch (MODE)
{
case 0:
for(DPTR=0;DPTR<7;DPTR++) //跳变
{
SET_RGB(TAB1[DPTR]);
delayms(1000); //延时1秒
if(FLAG_MODE)
{
FLAG_MODE=0;
break;
}
}break;
case 1:
for(DPTR=0;DPTR<14;DPTR=DPTR+2) //渐变
{
SHADE();
delayms(1000); //延时1秒
if(FLAG_MODE)
{
FLAG_MODE=0;
break;
}
}break;
}
}
}
复制代码
所有资料51hei提供下载(原理图):
http://www.51hei.com/bbs/dpj-137471-1.html
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1