今天的学习内容是:
楼道间照明灯实验3:在“楼道间照明灯实验1,2”的基础上进一步改进,让程序再次优化,使用材料不变,只是改变一下我们的编程思路,换一种方法编程达到同样的效果。我们的目标还是:一个楼道的照明灯,在楼上和楼下各有一个开关(甚至N个开关)都能几乎同时而且分别控制同一盏照明灯。
我们的方法一是:
1,首先设置一个变量,并且赋值为1(或0)。
2,就是判断楼上楼下两个开关的各自状态与自身的前一状态是否发生改变,从而改变变量的值。也就是单个开关自身对比,为了好便于后面的课题区分。所以我暂且称之为“单异或”。
3,再根据变量的值来让程序执行什么样的操作。
我们的方法二是:
1,相比实验1更加简单一些,就是让楼上楼下两个开关相互作为对方的参考值,可以不设置变量。为了好便于后面的课题区分。所以我暂且称之为“双异或”。
2,因为两个开关的异或结果只有0/1,而楼道灯也只有点亮和熄灭。正好一一对应。所以可以直接操作。
今天的方法三是:
综合我们的实验1和实验2就会知道,我们其实可以用三个甚至N个开关分别来控制我们的楼道照明灯了。
实验步骤:
1,首先打开上次收藏的“c51代码生成器”在线编译器网页。只要按照图一里面的步骤搭建就都可以完成。
2,搭建好的积木点击保存并复制代码。如图一所示
3,打开keil编译器软件,在文本框里粘贴,生成hex文件。
4,打开烧录软件,找到刚刚的hex文件,下载到单片机。效果如图二所示
实验解释及编程思路:
1,首先,设置开关变量S3o,S4o,S5o......Sno为开关S3,S4,S5,.....Sn的另外一种状态。并且赋值S3o,S4o,S5o......Sno=S3S4S5......Sn的起始状态值(0或1)。就是说开始让他们相等,便于后面的判断是否不等。
还要设置一个计数变量num,并且赋初值num=0.也是便于后面的判断。
2,假设:S3,S4,S5开始都没有按下时为0(或1),LED灯是熄灭(也可以是点亮的)的状态。
3,判断:当按下S3时,S3与S3o状态发生改变,即S3与S3o异或后=1.而S4,S5都没有按下就还是=0;所以,按键S3和S4后再与S5再次异或后又是(真)=1。同理:按下S4,S5........Sn任意哪个开关后,都是再同其他几个按键逐一进行异或运算。(延时5ms,防抖。再次判断:确实有按键按下,则num++)得到“真”后延时5毫秒防抖,再让num加一
4,判断:num的状态,num=1时执行LED点亮相应的指令。否则熄灭。
实验目的:
实际应用中,把S3S4换成楼上或楼下的开关,把LED换成楼梯灯泡。
当有人要上楼,若之前灯是灭的,在按下楼下开关后(此后开关为闭合状态),灯会点亮;当到楼上后,再按楼上开关,灯会熄灭。而当后来又有人上楼时,再次按楼下开关(此后开关为打开状态),灯同样会点亮;
图一多路开关同时而且分别控制同一盏灯的拼接过程及原理
00:20图二多路开关同时而且分别控制同一盏灯实验效果图