3 .软件设计
我们选用了AT89S52单片机作为中央处理器,它内部具有4KB的程序存储空间,3个定时、计数器。我们采用了C语言编程来控制单片机。程序的大致流程图如下图所示: 开始 初始化 启动5MS定定时中断 按键判断 时 计算时间 显示LED 否 送段码到缓冲区 是否定时驱动 中断结束 晚上 是 定时驱动 检测环境 白天 检测环境 关灯 判断行人走过 从左到右 有 报警 灯亮顺序1 从右到左 灯亮顺序2 环境检测 有 报警
程序流程图
6
4.系统测试
4.1时钟功能的测试:
通过按键的设置,可以任意设置时间,由于是采用四位一体数码管,所以只能显示分钟和秒的时间,虽然不能显小时的时间,但也总算是实现了部分时钟的功能。
4.2 设定、显示开关时间并控制整条支路按设好的时间开灯和关灯功能的测试:
首先我们先通过按键设置好多少时间以后就马上开灯或者关灯,数码管上显示的时间久开始倒计时,一旦达到所设置的时间就马上开灯或者关灯。在实验中,我们分别设置了一分钟以后就开灯和关灯,结果从灯的亮灭情况来看确实是达到了要求,因此我们这一步的设计是成功的。
4.3 根据环境明暗变化,自动开灯和关灯的测试:
我们测试这个功能很简单,在白天的情况下,LED灯是处于熄灭的状态,当我们用物体把光敏电阻罩住,阻止光照射到光敏电阻,两个LED灯就马上亮起来,因此我们的这一步的设计是成功的。 4.4 自动调节亮灯状态的测试:
我们用一个当物体经过第一个光电传感器时,灯1亮;当物体经过第二个光电传感器时,灯1灭,灯2亮;当物体经过第三个光电传感器时,灯2灭。若物体以相反的次序经过光电传感器,那么灯亮次序与上相反。由此我们也实现了这一功能。
4.5 灯出现故障,能显示出故障灯的灯号,并能报警:
由于灯出现故障,大多数情况是断路,由此我们只要在灯亮的情况下使灯不接入电路就可以人为制造故障了检测显示和报警的功能。在具体操作时,我们把1号灯不接入,那么数码管显示数字1,蜂鸣器发出报警声;当我们把2号灯不接入,那么数码管娴熟数字2,蜂鸣器发出报警声。
7
总结
测试表明,模拟路灯控制系统灯能够实现本次设计的基本要求。通过各种方案的讨论及尝试,再经过多次的整体软硬件结合调试,不断地对系统进行优化,才终于把此次设计完成。
在这次电子竞赛设计中,我们也从中学到了一些有关电子方面的知识,比如大功率LED的驱动,非接触式传感器的工作原理等,同时我们在电路检测这一环节中,也学到了一些检测基本电路故障的方法,比如在光电传感器这一部分电路中,很多次都不能实现传感器的作用,电路不工作正常,单片机无法采样电平,于是我们就在面包板上一个一个元器件的替换,后来才知道每个元器件不同的数值会直接影响传感器的正常工作,通过不断的调试,终于找出了能让传感器正常工作的元器件数值。虽然我们这次设计基本上达到了要求,但还有很多的不足,比如在制作PCB板中,没有很好布局与布线,在各个电路模块中,也没有很好考虑到整个控制系统的方便性,由于要用传感器采样,所以就必须要制作多个模块,于是决定采用导线把模块接到单片机并控制各个模块的工作情况,这样就增加了电路的复杂性,同时电路受到的不明干扰性也增大。
在部分模块电路的硬件测试中,刚开始做面包板试验时,电路连接是对了,但没有实现相应的功能,我们就一直在改电路,甚至想换掉整个模块,经过反复的思考,我们就怀疑芯片是坏的,于是我们就单独检测了芯片的功能,终于发现原来芯片是坏的,由此我们就得到一点经验,那就是在做面包板试验时,要仔细认真检测每个元器件的好坏,哪怕是刚买回来的元器件也可能是坏的。还有一个要注意的问题,那就是在调试各个模块的时候要记得仔细检查各个焊点是否短路和虚焊,如果不确定的地方,最好是用万用表检测一下。另外,在软件调试时,我们采用先编好一个模块的程序,并实现功能,接着继续编其他模块的程序,一个一个模块功能实现的方式,最后才把各个程序串联起来,经过不断的调试与修改,最后终于能使整个程序正常运行起来,并可以实现各个模块的功能,总体上达到了设计的基本要求。由于时间的原因,我们没有把发挥部分做出来,这也是很大的遗憾,因为我们在前阶段元器件的选择和调试中浪费了很多的时间,以至于到最后都没有时间去做发挥的部分,不管怎样,我们还是感到比较欣慰,毕竟是已经很努力去做了。
8
参考文献
1.《模拟电子线路基础》,吴运昌著,广州:华南理工大学出版社,2004年; 2.《数字电子技术基础》,阎石著,北京:高等教育出版社,1997年; 3.《单片机原理及应用》,李建忠著,西安:西安电子科技大学,2002年;
附1:电路原理图 附2: 源程序
附录:
9
#include
//****************************************************************
typedef unsigned char uint8; /* 无符号8
位整型变量 */
typedef signed char int8; /* 有符号8
位整型变量 */
typedef unsigned short uint16; /* 无符号16
位整型变量 */
typedef signed short int16; /* 有符号16
位整型变量 */
sbit P1_0 = P1^0; sbit P1_1 = P1^1; sbit P1_2 = P1^2; sbit P1_3 = P1^3; sbit P1_4 = P1^4; sbit P1_5 = P1^5; sbit P1_6 = P1^6; sbit P1_7 = P1^7; sbit P2_0 = P2^0; sbit P2_1 = P2^1; sbit P2_2 = P2^2; sbit P2_3 = P2^3; sbit P2_4 = P2^4; sbit P2_5 = P2^5; sbit P2_6 = P2^6; sbit P2_7 = P2^7; sbit P3_0 = P3^0; sbit P3_1 = P3^1; sbit hj_jc = P3^2; sbit P3_3 = P3^3; sbit flag_8 = P3^4; sbit flag_9 = P3^5;
//----------------------------------------------------------------------------------------------------//
//“1234”- 固定显示的数,可根据具体情况更改(可改为 0 -
10)
const uint8 leds_gd[4] = {1,2,10,10};
//led显示时用的显示数据缓冲区(led段码管上的显示内容就是
数组里的内容)
uint8 leds[4] = {0,0,0,0};
10