blackcake 发表于 2016-9-21 09:53:54

建议l萝莉老师做一个目录汇总这样子好找课程一点

无泪 发表于 2016-9-21 10:15:20

顶一下学习学习

kongyuss 发表于 2016-9-21 23:26:12

顶起来

tjcdq 发表于 2016-9-21 23:51:42

萝莉教程,收藏了,谢谢!

苏苏来了3 发表于 2016-9-22 09:01:00

路过顶

机甲老顽童 发表于 2016-9-22 16:21:31

群主够给力,那么忙还抽时间教我们学单片机。

zhangyiyun2014 发表于 2016-9-22 16:55:02

顶顶顶                           

我爱萝丽爱萝丽 发表于 2016-9-23 02:17:32

1.1 联系实际,规划出一个有用的产品


跟做过就忘的单片机实验不同,我的目的是让你的学习历程中能够实际的做出一些东西,留下自豪的回忆,以后用单片机处理类似的问题也能快速应用。


你焊好了《七色光芒》,它能做什么?





最低要求:
大功率的灯珠有强烈的光芒,所以你至少可以做一个小手电筒;
色彩的控制,让你的手电筒与众不同,随时可以从白色光芒变成彩色,回头率瞬间+1;


中等要求:
不能调节亮度的手电不是好用的手电!


扩展要求:
为了能够引起远方人的注意力,你还需要爆闪模式!
模仿一下警车的闪烁模式,是不是更拉风?
还记不记得晚会上的彩色舞台灯,让你到哪都能嗨起来;
和女友浪漫时,打开彩色的呼吸灯功能,更加温馨……
……


RGB灯光控制器现在还没有普及,这对很多人来说仍然是个新奇的玩意儿,只要发挥你的想象,它还能做更多的事。

我爱萝丽爱萝丽 发表于 2016-9-23 04:40:06

本帖最后由 我爱萝丽爱萝丽 于 2016-9-23 16:58 编辑

1.2 程序模块化思维


看到上面罗列的各种功能,是不是没有想到,原本以为只是是学了一个彩色流水灯,实际上却有那么多用途!
那你想不想把那些功能亲自都实现呢?
其实所有功能的程序,在前六课都已经教给你了,你缺的只是灵活的组合,熟练的运用。


我们在第五课学了控制多种色彩模式,第六课学了PWM控制亮度,把它们组合起来,就能实现一个中等要求的产品。


在我们的电路中,有两个按键,正好分配一下,一个切换模式,一个控制亮度。
那么组合三个功能的程序如何写呢?很多人简单的程序还能写,但复杂一点就懵逼,不是不会,是因为没有学到一套正确的程序思维:


知识点(36) 程序模块化
为了让程序思路更清晰、以后复制写好的程序更方便,你的程序需要模块化。
什么是模块化? 就是实现某个功能的程序尽可能的和其它程序独立,不要杂糅在一起。很多人一想到用按键控制色彩、亮度,自然而然的想到在按键程序里改变引脚、改变PWM等,这样做虽然也能实现,但3个程序被你杂糅成一个复杂的程序,不仅难以理解,改动也困难。


知识点(37) 消息传递机制
如果程序之间独立、模块化了,那怎么发生联系呢?你需要用“消息”喊话,把命令从一个程序传到另一个程序。
“消息”就是你定义的一个变量。比如你定义一个Key1_action,如果检测到按键,就把Key1_action=1,之后所有的程序都可以读一下Key1_action,读到1就知道按键情况了,而不必每个程序都来检测一下按键。




先来模块化两个程序练练手吧,再自己试试把PWM程序也加入

#include<reg51.h>

sbit LED_R=P3^4;//定义红灯
sbit LED_G=P3^3;//定义绿灯
sbit LED_B=P3^2;//定义蓝灯

sbit Key1=P3^0;//定义按键1
sbit Key2=P3^1;//定义按键2


unsigned char Key1_old;    //定义一个数据,记录Key1过去出现低电平
unsigned char Key1_action; //定义一个数据,传递Key1是否动作的消息
unsigned char Key2_old;    //定义一个数据,记录Key2过去出现低电平
unsigned char Key2_action; //定义一个数据,传递Key2是否动作的消息

unsigned char mode;      //定义一个数据,代表不同模式
unsigned char light;       //定义一个数据,代表亮度等级

unsigned char time;      //定义一个数据,记录时间

unsigned char count;       //定义一个数据,PWM循环次数
unsigned char duty_R;      //定义一个数据,传递红色亮度占空比
unsigned char duty_G;      //定义一个数据,传递绿色亮度占空比
unsigned char duty_B;      //定义一个数据,传递蓝色亮度占空比



void Delay1ms()                //@12.000MHz
{
      unsigned char i, j;

      i = 12;
      j = 169;
      do
      {
                while (--j);
      } while (--i);
}

void delay_n_ms(unsigned int n) //自己定义的延时n毫秒函数
{
      while(n)         
      {
                Delay1ms();
                n=n-1;//每循环一次n减小1
      }   
}


main()
{

      Key1_old=1;   //进入循环前,先初始化标志位。按键还没按下,old是高电平
      Key2_old=1;
      
      while(1)   
      {
                delay_n_ms(1);   //系统周期,每循环一次1ms
               
                time=time+1;//1ms计数
                if(time>9)    //time加到10ms,从0开始,每10ms检测一次按键
                {
                        time=0;   
                        
                        if(Key1==1)
                        {
                              if(Key1_old==0) //如果本次是高电平,上次是低电平,检测到按键
                              {
                                        Key1_action=1;                                                                        
                              }
                        }
                        
                        Key1_old=Key1;   //保存高低电平


                        if(Key2==1)
                        {
                              if(Key2_old==0) //如果本次是高电平,上次是低电平,检测到按键
                              {
                                        Key2_action=1;                                                                        
                              }
                        }
                        
                        Key2_old=Key2;   //保存高低电平
                }
                              
                //上面是完全模块化的按键检测程序,只传递出两个action消息
                ////////////////////////////////////////////
               
                if(Key1_action==1)//有按键消息,处理按键功能
                {
                        Key1_action=0;   //处理过按键后要清0
                        
                        mode++;
                        if(mode>6)      //按键1调节七种色彩
                        {
                              mode=0;
                        }
                }
               
                if(Key2_action==1)//有按键消息,处理按键功能
                {
                        Key2_action=0;   //处理过按键后要清0
                        
                        light++;
                        if(light>10)      //按键2控制10级亮度
                        {
                              light=0;
                        }
                }
               
                //上面是模块化的按键执行程序,只传递出mode模式、light亮度两个消息
                ////////////////////////////////////////////
               
                if(mode==0)       //模式0红色
                {
                        duty_R=light;   //红色占空比=亮度
                        duty_G=0;       //绿色、蓝色占空比为0,熄灭,只有红色亮
                        duty_B=0;
                }
                if(mode==1)   //模式1橙色
                {
                        duty_R=light;
                        duty_G=light;
                        duty_B=0;
                }
                if(mode==2)   //模式2绿色
                {
                        duty_R=0;
                        duty_G=light;
                        duty_B=0;
                }
                if(mode==3)   //模式3青色
                {
                        duty_R=0;
                        duty_G=light;
                        duty_B=light;
                }
                if(mode==4)   //模式4蓝色
                {
                        duty_R=0;
                        duty_G=0;
                        duty_B=light;
                }
                if(mode==5)   //模式5紫色
                {
                        duty_R=light;
                        duty_G=0;
                        duty_B=light;
                }
                if(mode==6)   //模式6白色
                {
                        duty_R=light;
                        duty_G=light;
                        duty_B=light;
                }
               

                //经过mode模式程序的处理,只剩下三个消息:每个LED的duty占空比
                //最后只需要按照duty改变PWM,就能实现亮度和色彩控制了
                //这样看起来,程序的思路是不是非常清晰?

                //你的发挥时间到了,自己在下面添加一个PWM程序,不然按键不能控制灯光
               
                //………………
                //………………
               
               
      }
      
}

panlongdian 发表于 2016-9-23 07:45:11

太感谢老师的递进学习方法了,我慢慢的竟然读懂了!!!

枫飞秋语 发表于 2016-9-23 11:39:43

本帖最后由 枫飞秋语 于 2016-9-23 11:45 编辑

大神,知识点好像是 36.37 了。。下面也不是这样加呀。
      {
                count=count+1;   
                if(count>9)      
                {
                        count=0;
                }

                if(light>count)   
                {
                        LED_R=1;
                        LED_G=1;
                        LED_B=1;   
                }
                else
                {
                        LED_R=0;
                        LED_G=0;
                        LED_B=0;      
                }
                delay_n_ms(1);   

      }
      
}



panlongdian 发表于 2016-9-23 15:00:25

枫飞秋语 发表于 2016-9-23 11:39
大神,知识点好像是 36.37 了。。下面也不是这样加呀。
      {
                count=count+1;   


                                if(light>count)
                                {
                                LED_R=duty_R;
                                LED_G=duty_G;
                                LED_B=duty_B;
                                }
                                else
                                {
                                LED_R=0;
                                LED_G=0;
                                LED_B=0;
                                }
应该是这样吧,不知道对不对,已通过刷机正常。

我爱萝丽爱萝丽 发表于 2016-9-23 17:00:54

枫飞秋语 发表于 2016-9-23 11:39
大神,知识点好像是 36.37 了。。下面也不是这样加呀。
      {
                count=count+1;   


不是这样加,我要等一段时间看看有没有人能够完成。需要加3个PWM控制每个LED

我爱萝丽爱萝丽 发表于 2016-9-23 17:01:57

panlongdian 发表于 2016-9-23 15:00
if(light>count)
                                {
                                LED_R=duty_R;


你这样能分别控制色彩和亮度吗?

280829954 发表于 2016-9-23 20:55:49

帮顶 萝丽的三代控成功DIY 回头传图给萝丽大大

panlongdian 发表于 2016-9-24 06:01:44

我爱萝丽爱萝丽 发表于 2016-9-23 17:01 static/image/common/back.gif
你这样能分别控制色彩和亮度吗?

能控制,key2控制亮度10级,key1控制色彩。我再实验一下三个pwm试试,谢谢老师。

kaisirxing 发表于 2016-9-25 23:16:56

希望萝丽老师能就航模设备这方面程序讲一讲

838055757 发表于 2016-9-26 01:07:11

还不更新   我写的跟32楼差不多怎么不对??干啥事都想咋写走火入魔了

我爱萝丽爱萝丽 发表于 2016-9-26 13:40:55

838055757 发表于 2016-9-26 01:07
还不更新   我写的跟32楼差不多怎么不对??干啥事都想咋写走火入魔了

也没几个人回复,还以为都没人看

hangmw 发表于 2016-9-26 13:57:05

有人看,顶你!!!
页: 1 [2] 3 4 5 6 7
查看完整版本: 第七课:扩展课!用掉你的单片机