51单片机+PWM控制渐变七彩灯C51程序

发布者:iota19最新更新时间:2021-02-02 来源: eefocus关键字:51单片机  PWM控制  七彩灯 手机看文章 扫描二维码
随时随地手机看文章

一、硬件介绍:

(采用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//MCU头文件


#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单片机  PWM控制  七彩灯 引用地址:51单片机+PWM控制渐变七彩灯C51程序

上一篇:自制简单51单片机编程器(烧写器)
下一篇:51单片机银行自动取款机模拟仿真

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved