用单片机控制啊!给个参考程序你!我参考的这个程序能通过PWM控制亮度
用R G B 三色LED合成任何颜色及渐变!呵呵!很有意思!自己再改改可以随便你PWM怎么控制几路亮度及不同颜色亮度合成
*
注意: 定时时间由晶振决定,我暂时给你按12MHz晶振计算定时时间,你接上6MHz晶振期效果也差不多,只是变化得慢一倍
此程序我已用ARM进行硬件模拟了LED的变化(在Keil中也用软件调试通过),应可以直接使用,你在端口上请注意选择合适的上拉电阻
另外你可根据你的需要及LED的效果来修改其定时时间、周期时间、脉冲宽度常数表与同一脉冲出现次数等
*/
#include
typedef unsigned char uint8;
typedef unsigned int uint16;
//宏定义
//*********************************************************
#define LED P1_2 //LED端口定义
#define _Timer0_Time_ 1 //Timer0定时时间
#define _Cycle_Time_ 20 //周期时间为20ms
#define _Times_ 5 //同一宽度脉冲出现的周期数
//变量定义
//*********************************************************
uint8 Cycle_Time; //周期时间
uint8 Pulse_Time; //脉冲时间(宽度)
const uint8 Pulse_Time_Buf[20]= //脉冲宽度常数表
{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
/*********************************************************
Time0中断函数
**********************************************************/
void Time0(void) interrupt 1 using 1
{
TH0=0xFC; //1ms定时
TL0=0x18;
if(Pulse_Time) Pulse_Time--;
if(Cycle_Time) Cycle_Time--;
}
//主函数
//*********************************************************
main()
{
uint8 i,j;
uint16 count;
P0=0xff; //P0口初始状态
TMOD=0x01;
TH0=0xFC; //1ms定时
TL0=0x18;
EA=1; //启动定时器,开定时器中断
ET0=1;
TR0=1;
LED=1;
while(1) { //进入主循环
//for(i=20; i; i--){ //脉冲宽度从20~0ms渐变
for(i=0; i<20; i++){ //脉冲宽度从0~20ms渐变
for(j=0; j<_Times_; j++) { //每一个宽度脉冲出现_Times_次
Cycle_Time=_Cycle_Time_;
Pulse_Time=Pulse_Time_Buf[i];
LED=1;
//LED=0; //此句代替上句可改变LED电平有效极性
do {
if(!Pulse_Time) {
LED=0;
//LED=1; //此句代替上句可改变LED电平有效极性
}
if(!Cycle_Time) {
break;
}
}while(1);
}
}
for(count=0; count<1000; count++); //延时,演示用
//for(i=20; i; i--){ //脉冲宽度从20~0ms渐变
for(i=0; i<20; i++){ //脉冲宽度从0~20ms渐变
for(j=0; j<_Times_; j++) { //每一个宽度脉冲出现_Times_次
Cycle_Time=_Cycle_Time_;
Pulse_Time=Pulse_Time_Buf[i];
LED=0;
//LED=1; //此句代替上句可改变LED电平有效极性
do {
if(!Pulse_Time) {
LED=1;
//LED=0; //此句代替上句可改变LED电平有效极性
}
if(!Cycle_Time) {
break;
}
}while(1);
}
}
for(count=0; count<1000; count++); //延时,演示用
}
}
#if 0
/*************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar Count,timecount;
bit temp;
/*********************************************************
延时函数
*********************************************************/
void Delay(uint num)//延时函数
{
while( --num );
}
/********************************************************
主函数
*********************************************************/
main()
{
P0=0xff;
Count=0x00;
TMOD=0x01;
TH0=0x4c; TL0=0x00; //50ms定时
EA=1; ET0=1; TR0=1;
while(1)
if(temp)
p1^2=!p1^2;
delay(200);
}
/*********************************************************
Time0中断函数
**********************************************************/
void Time0(void) interrupt 1 using 0
{
TH0=0x4c; //50ms定时
TL0=0x00;
timecount++;
if(timecount==20)
{
temp=!temp;
}
}
/*********************************************************/
#endif
LED主要是电流驱动,所以你做个电流型的整流器吧