当前位置: 代码迷 >> 单片机 >> 单片机8051按键控制LED灯的亮度,软件设计有关问题
  详细解决方案

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

热度:74   发布时间:2016-04-28 15:56:04.0
单片机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叫脉宽调制器,占空比不同,能控制外部高低电平(导通、关闭)的时间。