基于ARM7的竞答器设计(附完整源代码)_第1页
基于ARM7的竞答器设计(附完整源代码)_第2页
基于ARM7的竞答器设计(附完整源代码)_第3页
基于ARM7的竞答器设计(附完整源代码)_第4页
基于ARM7的竞答器设计(附完整源代码)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式期末设计报告 题 目:四位竞答器 日 期:2016年1月4日目录一、设计功能描述3二、设计框图41、总体框图42、算法流程图4三、软件设计51、循环显示流水灯52、外部中断EINT0设置53、数码管函数54、定时器设置65、抢答检测6四、硬件设计61、蜂鸣管脚62、按键电路73、LED管脚7五、测试8六、总结8七、源代码8一、设计功能描述本设计总体上是一个四位竞答器(支持四位选手),具备以下功能:1、在竞答开始之前,显示流水灯图样; 2、利用外部中断EINT0实现竞答开始控制:关闭流水灯,开始进入竞答倒计时;3、主持人按下开始竞答键后,数码管进行5S倒计时,当数码管显示为0时,选手开始竞

2、答;4、竞答完成后,数码管显示竞答选手的编号,仅对应的LED灯亮;5、当有选手抢答时,蜂鸣器响,数码管显示竞答选手编号;6、完成一轮竞答后,竞答系统自动返回流水灯图样,并等待下一轮竞答。二、设计框图1、总体框图LED灯数码管LPC2131最小系统蜂鸣器按键2、算法流程图三、软件设计1、循环显示流水灯初始化时:x=18;while(1) data=MSPI_SendData(DISP_TAB0);/数码管初始化显示为0;IO1CLR=1<<x;/LED灯亮x=x+1;delay(300);IO1SET=0xffffffff;/LED灯灭if(x=26) x=18; 2、外部中断EIN

3、T0设置EXTMODE=0x00;/设置为电平触发EXTPOLAR=0x00;/低电平有效IRQEnable();/使能IRQ中断VICIntSelect=0x00000000; /设置所有中断分配为IRQ中断VICDdefVectAddr=(int)IRQ_Eint0; /设置服务地址EXTINT=0x01;/清除中断VICIntEnable=1<<0x0e;/使能EINT0中断3、数码管函数/MSPI_SendData(DISP_TABcounter);/ 数码管显示/*捕获功能*/* 此表为LED0F以及L、P的字模 */uint8 const DISP_TAB19 = /

4、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 F0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,/ L P C 0xC7, 0x8C,0xC6 ; void MSPI_Init(void) PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; / 设置管脚连接SPISPI_SPCCR = 0x52; / 设置SPI 时钟分频SPI_SPCR = (0 << 3) | / CPHA = 0, 数据在

5、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; / 片选74HC595SPI_SPDR = data;while( 0 = (SPI_SPSR & 0x80); / 等待SPIF

6、置位,即等待数据发送完毕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管脚五、测

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

8、轮竞答不正常,修正后程序可以正确运行。七、源代码/抢答器#include"config.h"#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

9、 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;ui

10、nt8 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_TABcounter);/ 数码管显示/*捕获功能*/* 此表为LED0F以及L、P的字模 */uint8 const DISP_TAB19 = / 0 1 2 3 4 5 6 7 8 9 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,

11、0x80,0x90,/ A b C d E F0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,/ L P C 0xC7, 0x8C,0xC6 ; void MSPI_Init(void) PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00001500; / 设置管脚连接SPISPI_SPCCR = 0x52; / 设置SPI 时钟分频SPI_SPCR = (0 << 3) | / CPHA = 0, 数据在SCK 的第一个时钟沿采样(1 << 4) | / CPOL = 1, SCK 为低有效(1 <<

12、 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; / 片选74HC595SPI_SPDR = data;while( 0 = (SPI_SPSR & 0x80); / 等待SPIF 置位,即等待数据发送完毕IO0SET = IO0SET|HC595_CS;return(SPI_SPDR);/中断服务程序

13、void _irq IRQ_Eint0(void) T0TCR=0x01;/开启计数器功能 IO1SET=0xffffffff; while(1) if(T0IR&0x01)=1) T0IR=0x01;data=MSPI_SendData(DISP_TAB5-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;

14、 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_TAB1);IO1CLR=LED1; if(y&KEY3)=0)data=MSPI_SendData(DISP_TAB2);IO1CLR=LED2; if(y&KEY4)=0)data=MSPI_Sen

15、dData(DISP_TAB3);IO1CLR=LED3; if(y&KEY5)=0)data=MSPI_SendData(DISP_TAB4);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=0x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论