打印
[51单片机]

还有两天就要上交作品了,程序有问题,求指导,跪求。

[复制链接]
801|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
1012507633|  楼主 | 2015-3-4 20:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在调节led0亮度后,在跳节led1的亮度会使led0灭掉(我先把led0调暗,在调暗或调亮led1时led0就会熄灭)

附程序:
/*------------------------------------------------
  名称:基于蓝牙的智能家居灯光控制器
  编写:zxl
  日期:2015.1.5
  修改:无
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

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

bit rec;

sbit led0 = P2^5;
sbit led1 = P2^6;           //注意开发板与样品定义脚的更改

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

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

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

}

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

}

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

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

}

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

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


/*------------------------------------------------
                串口和定时器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)                       
    {
                if(rec==1)
                {
                        rec=0;
                    switch(temp)//判断temp从串口读取到的数据
                        {
                                case 0x30:     //如果是0x30 总开灯
                    turn_on();
                                break;
       
                                case 0x31:    //如果是0x31  总关灯
                                turn_off();
                                break;

                                case 0x32:    //如果是0x32 开黄灯
                    Yturn_on();
                                break;
       
                                case 0x33:    //如果是0x33 关黄灯
                    Yturn_off();
                                break;

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

                                case 0x35:    //如果是0x35 调亮黄灯
                    Yturn_up();
//                                TR0=1;
                                break;
       
                                case 0x36:    //如果是0x36 开白灯
                                Wturn_on();
                                break;
       
                                case 0x37:    //如果是0x37 关白灯
                                Wturn_off();
                                break;

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

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

/*------------------------------------------------
                  串口中断程序
------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{  
    if(RI)                        //判断是接收中断产生
     {
          RI=0;                      //标志位清零
          rec=1;
          temp=SBUF;

//          SBUF=temp1;                                  //读入缓冲区的值                                       
          }
        if(TI)                        //如果是发送标志位,清零
                  TI=0;
       
}

/*------------------------------------------------
                    定时器0中断
------------------------------------------------*/
void timer0() interrupt 1
{
        TH0=(65535-500)/256;
        TL0=(65535-500)%256;
        num0++;
        num1++;
        if(temp==0x38||temp==0x39)
        {
                ctrl_PWM0();
//                num0=0;
               
        }
        if(temp==0x34||temp==0x35)
        {
                ctrl_PWM1();
//                num1=0;
        }
}

相关帖子

沙发
1012507633|  楼主 | 2015-3-4 20:24 | 只看该作者
问题出在哪里

使用特权

评论回复
板凳
wangyy608| | 2015-3-5 08:14 | 只看该作者
ctrl_PWM0()和ctrl_PWM1()进入定时中断需要都运行;有这个if(temp的判断显然只控制了1个灯

使用特权

评论回复
地板
1012507633|  楼主 | 2015-3-6 09:23 | 只看该作者
wangyy608 发表于 2015-3-5 08:14
ctrl_PWM0()和ctrl_PWM1()进入定时中断需要都运行;有这个if(temp的判断显然只控制了1个灯 ...

void timer0() interrupt 1
{
        TH0=(65535-500)/256;
        TL0=(65535-500)%256;

        num++;
        if(num==10) num=0;

        if(num<PWM0) led0=0;else led0=1;
    if(num<PWM1) led1=0;else led1=1;
       
}
我把中断子程序改成这样,两路灯都可以独立调节,但是只让其中一个灯调节PWM时,会使另外一个灯也会亮起来,中断中有两个PWM都会执行,请问怎么既能两路独立调节,有可以在单路调节是不影响另外一路?程序怎么改?

使用特权

评论回复
5
joyme| | 2015-3-6 11:21 | 只看该作者
设置灯亮灭状态,在turnOff和turnOn里可以只变状态而不实际输出(实际输出也没有关系),在中断里判断如果是灭状态就相应管脚变0,如果是亮状态才用 if(num<PWM0) led0=0;else led0=1;

使用特权

评论回复
6
1012507633|  楼主 | 2015-3-6 14:12 | 只看该作者
joyme 发表于 2015-3-6 11:21
设置灯亮灭状态,在turnOff和turnOn里可以只变状态而不实际输出(实际输出也没有关系),在中断里判断如果是 ...

void timer0() interrupt 1
{
        TH0=(65535-500)/256;
        TL0=(65535-500)%256;

        num++;
        if(num==10) num=0;
        if(led0==0&&led1==1)
        {
                if(num<PWM0) led0=0;else led0=1;

        }
        if(led1==0&&led0==1)
        {
                if(num<PWM1) led1=0;else led1=1;

        }
        if(led0==0&&led1==0)
        {
                if(num<PWM0) led0=0;else led0=1;
                if(num<PWM1) led1=0;else led1=1;
        }
}
这种情况不管是两路一起调还是单路调,只要一调PWM 灯就会熄灭

使用特权

评论回复
7
joyme| | 2015-3-6 14:35 | 只看该作者
  if(led1==0&&led0==1)这种条件不对,本来就是PWM的,即灯亮的状态,led0,或led1也随时可能为1或0,另外用一个状态字来表示灭,或亮,亮的时候控制led1或led1输出PWM波,灭的时候led0或led1恒为0

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
1012507633 + 1 很给力!
8
1012507633|  楼主 | 2015-3-6 16:09 | 只看该作者
joyme 发表于 2015-3-6 14:35
if(led1==0&&led0==1)这种条件不对,本来就是PWM的,即灯亮的状态,led0,或led1也随时可能为1或0,另外用 ...

ok了,灰常感谢

使用特权

评论回复
9
1012507633|  楼主 | 2015-3-6 16:10 | 只看该作者
wangyy608 发表于 2015-3-5 08:14
ctrl_PWM0()和ctrl_PWM1()进入定时中断需要都运行;有这个if(temp的判断显然只控制了1个灯 ...

:handshake

使用特权

评论回复
10
原野之狼| | 2015-3-6 21:26 | 只看该作者
程序调试无捷径  每天都码代码  水平就上去了

使用特权

评论回复
11
ilikerome| | 2015-3-7 13:52 | 只看该作者
顶,学习一下。。。

使用特权

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

本版积分规则

2

主题

8

帖子

0

粉丝