找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4949|回复: 3
打印 上一主题 下一主题
收起左侧

单片机RGB彩灯渐变七彩灯无频闪 源程序

  [复制链接]
跳转到指定楼层
楼主
ID:370644 发表于 2019-11-18 12:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*彩灯自动循环:1、渐变*/

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define dengji 1//LED变化等级调整
sfr P5=0xC8;//xxxx,1111 端口5
uint shudu=30;//LED渐变速度调整
sbit B1=P3^3;
sbit R1=P5^4;
sbit G1=P5^5;
uchar cishu;
uchar num;//定时器计数变量
uint ji;//亮度等级控制变量
uint Rout,Gout,Bout;
void delay(uint z)
{
uint x,y;
for(y=z;y>0;y--)
for(x=2;x>0;x--);
}
void delay1(uint z)
{
uint x,y;
for(y=shudu;y>0;y--)
for(x=z;x>0;x--);
}
void pwm(uint r,uint g,uint b)
{
if(r!=0)
{
R1=1;
delay(r);
R1=0;
}
if(g!=0)
{
G1=1;
delay(g);
G1=0;
}
if(b!=0)
{
B1=1;
delay(b);
B1=0;
}
}
void main()
{
TMOD=0X01;
EA=1;
ET0=1;
TR0=1;
TH0=(65536-256)/256;//给定时器高8位赋值
TL0=(65536-256)%256;//给定时器低8位赋值
while(1)
{

pwm(Rout,Gout,Bout);


}
}
void zhong () interrupt 1
{

TH0=(65536-156)/256;//给定时器高8位赋值
TL0=(65536-156)%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=0;//兰灯不变
Bout+=dengji;//将绿灯变量加1
}
if((ji>340)&&(ji<440))/*亮度等级控制变量ji大于340小于440时,让绿灯变量停一段时间
这样就形成了当红灯过度到绿灯时,绿灯会停一会儿的效果。*/
{
Rout=0;//红灯灭
Gout=0;//兰灯灭
Bout=240;//绿灯亮
}
if((ji>440)&&(ji<680))//同理:亮度等级控制变量ji大于440小于680时,由绿灯到兰灯过度
{
Rout+=dengji;//红灯变量不变
Gout+=dengji;//将绿灯变量减1
Bout=240;//将兰灯变量加1
}
if((ji>680)&&(ji<685))//亮度等级控制变量ji大于680小于780时,让兰灯变量停一段时间
{
Rout=240;//红灯灭
Gout=240;//绿灯灭
Bout=240;//兰灯亮一会儿
}
if((ji>685)&&(ji<925))//亮度等级控制变量ji大于780小于1020时,由兰灯到白灯过度
{
Rout-=dengji;//将红灯变量加1
Gout=240;//绿灯变量加1
Bout-=dengji;//兰灯不变
}
if((ji>925)&&(ji<1025))//亮度等级控制变量ji大于1020小于1025时,由兰灯到白灯过度
{
Rout=0;//将红灯变量加1
Gout=240;//绿灯变量加1
Bout=0;//兰灯不变
}
if((ji>1025)&&(ji<1265))//亮度等级控制变量ji大于1025小于1265时,由白光到红光过度
{
Rout+=dengji;//红灯变量不变
Gout-=dengji;//绿灯变量自动减1
Bout=0;//兰灯变量自动减1
}
if(ji>=1265)//当亮度等级控制变量ji大于1210时,就将它清0
ji=0;//将亮度控制等级清0
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:67857 发表于 2020-1-24 14:42 | 只看该作者
怎么delay1后面没用到?
回复

使用道具 举报

板凳
ID:686631 发表于 2020-1-26 12:17 | 只看该作者
实物有吗?测试过吗

评分

参与人数 1黑币 +5 收起 理由
lxa0 + 5 那个代码是拍脑袋想出来的。。。

查看全部评分

回复

使用道具 举报

地板
ID:702292 发表于 2021-5-21 16:11 | 只看该作者
sbit R1=P3^4;
sbit G1=P3^5;修改
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表