请教高手

2019-03-24 19:43发布

本人做了个光源,遇到疑问请各位高手不吝赐教。此光源采用PWM调光,采用STC12CLE5A48S2单片机,LCD显示LED光源的亮度,定时器1作为串口波特率发生器,定时器0用来产生PWM方波。程序在不加EEPROM读写子程序,光源能正常通过按键进行调光,但是在加了EEPROM读写子程序,在有调光按键按下时,光源都会产生闪烁。听别人说,是EEPROM子程序和其他程序在占用硬件上有冲突,但是还是不懂,不知道哪边有冲突。麻烦高手指点一下,谢谢喽。如果需要程序我可以把程序附上,如果我有什么说不清楚的地方,请指出了,我可以详细再说下。再谢。 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
whwshiyuan1984
2019-03-25 19:37
初始化及一些函数
//************I/O初始化*****************************************
void InitialIO()
{
        P1M0 = 0x08;        //P1.3推挽输出 ,P1.5,P1.6紧为输入
        P1M1 = 0x60;
        DIM = 0;

}

//************ 定时器0初始化 ***************************************
void Initial_timer0(void)   
{   
    AUXR = 0x80;   //T0为1T模式
        TMOD = 0x01;   // T0为模式1  
    TH0 = (65536 - 26) / 256;;    //1KHzPWM波
    TL0 = (65536 - 26) % 256;;  
   
        EA = 1;
        ET0 = 1;
        TR0 = 1;  
}

//************ 串口初始化 ***************************************

void Initial_Serial()
{
            AUXR|=0x40;    //Time1 1T
                SCON=0x50;          //串口模式设置
                TMOD=0x21;         //设置定时器1为8位自动重装计数器
       
                TH1=0xFD;        //波特率:115200                       
                TL1=0xFD;
       
                TR1=1;         //开定时器1
                ES=1;
                EA=1;


}


//************ PWM输出 ***************************************
uchar PWM_P13(duty)
{
   
        CMOD = 0x04;   //T0溢出作为PCA时钟输入源
    CL = 0x00;   
    CH = 0x00;   
          CCAP0H = duty;
        CCAP0L = duty;
        CCAPM0 = 0x42;   //8位PWM
    CR = 1;   
                 
}
//************ 定时0中断 ***************************************
void timer0_int (void) interrupt 1 using 1   
{   
    TH0 = (65536 - 26) / 256;   
    TL0 = (65536 - 26) % 256;
            
      
}

//************ 串口接收中断 ***************************************
void Serial_isr() interrupt 4
{
          
                  uint temp;
            if(RI)
            {               
                       
                         RI=0;  
             temp  = SBUF;
                          SBUF = key1;
                     while(!TI);
                     TI = 0;
                         
                         RI = 0;
                         temp = SBUF;
                     SBUF = count_up;
                     while(!TI);
                     TI = 0;

                         RI = 0;
                         temp = SBUF;
                         SBUF = count_down;
                     while(!TI);
                     TI = 0;
                             
                       
                       
                       
            }
            else
            {
                RI=0;
            }
}

//************ 上按键判断 ***************************************

void Key1_scan()
{
          
           if(key1 == 0)
           {
                     
                  Delay(6);          //20ms
                  
                  if(key1 == 0)
                  {
                           flag1 = 1;
                //         count_up ++;
               
                         Delay(300);
                         PCA_PWM0=0x00;
                           
                  }
                 
                  
           }
           else
           {
                    flag1 = 0;
               
          
           }


}

//************ 下按键判断 ***************************************

void Key2_scan()
{
           if(key2 == 0)
           {
                     Delay(6); //20ms
                  if(key2 == 0)
                  {
                           flag2 = 1;
                        // count_down ++;
                         
                         Delay(300);
                         
                  
                  }
                 
          
           }
           else
           {
                    flag2 = 0;
       
          
           }


}


//************ 上按键处理 ***************************************

void Upkey()
{

                if(flag1 == 1)       
                {       
                    
                    if(y!=0)
                           {
                        count_up ++;
                        y=256-(count_up-count_down)*256/100;         
                        //y= (int)(t+5/10);
                        PWM_P13(y);
                        }
                    EEPROM_program() ;
                }


}


//************ 下按键处理 ***************************************

void Downkey()
{
               
                if(flag2 == 1)
                {
                        count_down ++;
                        y=256-(count_up-count_down)*256/100;
                        //y= (int)(t+5/10);
                        if(y==256)
                        {
                        PCA_PWM0=0x03;
                        }
                       
                        if(y>256)
                        {
                            //if(y>257)
                                //{
                            count_down --;
                            //}
                                PCA_PWM0=0x03;
                        }
                       
                        PWM_P13(y);
                    EEPROM_program();
                }


}

//************ 延时  ***************************************
void Delay(uint time)                                                    
{
    uchar i;

        while(time--)
        {
                for(i = 0; i < 80; i ++)
                {;}
        }
}

一周热门 更多>