单片机8051按键控制LED灯的亮度,软件设计有关问题

单片机8051按键控制LED灯的亮度,软件设计问题
我是新手,现在先将要求叙述一下,可能有不清楚的地方大家可以回复继续问,比如说一个8051控制器控制LED灯的亮度调节,有两个要求:
假定设计LED灯亮度分为0.1.2.3.4.5六档,其中0代表LED灯关闭。
1,控制器上按键包括灯的亮度调节的+,-两个按钮,按其中的按钮+或者-按键,执行发送一条亮度消息,在LED灯当前亮度基础上+或者-一档亮度。
2,控制器接收一条亮度调节的消息,消息中包括要调节到的LED灯的亮度值,比如原本LED灯处于2档亮度,接受将亮度调节为最亮5档的消息,然后发送一条亮度消息,将其控制的LED灯调节为要求亮度。
3,亮度改变要求渐变。
现在硬件导上单片机通过其中的一个引脚接IDAC然后接LED灯组。控制LED的亮度。
我先问一下,这个单片机软件框架应该怎么写,亮度消息怎么定义,还有怎么获取LED灯组目前的亮度等级,求大神帮忙把关键代码给写一下,我参考学习用,谢谢大神了 我新手,可能问题有点小白,大神勿怪 ,有什么看不懂的的回复交流

------解决方案--------------------
框架无非就是

[code=C/C++][/code]main(){
init();
while(1)
{}}

led亮度等级肯定是保存在你定义的变量里

------解决方案--------------------
C/C++ code
main(){
init();
while(1)
{}}

------解决方案--------------------
C/C++ code
void main(void)
{
    unsigned char key;//按键键值
    unsigned char duty1,duty2,duty0;
    
    WDTCN = 0xde;  // 关闭看门狗            
    WDTCN = 0xad; 

    Sysclk_Init();  // 配置系统时钟
    SysPort_Init(); // 端口配置

    ALARM_Ctrl(true);
    LED1_PutVal(true);
    LED2_PutVal(true);
    LED3_PutVal(true);    
    
    Delay_ms(500);      // 延时500ms
    LCD_Init();
    LCD_ShowString(0,1,WEB);
    LCD_ShowString(1,0,TEL);

    LED1_PutVal(false);
    LED2_PutVal(false);
    LED3_PutVal(false);
    ALARM_Ctrl(false);    
    Delay_ms(1000);        // 延时1s
//    LCD_ClearScreen(); 
    
    PCA_Init();    // PCA0初始化
    EA=1;          // 允许全局中断
    
    duty0 = 0;
    duty1 = 0;
    duty2 = 0;
    
    PCA_PwmDuty(0,duty0);
    PCA_PwmDuty(1,duty1);
    PCA_PwmDuty(2,duty2);

    while(1)
    {
      key = Key_Read();
      switch (key)               //判断按键值
      {                    
        case KEY_1:             
             duty0 += 10;
             if (duty0>100)
                  duty0 = 100;
             duty1 += 10;
             if (duty1>100)
                  duty1 = 100;
             duty2 += 10;
             if (duty2>100)
                  duty2 = 100;
             
             PCA_PwmDuty(0,duty0);
             PCA_PwmDuty(1,duty1);
             PCA_PwmDuty(2,duty2);

             LED1_PutVal(true);
             Delay_ms(100);        // 延时100毫秒
             LED1_PutVal(false);
             break;

        case KEY_2:    
              
             if (duty0>=10)
                  duty0 -= 10;
             else
                 duty0 = 0;     
             
             if (duty1>=10)
                  duty1 -= 10;
             else
                 duty1 = 0;     

             if (duty2>=10)
                  duty2 -= 10;
             else
                 duty2 = 0;     
                 
             PCA_PwmDuty(0,duty0);
             PCA_PwmDuty(1,duty1);
             PCA_PwmDuty(2,duty2);     
             
             LED2_PutVal(true);
             Delay_ms(100);        // 延时100毫秒
             LED2_PutVal(false);
             break;
        
        case KEY_3:    
             duty0 = 0;
             duty1 = 0;
             duty2 = 0;
             
             PCA_PwmDuty(0,duty0);
             PCA_PwmDuty(1,duty1);
             PCA_PwmDuty(2,duty2);
             
             LED3_PutVal(true);
             Delay_ms(100);        // 延时100毫秒
             LED3_PutVal(false);
        
             break;    
        default:

             break;
      }                  
    }
}

------解决方案--------------------
探讨

你是说51的型号么 我的CPU是C8051F330

------解决方案--------------------
理解别人的思想,而不是完全的拿来主义。

不能能和你要求一模一样,那是定制或外包!!!!
------解决方案--------------------
PWM叫脉宽调制器,占空比不同,能控制外部高低电平(导通、关闭)的时间。