想过这种程序,但让汪因为没什么卵用就给我忘了。
pwm要挺高频率才行,不然会闪,试过3灯的rgb,原理上差不多,但是直接程序死循环都难受,不是很流畅坦渣仔,你也可以参考一下。。。
#include "reg52.h"
#include "intrins.h"
sbit r=P1^0
sbit g=P1^1
sbit b=P1^2
void Delay200ms()
void play(char rz1,char gz1,char bz1,int t)
void Delay10us()
//占空比从0到100变化
void main(void)
{
while(1)
{char rz=0,gz=0,bz=0
char x=0,y=0,z=0
r=1
g=1
b=1
Delay200ms() //接线验证,rgb依次亮起
r=0
Delay200ms()
r=1
g=0
Delay200ms()
g=1
b=0
Delay200ms()
b=1
Delay200ms()
for(x=5x>=0x--) //彩色连续变化
{rz=100gz=0bz=0
play(rz,gz,bz,1)
for(gz=0gz<=100gz++)
play(rz,gz,bz,1)
for(rz=100rz>=0rz--)
play(rz,gz,bz,1)
for(bz=0bz<=100bz++)
play(rz,gz,bz,1)
for(gz=100gz>=0gz--)
play(rz,gz,bz,1)
for(rz=0rz<=100rz++)
play(rz,gz,bz,1)
for(bz=100bz>=0bz--)
play(rz,gz,bz,1)
}
}
}
//显示色彩程序,pwm,显示某占空比颜色时间t
void play(char rz1,char gz1,char bz1,int t)
{
char i=rz1,j=gz1,k=bz1,yt
for(t=t*4t>=0--t)
{
i=rz1j=gz1k=bz1
for(yt=100yt>=0yt--)
{
if(i>0)
r=0
else
r=1
if(j>0)
g=0
else
g=1
if(k>梁哗0)
b=0
else
b=1
--i
--j
--k
Delay10us()
}
}
r=1g=1b=1
}
//延时程序组
void Delay200ms() //@12.000MHz
{
unsigned char i, j, k
_nop_()
_nop_()
i = 10
j = 31
k = 147
do
{
do
{
while (--k)
} while (--j)
} while (--i)
}
void Delay10us() //@12.000MHz
{
unsigned char i
_nop_()
_nop_()
i = 27
while (--i)
}
直接用按钮触发外部中断嫌如的,一个加速,一个减速。
用的光敏电阻和继电器做的光电开关。
电路我用proteus 8画和仿真的。你参裂者颂考吧。
#include <reg52.h>
#define uint unsigned int
void delay(uint time)
void flicker(uint led)//呼吸灯
void init()
uint t1=80//闪烁频率
uint light=0
sbit k1=P3^2
sbit k2=P3^3
sbit led1=P1^6
sbit led2=P1^7
void main()
{
uint led1=0xFE,led2=0xFD,led3=0xFB
init()
while(1)
{
flicker(led1)
flicker(led2)
flicker(led3)
}
}
void init()
{
IT0=0
IT1=0
EX0=1
EX1=1
EA=1
}
void delay(uint t)//延时程序
{
uint i,j
for(i=ti>0i--)
for(j=110j>0j--)
}
void flicker(uint led)//呼吸灯 flag==1逐渐变亮 flag==0逐渐变暗
{
uint flag=1
while(1)
{
P1=led
delay(light)
P1=0xFF
delay(t1-light)
if(flag==1)
light++
else
light--
if(light==t1 &&flag==1)
flag=0
else if(light==0 &肆郑&flag==0)
break
}
}
void click1()interrupt 0 //加速
{
delay(10)
if(k1==0)
{
while(k1==0)
if(t1-1>light)
t1--
else
{
t1--
light=t1-1
}
}
}
void click2()interrupt 2 //减速
{
delay(10)
if(k2==0)
{
while(k2==0)
if(t1<80)
t1++
}
}
做8个流水灯加一个呼吸灯比较容易,P1口接8个流水灯,察侍物8个LED负极接P1口,则P1口输出低电平有效。P3.7脚接一个开关作切换。谈念仿真图如下败液所示。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)