学 号 231

姓 名 福福

指导教师:赵志鹏

7 2

实训题目:交通灯系统

1 系统设计

    1. 设计要求
      1. 设计任务

设计基于Arduino的双向交通灯系统,实现控制和方向显示功能

      1. 性能指标要求

1、基本要求

(1) 按照题目要求独立完成DF通灯状态(红、黄、绿)

(3)每隔10秒钟切换一个方向,绿灯亮之前黄灯开始闪烁三次结束

(4)通过点阵显示当前正在通行的方向

(5)通过按键控制,调整通行时间

(6)通过按键设置紧急状态(红灯全亮)

2、发挥部分

1、设置人行道通行指示灯,并通过按键控制

2、紧急状态期间可通过蜂鸣器报警

3、设置倒计时时间

1.2 设计思路及设计框图

1.2.1设计思路

先设定点阵显示交通灯的通行方向,在面包板上做成DF通灯状态,接好剩下的按键和蜂鸣器。再设定灯的亮灭顺序(南北两个方向上的三盏灯根据要求显示亮灭),然后调用功能子函数实现按键控制通行时间和蜂鸣器紧急状态。

1.2.2总体设计框图

2 各个模块程序的设计

1.对主函数编译调试,本次实训中主程序类似于流水灯的闪烁过程,然后进行面包板的连接和调试。通过USB将主程序烧进主控板,然后测试功能进行调试。

2.编写各个模块的程序,使用Arduino本身自带的模块功能以及库函数,程序编辑起来会有很提高。警报和控制时间那里由按键控制,如果按按键红灯会亮,并且蜂鸣器会响起,松开按钮返回循环;按第二个按键则调整通行时间。

图2-1程序流程图

4.关于程序的设计,主要关键部分:

1.点阵的数组定义:

#include//关于点阵的头文件LedControl lc=LedControl(13,11,12,1);

强调声明点阵函数库,点阵就可以发挥作用。

2.点阵清屏:

lc.shutdown(0,false);lc.setIntensity(0,3);lc.clearDisplay(0);

3.函数的声明:

intk1=0;intk2=0;intkeypin1=10;intkeypin2=3;intredpin=4;intyellowpin=5;intgreenpin=6;intredpin2=7;intyellowpin2=8;intgreenpin2=9;voidsetup(){lc.shutdown(0,false);lc.setIntensity(0,3);pinMode(keypin1,INPUT);pinMode(keypin2,INPUT);pinMode(redpin,OUTPUT);pinMode(yellowpin,OUTPUT);pinMode(greenpin,OUTPUT);pinMode(redpin2,OUTPUT);pinMode(yellowpin2,OUTPUT);pinMode(greenpin2,OUTPUT);}

3 调试过程

代码很长又麻烦,还有一些逻辑性的问题,解决一个问题所编写的程序代码较长,要检查和排除所有语法错误,调试过程要认真而专注。

测试是通过运行程序发现错误的过程,常见的错误有缺少程序大括号、结尾缺少分号、错误使用了中文符号、关键字错误、注释错误、库文件未加载、端口选择错误、串口被占用、驱动没有正确安装等等。调试则是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试——调试——再测试——再调试。

用尽可能少的测试数据发现更多的错误,选择合适的测试数据,使系统在运行时能执行到每条语句,以测试各指令是否正确。测试输入合法数据与非法数据时,程序的运行情况。对于合法数据,还要考虑数据的一般性与特殊性。

测试可按模块测试、组装测试和确认测试的步骤进行。

1.模块测试就是分别对各模块进行测试的过程。在编写一个模块后应立即对其进行测试,因为这时对模块记忆深刻,而且单个模块相对较小,所以容易构造测试数据,能方便地检查和改正错误。

2.组装测试就是把所有模块(应该是通过模块测试的模块)按预先制定的计划逐步组装和测试的过程。一般情况下,各模块之间要相互传递数据和控制信息,因此组装测试的主要任务是发现模块接口中的错误。

3.确认测试是最后一个步骤,一般在将软件交付用户之前,应确认软件是否确实满足用户的要求,通常使用接近实际的用例进行测试。

测试程序时,用Arduino程序的模块化可以随时查看变量或表达式的值,有时还可以将部分程序代码用模块直接修改,提高自己代码的正确性,以便压缩出错代码的范围。

4 功能测试

4.1 测试仪器与设备

用面包线把Arduino与面包板上的Led灯和点阵连接起来,通电之后查看各小灯和点阵亮灭情况,在电路连接正确的前提下灯亮,不亮则重新调试。将主程序烧录进开发版,测试主程序的运行情况,图片中灯亮表明运行情况良好,灯亮的同时点阵开始运行。

4.2 性能指标测试

该实验实现了交通灯的通灯状态(红、黄、绿),和每隔10秒钟切换一个方向,绿灯亮之前黄灯开始闪烁三次结束以及通过点阵显示当前正在通行的方向。通过子程序实现两个按键的控制功能,被调用函数开始循环,按键起控制作用。可蜂鸣器响而不受控制,按键紧急状态时全部灯都灭了,可能因为模块中语句循序有错误,也可能句法不全。具备了部分交通灯功能。

4.3 误差分析

5 实训心得体会

Arduino实验是开学之后才进行的,即使学了C语言也只是皮毛,注定了这次的实训不会很轻松。这次实训设计基于Arduino的双向交通灯系统,实现控制和方向显示功能,为了让我们巩固这学期所学的C语言程序设计的课本内容和Arduino实验开设的课程,拿到交通灯题目后看着就觉得好难,回来开始编写代码接电路时才发现才发现自己不会的的问题比想象的多。

本次实训主要运用Arduino开发版、8*8点阵、面包板, 把C语言的理论知识以及实际操作过程结合起来而成。这是我第一次做,自身经验不足、不够细心在操作时出现了许多问题,主要是不会。我发现自己对一些前面学过的知识还不够理解,没能好好的掌握。

本次实训,其实接电路并不怎么难,最难的是编写代码,真的好无从下手只能通过上网查资料书籍,然后又问同学,通过对比他们的设计过程,觉得书籍上的模块化设计思想省时而不易出错。我还尝试用Arduino图形化编程练过,觉得那个也不错,都不用自己写程序。后来我发现我自己的不足地方,逐渐地改变自己的设计思路,在面包板上将开发板、点阵、led、按键、蜂鸣器通过面包线连接起来,首先设定点阵的方向再编译南北方向的led灯再到两个按键控制的程序,顺着思路编写好代码。当程序烧录进去灯亮起的那一刻,我心理感到无比激动与自豪,心里非常的高兴。

通过本次实训,我更加深了对Arduino程序和c程序的理解,学会了在面包板的使用方法。即使这次实训不能完整的做出来,但我感觉到收获好大,这过程我遇到了好多不同的问题,暴露了我不足的知识点,经过自己的思考和动手操作,终化成为属于我自己的东西。曾认为很难的实训,现在也做好了,在今后的学习生活中一定要不懈努力不能遇到困难就退缩,要找出问题所在然后一一解决。在日后,自己所学的理论知识要和实践结合起来,提高自己的实际动手能力和独立思考能力。

6 参考文献

  1. 《C程序设计》/谭浩强著-清华大学出版社,2019.12
  2. Arduino程序设计基础(第二版)/陈吕洲主编-北京航空航天大学出版社,2015.3

附录

附录1:仿真波形图(部分模块)

附录2:程序清单

#include"LedControl.h"LedControllc=LedControl(13,11,12,1);byted[8]={B00001000,B00000100,B00000010,B11111111,B11111111,B00000010,B00000100,B00001000,};byteh[8]={B00010000,B00100000,B01000000,B11111111,B11111111,B01000000,B00100000,B00010000,};intk1=0;intk2=0;intkeypin1=10;intkeypin2=3;intredpin=4;intyellowpin=5;intgreenpin=6;intredpin2=7;intyellowpin2=8;intgreenpin2=9;voidsetup(){lc.shutdown(0,false);lc.setIntensity(0,3);lc.clearDisplay(0);pinMode(keypin1,INPUT);pinMode(keypin2,INPUT);pinMode(redpin,OUTPUT);pinMode(yellowpin,OUTPUT);pinMode(greenpin,OUTPUT);pinMode(redpin2,OUTPUT);pinMode(yellowpin2,OUTPUT);pinMode(greenpin2,OUTPUT);}voidloop(){k2=digitalRead(keypin2);if(k2==LOW){k1=digitalRead(keypin1);if(k1==LOW){lc.clearDisplay(0);for(introw=0;row<8;row++)lc.setRow(0,row,h[row]);digitalWrite(redpin,HIGH);digitalWrite(greenpin2,HIGH);delay(7000);digitalWrite(redpin,LOW);digitalWrite(yellowpin,HIGH);delay(500);digitalWrite(yellowpin,LOW);delay(500);digitalWrite(yellowpin,HIGH);delay(500);digitalWrite(yellowpin,LOW);delay(500);digitalWrite(yellowpin,HIGH);delay(500);digitalWrite(yellowpin,LOW);delay(500);lc.clearDisplay(0);for(introw=0;row<8;row++)lc.setRow(0,row,d[row]);digitalWrite(greenpin2,LOW);digitalWrite(greenpin,HIGH);digitalWrite(redpin,LOW);digitalWrite(redpin2,HIGH);digitalWrite(yellowpin,LOW);delay(7000);digitalWrite(redpin2,LOW);digitalWrite(yellowpin2,HIGH);delay(500);digitalWrite(yellowpin2,LOW);delay(500);digitalWrite(yellowpin2,HIGH);delay(500);digitalWrite(yellowpin2,LOW);delay(500);digitalWrite(yellowpin2,HIGH);delay(500);digitalWrite(yellowpin2,LOW);delay(500);digitalWrite(yellowpin2,LOW);digitalWrite(greenpin,LOW);}elseif(k1==HIGH){lc.clearDisplay(0);for(introw=0;row<8;row++)lc.setRow(0,row,h[row]);digitalWrite(redpin,HIGH);digitalWrite(greenpin2,HIGH);delay(15000);digitalWrite(redpin,LOW);digitalWrite(yellowpin,HIGH);delay(500);digitalWrite(yellowpin,LOW);delay(500);digitalWrite(yellowpin,HIGH);delay(500);digitalWrite(yellowpin,LOW);delay(500);digitalWrite(yellowpin,HIGH);delay(500);digitalWrite(yellowpin,LOW);delay(500);lc.clearDisplay(0);for(introw=0;row<8;row++)lc.setRow(0,row,d[row]);digitalWrite(greenpin2,LOW);digitalWrite(greenpin,HIGH);digitalWrite(redpin,LOW);digitalWrite(redpin2,HIGH);digitalWrite(yellowpin,LOW);delay(15000);digitalWrite(redpin2,LOW);digitalWrite(yellowpin2,HIGH);delay(500);digitalWrite(yellowpin2,LOW);delay(500);digitalWrite(yellowpin2,HIGH);delay(500);digitalWrite(yellowpin2,LOW);delay(500);digitalWrite(yellowpin2,HIGH);delay(500);digitalWrite(yellowpin2,LOW);delay(500);digitalWrite(yellowpin2,LOW);digitalWrite(greenpin,LOW);}}elseif(k2==HIGH)digitalWrite(redpin,HIGH);digitalWrite(redpin2,HIGH);delay(5000);digitalWrite(redpin,LOW);digitalWrite(redpin2,LOW);}