求一个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单片机与89s52单片机的区别是什么
STC89C52单片机与AT89S52是完全兼容的,就是原来用的是AT89S52,STC89C52是完全可以直接替换的。硬件和程序都不用做改动。两者的区别就在于烧录程序上。AT89S52需要电脑的并口下载线,这是早期的电脑才有并口的,现在电脑连串口都没有了。所以,要烧录程序要买一条USB转ISP线,可是网上能买的USB转ISP线又...

stc89c52单片机和51单片机的区别
1、种类不同:51系列单片机是指51内核,stc89c5X基本都是51内核的种类。2、大小不同:最后一个数字表示E2prom的大小,E2prom=X*4K,c51就是4K,c52就是8k。3、配件不同:52还多了一个定时器,所以可以说52是51(这个51是指stc89c51,不是51内核)的增强型。如下图,可以很清晰的看出两者之间...

89c52单片步进电机速度
方便的方法用步进电机驱动器,单片机只要输出不同频率的时钟脉冲(也就是改变每个脉冲时长)就可以改变电机的转速,频率越高转速越高。同时驱动器也可以设置不同的细分驱动方式。不同的细分在相同频率脉冲驱动时,转速也不相同,细分越高转速越低。

自己做了一个单片机最小系统(89C52),为什么写不进去程序?我检查电路没...
问一下,你用的单片机是AT89C52还是用的STC89C52,若是用AT89C52要专用的下载器,STC89C52这个单片机可以直接通过ISP接口下载程序,AT89C52这个单片机没有ISP接口。

89C52单片机的电源原理是什么
89C52单片机没有电源供电,也没有电源模块。89C52内置8位中央处理单元、512字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入\/输出(I\/O)口、3个16位定时\/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉...

89c52单片机主频是多少?
89C52内置8位中央处理单元、512字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入\/输出(I\/O)口、3个16位定时\/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、...

stc89c52与89c52的区别有哪些?
STC89C52RC是宏晶公司的增强型MCS-51单片机,与Atmel公司的AT89C52相比,有以下优点:支持STC的2线制下载方式,下载程序更方便;支持6T模式(在6T模式下,6个时钟周期就是一个机器周期);片内集成了4kB容量的E²PROM;带有P4口,具有更多的I\/O;程序存储器拥有更多的擦写寿命(STC标称可以擦写1...

关于51单片机和74HC595D芯片通信,想用1片89C52和1片74HC595D实现12个LED...
两片hc595芯片串接程序,dat1和dat2,表示两片hc595的16个并口的电平 void HC595_senddata(unsigned char dat1,unsigned char dat2){ unsigned char i;for(i=0;i<8;i++) \/\/发送一个八位数据 { if(((dat1<<i)&0x80)==0)DS=0; \/\/第i位为0时,MOSIO发送0;else ...

stc89c51和stc89c52的区别是什么??
FLASH PERAM,而。AT89C52 的内部FLASH PERAM 增加1倍,达到8K。3、52还多了一个定时器,所以可以说52是51(这个51是指stc89c51,不是51内核)的增强型;4、中断源增加:AT89C52 除了具备 AT89C51 的定时器\/计数器 T0 和定时器\/计数器 T1,还额外增加了一个定时器\/计数器 T2。单机片:...

求写程序!89C52单片机,按按键1点亮LED,按按键2熄灭LED,两个按键另一...
求写程序!我的是89C52单片机,想用两个按键和一个LED来实现,按下按键1点亮LED,按下按键2熄灭LED,两个按键另一端是接5V,LED另一端也是接5V。最好配上原理图。感激不尽 提醒一下:两个按键另一端接5V地!!!电路参考如下:代码参考如下:include<reg52.h> sbit LED = P2^7;define ON0 ...

应城市13960849503: 哪位大神可以帮我做呼吸灯,即一个亮,另一个就暗.一直循环,用89c52单片机写 -
邴茅复方: 可以用软件PWM做出来 这是一个软件PWM的函数 由于晶振不一样,你需要自己写延时函数void DelayUS(unsigned int ntime); void pwm_output(int updated_rate) { int pwm_high,pwm_low,pwm_cycle; //分别为频率周期内高电平时间,低电平时...

应城市13960849503: 求一个89c52单片机的呼吸灯程序 要边呼吸边移动的 就是相当于呼吸灯流水灯结合 -
邴茅复方: #include// 包含头文件// 延时函数// 参数 in 为延时的时间长度(单位时间很短,大约一条指令的时间) void delay(unsigned int in) { unsigned int i; for(i=0;i}// 由暗变亮的子函数// 参数 ledn 为点第几位的灯 void off_on(unsigned char ledn) { unsigned...

应城市13960849503: 求一个单片机呼吸灯程序
邴茅复方: #include <reg51.h> #define unchar unsigned char #define unint unsigned int #define led P1 void delay(unchar l); void main() { unchar i,j,x,y; i=0; j=255; x=255; y=255; while(1) { while(x>0) {x--; led =0x00; delay(i); led =0xff; delay(j); delay(j); delay(j); i++...

应城市13960849503: 单片机. STC89C52RC.怎么控制输出口的电压. 我想做一个呼吸灯,控制输出电压呈周期变化是 -
邴茅复方: 用定时器模拟pwm功能,改变占空比来改变亮度.

应城市13960849503: 求一个单片机呼吸灯程序 -
邴茅复方: 呵呵换成stc12c5410更简单~与五一兼容,有pwm模块,五一还得用定时器模拟

应城市13960849503: 1个stc单片机(如:stc89c52rc)最多可以控制多少个led灯? -
邴茅复方: 驱动方法不同,个数当然也不同了.如果是IO口直接驱动,那就32个.如果你通过74HC138之类的译码器驱动,就能更多(一个74HC138可以控制8个LED,只占用单片机3个脚),如果你用74HC164或者74HC595之类的串入并出移位寄存器驱动的话,不考虑驱动速度的情况下,一百个,一千个,一万个都可以,这类器件只占用单片机3、4的几个端口,通过多个芯片级联,可以扩展无数个输出端,当然级联越多单片机发送数据时占用的时间就越多,速度就越慢.

应城市13960849503: 我有个89C52的单片机 请问可以驱动几个LED灯 -
邴茅复方: 一个IO口8线单独用可驱动8个小LED,两个口组成8x8矩阵可驱动64个,4个口可组成16x16矩阵可驱动256个.但是注意P0是集电极开路,要上拉才能输出高电平.另外,如果LED电流较大,还要加三极管.有关单片机应用学习,建议你可以经常到百度传课找一些视频教程看看,有些免费视频其实挺好的.

应城市13960849503: 跪求一个 89C52单片机通过按键产生PWM信号来控制LED灯的不同亮度的程序, -
邴茅复方: #include#define uchar unsigned char#define uint unsigned int sbit lamp=P2^0;//输出 sbit k1=P3^3;//加键 sbit k2=P3^2;//减键 sbit k3=P3^4;//停止 uchar a=10; void delay(uint x)//延时函数 { uchar i; while(x--) for(i=0;i} void init() { TMOD=0X01;...

应城市13960849503: 单片机控制灯泡渐亮 -
邴茅复方: 授人以鱼不如授人以渔. 不管你是不是伸手党.如果你希望自己能做.我还是给你一个思路. 首先你要检测P20的信号. 检测到了才能去控制灯泡.可以将P20接一个开关 另外一头接地.当你按快关的时候.P20被拉低,检测到i信号. 检测到信号之后,就要控制灯泡渐亮. 要让灯泡亮灭很容易,但是渐亮还是需要一点技巧. 可以用脉宽调制. 就是短时间里给灯泡亮灭,但是人眼却看不出来在闪, 自己控制好频率 ,慢慢加强,灯泡就慢慢亮了.具体用语言怎么实现,还是你自己来吧,别这么懒,自己动动脑筋.

应城市13960849503: 求89c52单片机控制4个led流水灯每0.5秒亮一个c语言
邴茅复方: #include &lt;reg52.h&gt; #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&lt;4;i++) { P2&amp;= ~(1&lt;&lt;i); delay500ms(); P2|=(1&...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网