历史上的今天
今天是:2025年02月02日(星期日)
2021年02月02日 | 51单片机+PWM控制渐变七彩灯C51程序
2021-02-02 来源:eefocus
一、硬件介绍:
(采用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单片机银行自动取款机模拟仿真
史海拾趣
|
看到有个评论说“STC是手机中的战斗机”,当时乐呵了半天。 其实,还有很多朋友用STC的,昨天还看到有人上传相关的资料呢。不可否认的是,价格着实是个不错的因素。 但不可否认的是,牌子被做的有些烂。 你用过STC么?你觉得如何?… 查看全部问答> |
|
vxworks下用routeShow命令可以显示路由表,如下 ROUTE NET TABLE Destination Gateway Flags Refcnt Use &n ...… 查看全部问答> |
|
请问大家: ISR 的定义? 在某个函数里,作者定义 ISR isr ,我不知道这个ISR在哪里定义的? 是不是在嵌入式中作为了一个已经定义好的函数,或者结构体了? 关键是怎么定义的? 谢谢大家… 查看全部问答> |
|
wince 下使用c#调用webServices 总是出错 但是使用wince下的ie访问没有问题 就是方法测试时 提示下在文件 应该程序访问webServices 总是出错… 查看全部问答> |
|
如题,我看到一个电路板输出是用了两块单片机,其中一块产正一组正弦波,另一块产生一组方波,然后将正弦波叠加到了方波的高电平上,不知道用什么电路可以实现,求教各位!… 查看全部问答> |




