求一个89c52单片机的光控呼吸灯程序 ,就是边呼吸边移动的,相当于呼吸与流水灯结合,两个按键能加减速度 求你89C52单片机流水灯移动的程序
#include // 包含头文件
// 延时函数
// 参数 in 为延时的时间长度(单位时间很短,大约一条指令的时间)
void delay(unsigned int in)
{
unsigned int i;
for(i=0;i<100;i++) {;}
}
// 由暗变亮的子函数
// 参数 ledn 为点第几位的灯
void off_on(unsigned char ledn)
{
unsigned int i,j;
for(i=0;i<100;i++)
{
for(j=0;j<100;j++)
{
if(i<=j)
{ // 模拟pwm的低电平输出
P0 = 0;
}
else
{ // 模拟PWM的高电平输出
P0 = 1<<ledn;
}
delay(10); // 这里的延时 根据灯的情况自己调整
}
}
}
// 由亮变暗的子函数
// 参数 ledn 为点第几位的灯
void on_off(unsigned char ledn)
{
unsigned int i,j;
for(i=100;i>1;i--)
{
for(j=0;j<100;j++)
{
if(i<=j)
{ // 模拟pwm的低电平输出
P0 = 0;
}
else
{ // 模拟PWM的高电平输出
P0 = 1<<ledn;
}
delay(10); // 这里的延时 根据灯的情况自己调整
}
}
}
// 主程序开始
void main()
{
unsigned char ledn;
while(1)
{
for(ledn=0;ledn<8;ledn++)
{
off_on(ledn);
on_off(ledn);
}
}
}
这个程序我简单测试了一下,效果还好,不知道这个效果是不是您想要的?
说明一下啊,我这个程序是高电平点的灯,就是P0口在输出高电平的时候灯才会亮,
如果调试程序的时候看见各个灯的亮暗顺序反了的话,仅仅需要调换一下亮暗的顺序或者改一下输出的电平关系就可以了。
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar num,m,led,a;
delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
uchar code table[]={
0xfe,0xfc,0xf8,0xf0,
0xe0,0xc0,0x80,0x00};
void main()
{
m=8;
num=0;
while(1)
{
led=table[num];
for(a=m;a>0;a--)
{
P1=led;
delay(500);
led=_crol_(led,1);
delay(500);
}
m--;
num++;
if(num==8)
num=0;
if(m==0)
m=8;
}
}
不知道你要的是不是这个效果
直接用按钮触发外部中断的,一个加速,一个减速。
用的光敏电阻和继电器做的光电开关。
电路我用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=t;i>0;i--)
for(j=110;j>0;j--);
}
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++;
}
}
《开发板是HL-1,单片机是89C52RC 想外接一个红外模块,VCC和GND接在哪儿...》
答:单片机和红外接收头上都有VCC和GND