模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

[单片机课堂] 第七课:扩展课!用掉你的单片机

  [复制链接]
发表于 2016-9-26 14:53:01 | 显示全部楼层
我爱萝丽爱萝丽 发表于 2016-9-26 13:40
也没几个人回复,还以为都没人看

大神,估计大家都没懂,不敢乱回复,快公布吧
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-26 15:14:11 | 显示全部楼层
群主,学生最怕的就是作业!一看是作业,一个头两个大。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-26 18:28:03 | 显示全部楼层
都在默默的看呢。每天都要来看几遍更新没有。老火。
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-27 00:12:09 来自手机 | 显示全部楼层
count=count+1;                    if(count>9)                       {                         count=0;                     }                  if(duty_R>count)                    {                         LED_R=1;                 }                 else                 {                         LED_R=0;                 }                if(duty_G>count)                    {                         LED_G=1;                 }                 else                 {                         LED_G=0;                 }                  if(duty_B>count)                    {                         LED_B=1;                 }                 else                 {                         LED_B=0;                 }

点评

对,就是这样。起码的互动还是要有的,不然整天自言自语什么意思。  详情 回复 发表于 2016-9-27 00:53
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-27 00:15:11 来自手机 | 显示全部楼层
睡了一觉醒来想出来的   就是这学习劲  不知道对不对
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2016-9-27 00:53:55 | 显示全部楼层
838055757 发表于 2016-9-27 00:12
count=count+1;                    if(count>9)                       {                         count ...

对,就是这样。起码的互动还是要有的,不然整天自言自语什么意思。
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-27 01:27:42 | 显示全部楼层
1.3 添加PWM程序


上一小节中,留了一个小坑让大家自己填。要求实现的功能是:用每个LED的占空比独立的控制三种颜色的亮度。


一共有三位童鞋提交了自己的答案:


第一位:只能亮白色或熄灭,达不到要求;
第二位:能够实现控制亮度、颜色的目的,但逻辑不清晰,引脚只能是0或1,将0~10的duty值赋给引脚没有意义;
第三位:能够实现要求。
为什么要使用三个PWM?独立控制每个LED亮度才能实现更多的色彩,方便接下来更复杂的程序编写。

  1. count=count+1;   //每过1ms计数+1
  2.                 if(count>9)      
  3.                 {
  4.                         count=0;       //计数大于9后又变成0!,0~9十毫秒PWM周期
  5.                 }

  6.                 if(duty_R>count)   //在count 0~9变化中,duty大于count的次数就是占空比
  7.                 {
  8.                         LED_R=1;       //改变duty改变高电平时间,亮度变化
  9.                 }
  10.                 else
  11.                 {
  12.                         LED_R=0;
  13.                 }
  14.                
  15.                 if(duty_G>count)   //绿色LED PWM
  16.                 {
  17.                         LED_G=1;      
  18.                 }
  19.                 else
  20.                 {
  21.                         LED_G=0;
  22.                 }
  23.                
  24.                 if(duty_B>count)   //蓝色LED PWM
  25.                 {
  26.                         LED_B=1;      
  27.                 }
  28.                 else
  29.                 {
  30.                         LED_B=0;
  31.                 }
复制代码


点评

复制PWM程序的时候粘贴到了主程序外面,导致编译时报错,折腾了好久,最后回过头看前面的注解才恍然大悟。  发表于 2017-2-10 22:37
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-27 02:33:37 | 显示全部楼层
1.4 更多模式怎么加


首先你应该注意到,无论什么模式,都是有它的周期性的。
举例说最简单的爆闪模式:亮半秒灭半秒,两个状态不断循环;
双闪模式:亮半秒、灭半秒、亮半秒、灭三秒,四种状态循环;
七色舞台灯的模式:每种颜色亮1秒,7个状态不断循环;
……


举例程序如何实现爆闪模式,学到以后你可以试试自己实现其他功能。


循环程序必定有有一个数据计算时间,所以你要先定义一个数据:
unsigned int delay_time;   //定义一个数据,记录时间
注意数据大于255时,必须使用unsigned int


增加了模式7,所以按键改变模式的最大值也要相应更改。
添加模式7的代码:
更多更复杂的模式程序,就要看每个人的能力自己深入练习了。第一个项目的学习算是结束。
  1. if(mode==7)   //模式7 爆闪
  2.                 {
  3.                         delay_time=delay_time+1;
  4.                         if(delay_time>1000)  //爆闪周期1000ms
  5.                         {
  6.                                 delay_time=0;
  7.                         }
  8.                        
  9.                         if(delay_time<400)   //前0.4秒全亮
  10.                         {
  11.                                 duty_R=10;
  12.                           duty_G=10;
  13.                           duty_B=10;
  14.                         }
  15.                         else                 //后0.6秒熄灭
  16.                         {
  17.                                 duty_R=0;
  18.                           duty_G=0;
  19.                           duty_B=0;
  20.                         }
  21.                 }
复制代码


点评

unsigned int delay_time; //定义一个数据,记录时间 在头文件后加入这一行就可以了,看来遇到问题时再仔细看教程比自己瞎琢磨有效。  发表于 2017-2-10 22:56
把这段程序加到模式6后面,并把"if(mode>6)"改成">7"后还是报错。百思不得其解。  发表于 2017-2-10 22:51
回复 支持 1 反对 1

使用道具 举报

发表于 2016-9-27 08:20:44 | 显示全部楼层
谢谢老师的更新,一个PWM和三个PWM效果没有什么区别呀!只是需要更多的功能时,才能显示出led变量的用处。谢谢老师详细而渐进的引导!
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-27 22:42:17 | 显示全部楼层
楼主,pwm掌握的差不多了,希望楼主尽快推出ppm教程和ad检测功能,这样就可以自己做一些东西插在接收机上了,楼主辛苦

点评

恩,会慢慢有的。这样会的人多了以后简单DIY你们可以自己搞定了  详情 回复 发表于 2016-9-29 03:27
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-28 00:04:02 | 显示全部楼层
你们都那么牛逼,咋都不上天呢,我还没学会呢,群主关键词都没教完
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-28 14:22:20 来自手机 | 显示全部楼层
unsigned char jaotishan;  if(mode==8) { jaotishan=jaotishan+1;    if(jaotishan>3)        {           jaotishan=0;         }                  if(jaotishan==1)                        {                           duty_R=10;                           duty_G=0;                           duty_B=0;                         }                if(jaotishan==2)                        {                           duty_R=0;                           duty_G=10;                           duty_B=0;                         }                   if(jaotishan==3)                        {                           duty_R=0;                           duty_G=0;                           duty_B=10;                         }  }
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-28 19:30:37 | 显示全部楼层

unsigned char jaotishan;
        if(mode==8)
      {
       jaotishan=jaotishan+1;   
        if(jaotishan>3)      
             {   
              jaotishan=0;
             }               
       if(jaotishan==1)

                  {
                        duty_R=10;
                        duty_G=0;   
                        duty_B=0;                 
                  }      
        if(jaotishan==2)  
                  {
                        duty_R=0;
                        duty_G=10;
                        duty_B=0;
                   }                 
       if(jaotishan==3)
                    {   
                       duty_R=0;  
                       duty_G=0;  
                       duty_B=10;
                        }
  }


萝丽大师 你看下 哪里不对   我想让他交替闪

点评

交替闪变化太快了,1ms变化一次看不出来。至少要200ms吧.先用delay_time等待200ms后,jiaotishan再+1  详情 回复 发表于 2016-9-29 03:31
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-28 20:31:05 | 显示全部楼层
838055757 发表于 2016-9-28 19:30 第七课:扩展课!用掉你的单片机  作者:panlongdian 9075
unsigned char jaotishan;
        if(mode==8)
      {

牛,有思想。
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-28 21:34:02 | 显示全部楼层
本帖最后由 yrj 于 2016-9-28 21:47 编辑

爆闪的编译出错,呵呵,原来自己没定义unsigned int delay_time;
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-9-29 03:27:03 | 显示全部楼层
我是天才 发表于 2016-9-27 22:42
楼主,pwm掌握的差不多了,希望楼主尽快推出ppm教程和ad检测功能,这样就可以自己做一些东西插在接收机上了 ...

恩,会慢慢有的。这样会的人多了以后简单DIY你们可以自己搞定了
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2016-9-29 03:31:16 | 显示全部楼层
838055757 发表于 2016-9-28 19:30
unsigned char jaotishan;
        if(mode==8)
      {

交替闪变化太快了,1ms变化一次看不出来。至少要200ms吧.先用delay_time等待200ms后,jiaotishan再+1
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-29 08:53:32 | 显示全部楼层
原来大神在这里呀。。找的好辛苦。
回复 支持 0 反对 1

使用道具 举报

发表于 2016-9-29 09:10:27 | 显示全部楼层
催更第七课:扩展课!用掉你的单片机  作者:LIHUA 3412
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-29 09:13:09 | 显示全部楼层
time变量有什么用呢?        没看懂,

点评

time后面有注释,10ms检测一次按键  详情 回复 发表于 2016-9-29 18:18
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!