一、硬件介绍:
(采用5050LED 2W) RGB三色LED控制引脚分别为单片机P1.2、P1.1、 P1.0。LED正极接主电源(24V)正极,负极接驱动3颗三极管的集电极,单片机控制脚分别接3颗NPN三极管,三极管发射极接地,而单片机的供电是来自三端稳压器7805,祥细原理如下:
二、实物图片:
三、软件部分:
1、原理:
先亮红灯(保持一会儿)----红绿过度(绿加1、红减1循环240次)------
绿灯亮起(保持一会儿)----绿兰过度(兰加1、绿减1循环240次)
-----兰灯亮起(保持)-----兰白过度(绿加1、红加1循环240次、兰不变)
---白红过度
2、具体程序如下:
#include #define uchar unsigned char//字浮型宏定义 #define uint unsigned int//整型宏定义 #define shudu 30//LED渐变速度调整 #define dengji 1//LED变化等级调整 sbit B1=P1^0;//红色灯控制IO口 sbit G1=P1^1;//绿色灯控制IO口 sbit R1=P1^2;//兰色灯控制IO口 uchar Rout,Bout,Gout;//红绿兰3个变量 /***************************************************/ /**********************延时子程序*******************/ /***************************************************/ void delay(uint z) { uint x,y;//局部变量定义 for(x=0;x<5;x++)//延时外循环 for(y=0;y } /**********************************************/ /**********PWM控制红绿兰3种灯亮灭时间**********/ /**********************************************/ void RGBpwm(uchar Rou,uchar Gou,uchar Bou)//3个局部变量,些部分为带参数函数 { if(Rou!=0)//如果红灯变量不等于0就亮红灯 { R1=1;//红灯亮 delay(Rou);//红灯亮起时间 R1=0;//红灯灭 } if(Gou!=0)//如果红灯变量不等于0就亮红灯 { G1=1;//绿灯亮 delay(Gou);//绿灯亮起的时间 G1=0;//绿灯灭 } if(Bou!=0)//如果红灯变量不等于0就亮红灯 { B1=1;//兰灯亮 delay(Bou);//兰灯亮起的时间 B1=0;//兰灯灭 } } /***********************************************/ /********************主程序*********************/ /***********************************************/ void main() { TMOD=0x01;//选择定时器在方式1下工作 EA=1;//打开总中断 ET0=1;//打开定时器中断 TR0=1;//打开定时器 R1=0;//开机将红灯关闭 G1=0;//开机将绿灯关闭 B1=0;//开机将兰灯关闭 TH0=(65536-256)/256;//给定时器高8位赋值 TL0=(65536-256)%256;//给定时器低8位赋值 while(1)//程序主循环 { RGBpwm(Rout,Gout,Bout);//调用RGBpwm子程序 } } /*************************************************/ /*中断服务子程序(控制LED红绿兰亮灭时间占空比例)*/ /*************************************************/ void zhong() interrupt 1//中断向量位为1 { uint num;//定时器计数变量 uint ji;//亮度等级控制变量 TH0=(65536-256)/256;//给定时器高8位赋值 TL0=(65536-256)%256;//给定时器低8位赋值 num++;//将定时计数变自动增加1 if(num==shudu)//如果速度变量等于定时计数器变量就执行下面大括号语句 { num=0;//将计数器清0 ji++;//将亮度等级控制变量加1 if((ji>0)&&(ji<100))//如果亮度等级控制变量ji小于100,红灯亮起时间变量为240 { Rout=240;//红灯亮起变量为240 Gout=0;//绿灯亮起变量为0 Bout=0;//兰灯亮起变量为0 } if((ji>100)&&(ji<340))/*如果亮度等级控制变量ji大于100小于340(刚好240个等级), 红灯亮起时间变量由原来的240,慢慢减小到0,同时绿灯由原来的0慢慢增到240,形成 红灯到绿灯的渐变过程*/ { Rout-=dengji;//将红灯变量减1。因为dengji为亮度变化等级(本程序变化等级为1), Gout+=dengji;//将绿灯变量加1 Bout=0;//兰灯不变 } if((ji>340)&&(ji<440))/*亮度等级控制变量ji大于340小于440时,让绿灯变量停一段时间 这样就形成了当红灯过度到绿灯时,绿灯会停一会儿的效果。*/ { Rout=0;//红灯灭 Gout=240;//绿灯亮 Bout=0;//兰灯灭 } if((ji>440)&&(ji<680))//同理:亮度等级控制变量ji大于440小于680时,由绿灯到兰灯过度 { Rout=0;//红灯变量不变 Gout-=dengji;//将绿灯变量减1 Bout+=dengji;//将兰灯变量加1 } if((ji>680)&&(ji<780))//亮度等级控制变量ji大于680小于780时,让兰灯变量停一段时间 { Rout=0;//红灯灭 Gout=0;//绿灯灭 Bout=240;//兰灯亮一会儿 } if((ji>780)&&(ji<1020))//亮度等级控制变量ji大于780小于1020时,由兰灯到白灯过度 { Rout+=dengji;//将红灯变量加1 Gout+=dengji;//绿灯变量加1 Bout=240;//兰灯不变 } if((ji>1020)&&(ji<1025))//亮度等级控制变量ji大于1020小于1025时,由兰灯到白灯过度 { Rout=240;//将红灯变量加1 Gout=240;//绿灯变量加1 Bout=240;//兰灯不变 } if((ji>1025)&&(ji<1265))//亮度等级控制变量ji大于1025小于1265时,由白光到红光过度 { Rout=240;//红灯变量不变 Gout-=dengji;//绿灯变量自动减1 Bout-=dengji;//兰灯变量自动减1 } if(ji>1265)//当亮度等级控制变量ji大于1210时,就将它清0 ji=0;//将亮度控制等级清0 } }
上一篇:自制简单51单片机编程器(烧写器)
下一篇:51单片机银行自动取款机模拟仿真
设计资源 培训 开发板 精华推荐
- AM2G-2403SZ 3.3V 2 瓦 DC/DC 转换器的典型应用
- LT8335EDDB 5V 至 12V 输入、-12V 反相转换器的典型应用电路
- 使用 Microchip Technology 的 LX1671 的参考设计
- 用于 Intel Pentium VRE 处理器的 LT1585CM 4.6A 低压差稳压器的典型应用
- 基于Si3212 8位HC08 MCU的8位微控制器电路
- L7815A 高输入输出稳压器的典型应用
- MIC2954 的典型应用:250mA 低压降稳压器
- 60W、15V、160V 交流转直流多路输出电源
- FEBFHR1200_SPG01A,基于 FHR1200 高性能并联稳压器的评估板
- EVAL-ADF4193EB1,用于无线 LAN 的 ADF4193 PLL 时钟发生器的评估板