筱浯 发表于 2012-9-21 22:22:18

菜鸟求助PWM控制LED闪烁问题

#include<reg52.h>

typedef unsigned char uint8;
typedef unsigned int    uint16;

sbit LED = P0^0;//定义一个LED小灯
sbit ENLED = P1^4;
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;

void delay(uint16 t);
void init_t0();

uint8 PWM;
uint8 NUM;

main()
{

        ENLED = 0;ADDR3 = 1; //使能38译码器
        ADDR0 = 0; ADDR1 = 1; ADDR2 = 1; //使能LED

        PWM=0x7f; //初值
        LED=1;      //初值 熄灭LED
        init_t0();    //定时器
        while(1)   //渐亮、渐暗语句
        {
                if(PWM!=0xff)
                {
                        PWM++;
                        delay(100);
                }
               if(PWM!=0x01)
                {
                                PWM--;
                                delay(100);
                  }
        }

}

void delay(uint16 t)//延时程序
{
        uint16 x;
        uint8 y;
        for(x=t;x>0;x--)
        {
                for(y=120;y>0;y--)
                {}
        }
}

void init_t0()   //定时器控制
{
        TMOD=0X01;
        TH0    =255;
        TL0    =256-PWM;

        EA=1;
        ET0=1;
        TR0=1;
}

void timer0() interrupt 1   //中断 NUM的奇偶模拟LED的高低电平
{
        TR0=0;
        NUM++;
        if(NUM%2==1)
        {
                LED=0;
                TH0=255;
                TL0=256-PWM;
                TR0=1;
        }

        if(NUM%2==0)
        {
                LED=1;
                TH0=255;
                TL0=PWM;
                TR0=1;
        }

}



各位牛掰掰们,瞅瞅哪里出问题了

请指教下,
幸苦了!

chengzepeng 发表于 2012-9-22 04:57:49

给你个例子慢慢看!/*
        程序说明:
        由P2_0输出PWM,12M时输出100Hz,
        LED接在P2_0上,每0.1秒钟改变一次亮度。
        制作者;bbsniua
        2012/9/1
*/
#include<AT89X51.H>        // AT89X51专属库

#define uint8_t unsigned char

#define LED P2_0        // PWM输出

uint8_t P_S,PWM,d_ms;

void mcu_init()                // mcu初始化子函数
{
        TMOD = 0x02;        // T0为8位自动重装定时器
        TH0= 256-100;        // T0自动重装值,12M晶体时100uS中断一次
        TL0= 256-100; // T0预装值
        ET0= 1;                   // 开T0中断
        TR0= 1;                // 启动T0
        EA   = 1;                // 开总中断
        P_S= 1;                // PWM计数
        PWM= 0;                // PWM占空比
        P2   = 0xFF;
}

void int_t0(void) interrupt TF0_VECTOR                // T0中断函数,12M晶体时100uS中断一次
{
        ++P_S;
        if(P_S>100)
        {
                P2_0 = 1;
                P_S = 1;
               if(d_ms)
                {
                        --d_ms;
                }
        }
        if(P_S>PWM)
        {
                P2_0 = 0;
        }
}

void delay_ms(uint8_t xms)
{
        d_ms = xms;
        while(d_ms);       
}

void main()                                                  // 主函数
{
        mcu_init();                                        // mcu寄存器初始化
        while(1)
        {
                delay_ms(10);                          // 每100mS更改一次PWM占空比
                ++PWM;
                if(PWM>100)
                {
                        PWM = 0;
                }                                       
        }
}
页: [1]
查看完整版本: 菜鸟求助PWM控制LED闪烁问题