求一个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 ...
邴茅复方: 可以用软件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 <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&...