微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微波和射频技术 > 射频综合技术问答 > PWM控制led流星灯(水滴效果)

PWM控制led流星灯(水滴效果)

时间:10-02 整理:3721RD 点击:
各位大神,我最近想做一个基于单片机PWM功能的流星灯(水滴效果),可是看了一些资料,按着书上的程序做了一边还是不行。那灯亮度压根儿就没变,,,求正解啊。
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
sbit PWM=P0^1;
void delay(uchar i)
{
        uchar j;
        for(;i>0;i--)
        {
                for(j=29;j>0;j--)
                _nop_();
                _nop_();
        }
}
void PWMout(uchar q)
{
        PWM=1;
        delay(q);
        PWM=0;
        delay(10-q);
}
void main()
{
        while(1)
        {
                PWMout(0);
                PWMout(1);
                PWMout(2);
                PWMout(3);
                PWMout(4);
                PWMout(5);
                PWMout(6);
                PWMout(7);
                PWMout(8);
                PWMout(9);
                PWMout(10);
        }
}

路过学习学习

发不了

#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
sbit LED0=P1^0;// 用sbit 关键字 定义 LED到P1.0端口,LED是自己任意定义且容易记忆的符号
void Delay(unsigned int t); //函数声明
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
                  
unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
while (1)         //主循环
  {
LED0=1;
Delay(60000);        //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++){ //PWM_LOW表示低
//电平时间,这个循环中低电平时长从1累加到CYCLE(周期)的值,即600次
                   LED0=0;        //点亮LED  
                   Delay(PWM_LOW);//延时长度,600次循环中从1加至599
                   LED0=1;        //熄灭LED
              Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
     
   }
LED0=0;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--){ //与逐渐变亮相反的过程
                   LED0=0;
                   Delay(PWM_LOW);
                   LED0=1;
              Delay(CYCLE-PWM_LOW);
     
   }
                     //主循环中添加其他需要一直工作的程序
  }
}
/*------------------------------------------------
延时函数,含有输入参数 unsigned int t,无返回值
unsigned int 是定义无符号整形变量,其值的范围是
0~65535
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}

zhhq707  ,赞一个,多谢分享。

这是我刚才改的,用数码管显示
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
unsigned int count=800,i;
void delay(unsigned int t)
{
        while(--t);
}
void shui()
{
        P0 = 0xc0;        //点亮LED  
        delay(i);//延时长度,600次循环中从1加至599
        P0 = 0xff;       //熄灭LED
        delay(count-i);//延时长度,600次循环中从599减至1
}
void shuidi()
{
        P0 = 0xff;
        delay(60000);
        for(i=1;i<count;i++)  //i表示低         //电平时间,这个循环中低电平时长从1累加到count(周期)的值,即600次
        shui();
        P0 = 0x00;
        for(i=count-1;i>0;i--)         //与逐渐变亮相反的过程
        shui();
}
void main ()
{   
        while (1)         //主循环
        {
                P2 = 0x00;
                shuidi();
        }            
}

                            赞

路过学习学习路过学习学习

想法不错!1

单片机是哪款?

想法很好啊!学习中。

。水滴石穿

很好,很强大,仁健微波,频率源专家

到处看看,学习学习~!~!

多学习学习!

这是通过控制延时来控制闪烁频率的?

PWMout(0);
                PWMout(1);
                PWMout(2);
                PWMout(3);
                PWMout(4);
你在每个之间PWMout
加个大概1S的延时程序,看看有没有变化。

要根据自己板子的电器特性来写程序 #include<reg52.h>
typedef unsigned char uint8;
sbit DB1=P1^0;
void main()
{
uint8 i,k,p,t,j;
char n;
uint8       a[]={0,1,2,4,6,16,32,64};
uint8       b[]={0,34,48,59,68,76,84,91,97,103,109,114,119,123,126};
signed char c[]={-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7};
P1=0xFF;
while (1)
{       
//***************************************************************   
//水滴形成
/*P1 = 0xFF;
//---------------水滴逐渐变大(第一个LED 亮度逐渐变大)---------
        for(i=0; i<64; i++)
        {
       
                for(j=0; j<64; j++)          //一个亮度级别发送64 个脉冲
                {
                        P1 = 0xFE;
       
                        for(k=0; k<64; k++)          //以i 为亮度级别,随着i 的增大,占空比增大
                        {
                                if(k > i)
                                {
                                P1 = 0xFF;
                                }
                        }  
        }}
   */ k=0;
        for(i=0;i<=252;i++)
        {
                if(0==(i%4))
                {
                k++;
                }
                for(t=0;t<=16;t++)
                {
                 DB1=0;
                 for(j=0;j<=64;j++)
                 if(j==k)
                 DB1=1;               
                }
        }
//*******************************************************************
//        滴落
for(j=0;j<=254;j++)
{
        p=0;
        for(k=0;k<=15;k++)
        {
        if(j==b[k])
        n=c[k];                         
        }
        for(i=0;i<=64;i++)
         {
                for(k=0;k<=7;k++)
                {
                  if(i==a[k])
                  {
                          p=p|(1<<k);                 
                          t=~p;
                          if(n>=0)                         
                          P1=~(t<<n);                  
                          else
                          P1=~(t>>-n);        
                  }
                }
         }

}          
}
}                          

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top