/*彩燈自動循環: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
}
}
|