打印

调试PWM遇到问题

[复制链接]
1083|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
机智的埃文|  楼主 | 2015-1-21 20:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本来通过串口发送一个指令控制led亮度,但是调试过程中发现发送"调亮"或“调暗”的指令灯不会只改变一次亮度,而是直接自己执行到底(比如我发调暗,灯会自己一直暗到灭,我只发了一次指令),目标是一次执行变暗一下。请各位帮我看下。在线等。。。。


#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义


unsigned char PWM0;
unsigned char PWM1;
unsigned char temp;
unsigned char temp1;
unsigned char num0;
unsigned char num1;

sbit led0 = P2^2;
sbit led1 = P2^3;
               

/*------------------------------------------------
                  亮度调节延时
------------------------------------------------*/
void delay(unsigned int z)  
{
        unsigned x,y;
        for(x=z;x>0;x--)
                for(y=100;y>0;y--);
}

/*------------------------------------------------
                      总开
------------------------------------------------*/
void turn_on()
{       
        led0=0;
        led1=0;
        if(led0||led1==1)
        temp1=0x20;             //返回“打开灯光失败”
        else
        temp1=0x10;                            //返回“打开灯光成功”
}
/*------------------------------------------------
                      总关
------------------------------------------------*/
void turn_off()
{
        led0=1;
        led1=1;
        if(led0&led1==0)
        temp1=0x20;             //返回“关闭灯光失败”
        else
        temp1=0x10;                            //返回“关闭灯光成功”
}

/*------------------------------------------------
                  开白色LED
------------------------------------------------*/
void Wturn_on()
{
        led0=0;
        if(led0==1)
        temp1=0x20;             //返回“打开白灯失败”
        else
        temp1=0x10;                            //返回“打开白灯成功”

}
/*------------------------------------------------
                  开黄色LED
------------------------------------------------*/
void Yturn_on()
{
        led1=0;
        if(led1==1)
        temp1=0x20;             //返回“打开黄灯失败”
        else
        temp1=0x10;                            //返回“打开黄灯成功”

}

/*------------------------------------------------
                  关白色LED
------------------------------------------------*/
void Wturn_off()
{
        led0=1;
        if(led0==0)
        temp1=0x20;             //返回“关闭白灯失败”
        else
        temp1=0x10;                            //返回“关闭白灯成功”

}

/*------------------------------------------------
                  关黄色LED
------------------------------------------------*/
void Yturn_off()
{
        led1=1;
        if(led1==0)
        temp1=0x20;             //返回“关闭黄灯失败”
        else
        temp1=0x10;                            //返回“关闭黄灯成功”
}

/*------------------------------------------------
                   PWM0调节
------------------------------------------------*/
void ctrl_PWM0()
{
        if(num0==10)                           //PWM0
        {
                num0=0;
        }       
        if(num0<PWM0)
        {
                led0=0;
        }
        else
                led0=1;
}

/*------------------------------------------------
                   PWM1调节
------------------------------------------------*/
void ctrl_PWM1()
{
        if(num1==10)                            //PWM0
        {
                num1=0;
        }       
        if(num1<PWM1)
        {
                led1=0;
        }
        else
                led1=1;
}

/*------------------------------------------------
                 调亮白色LED
------------------------------------------------*/
void Wturn_up()
{
         if(PWM0>10)
                PWM0=10;
         else
                   PWM0=PWM0+1;
                delay(200);
}
/*------------------------------------------------
                 调亮黄色LED
------------------------------------------------*/
void Yturn_up()
{
        if(PWM1>10)
                PWM1=10;
        else
                   PWM1=PWM1+1;
                delay(200);               
}
/*------------------------------------------------
                 调暗白色LED
------------------------------------------------*/
void Wturn_down()
{
   if(PWM0<1)
                   PWM0=1;
   else
                   PWM0=PWM0-1;
                 delay(200);
}
/*------------------------------------------------
                 调暗黄色LED
------------------------------------------------*/
  void Yturn_down()
{
   if(PWM1<1)
                   PWM1=1;
   else
                   PWM1=PWM1-1;
                 delay(200);
}


/*------------------------------------------------
                串口和定时器0初始化
------------------------------------------------*/
void Init_UART  (void)
{

    SCON  = 0x50;                        // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x21;                           // TMOD: timer 1, mode 2, 8-bit            
    TH1   = 0xFD;
        TL1   = 0xFD;               // 9600 波特率 晶振 11.0592MHz  
        TH0 =(65535-500)/256;
        TL0 =(65535-500)%256;
    TR1   = 1;                  // TR1:  timer 1 打开                        
    EA    = 1;                  //打开总中断
        ES    = 1;                                  //打开串口中断
        ET0 = 1;
        TR0 = 1;
}
                       
/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{

        led0=1;
        led1=1;
        PWM0=5;
        PWM1=5;
        Init_UART();  
        TR0 = 0;            
        while (1)                       
    {
            switch(temp)//判断temp从串口读取到的数据
                {
                        case 0x01:     //如果是0x01 总开灯
            turn_on();
//                        temp=0;
                        break;

                        case 0x02:    //如果是0x02  总关灯
                        turn_off();
//                        temp=0;
                        break;

                        case 0x03:    //如果是0x03 开白灯
                        Wturn_on();
//                        temp=0;
                        break;

                        case 0x04:    //如果是0x04 关白灯
                        Wturn_off();
//                        temp=0;
                        break;

                        case 0x05:    //如果是0x05 开黄灯
            Yturn_on();
//                        temp=0;
                        break;

                        case 0x06:    //如果是0x06 关黄灯
            Yturn_off();
//                        temp=0;
                        break;

                        case 0x07:    //如果是0x07 调亮白灯
                        TR0=1;
            Wturn_up();
//                        temp=0;
                        break;

                        case 0x08:    //如果是0x08 调暗白灯
                        TR0=1;
            Wturn_down();
//                        temp=0;
                        break;

                        case 0x09:    //如果是0x09 调亮黄灯
                        TR0=1;
            Yturn_up();
//                        temp=0;
                        break;

                        case 0xa0:    //如果是0xa0 调暗黄灯
                        TR0=1;
            Yturn_down();
//                        temp=0;
                        break;

                }       
        }       
}

/*------------------------------------------------
                  串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{  
   if(RI)                        //判断是接收中断产生
     {
         RI=0;                      //标志位清零
          temp=SBUF;                 //读入缓冲区的值
      SBUF=temp1;
          temp1=0;                       
          }
          if(TI)                        //如果是发送标志位,清零
     TI=0;
}

/*------------------------------------------------
                    定时器0中断
------------------------------------------------*/
void timer0() interrupt 1
{
        TH0=(65535-500)/256;
        TL0=(65535-500)%256;
        num0++;
        num1++;
        if(temp==0x07||temp==0x08)                 //去除其他状态的干扰
        {
                ctrl_PWM0();
        }
        if(temp==0x09||temp==0xa0)
        {
                ctrl_PWM1();       
        }
}

相关帖子

沙发
ayb_ice| | 2015-1-22 08:14 | 只看该作者
串口中断设个接收标志,看到数据置1,

主循环判断标志,为1处理命令,然后清除标志,为0则不处理命令

使用特权

评论回复
板凳
tianm| | 2015-1-22 11:00 | 只看该作者
循环没有判断

使用特权

评论回复
地板
ss掷弹专业| | 2015-1-24 22:53 | 只看该作者
在switch里面干嘛要把temp=0;注释掉?? temp不清掉的话 不就一直执行变暗操作了么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

8

帖子

0

粉丝