暑假学习第二周

来源:互联网 发布:早生华发的华 知乎 编辑:程序博客网 时间:2024/05/21 17:33

第二周汇总

概况

主要进行了抢答器的完成,从开始的计划筹备,以及元器件的选择,线路的连接,到对各个元器件进行逐个学习,完成单人的答题流程,到最后的整体连线,元器件的连接固定和故障调试,初步完成了抢答器的基本功能。

抢答器概要

本设计最终目的实现三路抢答功能,不同分值的加分功能,惩罚功能。为完成设计要求需要完成各个模组的线路连接,以及软件的架构,和最后软硬件的对接和测试。
硬件分析:抢答器的硬件主体为arduino Mega 2560单片机,所有其他模块接收到的数据都是由它采集和处理的。一个最基础的抢答单元,需要一个抢答按钮和作为提示的灯光蜂鸣器,需要一块LED显示屏展示得分情况,这里选用的是linksprite系列的Serial 16x2 LCD。最后需要使用舵机完成惩罚操作。
软件分析:单片机能对采集到的信息进行判断,选择出优先做出抢答的选手,还需要判断情况,根据不同模块传导的数据来进行不同分值的加分和惩罚工作。最后需要能在一次答题的整个流程结束后,迅速进入到下一次的准备中。

流程分析

这里写图片描述
根据题目的需求与任务,我们做了一个初步的想法。首先在开始抢答时,迅速判断出领先的选手,并立即使当前选手前的LED灯泡点亮和蜂鸣器长响,示意该选手完成抢答。接着程序自动进入到答题倒计时阶段(需要将时间展现给选手),计时结束后,由主持人做出选择,判断正误,若正确,则进入到加分环节,将设置几个不同的分值按钮可供选择,接着展示展示当前所有选手分值,流程结束。或回答错误,按下相应按钮后,触发惩罚程序,流程结束

相关的代码

串行led

#include <SoftwareSerial.h>#define txPin 2SoftwareSerial LCD = SoftwareSerial(0, txPin);// since the LCD does not send data back to the Arduino, we should only define the txPinconst int LCDdelay=10;  // conservative, 2 actually works// wbp: goto with row & columnvoid lcdPosition(int row, int col) {  LCD.write(0xFE);   //command flag  LCD.write((col + row*64 + 128));    //position   delay(LCDdelay);}void clearLCD(){  LCD.write(0xFE);   //command flag  LCD.write(0x01);   //clear command.  delay(LCDdelay);}void backlightOn() {  //turns on the backlight  LCD.write(0x7C);   //command flag for backlight stuff  LCD.write(157);    //light level.  delay(LCDdelay);}void backlightOff(){  //turns off the backlight  LCD.write(0x7C);   //command flag for backlight stuff  LCD.write(128);     //light level for off.   delay(LCDdelay);}void serCommand(){   //a general function to call the command flag for issuing all other commands     LCD.write(0xFE);}void setup(){  pinMode(txPin, OUTPUT);  LCD.begin(9600);  backlightOn() ;  clearLCD();  lcdPosition(0,0);  LCD.print("Hello world from LinkSprite!");}void loop(){}

四路七段数码管

#include "TM1637.h"#define CLK 3//pins definitions for TM1637 and can be changed to other ports       #define DIO 2TM1637 tm1637(CLK,DIO);void setup(){  tm1637.init();  tm1637.set(BRIGHT_DARKEST );//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7;}int i=0;int a=0;int b=0;int c=0;int d=0;void loop(){  int b1=0;    b1=analogRead(A0);    if(b1==1023)    {delay(300);      i++;    }    if(i<10)    {a=i;}    if(i>=10)    {a=i%10;b=i/10;}    tm1637.display(0,b);    tm1637.display(1,a);     tm1637.display(2,c);    tm1637.display(3,d);delay(1000);}

数据结构与SPI的学习

只是进行了初步的了解,关于SPI串行外设接口总线,其各个接口信号线的作用,以及数据传输时的大概流程。
SPI接口共有4根信号线,分别是:设备选择线、时钟线、串行输出数据线、串行输入数据线。设备选择线。
SS-;(CS)设备选择线 SS-线用于选择激活某Slave设备,低有效,由Master驱动输出。只有当SS-信号线为低电平时,对应Slave设备的SPI接口才处于工作状态。
SCLK:同步时钟信号线 SCLK用来同步主从设备的数据传输,由Master驱动输出,Slave设备按SCK的步调接收或发送数据。
串行数据线: SPI接口数据线是单向的,共有两根数据线,分别承担Master到Slave、Slave到Master的数据传输;但是不同厂家的数据线命名有差别。 Motorola的经典命名是MOSI和MISO,这是站在信号线的角度来命名的。
MOSI:When master, out line; when slave, in line
MISO:When master, in line; when slave, out line
不过,也有一些产家(比如Microchip)是按照类似SDI,SDO的方式来命名,这是站在器件的角度根据数据流向来定义的。 SDI:串行数据输入 SDO:串行数据输出。

多Slave的应用

SPI 也支持多Slave应用。多个Slave共享时钟线、数据线,可以直接并接在一起;而各Slave的片选线SS则单独与Master连接,受Master 控制。在一段时间内,Master只能通过某根SS线激活一个Slaven进行数据传输。Slave的时钟线和数据线端口则都应保持高阻状态,以免影响当前数据传输的进行。

关于数据结构

认识数据结构,数据,数据元素,数据项,数据对象。逻辑结构包括集合结构,线性结构,树形结构和图形结构。物理结构包括顺序存储结构和链式存储结构。初步掌握了算法效率的度量方法和算法时间复杂度的计算。

遇到的问题

对单片机上的引脚不够熟悉,错误的将LED3连接在了13好接口,导致其在通电后不停闪烁,错误的将8号接口定义为舵机的控制接口,导致舵机2在通电后一直进行自行旋转,并影响到了LED屏的正常工作。
各个元器件上的跳线过多,未进行正确的梳理,导致乱糟糟一团,在连线到面包版以及单片机时产生了很多操作上的难度,尤其是当其中一根跳线脱落时,更加难以排查。
对于控制串行UART 16x2 LCD,四七段数码管,舵机的复杂代码,只能做到最基本的使用和简单的修改,没能彻底掌握。

原创粉丝点击