微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 想用PWM给51单片机实现呼吸灯,代码如下,但是一直灯都是一闪一闪的,没有逐渐亮灭的效果。

想用PWM给51单片机实现呼吸灯,代码如下,但是一直灯都是一闪一闪的,没有逐渐亮灭的效果。

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
sbit PWM=P2^1;
#define uchar unsigned char
uchar dir,value,t0;
void init();
void main()
{
        init();
        while(1)
        {
                if(dir==0)                                          
                {
                        value++;
                        if(t0>value)
                                {
                                        PWM=0;
                                }
                        if(value==100)
                                {
                                        dir=1;
                                }
                }
                else
                {
                        value--;
                        if(t0<value)
                                {
                                        PWM=1;
                                }       
                        if(value==0)
                                {
                                        dir=0;
                                }
                }
                if(t0>100)
                {
                        t0=0;
                }
        }               
}
void init()
{
        t0=100;
        PWM=1;
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void Time0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t0++;
}

没有用单片搞过  用LM358和NE555搞过

你这个当然是亮灭了,想要逐渐变化的话,最好改变通断的频率来实现,简单说就是频率由慢到快然后由快到慢就可以了,另外一点,注意间隔时间的控制。

你这样实现不了,如楼上所说你应该通过改变亮灭的频率,去控制亮度,逐渐加大,然后减小,通过时间的调整实现

dddddddddddddddddddddddddd

改变定时器的值在中断里面翻转引脚。

看看一下,,,,,,,,,,

while(1)
  {
               value++;
                 
                        if(t0>value)
                                {
                                        PWM=0;
                                }
                  
                      else
      
                                {
                                        PWM=1;
                                }      
                     
}
你这样试一下,

好的

要是灯上并个的电容呢?

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit S2=P3^4;
sbit S3=P3^5;
sbit fm=P2^3;
uchar pwm,num;
void delay(uint ms)
{
        uchar i;
        while(ms--)
        {
                for(i=0;i<120;i++);
        }
}
void bee()
{
        fm=0;
        delay(100);
        fm=1;
        delay(100);
}
void keyscan()
{
        if(S2==0)
        {
                delay(50);
                if(S2==0)
                {
                        if(pwm<32)
                        {
                                pwm++;
                                delay(100);
                        }
                        else
                        {
                                bee();
                        }
                }
        }
        if(S3==0)
        {
                delay(50);
                if(S3==0)
                {
                        if(pwm>1)
                        {
                                pwm--;
                                delay(100);
                        }
                        else
                        {
                                bee();
                        }
                }
        }
}

void init_t0()
{
        TMOD=0x01;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void t0() interrupt 1
{
        TR0=0;
        TH0=(65536-500)/256;
        TL0=(65536-500)%256;
        num++;
        if(num>32)
        {
                num=0;
        }
        if(num<=pwm)
        {
               
                P0=0x00;
        }
        else
        {
       
                P0=0xff;
        }
        TR0=1;
}
void main()
{
        init_t0();
        num=0;
        pwm=16;
        while(1)
        {
                keyscan();
        }
}

可以实现由暗到亮和有亮到暗  控制中断函数里面的pwm值就可以实现

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

网站地图

Top