LED跑马灯设计
1 系统设计
1.1 设计要求
1.1.1 设计任务
以Arduino为主控制器,一个滑动变阻器对10只LED流水灯效果进行快慢控制,实现LED跑马灯设计效果。
1.1.2 性能指标要求
(1)按照要求独立完成Arduino程序设计。
(2)滑动变阻器作为分压器,用8*8点阵显示分压点取整后的电压值,比如:0V,1V,2V,3V,4V,5V。
(3)通过滑动变阻器调整10只LED流水的速度,分压点电压越高,流水速度越快。
(4)通过按键可暂停也可启动跑马灯效果。
1.2 设计思路及设计框图
1.2.1设计思路
主控单元通过C程序编程,实现一个LED跑马灯设计。滑动变阻器三个脚,固定的两个脚一个接5V,一个接GND,滑动端接Arduino其中一个模拟端口,用于采集分压点的电压;滑动变阻器对10只LED流水灯效果进行快慢控制,实现LED跑马灯设计效果,8*8点阵显示分压点的电压值。
1.2.2总体设计框图
2 各个模块程序的设计
① 点阵图案(不同情况对应不同的图案):通过开发板控制显示不同情况下需要显示的图案,如:电压是5V时候显示“5”数字图案。
②用for函数来实现流水:依次输出灯的引脚,让LED反复循环。
③用switch函数来实现不同电压的显示:用模拟引脚的读书除以200得到变量0~5,再用switch函数来实现0~5电压的显示。
④设置一个按钮的子函数:用一个变量来接收灯的位置,当按钮按下时候跑马灯就会被暂停在此刻。
⑤模拟针脚取滑动变阻:通过程序代码编写,analogRead函数通过读取滑动变阻器变化,读模拟引脚, 返回[0-1023]之间的值。得到的值用来当做两个灯之间的delay延迟。
3 调试过程
①编写程序,检查编译是否出现问题,检查编译没有物体后继续下一步。
②在面包板上搭载好LED跑马灯电路,接入电源,看是否存在短路情况。
③打开Arduino软件将编写好的程序烧录进开发板。
④不触碰开关,看LED是否按程序的顺序进行闪烁。
⑤按下开关,看跑马灯是否受开关的控制。
⑥观察点阵图案和LED灯是否按程序执。
⑦扭动滑动变阻器,看是否能控制LED流水的快慢,点阵上面的数字是否发生变化。
4 功能测试
4.1 测试仪器与设备
Arduino开发板一块、滑动变阻器一个、面包板一个、数据传输线一条、8*8点阵一块、杜邦线若干、发光二级管(红灯10个)、开关(1个)、电阻(220欧10个)、电脑及Arduino软件;
4.2 性能指标测试
LED灯进行正常的流水闪烁,安装在面包板上的按键触发有效,三脚滑动变阻器可以对10只LED灯效果进行快慢控制,点阵屏上可以显示电压数字图案。
4.3误差分析
无
代码:
#include<LedControl.h>
LedControl lc=LedControl(12,11,13,1);
byte d={
{B00000000,B00111100,B00100100,B00100100,B00100100,B00100100,B00100100,B00111100},
{B00000000,B00000100,B00000100,B00000100,B00000100,B00000100,B00000100,B00000100},
{B00000000,B00111100,B00000100,B00000100,B00111100,B00100000,B00100000,B00111100},
{B00000000,B00111100,B00000100,B00000100,B00111100,B00000100,B00000100,B00111100},
{B00000000,B00100100,B00100100,B00100100,B00111100,B00000100,B00000100,B00000100},
{B00000000,B00111100,B00100000,B00100000,B00111100,B00000100,B00000100,B00111100},
};
int dzp=0,a=0,b=1;
void anjian();
void dianzhenping();
void setup() {
lc.shutdown(0,false);
lc.setIntensity(0,3);
lc.clearDisplay(0);
pinMode(10,INPUT_PULLUP);
for(int k=0;k<10;k++)
pinMode(k,OUTPUT);
}
void loop() {
for(int l=0;l<10;l++)
{digitalWrite(l,HIGH);dianzhenping();delay(dzp*2);anjian();
digitalWrite(l,LOW);dianzhenping();}
}
void anjian()
{b=digitalRead(10);
while(b==LOW){b=digitalRead(10);dianzhenping();}}
void dianzhenping()
{dzp=analogRead(1);a=dzp*5/1023;
for(int f=0;f<8;f++)
{lc.setRow(0,f,d[a][f]);}
}
|