ARM实训报告五路智能抢答器.docx
《ARM实训报告五路智能抢答器.docx》由会员分享,可在线阅读,更多相关《ARM实训报告五路智能抢答器.docx(25页珍藏版)》请在冰豆网上搜索。
ARM实训报告五路智能抢答器
五路智能抢答器
摘要
随着电子技术的飞速发展,基于嵌入式的控制系统已广泛应用于工业、农业、电力、电子、智能楼宇等行业,微型计算机作为嵌入式控制系统的主体与核心,代替了传统的控制系统的常规电子线路。
同时楼宇智能化的发展与成熟,也为基于嵌入式的控制系统的普及与应用奠定了坚实的基础。
电子智能抢答在抢答过程中,为了知道哪一组或哪一位选手先答题,必须要设计一个系统来完成这个任务。
如果在抢答中,靠视觉是很难判断出哪组先答题。
利用嵌入式系统来设计抢答器,使以上问题得以解决,即使两组的抢答时间相差几微秒,也可分辨出哪组优先答题。
由于ARM7的开发板的按键只有六个,为了现象比较清晰的观察和操作的易于控制,抢答组数在五组以内任意使用,本系统设计为模块形式采用ARM7的2138开发板与PC机的链接来实现的,系统工作原理本系统采用ARM7的2138开发板模块作为核心。
控制系统的五个模块分别为:
显示模块、显示驱动模块、定时器模块、抢答开关按键模块、蜂鸣器输出模块。
关键词:
按键;显示;驱动;抢答;定时
一、设计任务与要求:
1)设计一个容纳5组参赛队的智能式的抢答器,每组设置一抢答按钮供抢答者使用。
2)设置一个系统清除和抢答控制开关按钮S,该开关由主持人控制。
3)抢答器具有锁存与显示功能。
选手按动按钮,锁存相应的编号,并在LED数码管上显示号码,同时亮相应号的流水灯。
其他选手无法抢答。
优先抢答选手的编号一直保持到主持人将系统清除为止。
4)抢答器具有定时抢答功能。
当主持人启动"开始"键后,定时器进行计时,定时30秒。
5)参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,流水灯输出且音乐输出“康定情歌”歌曲,显示器上显示选手的号码,并保持到主持人将系统清除为止,音乐输出完后主持人才能按复位键开始重新一轮的抢答。
二、实训目的
本次实训使用LPC2131的SPI接口作为主机向74HC595发送数据,数据内容由7段数码管显示,再加上GPIO输入实验的按键输入检测,由自己编程实现程序检测按键状态时,控制蜂鸣器蜂鸣和对应号的流水灯来,(即表示此号队抢答到),进而进入定时状态抢答,用定时器0实现30s定时,查询标志位等待定时时间到达,表示此一轮抢答完毕,音乐输出,而后按键复位开始新一轮的抢答。
如此不断的循环下去,实现了智能抢答的效果。
在本次实验中,参赛选手由按键1~5表示,主持人按键由按键6表示即复位和开始按键。
通过本次的实验,能使自己了解并掌握定时器查询方式和中断的用法和SPI的7段数码管显示用法,还有就是更熟练地应用GPIO口,以设计生活中实用的抢答来培养自己的思维和加强自己的系统设计能力。
三、实验仪器
1、装有ADS1.2及EasyJTAG仿真器的电脑一台
2、ARM7开发板一块
四、实验原理
(一)、GPIO的相关原理
4.1.4、GPIO——蜂鸣器控制
如果跳线JP11选择蜂鸣器,当P0.7输出低电平,蜂鸣器蜂鸣,当P0.7输出高电平时,蜂鸣器停止蜂鸣。
实验利用P0.7的输出功能,控制蜂鸣器,程序设置PINSEL0使P0.7链接GPIO,并通过IO0DIR将其设置输出状态,然后通过IO0CLR和IO0SET清零和置位P0.7口,控制蜂鸣器。
4.1.5、GPIO输出——单路LED控制
实验程序首先设置管脚链接GPIO,接着设置P1.18口为输出模式,然后通过IO1CLR和IO1SET控制盘.18,驱动LED1的亮灭。
4.1.6、GPIO输出——多路LED控制
当跳线JP12全部选择LED8~LED1后,P1.25~P1.18分别控制这8路LED,就可以进行流水灯实验。
(二)、SPI接口相关原理
4.2.1、概述
4.2.2、特性
4.2.3、管脚描述
4.2.4、结构
4.2.5、SPI基本操作
4.2.6、SPI——7段数码显示
(三)、定时器0相关原理
4.3.1、概述
4.3.2、特性
4.3.3、结构
4.3.4、功能框图
4.3.5、定时器查询
(四)、脉宽调制相关原理
4.4.1、概述
4.4.2、特性
4.4.3、管脚描述
4.4.4、结构
4.4.5、基本操作
4.4.6、PWM音乐输出
五、实验程序
/****************************************Copyright(c)**************************************************
**GuangzouZLG-MCUDevelopmentCo.,LTD.
**graduateschool
**
**
**--------------FileInfo-------------------------------------------------------------------------------
**Filename:
main.c
**LastmodifiedDate:
2004-09-16
**LastVersion:
1.0
**Descriptions:
Themain()functionexampletemplate
**
**------------------------------------------------------------------------------------------------------
**Createdby:
Chenmingji
**Createddate:
2004-09-16
**Version:
1.0
**Descriptions:
Theoriginalversion
**
**------------------------------------------------------------------------------------------------------
**Modifiedby:
Chenxibing
**Modifieddate:
2005-01-14
**Version:
**Descriptions:
SPI实验,74HC595驱动7段数码管。
**
********************************************************************************************************/
#include"config.h"
#include"music.h"
#defineBEEP1<<15//P0.12控制蜂鸣器
#defineHC595_CS(1<<29)//P0.29口为74HC595的片选
constuint32LEDS8=(0xFF<<18);
constuint32LED1=(1<<18);
constuint32LED2=(1<<19);
constuint32LED3=(1<<20);
constuint32LED4=(1<<21);
constuint32LED5=(1<<22);
constuint32LED6=(1<<23);
constuint32KEY1=1<<16;
constuint32KEY2=1<<17;
constuint32KEY3=1<<18;
constuint32KEY4=1<<19;
constuint32KEY5=1<<20;
constuint32KEY6=1<<21;
uint32i;
uint8rcv_data;
constuint32HCMM[]=
{
_MI,_SO,_LA,_LA,_SO,_LA,_MI,_RE,
_MI,_SO,_LA,_LA,_SO,_LA,_MI,
_MI,_SO,_LA,_LA,_SO,_LA,_MI,_RE,
_SO,_MI,_RE,_MI,_RE,_DO,_RE,_LA,
_1LA,_RE,_SO,_MI,_RE,_DO,_1LA,
_SO,_MI,_RE,_MI,_RE,_DO,_RE,_LA,
_1LA,_RE,_SO,_MI,_RE,_DO,_1LA,
_SO,_MI,_RE,_MI,_RE,_DO,_RE,_LA,
};
constuint32HCMM_L[]=
{
_8,_8,_8,_16,_16,_8d,_16,_4,
_8,_8,_8,_16,_16,_8,_4,
_8,_8,_8,_16,_16,_8d,_16,_4,
_4,_4,_16,_16,_16,_16,_8,_4,
_4,_8d,_8,_4,_16,_16,_8d,
_4,_4,_16,_16,_16,_16,_8,_4,
_4,_8d,_8,_4,_16,_16,_8d,
_4,_4,_16,_16,_16,_16,_8,_4,
};
/********************************************************************************************************
**函数名称:
DelayNS()
**函数功能:
长软件延时
**入口参数:
dly延时参数,值越大,延时越久
**出口参数:
无
********************************************************************************************************/
voidDelayNS(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
voidDelay(uint32dly)
{
uint32i;
for(;dly>0;dly--)
for(i=0;i<0x7ffff;i++);
}
voiddingshi()
{
/*定时器0初始化*/
T0TC=0;/*定时器设置为0*/
T0PR=0;/*时钟不分频*/
T0MCR=0x03;/*设置T0MR0匹配后复位T0TC,并产生中断标志*/
T0MR0=Fpclk*5;/*5秒钟定时*/
T0TCR=0x01;/*启动定时器*/
T0IR=0x01;
while((T0IR&0x01)==0);/*等待定时时间到*/
T0IR=0x01;
}
/********************************************************************************************************
**函数名称:
MSPI_Init()
**函数功能:
初始化SPI接口,设置为主机。
**入口参数:
无
**出口参数:
无
*********************************************************************************************************/
voidMSPI_Init(void)
{
PINSEL0=0x00005500;//设置管脚连接SPI
PINSEL2=PINSEL2&(~0x08);//P1[25:
16]连接GPIO
SPCCR=0x52;//设置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中断被禁止
}
/********************************************************************************************************
**函数名称:
MSPI_SendData()
**函数功能:
向SPI总线发送数据。
**入口参数:
data待发送的数据
**出口参数:
返回值为读取的数据
********************************************************************************************************/
uint8MSPI_SendData(uint8data)
{
IOCLR=HC595_CS;//片选74HC595
SPI_SPDR=data;
while(0==(SPI_SPSR&0x80));//等待SPIF置位,即等待数据发送完毕
IOSET=HC595_CS;
return(SPI_SPDR);
}
constuint32LED_TBL[]={
0x00,0xFF,//全部熄灭后,再全部点亮
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,//依次逐个点亮
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,//依次逐个叠加
0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01,//依次逐个递减
0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,//两个靠拢后分开
0x81,0xC3,0xE7,0xFF,0xFF,0xE7,0xC3,0x81};//从两边叠加后递减
/*此表为LED0~F以及L、P的字模*/
uint8constDISP_TAB[6]={
//012345
0xC0,0xF9,0xA4,0xB0,0x99,0x92};
music()
{PINSEL0=0x02<<14;
for(i=0;i<40;i++)
{
PWMMR0=Fpclk/HCMM[i];//设置输出频率
PWMLER=0x05;//更新匹配值后,必须锁存
IO1SET=~((LED_TBL[i])<<18);
IO1CLR=((LED_TBL[i])<<18);
Delay(HCMM_L[i]);}
PINSEL0=0x00005500;
}
/********************************************************************************************************
**函数名称:
main()
**函数功能:
使用硬件SPI,74HC595驱动控制7段数码管显示。
**先显示0~F的字模,然后显示LPC2131字样。
********************************************************************************************************/
intmain(void)
{uint8i,k;
PINSEL0=0x00005500;//设置SPI管脚连接
PINSEL1=0x00000000;
PINSEL0=0x02<<14;
IO0DIR=BEEP|HC595_CS;
PINSEL2=PINSEL2&(~0x08);//P1[25:
16]连接GPIO
IO1DIR=LEDS8;//设置LED1控制口为输出
MSPI_Init();
IO1SET=LEDS8;
IO0SET=BEEP;
PWMPR=0x00;//不分频,计数频率为Fpclk
PWMMCR=0x02;//设置PWMMR0匹配时复位PWMTC
PWMPCR=0x0400;//允许PWM2输出,单边PWM
PWMMR0=Fpclk/500;
PWMMR2=PWMMR0/2;//50%占空比
PWMLER=0x05;//PWM0和PWM2匹配锁存
PWMTCR=0x02;//复位PWMTC
PWMTCR=0x09;//启动PWM输出
MSPI_Init();//初始化SPI接口
while
(1)
{
if((IO0PIN&KEY6)==0)
rcv_data=MSPI_SendData(DISP_TAB[0]);//发送显示数据
IO1CLR=LED6;
DelayNS(20);
IO1SET=LED6;
DelayNS(20);
if((IO0PIN&KEY1)==0)
{rcv_data=MSPI_SendData(DISP_TAB[1]);//发送显示数据
IO1CLR=LED1;//LED1点亮
DelayNS(20);
IO1SET=LED1;//LED1熄灭
dingshi();//进入定时程序
while(((IO0PIN&KEY6)!
=0)&((T0IR&0x01)==0))//当按键6未按下且定时时间到
music();}//进入音乐输出程序
elseif((IO0PIN&KEY2)==0)//按键二按下
{rcv_data=MSPI_SendData(DISP_TAB[2]);//发送显示数据数码显示2
IO1CLR=LED2;//LED2点亮
DelayNS(20);//延时
IO1SET=LED2;//LED2熄灭
dingshi();//进入定时程序
while(((IO0PIN&KEY6)!
=0)&((T0IR&0x01)==0))当按键6未按下且定时时间到
music();}//进入音乐输出程序
elseif((IO0PIN&KEY3)==0)//按键三按下
{rcv_data=MSPI_SendData(DISP_TAB[3]);//发送显示数据数码显示3
IO1CLR=LED3;//LED3点亮
DelayNS(20);//延时
IO1SET=LED3;//LED2熄灭
dingshi();//进入定时程序
while(((IO0PIN&KEY6)!
=0)&((T0IR&0x01)==0))当按键6未按下且定时时间到
music();}//进入音乐输出程序
elseif((IO0PIN&KEY4)==0)//按键四按下
{rcv_data=MSPI_SendData(DISP_TAB[4]);//发送显示数据数码显示4
IO1CLR=LED4;//LED4点亮
DelayNS(20);//延时
IO1SET=LED4;//LED4熄灭
dingshi();//进入定时程序
while(((IO0PIN&KEY6)!
=0)&((T0IR&0x01)==0))当按键6未按下且定时时间到
music();}//进入音乐输出程序
elseif((IO0PIN&KEY5)==0)//按键五按下
{rcv_data=MSPI_SendData(DISP_TAB[5]);//发送显示数据数码显示5
IO1CLR=LED5;//LED5点亮
DelayNS(50);//延时
IO1SET=LED5;//LED5熄灭
dingshi();//进入定时程序
while(((IO0PIN&KEY6)!
=0)&((T0IR&0x01)==0))当按键6未按下且定时时间到
music();}//进入音乐输出程序
}
return0;
}
/*********************************************************************************************************
**EndOfFile
********************************************************************************************************/
六、实验现象及结果
当程序执行时,LPC2138开发板的LED6闪烁的亮,表示准备开始比赛,当主持人按下按键6(作为开始按键),这时数码管显示数字0,表示进入抢答开始抢答,这时选手1到5谁先按下按键,谁优先抢答到,通过寄存器锁存,数码显示相应选手的号码,且相应的灯就亮,灯亮后延时熄灭,表示选手进入抢答状态的定时状态,定时30s回答,应用定时器0的查询方式当定时时间到了且按键六没按下复位,这时通过PWM2音乐输出且配有流水灯花样,表示此轮抢答结束,此时才能按下按键6才能复位开始新一轮的抢答。
七、实训心得
通过这次实训设计。
我设计电子智能抢答器,采用ARM7中的GPIO、SPI接口、定时器0、脉宽调制PWM等相关知识的结合。
把在学校三年所学知识连成一串。
理论联系实践,体现出大学生动手能力。
通过查资料和搜集有关的文献,培养了自学能力和动手能力。
并且由原先的被动的接受知识转换为主动的寻求知识,这可以说是学习方法上的一个很大的突破。
在以往的传统的学习模式下,我们可能会记住很多的书本知识,但是通过实习论文,我们学会了如何将学到的知识转化为自己的东西,学会了怎么更好的处理知识和实践相结合的问题。
把握重点、攻克难关,学到用到、活学活用。
在设计过程中由于时间仓促有很多地方难免存在不足之处,原先定时器定时总不能按预想的工作,后来在老师的指点下终于把问题解决了,并实现了自己原先设想的