基于ARM7的竞答器设计(附完整源代码)

更新时间:2024-01-28 03:18:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式 期末设计报告

题 目:四位竞答器 日 期:2016年1月4日

目录

一、设计功能描述 ........................................................................................................................... 3 二、设计框图 ................................................................................................................................... 3

1、总体框图 ............................................................................................................................. 3 2、算法流程图 ......................................................................................................................... 4 三、软件设计 ................................................................................................................................... 4

1、循环显示流水灯 ................................................................................................................. 4 2、外部中断EINT0设置 ......................................................................................................... 5 3、数码管函数 ......................................................................................................................... 5 4、定时器设置 ......................................................................................................................... 6 5、抢答检测 ............................................................................................................................. 6 四、硬件设计 ................................................................................................................................... 6

1、蜂鸣管脚 ............................................................................................................................. 6 2、按键电路 ............................................................................................................................. 7 3、LED管脚 ............................................................................................................................. 7 五、测试........................................................................................................................................... 8 六、总结........................................................................................................................................... 8 七、源代码....................................................................................................................................... 8

一、设计功能描述

本设计总体上是一个四位竞答器(支持四位选手),具备以下功能: 1、在竞答开始之前,显示流水灯图样; 2、利用外部中断EINT0实现竞答开始控制:关闭流水灯,开始进入竞答倒计时; 3、主持人按下开始竞答键后,数码管进行5S倒计时,当数码管显示为0时,选手开始竞答; 4、竞答完成后,数码管显示竞答选手的编号,仅对应的LED灯亮; 5、当有选手抢答时,蜂鸣器响,数码管显示竞答选手编号; 6、完成一轮竞答后,竞答系统自动返回流水灯图样,并等待下一轮竞答。

二、设计框图

1、总体框图

LED灯 LPC2131最小系统 数码管

蜂鸣器

按键

2、算法流程图

三、软件设计

1、循环显示流水灯

初始化时:x=18; while(1) {

data==MSPI_SendData(DISP_TAB[0]);//数码管初始化显示为0; IO1CLR=1<

2、外部中断EINT0设置

EXTMODE=0x00;//设置为电平触发 EXTPOLAR=0x00;//低电平有效 IRQEnable();//使能IRQ中断

VICIntSelect=0x00000000; //设置所有中断分配为IRQ中断 VICDdefVectAddr=(int)IRQ_Eint0; //设置服务地址 EXTINT=0x01;//清除中断

VICIntEnable=1<<0x0e;//使能EINT0中断

3、数码管函数

//MSPI_SendData(DISP_TAB[counter]); // 数码管显示 /*捕获功能*/

/* 此表为LED0~F以及L、P的字模 */ uint8 const DISP_TAB[19] = {

// 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90, // A b C d E F 0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E, // L P C 0xC7, 0x8C,0xC6 }; void MSPI_Init(void)

{ PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; // 设置管脚连接SPI SPI_SPCCR = 0x52; // 设置SPI 时钟分频

SPI_SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样 (1 << 4) | // CPOL = 1, SCK 为低有效 (1 << 5) | // MSTR = 1, SPI 处于主模式

(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先 (0 << 7); // SPIE = 0, SPI 中断被禁止 }

uint8 MSPI_SendData(uint8 data)

{ IO0CLR =IO0CLR|HC595_CS; // 片选74HC595 SPI_SPDR = data;

while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF 置位,即等待数据发送完毕 IO0SET = IO0SET|HC595_CS; return(SPI_SPDR); }

4、定时器设置

注:在进入外部中断时,才开启使能计数数/定时器,T0TCR=0x01; T0CTCR=0x00;//工作在定时器模式 T0TC=0;

T0PR=99;//100分频

T0MCR=0x03;//复位TOTC,并产生中断 T0MR0=Fpclk/100;

5、抢答检测

为了竞答公平,需要进行抢答检测。 抢答检测主要是为了防止有选手在倒计时时,按住按键不动,为此,在倒计时跳变为0那一刻,读取KEY2-KEY5的状态,判断是否有抢答情况。

四、硬件设计

1、蜂鸣管脚

2、按键电路

3、LED管脚

五、测试

将编译好的代码通过JLINK-FLASH烧录入LPC2131芯片。 经过测试,电路运行、实验效果与设计要求一致。

六、总结

1、为了竞答的公平性,引入了抢答检测这一步。因为有选手可以一直按住按键不动。在倒计时未到0前,用户按下按键是无效的。因而只需要检测跳变为0前那瞬间的管脚状态,如果选手是按住不动的话,就可以检测出来。 2、本设计运用了定时器、中断技术、数码管显示等技术,并把蜂鸣器、LED灯、按键也运用进入。从分利用了所学知识。 3、设计前,本人先画好系统框图以及流程图再编写代码,因而编写代码过程较为顺利,编译错误较少。 4、因为一轮竞答后自动进入下一轮,因为需要重新初始化。刚开始时没考虑到,因为下一轮竞答不正常,修正后程序可以正确运行。

七、源代码

//抢答器

#include\

#define HC595_CS (1<<29)// P0.29为74HC595的片选引脚 //按键

const uint32 beep=1<<7; const uint32 KEY1=1<<16; const uint32 KEY2=1<<17; const uint32 KEY3=1<<18; const uint32 KEY4=1<<19; const uint32 KEY5=1<<20; const uint32 KEY6=1<<21;

//LED灯 分别对应五位抢答选手,最先按下按键者对应的灯亮 const uint32 LED1=1<<18; const uint32 LED2=1<<19; const uint32 LED3=1<<20; const uint32 LED4=1<<21; const uint32 LED5=1<<22; const uint32 LED6=1<<23; const uint32 LED7=1<<24; const uint32 LED8=1<<25; uint32 y=0; uint8 data; uint32 z=1;

uint32 w=1; uint32 count=0; uint32 a=20; //延时函数

void delay(uint32 dly) { uint32 i; for(;dly>0;dly--) { for(i=0;i<5000;i++); } }

//数码管显示电路

//MSPI_SendData(DISP_TAB[counter]); // 数码管显示 /*捕获功能*/

/* 此表为LED0~F以及L、P的字模 */ uint8 const DISP_TAB[19] = {

// 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90, // A b C d E F 0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E, // L P C 0xC7, 0x8C,0xC6 }; void MSPI_Init(void)

{ PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; // 设置管脚连接SPI SPI_SPCCR = 0x52; // 设置SPI 时钟分频

SPI_SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样 (1 << 4) | // CPOL = 1, SCK 为低有效 (1 << 5) | // MSTR = 1, SPI 处于主模式

(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先 (0 << 7); // SPIE = 0, SPI 中断被禁止 }

uint8 MSPI_SendData(uint8 data)

{ IO0CLR =IO0CLR|HC595_CS; // 片选74HC595 SPI_SPDR = data;

while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF 置位,即等待数据发送完毕 IO0SET = IO0SET|HC595_CS; return(SPI_SPDR); }

//中断服务程序

void __irq IRQ_Eint0(void) {

T0TCR=0x01;//开启计数器功能 IO1SET=0xffffffff; while(1) {

if((T0IR&0x01)==1) { T0IR=0x01; data=MSPI_SendData(DISP_TAB[5-count]); count=count+1; if(count==6) {count=0;T0TCR=0x00; y=IO0PIN;w=1;

if((y&KEY2)==0|(y&KEY3)==0|(y&KEY4)==0|(y&KEY5)==0) {

w=0; while(a) {

if(a%2==0) IO0CLR=beep; else

IO0SET=beep; a=a-1;

delay(100); } } a=20; break;} } }

delay(100); while(w){ y=IO0PIN;

if((y&KEY2)==0|(y&KEY3)==0|(y&KEY4)==0|(y&KEY5)==0) { w=0;} }

if((y&KEY2)==0) {

data=MSPI_SendData(DISP_TAB[1]); IO1CLR=LED1; }

if((y&KEY3)==0) {

data=MSPI_SendData(DISP_TAB[2]); IO1CLR=LED2; }

if((y&KEY4)==0) {

data=MSPI_SendData(DISP_TAB[3]); IO1CLR=LED3; }

if((y&KEY5)==0) {

data=MSPI_SendData(DISP_TAB[4]); IO1CLR=LED4; }

delay(10000);

while((EXTINT&0x01)!=0) {

EXTINT=0x01; }

VICVectAddr=0; }

int main() {

uint32 x=18;

PINSEL0=0x00000000;

PINSEL1=0x00000001;//设置P0.16 即key1为中断ENIT0; IO0DIR=HC595_CS|beep; MSPI_Init();

IO1DIR=LED1|LED2|LED3|LED4|LED5|LED6|LED7|LED8;

IO1SET=IO1SET|LED1|LED2|LED3|LED4|LED5|LED6|LED7|LED8; IO0SET=IO0SET|beep;

T0CTCR=0x00;//工作在定时器模式 T0TC=0;

T0PR=99;//100分频

T0MCR=0x03;//复位TOTC,并产生中断 T0MR0=Fpclk/100;

EXTMODE=0x00;//设置为电平触发 EXTPOLAR=0x00;//低电平有效 IRQEnable();

VICIntSelect=0x00000000;//设置所有中断分配为IRQ中断 VICDefVectAddr=(int)IRQ_Eint0;//设置服务地址 EXTINT=0x01;//清除中断

VICIntEnable=1<<0x0e;//使能EINT0中断 while(1) {

data==MSPI_SendData(DISP_TAB[0]);//数码管初始化显示为0; IO1CLR=1<

IO1SET=0xffffffff;//LED灯灭 if(x==26) x=18; } }

本文来源:https://www.bwwdw.com/article/hbnw.html

Top