感悟网 导航

求一个89c52单片机的光控呼吸灯程序 ,就是边呼吸边移动的,相当于呼吸与流水灯结合,两个按键能加减速度 求你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++;

}

}



《89c52单片机按一键点亮小灯延时5分钟后熄灭怎么写》
答:是仿真?还是实物开发板?程序如下 include<reg51.h> sbit k1 =P3^2; //按键在P3.2上 sbit led=P2^7; //LED灯在P2.7上,0点亮 unsigned char t0n,second,minute;void main(){ TMOD=0x01;TH0 =0x3C;//晶振频率=12M,定时50ms TL0 =0xB0;IE =0x82;//开中断 while(1){ i...

《求89c52单片机控制4个led流水灯每0.5秒亮一个c语言》
答:include <reg52.h> define uint unsigned int define uchar unsigned char uchar aa,num,ge,shi;void delay500ms(void);void main(void){ uchar i;P2=0xFF;//4LED 共阳 while(1){ for(i=0;i<4;i++){ P2&= ~(1<<i);delay500ms();P2|=(1<0;c--)for(b=152;b>0;b--)for...

《我做的题目是智能窗帘,用到光敏电阻和ATC89C52单片机,想问问,电路图怎 ...》
答:你的这个题目是非常简单的。单片机要用AT89S51/AT89S52,或STC单片机,ATC89C52单片机,你可能是想写AT89C52单片机,这款单片机早已停产了,取而代之是AT89S52,价格约4。5元/块。给你电路图,程序想必你会写。图中,P2。0为输入端,P2。1为输出端。

《跪求单片机89C52编程,题目是:P1口的四个LED灯循环点亮,点亮时间为一 ...》
答:include<reg52.h> include<intrins.h> define uint unsigned int define uchar unsigned char uchar aa,tt;void main() //---主函数--- { TMOD=0x01;TH0=(65535-50000)/256;TL0=(65535-50000)%256;EA=1;ET0=1;TR0=1;tt=0;aa=0xfe;P1=aa;while(1);} void time() interrupt 1...

《单片机用89c52写》
答:/*stc89c52 晶振为22.1184M */ /* 有一个缺陷,就是必须在每一个模式走完之后按下按键才有效,正在改进中*/ include<reg52.h> sbit KEY1=P3^4;sbit KEY2=P3^5;sbit KEY3=P3^6;sbit KEY4=P3^7;sbit led_lock=P2^5;//led锁存 sbit DULA=P2^6;//数码管段锁存 sbit WELA=P2^...

《开发板是HL-1,单片机是89C52RC 想外接一个红外模块,VCC和GND接在哪儿...》
答:单片机和红外接收头上都有VCC和GND

《89c52 单片机测速程序 光电码盘》
答:光电码盘我没用过,不过原理应该是和编码器类似的,可以利用89C52的T0或者T1的计数器模式统计1s内的下降沿次数(从高电平到低电平转换的过程),然后计算就可以了。也可以使用T2定时的捕获模式,不过89c52的捕获我没用过,详细请百度。T0、T1定时器计数器模式参考示例:

《求用st89c52单片机外部中断功能改变发光二极管的点亮,无外部中断时8个...》
答:include<reg51.h> define uchar unsigned char define uint unsigned int uchar led=0xfe,ledf=0x0f;void delay(uint a){ uchar i;while(a--)for(i=0;i<120;i++);} void ext0() interrupt 0 { P0=ledf;ledf=~ledf;delay(100);} main(){ EX0=1;IT0=0;EA=1;while(1){ P0...

《设89C52单片机Fosc=12MHz。试编写一段程序,对定时器T1初始化,使之工作...》
答:楼上用的是查询法,我来个中断函数的 呵呵 include<reg52.h> sbit a0=P1^1;//端口定义 int count=0;//计时变量初始化 /***T1中断服务函数***/ void T0Int() interrupt 3 using 0 // { count++;//200us 加一次 if(count==100)//一百次之后,取反输出端口 { count=0;//清零...

《急求 基于89c52单片机,ds18b20温度传感器的温度控制c程序!!!》
答:;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒 ;可以将检测到的温度直接显示到AT89C51的两个数码管上 ;显示温度00到99度,很准确无需校正!ORG 0000H ;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低8位 TEMPER_H EQU 28H;用于保存读出温度的高8位 FLAG1 EQU ...

   

返回顶部
本页内容来自于网友发表,若有相关事宜请照下面的电邮联系
感悟网