灯泡亮度控制单片机_自学单片机第三十二篇:光线可调台灯上篇

有了之前的吊灯案例做打底,我们再来看一个小台灯的案例,生活中的一个小电器,这个小台灯价格也不贵,是一款光线可调节的,有三种亮度可以调节,只有一个按键,电池是可充电电池。当这个小台灯购买回来时,家人感觉很神奇,只需要触摸就可以点亮,而且可以调节亮度,同时通过USB充电即可,很实用。作为我们电气人来说,通过外观和动作就可以大致解析出内部原理和组成,我不做这个,所以就不分析了,我们只是来看下,如果通过51单片机如何进行实现这个台灯的功能。每个程序都是建立在硬件的基础上的,尽管我们不分析其结构,但是我们有必要对光线可调来进行简单的分析,这样有利于下一步的程序书写。我们可以观察到有四种状态,暗,一般,亮,关。于是我们可以得出以下四种控制方式,也许有更多,我们只是以这四种为例。1,通过调节电阻值得大小来调节亮度。

8a4da4ca9b8991df1424b5e13c6dc7cf.png

2,通过调节灯的数量来调节亮度。

932d35df1e884d36818c1e99eb6bf40b.png

3,通过调节电流的大小来调节亮度。

b3714cd54222a8dd57826e3622bfcc43.png

4,通过占空比信号来调节亮度。

34c9ebed7baa888f9c4f79148e55e65e.png

四种方法,第一和第二种最直观,最好理解,第一是通过减小串入电路的电阻,进而减小电流的大小,然后就可以控制灯光的亮度了。第二种是通过增加灯泡的数量,也可以增加灯光的亮度。简单,直接,好理解。第三种其实是第一种的一种变形,此处是通过短路的方法来实现电阻的大小改变,进而同样的改变电流的大小,也就实现了灯光亮度的调节。第四种就是通过占空比来调节灯泡的亮度,这种方法,我们之后在着重介绍,首先介绍下前三种。为了便于理解,我们使用第一个电路来实现这个案例。首先分析下输入,只有一个可复位按钮开关,输出为一个总电源,三个控制线。当点击第一下时,暗模式打开,点击第二下时,一般模式打开,点击第三下,亮模式打开,点击第四下,关闭。我们首先梳理下程序。

1cb621ddd2ae642f938c1b8ba7e0fd98.png

508a429601a5d6477f8e9eaff278c43d.png

7c039a14e54bd030578ebb793b81f339.png

如果你看过了之前的那一篇关于《多彩的吊灯》的文章,你会发现,其实这里的程序跟吊灯中的几乎一样,唯一不同的就是修改了switch函数中的输出变量,因为这里的内容对应的是开关的相应的动作。然后是把按键的功能由10个调整到了4个,所以对key进行了修改。之前一直没有对程序进行讲解,是因为,我们的教程也从第一期更新了50多期了,如果从第一期一直看过来的话,想必不会出现无法读懂的情况,所以我们就只是把代码贴出来,没有讲解,不直接复制代码而采用图片是因为,这样可以让大家有更多的机会去自己把代码写出来,一味地复制别人的代码,一方面不利于理解,另一方面对自己打字的速度也没有提升。如果有需要源码的可以留言,我会私信提供。这里我就这个代码进行简单的说明,之后会依然是直接贴代码,然后仿真。案例还会再说几个,尽量把案例说的覆盖面广一些,之后就开始中断和定时器了 。

ea287b030a2cb0220acb0a7bd2e8c0a5.png

第五行是一个声明,说明了我们所使用的这些简写,如P1,P2等等,在reg52.h中有定义,这里使用时都可以直接调用,非常方便。然后是输入信号的定义,这里使用key_Led来代替P1^0,不是说P1^0不能用,只是为了方便在程序中当我看到key_Led时,可以快速的知道这个端口指的是什么含义,如果记忆力超群,也是可以直接使用P1^0的。接下来是输出端口的定义,同样是为了方便自己识别。名称的定义,可以自己按照自己的想法来,也可以多看看别人的代码,然后对一些常用的功能使用通用名称,其他的可以自己定义。例如delay就是一个延时函数,多数同学在书写时,都会使用delay来代表延时函数,当然也有同学使用yanshi来直接用的,没有问题,怎么写完全看自己。不过代码如果还需要交到队友手里的话,最好还是约定好名称的定义规则,以免造成代码写好了,却读起来很困难。最后一行就是一个延时函数的声明,记着,函数有返回值得需要在声明中加上,不能省略。

b98483f6476f321a037bd48de3397b0e.png

这个是主函数,由于代码量比较小,所以功能就都在主函数中进行书写了。P1=0xff是对P1端口的所有位置一,因为如果我们需要读取端口上的数据,那么就需要先将端口置一,这样在程序中才会读取到端口外电位的变化。这一步是不能省略的,尽管单片机上电就是高电位,我们也需要自己主动操作一次。主要的逻辑功能就放在了循环函数中了,这样可以保证,程序始终在程序中运行,不会跑飞。第一个程序结构是消抖if(key_Led==0)                     {                                        keybuff=key_Led;                            delay(6);                            if(keybuff==key_Led)                            {**执行文件**}}判断按键是否按下,如果按下就把按键的值赋值给中间缓存变量,然后延时,我这里的delay是2ms多一点,6次就是12ms,基本可以把抖动延时过去了。接着判断中间缓存变量中保存的值与当前的按键状态是否一致,如果一致,就执行接下来的动作,不一致,就跳出。第二个结构是按键动作 switch(key)               {              case 0: P2=0xf1;break;//1111 0001              case 1: P2=0xf8;break;//1111 1000              case 2: P2=0xf4;break;//1111 0100              case 3: P2=0xf2;break;//1111 0010               }while(key_Led==0);这个也是一个判断函数,不同与if,这个函数可以对函数中的语句进行依次判断,一次执行多个动作,if只能执行一次,当然为了加快速度,我们在语句中添加了break,这个语句可以让函数执行到这里,直接跳出,不再执行接下来的语句,减少时间。Switch中的key就是需要对比判断的量,对比的数据是case后的0123这些数,这个可以自己规定,按程序要求来,不一定非要是0123,也可以是0xff这些,但有一点,需要是确定的数据,写个变量a是不行的。P2=0xf1就是需要执行的动作,这个要依据实际功能来说了,我们这里的动作是关闭电源,所以,需要对P20输出高电位,对P21、P22、P23输出低电位。于是低四位就是0001.最后一句的循环语句,是为了让动作停止在开关按下的状态,因为如果手指没有抬起,按键就会一直保持等于零的状态,程序如果有其他操作,那么不添加这一句,程序就会反复执行,造成程序异常,这一句也相当于在监测按键是否弹起,不弹起就不向下执行动作。第三个结构是按键计数key++;if(key==4)    {       key=0;       }这个是在按键弹起后,我们就对key加一,这个加一是在说明按键有了一次有效的按下动作,然后会判断此时按键的按下次数有没有超出规定的范围,因为我们就只有四个动作,所以当key等于4的时候,我们之前的switch中没有对应的语句,所以此时需要对key进行置零。这样在程序中走一圈之后,就会执行case 0 这一句,关掉所有端口。

e232113912b6fc6ed664a96f8572231e.png

延时函数,大同小异,每一个初学者都会经历这个函数,他的主要作用就是在某些阶段浪费程序的时间,达到延时目的。While会循环判断外部引入的t是否为真,也就是大于零。如果大于零就会反复执行循环体中的语句。而这个语句本身也是一个循环函数,for循环是先对变量i清零,然后判断i是不是小于设定的数,这里是200,如果小于200,就会执行加一操作,然后再次判断是否小于200,知道i加到等于200,就会跳出循环。这样while中的一个t减一就相当于程序跑了200次,于是就可以通过调节t的值来调整延时的时间。这个时间不是很精确,依据晶振频率和程序的执行情况而定,与硬件也有关系,只能通过实际测试或者仿真得出一个大致的范围,用在一些对时间要求比较松的场合还是可以的。有兴趣也可以通过机器周期自己计算出来。好了一个简单的台灯程序又写了这么长。仿真的话下篇说吧。有问题或者疑问可以直接留言,我会回复或私信给你。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值