嵌入式系统原理与应用综合设计简易电子琴系统设计

上传人:无*** 文档编号:67169205 上传时间:2022-03-30 格式:DOC 页数:30 大小:1.82MB
收藏 版权申诉 举报 下载
嵌入式系统原理与应用综合设计简易电子琴系统设计_第1页
第1页 / 共30页
嵌入式系统原理与应用综合设计简易电子琴系统设计_第2页
第2页 / 共30页
嵌入式系统原理与应用综合设计简易电子琴系统设计_第3页
第3页 / 共30页
资源描述:

《嵌入式系统原理与应用综合设计简易电子琴系统设计》由会员分享,可在线阅读,更多相关《嵌入式系统原理与应用综合设计简易电子琴系统设计(30页珍藏版)》请在装配图网上搜索。

1、嵌入式系统原理与应用综合设计简易电子琴系统设计系 部:电子与信息工程系专业班级:电子信息工程09秋2班姓 名:学 号:小组成员:指导教师:完 成 日 期 2012年 6月目录1 前言11.1电子琴介绍11.2嵌入式电子琴发展趋势21.3实现目标22 总体设计32.1利用实验资源实现简易电子琴的功能。32.2主要技术指标33 硬件设计43.1 LM3S2110芯片43.1.1 LM3S2110特性概述43.1.2 LM3S2110中断功能概述53.1.3 LM3S2110的GPIO特性53.2 键盘模块63.2.1 矩阵键盘模块63.2.2 独立按键模块73.3 LCD显示模块73.3.1 16

2、02介绍73.3.2编辑本段管脚功能73.4蜂鸣器模块设计84 系统软件设计94.1 音乐控制104.4.1 音乐的相关知识104.4.2 如何用嵌入式实现音乐节拍104.4.3 如何用嵌入式产生音频脉冲104.2 软件初始化114.2.1 LCD初始化114.2.2 输入输出初始化124.2.3 按键、蜂鸣器、LED初始化134.2.4 定时器的初始化134.3总设计流程图145调试155.1音调调试155.2按键控制音乐停止调试155.3 LED显示音频效果调试156结束语157参考文献16附录一 LM3S2110原理电路图17附录二 程序清单171 buzzer.c程序清单172 mus

3、ic.c程序183 systemInit.c程序204主程序清单201 前言1.1电子琴介绍电子琴又称作电子键盘,属于(区别于电声),发音音量可以自由调节。较宽,和声丰富,甚至可以演奏出一个的效果,表现力极其丰富。采用半导体集成电路,对乐音信号进行放大,通过扬声器产生音响。现在的电子琴一般使用PCM或AWM采样音源。所谓采样就是录制乐器的声音,将其数字化后存入ROM里,然后按下键时CPU回放该音。甚至有一些高级编曲键盘可以使用外置采样(比如Tyros 3的硬盘音色)。图1-1电子琴原理框图电子琴使用二分频电路是音阶规律的需要。音乐中的基本音阶的频率是按照一定规律排列的,以C调为例,音阶中各音之

4、间的频率(单位为赫兹)关系是:说明一个音的频率刚好是比它低八度音的频率的两倍。所以,只要把一个音的频率除以2就得到比它低八度的一个音的频率。实现这一点就需要使用二分频电路。这样,只要振荡器产生一个标准音的频率信号,如高音“1”的信号,通过二分频就产生中音“2”的频率,再一次二分频就产生低音“1”的频率了。如果按照键盘上最高音组的频率制作七个振荡器,并将得到的七个音阶信号分别二分频,便可得到低八度的一组音阶信号;再次二分频,就可得到再低八度的一组音阶信号。依此类推,最后,就能得到键盘上所有的音阶信号了。不过,实际上需要制作12个振荡器和更多的分频器,因为一组键盘中还有五支黑键。1.2嵌入式电子琴

5、发展趋势嵌入式技术在电子琴方面的设计应用是其发展的一个方向,同时也是一种必然趋势。嵌入式设备能够促使宿主设备更加智能、高效。设计的过程更加灵活,整个系统的操作更加简单方便,嵌入式电子琴设计过程能够保证电子琴的开发成本趋于合理性、功能更加完善,嵌入式电子琴具有功能全面、结构紧凑、可靠性强、实时性强等特点。嵌入式电子琴系统是技术过程的具体体现,具有核心处理程序设计功能,能够保证电子琴满足新时期的要求,从键盘设计、输入输出模块设计、音色音调控制、电路设计等方面发挥重要的作用。能够与现实环境进行有效的结合,保证交互式信息系统的实现,嵌入式电子琴设计可以把半导体技术、计算机技术与行业具体应用紧密结合起来

6、,最终保证嵌入式电子琴处于资金密集、技术密集、高度分散、不断创新的环境下。随着EDI的推广、Dsp技术的发展,嵌入式电子琴技术作为核心技术应用越来越广泛,在某一个芯片上实现一个核心技术的时代已经来临,用户设计过程中可以根据实际需要,按照嵌入式电路的要求,设计出功能各异的系统结构。仿真设计完成后可以通过半导体制作形成需要的产品,整个嵌入式系统可以很好的集中到一块或者几块芯片上,很好的解决了电子琴设计电路分散的状况。应用系统集中到某一个芯片上保证系统更加简洁,功能更加完善。1.3实现目标本次制作电子琴除了可正常弹奏外,LCD液晶屏显示音阶,LED灯带展现音频效果。具有较强的感官体验,增加生活乐趣。

7、本系统运行稳定,其优点是硬件电路简单,软件功能完善,控制系统可靠,性价比较高等,具有一定的实用和参考价值。2 总体设计2.1利用实验资源实现简易电子琴的功能。(1) 用蜂鸣器发出不同声音;(2) 使用LCD显示器来显示音阶输入的相关信息;(3) 当按下键盘组相对按键,蜂鸣器会发出相对音阶单音,共有两个8度音阶;(4) 可以输入16个单音,可以一起演奏出来;(5) 演奏时可以按键中断;(6) 可以实时显示目前演奏的单音码;(7) 不同音阶对应不同灯亮,具有音频效果。2.2主要技术指标(1) 充分利用自己设计的开发板的硬件的资源进行设计;(2) 通过调整PWM的周期,改变占空比生产不同频率的信号;

8、(3) 实现按键发出相对音阶单音;(4) 外扩实现音频效果。图2-1 总设计框图3 硬件设计本次用到的硬件有:LM3S2110开发板中包含的一块LM3S2110微控制器和4个独立键盘。另外可以外接的有1个4X4矩阵键盘模块、 1个LCD液晶显示屏、1个蜂鸣器和1个LED音频模块。3.1 LM3S2110芯片3.1.1 LM3S2110特性概述LM3S2110 微控制器是针对工业应用方案而设计的,包括远程监控、电子贩售机、测试和测量设备、网络设备和交换机、工厂自动化、HVAC和建筑控制、游戏设备、运动控制、医疗器械、以及火警安防。除此之外,该LM3S2110微控制器的优势还在于能够方便的运用多种

9、ARM的开发工具和片上系统(SoC)的底层IP应用方案,以及广大的用户群体。 另外,该微控制器使用了兼容ARM的Thumb指令集的Thumb2指令集来减少存储容量的需求,并以此达到降低成本的目的。LM3S2110微控制器与Stellaris系列的所有成员是代码兼容的,这为用户提供了灵活性,能够适应各种精确的需求5。与此同时,它还提供出色的计算性能和优越的系统中断响应能力。总的来说,其特性包括:1、具有十分紧凑的内部核心。2、从 ARM7 处理器系列中移植过来,以获得更好的性能和电源效率。3、存储器保护单元(MPU)为复杂的应用提供特权操作模式。4、中断处理能力优秀非常,通过执行寄存器操作来实现

10、,这些寄存器操作在处理硬件中断时使用。5、通过Harvard结构执行快速的应用,以独立指令以及数据总线为其十分突出的特征。6、在通常与8位和16位设备相关的存储容量中的Thumb-2指令集,特别是在微控制器级应用的几千字节存储量中,提供ARM内核所期望的高性能。7、调试的解决方案应有尽有:仪表跟踪宏单元(ITM),用于支持printf 型调试;Flash 修补和断点(FPB)单元,用于实现断点操作;数据观察点和触发(DWT)单元,用于执行观察点、触发源和系统性能分析;串行线JTAG调试端口(SWJ-DP);跟踪端口接口单元(TPIU)用作跟踪端口分析仪的桥接。3.1.2 LM3S2110中断功

11、能概述ARM Cortex-M3 处理器和嵌套向量中断控制器(NVIC)将区别所有问题的优先等级并对其进行相应的处理。所有存在的异常都会在处理器模式中被予以处理。当出现异常时,处理器的状态将被自动存储到堆栈中,并在中断服务程序(ISR)结束时自动从堆栈中恢复。取出向量和保存状态是同时进行的,这样可以提高进入中断的效率。处理器还支持末尾连锁(tail-chaining),这使处理器无需保存和恢复状态便可执行连续的(back-to-back)中断。用户可设置的最高优先级0在内部看作是优先级4,仅次于复位、NMI以及硬件故障。值得注意的是:0是所有可调整优先级的默认优先级。如果你将两个或更多的中断指

12、定为相同的优先级,那么它们的硬件优先级(位置编号越高优先级越低)就决定了处理器激活中断的顺序。例如,如果GPIO端口B和GPIO端口A都为优先级1,那么GPIO端口A的优先级更高6。系统通过NVIC系统处理程序优先级寄存器来设置处理程序的优先级。通过NVIC中断设置使能寄存器来使能中断,并由NVIC中断优先级寄存器来区分其中的优先等级。你还可以把优先级划分为占先优先级和次要优先级两组。3.1.3 LM3S2110的GPIO特性GPIO模块由 8个物理GPIO 模块组成,每个对应一个独立的GPIO端口(端口A, 端口B, 端口C, 端口D, 端口E, 端口F, 端口G, 和端口H)。GPIO模块

13、遵循FiRM规范,并且支持11-40 个可编程的输入/输出管脚,具体取决于正在使用的外设7。GPIO模块具有以下的特性:1、可编程控制GPIO中断:屏蔽中断发生;边沿触发(上升沿,下降沿,上升、下降沿);(高或低)电平触发。2、输入/输出可承受5V电压。3、在读和写操作中通过地址线进行位屏蔽。4、可编程控制GPIO引脚配置。本次设计使用的开发板上的微控制器LM3S2110上可使用的引脚有PA2PA6(5个)、PB0PB6(7个)、PC4PC7(4个)、PD0PD7(8个)、PE0、PE1、PF0、PF1、PF2、PG0、PG1、PH0、PH1。其中PF0和PF1可以直接用来脉宽调制(PMW),

14、输出方波信号。3.2 键盘模块3.2.1 矩阵键盘模块采取4*4键盘结构构造可以保证电子琴键盘趋于合理性,多功能电子琴设计过程中需要设计多种模式的按键,一般情况下,因为要按键输入16个音阶,从低音区的SO到高音区的SI。键盘设计模块主要负责对输入设备进行扫描,扫描的方法采取并列式法,具体定义过程中,每个按键的功能都可以看成其他模块的控制信号。3.1矩阵键盘原理图电子琴键盘设计过程中,通过键盘控制LM3S2110芯片内部频率实现,从而产生不同类型的音符,按键设计过程中接法起到一定的作用。在矩阵式键盘设计过程中,垂直线和水平线交互出不能直接进行连通设计,具体通过一个按键设计较好,按照此模式一个端口

15、可以产生一个4*4=16的按键。图3.2 矩阵键盘音频为分部3.2.2 独立按键模块开发板上具有4个独立按键,本次试验除了控制16个音阶外,外加了播放3首音乐与停止功能,设计更加合理化,使初学者可通过听音乐判断自己的程度。开发板从左到右KEY1为停止键,KEY2-KEY4各播放一首曲目。3.3 LCD显示模块3.3.1 1602介绍1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用。1602LCD是指显示的内容为1

16、6X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。 3.3.2管脚功能1602采用标准的16脚接口,其中: 第1脚:VSS为电源地 第2脚:VDD接5V电源正极 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。 第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。 第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。 第6脚:E(或EN)端为使能(enable)端。 第714脚:D0D7为8位双向数据端。 第1516脚

17、:空脚或背灯电源。15脚背光正极,16脚背光负极。本次试验为读模式,所以RW常置1,与vcc相连。图3.3 本次试验用到的LCD液晶显示屏3.4蜂鸣器模块设计在简易电子琴的设计过程中,音乐蜂鸣器电路模块设计显的非常重要。系统应用过程中,必须利用音乐蜂鸣器必须根据音频相应不同音阶,与音乐。具体工作中包括按键按下、工作结束、开始工作等。本次试验采取的是试验箱上的功放模块。只要选择2110的GPIO中的一个I/O口与功放模块(含功放模块、触发音乐发声、分立元件OTL功放电路、集成电路功放电路。)中蜂鸣器输入的管脚相连(并共地),给予蜂鸣器一个信号,不同音调的控制,其原理图如图3.4功放模块原理图所示

18、。图3.4试验箱功放模块原理图图3.4试验箱功放模块实物图4 系统软件设计本软件设计关键是要实现一种由嵌入式控制的简单音乐发生器,它由16个音节组成的的键盘,用户可以根据乐谱在键盘上进行演奏,音乐发生器会根据用户的弹奏,通过扬声器将音乐播放出来。也可根据选择播放出喜爱的音乐来。4.1 音乐控制4.4.1 音乐的相关知识乐音听起来有的高,有的低,这就叫音高,音高是由发音物体振动频率的高低决定的,频率高声音就高,频率低声音就低,不同音商的乐音是用C、D、E、F、G、A、B表示的,这7个字母就是乐音的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,这是唱曲时乐音的发音,所以叫唱名。音

19、持续时间的长短即时值,一般用拍数表示,休止符表示暂停发音。一首音乐是由许多不同的音符组成的,而每个音符对应着不同的频率,这样就可以利用不同频率的组合,加以与拍数对应的延时,构成音乐。4.4.2 如何用嵌入式实现音乐节拍除了音符以外,节拍也是音乐的关键组成部分。节拍实际上就是音持续时间的长短,在嵌入式系统中可以用延时来实现,如果1/4拍的延时是T/16秒,则1拍的延时是T/4秒,只要知道1/4拍的延时时间,其余的节拍延时时间就是它的陪数(T=3600ms)。如果芯片要自己播放音乐,那么必须在程序设计中考虑到节拍的设置,由于本例实现的音乐发生器是由用户通过键盘输入弹奏乐曲的,所以节拍由用户掌握,不

20、由程序控制。4.4.3 如何用嵌入式产生音频脉冲了解音乐的一些基本知识后可知,产生不同频率的音频脉冲即能产生音乐,对于嵌入式而言,产生不同频率有脉冲非常方便,可以利用它的定时/计数器来产生这样的方波频率信号,因此,需要弄清楚音乐中的音符和对应的频率,以及嵌入式定时计数的关系。在本实验中,芯片工作于6MHZ时钟频率, C调的各音符频率与计数值T的对照如下表:表3.1 C调的各音符频率音调频率(HZ)音调频率(HZ)音调频率(HZ)L1262M1523H11047L2294M2587H21175L3330M3659H31319L4349M4698H41397L5392M5784H51568L644

21、0M6880H61760L7494M7988H719764.2 软件初始化初始化对于软件或者系统来说是十分重要的。所谓初始化就是把其中的某些参数或者数值变为默认值,或者将控件调整为默认状态。系统进行将系统的所有状态和设置还原到最后备份时的样子就是初始化的过程,将软件的一些功能和设置还原到最原始的设置就是对其的初始化。因此只有将初始化做好,才能谈软件设计,本设计主要涉及的初始化除了基本的初始化步骤之外,还有输入输出、定时器、按键、LCD液晶显示、和蜂鸣器的初始化。值得一提的是在软件开发的过程中也要不断完善初始化这个步骤。4.2.1 LCD初始化首先在LCD初始化的程序中要先通过数据写入和命令写入

22、的方式以及相关的操作来初始化与其相互通讯的硬件。然后编写LCD清屏的程序和其余的子程序。最终在自己的设计中合理添加这些子程序。这样一来就完成了对于LCD液晶显示屏的初始化。初始化液晶屏时,先对寄存器的高八位和低八位分别进行设置,再设置液晶屏的显示模式,包括:颜色、坐标、图形大小等。LCD液晶屏初始化流程图如图4.1所示。图4.1 LCD_Init()子程序流程首先在LCD初始化的开始需要给RST引脚一个脉冲。 其次通过调用LCD_WRITE_CMD()函数,LCD_WRITE_DATA()函数初始化液晶屏的寄存器,使其满足功能需求。如下图4.2 LCD_WRITE_CMD()函数的时序图所示,

23、可以写出函数LCD_WRITE_CMD()的子程序。首先拉低CS和RS,通过GPIOD来传输数据位的高八位,WR经过一个上升沿,使数据的高八位写入LCD寄存器;同样在下一个时序中写入数据位的低八位,最后拉高CS和RS,整个过程即为一个16位命令子程序的编写。图4.2 LCD_WRITE_CMD()函数的时序图驱动LCD是其初始化的第一个步骤。显示驱动程序是用来允许图形库和特点的显示连接用以处理包括与显示控制器通讯和传输显示控制器所需的指令等的细节问题。显示驱动程序必须提供要设定的与显示相关的操作。显示相关的操作包括初始化程序、背光控制和对比度控制等内容。tDisplay结构体包含一些的函数指针

24、以及屏幕的宽度和高度。这种结构体由显示驱动程序提供,并同时在一个显示驱动程序特定的头文件中提供结构体的原型。以上内容的具体程序清单详见附录中的LCDFunc.c的部分。4.2.2 输入输出初始化对于不同端口的输入输出引脚,都要分别进行初始化的设置。这里提供以下最基本的GPIO初始化步骤:首先使能端口,然后设置引脚的输入或输出状态,其次设置引脚的上升沿或下降沿触发的状态,再是设置引脚的中断使能,最后是设置端口的中断使能。Stellaris(德州仪器公司提供)的外设驱动库中,详细地描述了LM3S2110的输入输出特性,并给出了其API函数的使用方式,这些API函数按其功能可以分成三个组别:处理中断

25、的API函数,配置GPIO引脚功能的API函数和访问GPIO引脚值的API函数。4.2.3 按键、蜂鸣器、LED初始化要初始化按键、蜂鸣器,首先应该使能和配置其所对应的微控制器LM3S2110上的引脚,其中将两个按键所对应的引脚(本次设计用PB4和PB5等)设置为输入状态,将蜂鸣器所对应的引脚(CCP2/PB1)与LED所对应的脚(PA4等)设置为输出状态,使能和配置完成后将蜂鸣器(CCP2/PB1)赋初值,因它们均为低电平时能,故将初值赋为全1。赋值也就是将值写入到该引脚,赋值所使用的函数是GPIOPinWrite(ulPort,ucPins,ucVal),如将全1赋值给PB3,其编写方法为

26、:GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_3,0xff)。4.2.4 定时器的初始化定时器的使用是本次设计的重中之重,所以对于它的初始化显得尤为关键。在使用通用定时器时,外设时钟必须使能,该操作通过将RCGC1寄存器中的TIMER0、TIMER1和TIMER2位置位来实现。LM3S2110对于16位单次触发/周期定时器,Timer可以被拆分为两个单独运行的16位定时/计数器,都可以被配置成带8位预分频(可选)的16位递减计数器。如果使用8位预分频功能,则相当于24位定时器。具体用法跟32位单次触发/周期定时器类似,只不过对TimerA和TimerB的操作是分

27、别独立进行的。对于16位输入边沿计数捕获,在该模式中,TimerA或TimerB被配置为能够捕获外部输入脉冲边沿事件的递减计数器。共有3种边沿事件类型:正边沿、负边沿、双边沿。该模式的工作过程是:设置装载值,并预设一个匹配值(应当小于装载值);计数使能后,在特定的CCP管脚每输入1个脉冲(正边沿、负边沿或双边沿有效),计数值就减1;当计数值与匹配值相等时,停止运行,并触发中断(如果中断已被使能)。如果需要再次捕获外部脉冲,则要重新进行配置。根据我在本次设计中的感悟对于定时器的初始化,具体来说主要要进行以下几个步骤:首先使能定时器的GPIO端口(SysCtlPeriEnable),然后配置定时器

28、功能(TimerConfigure),再然后是设置定时器的预分频值(TimerPrescaleSet),再次是设置定时器的装载值(TimerLoadSet),再是使能定时器捕获匹配中断(TimerIntEnable),随后是使能定时器中断(IntEnable),再次是使能处理器中断(IntMasterEnable),最后便是使能定时器(TimerEnable)。具体的函数使用方式和程序编写方式可以参见附录一程序清单中的main.c部分。4.3总设计流程图4.3简易电子琴总流程图5调试5.1音调调试打开“音乐播放化蝶”的程序,烧入开发板中,连接好音乐蜂鸣器模块,测试。调节模块上音量旋钮可调节音乐

29、声音大小。烧入矩阵键盘控制音频程序,刚开始矩阵键盘不按键时存在底音,之后调节模块上的电位器,可消除底音。5.2按键控制音乐停止调试问题:播放一段音乐一定要播放完毕才能跳出。不同文件中的程序无法调用。解决方法:将关于停止按键的任何定义程序都放入音乐播放文件中。音乐播放文件是通过扫描数组播放音乐的,在每次扫描数组前加入停止按键的扫描即可。5.3 LED显示音频效果调试不同的频率显示不懂的灯数,制造音频效果,8个LED灯显示16个音频(在弹琴模块中将两个音频分为一组,我们采用按键控制灯数,16个键,每两个键控制一个灯)。当播放音乐的时候,在每个音乐子程序中,监测音频控制灯的亮度。从而达到LED灯随音

30、乐跳动的效果。6结束语通过这个月的ARM课程设计,我学到了不少课本上没有的知识,也锻炼了自己的动手能力,将以前学过的零散的知识串到一起。首先在课程设计刚开始的调研阶段,我学会了怎么通过各种方式查询相关的资料。通过对这些资料的学习,我大致了解了ARM的发展现状以及未来的发展趋势,认识到目前ARM方面的各种各样的发展,和它们之间的竞争。了解了ARM方面的先进技术,这些都为我的未来的学习指明了方向。我的课程设计主要涉及硬件和软件两方面的内容,通过这些我的硬件和软件开发能力都获得了提高。首先硬件方面,基本了解了电子产品的开发流程和所要做的工作。通过开发板的设计和硬件搭建的过程,使我ARM2110实验板

31、的接口有了更深层次的理解,熟悉了一些ARM常用的外围电路引脚和连接方法,如LED数码管,键盘等。在软件方面,通过调试工具的开发,使我加深了对累封装的理解,熟悉了ARM2110内部的寄存器和编程规则,以及如何控制外围电路。 最后,感谢上海师范大学天华学院徐振老师、王永明老师、陶亚雄老师的精心指导,使我能够完成这次课程设计。7参考文献1 周立功.ARM嵌入式系统基础教程(第2版)M.北京:北京航空航天大学出版社, 20082 姚文详.ARM Cortex-M3权威指南M.北京:北京航空航天大学出版社,20093 陈明荧.8051单片机课程设计实训教材M.北京:清华大学出版社,20084 魏洪兴,周

32、亦敏.嵌入式系统设计与实例开发实验教材IIM.北京:清华大学出版社,20075 江力.单片机原理与应用技术M.北京:清华大学出版社,20076 张义和,王敏男,许宏昌等.例说51单片机(C语言版)M北京:人民邮电出版社, 20087 Luminary Micro公司.LM3S1138微控制器数据手册M.2008/20108 王福瑞等.单片微机测控系统设计大全M.北京:北京航空航天大学出版社,20079 赵星寒.从51到ARM:32位嵌入式系统入门M.北京:北京航空航天大学出版社,200810 彭伟等.单片机典型系统设计实例精讲M.北京:清华大学出版社,200911 百度百科LCD1602 12

33、论文基于ARM2110的多功能可视化电子琴设计 孔佳(作)13论文单片机16音阶电子琴 周彪平(作)附录一 LM3S2110原理电路图附录二 程序清单1buzzer.c程序清单#include buzzer.h#include #include #include #include #include #define PART_LM3S2110#include #define SysCtlPeriEnable SysCtlPeripheralEnable#define GPIOPinTypeOut GPIOPinTypeGPIOOutput/ 声明全局的系统时钟变量extern unsigned

34、long TheSysClock;/ 蜂鸣器初始化void buzzerInit(void) SysCtlPeriEnable(SYSCTL_PERIPH_TIMER1); / 使能TIMER1模块 SysCtlPeriEnable(CCP2_PERIPH); / 使能CCP3所在的GPIO端口 GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN); / 设置相关管脚为Timer功能 TimerConfigure(TIMER1_BASE, TIMER_CFG_16_BIT_PAIR | / 配置TimerB为16位PWM TIMER_CFG_A_PWM);/ 蜂鸣器发出指

35、定频率的声音/ usFreq是发声频率,取值 (系统时钟/65536)+1 20000,单位:Hzvoid buzzerSound(unsigned short usFreq) unsigned long ulVal; if (usFreq 20000) buzzerQuiet(); else GPIOPinTypeTimer(CCP2_PORT, CCP2_PIN); / 设置相关管脚为Timer功能 ulVal = TheSysClock / usFreq; TimerLoadSet(TIMER1_BASE, TIMER_A, ulVal); / 设置TimerB初值 TimerMatch

36、Set(TIMER1_BASE, TIMER_A, ulVal / 2); / 设置TimerB匹配值 TimerEnable(TIMER1_BASE, TIMER_A); / 使能TimerB计数 / 蜂鸣器停止发声void buzzerQuiet(void)TimerDisable(TIMER1_BASE, TIMER_A); / 禁止TimerB计数 GPIOPinTypeOut(CCP2_PORT, CCP2_PIN); / 配置CCP3管脚为GPIO输出 GPIOPinWrite(CCP2_PORT, CCP2_PIN,0x00); / 使CCP3管脚输出低电平2 music.c程序

37、#include music.h#include buzzer.h#include systemInit.h#define KEY_PERIPH1 SYSCTL_PERIPH_GPIOH#define KEY_PORT1 GPIO_PORTH_BASE#define KEY_PIN1 GPIO_PIN_1/ 定义LED#define LED1_PERIPH SYSCTL_PERIPH_GPIOA#define LED1_PORT GPIO_PORTA_BASE#define LED1_PIN GPIO_PIN_4#define LED2_PERIPH SYSCTL_PERIPH_GPIOA#d

38、efine LED2_PORT GPIO_PORTA_BASE#define LED2_PIN GPIO_PIN_5#define LED3_PERIPH SYSCTL_PERIPH_GPIOA#define LED3_PORT GPIO_PORTA_BASE#define LED3_PIN GPIO_PIN_6#define LED4_PERIPH SYSCTL_PERIPH_GPIOG#define LED4_PORT GPIO_PORTG_BASE#define LED4_PIN GPIO_PIN_0#define LED5_PERIPH SYSCTL_PERIPH_GPIOF#defi

39、ne LED5_PORT GPIO_PORTF_BASE#define LED5_PIN GPIO_PIN_2#define LED6_PERIPH SYSCTL_PERIPH_GPIOG#define LED6_PORT GPIO_PORTG_BASE#define LED6_PIN GPIO_PIN_1#define LED7_PERIPH SYSCTL_PERIPH_GPIOE#define LED7_PORT GPIO_PORTE_BASE#define LED7_PIN GPIO_PIN_0#define LED8_PERIPH SYSCTL_PERIPH_GPIOE#define

40、LED8_PORT GPIO_PORTE_BASE#define LED8_PIN GPIO_PIN_1const tNote MyScore = L5, T/10, L6, T/10, L7, T/10, M1, T/10, M2, T/10, M3, T/10, M4, T/10, M5, T/10, M6, T/10, M7, T/10, H1, T/10, H2, T/10, H3, T/10, H4, T/10, H5, T/10, H6, T/10, H7, T/10, 0, 0 / 结束;const tNote MyScore1 =L3, T/4, 0, 0; const tNo

41、te MyScore2 =M5,T/8,0,0;const tNote MyScore3 =M5,T/16,0,0;void musicPlay(int i) buzzerSound(MyScorei.mName); SysCtlDelay(MyScorei.mTime * (TheSysClock / 3000); SysCtlDelay(10 * (TheSysClock / 3000);void musicPlayy(void) SysCtlPeriEnable(KEY_PERIPH1); / 使能KEY所在的GPIO端口 GPIOPinTypeIn(KEY_PORT1, KEY_PIN

42、1); / 设置KEY所在管脚为输入 short i = 0; for (;) if ( GPIOPinRead(KEY_PORT1, KEY_PIN1) = 0x00) / 如果按下KEY1 break; else if (MyScore1i.mTime = 0) break; else if(MyScore2i.mName = M1) / 点亮1个LED GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); GPIOPinWrite(LED2_PORT, LED2_PIN, 0xFF); GPIOPinWrite(LED3_PORT, LED3_PIN, 0xF

43、F); GPIOPinWrite(LED4_PORT, LED4_PIN, 0xFF); GPIOPinWrite(LED5_PORT, LED5_PIN, 0xFF); GPIOPinWrite(LED6_PORT, LED6_PIN, 0xFF); GPIOPinWrite(LED7_PORT, LED7_PIN, 0xFF); GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF); / 点亮7个LED GPIOPinWrite(LED1_PORT, LED1_PIN, 0x00); / 点亮LED GPIOPinWrite(LED2_PORT, LED2_PIN

44、, 0x00); / 点亮LED GPIOPinWrite(LED3_PORT, LED3_PIN, 0x00); / 点亮LED GPIOPinWrite(LED4_PORT, LED4_PIN, 0x00); / 点亮LED GPIOPinWrite(LED5_PORT, LED5_PIN, 0x00); / 点亮LED GPIOPinWrite(LED6_PORT, LED6_PIN, 0x00); / 点亮LED GPIOPinWrite(LED7_PORT, LED7_PIN, 0x00); / 点亮LED GPIOPinWrite(LED8_PORT, LED8_PIN, 0xFF

45、); / 熄灭LED buzzerSound(MyScore1i.mName); SysCtlDelay(MyScore1i.mTime * (TheSysClock / 3000); i+; buzzerQuiet(); SysCtlDelay(10 * (TheSysClock / 3000); 3 systemInit.c程序#include systemInit.h/ 定义全局的系统时钟变量unsigned long TheSysClock = 12000000UL;/ 系统时钟初始化void clockInit(void) SysCtlLDOSet(SYSCTL_LDO_2_50V)

46、; / 设置LDO输出电压 SysCtlClockSet(SYSCTL_USE_OSC | / 系统时钟设置 SYSCTL_OSC_MAIN | / 采用主振荡器 SYSCTL_XTAL_6MHZ | / 外接6MHz晶振 SYSCTL_SYSDIV_1); / 不分频 TheSysClock = SysCtlClockGet(); / 获取当前的系统时钟频率4主程序清单#include systemInit.h#include buzzer.h#include music.h#include systemInit.h#define lcden GPIO_PIN_0 /PB0;#define

47、lcdrs GPIO_PIN_2 /PB2;/ 定义LED#define LED1_PERIPH SYSCTL_PERIPH_GPIOA#define LED1_PORT GPIO_PORTA_BASE#define LED1_PIN GPIO_PIN_4#define LED2_PERIPH SYSCTL_PERIPH_GPIOA#define LED2_PORT GPIO_PORTA_BASE#define LED2_PIN GPIO_PIN_5#define LED3_PERIPH SYSCTL_PERIPH_GPIOA#define LED3_PORT GPIO_PORTA_BASE#

48、define LED3_PIN GPIO_PIN_6#define LED4_PERIPH SYSCTL_PERIPH_GPIOG#define LED4_PORT GPIO_PORTG_BASE#define LED4_PIN GPIO_PIN_0#define LED5_PERIPH SYSCTL_PERIPH_GPIOF#define LED5_PORT GPIO_PORTF_BASE#define LED5_PIN GPIO_PIN_2#define LED6_PERIPH SYSCTL_PERIPH_GPIOG#define LED6_PORT GPIO_PORTG_BASE#def

49、ine LED6_PIN GPIO_PIN_1#define LED7_PERIPH SYSCTL_PERIPH_GPIOE#define LED7_PORT GPIO_PORTE_BASE#define LED7_PIN GPIO_PIN_0#define LED8_PERIPH SYSCTL_PERIPH_GPIOE#define LED8_PORT GPIO_PORTE_BASE#define LED8_PIN GPIO_PIN_1/ 定义KEY#define KEY_PERIPH2 SYSCTL_PERIPH_GPIOB#define KEY_PORT2 GPIO_PORTB_BASE

50、#define KEY_PIN2 GPIO_PIN_6|GPIO_PIN_5|GPIO_PIN_4/连接方式 矩阵键盘的行线接PC47 列线接PA03unsigned char data; /PD0-PD7;unsigned char num;int guan;int jian;int numm;/lcd显示模块技术/lcd模块void write_com(unsigned char com) /写命令 GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0x00); / lcdrs=0; GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPI

51、O_PIN_1|GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,com);/PD=com;SysCtlDelay(5 * (TheSysClock / 4000); / 延时 5msGPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF); / lcden=1; SysCtlDelay(5 * (TheSysClock / 4000); GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00); / lcden=0; void write_data(unsign

52、ed char date)GPIOPinWrite(GPIO_PORTB_BASE,lcdrs,0xFF); / lcdrs=1;GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7,date);/PD=date; SysCtlDelay(5 * (TheSysClock / 4000); GPIOPinWrite(GPIO_PORTB_BASE,lcden,0xFF); / lcden=1; SysCtlDela

53、y(5 * (TheSysClock / 4000); GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00); / lcden=0;void init()SysCtlPeriEnable(SYSCTL_PERIPH_GPIOD); /使能A端口 GPIOPinTypeOut(GPIO_PORTD_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2| GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); SysCtlPeriEnable(SYSCTL_PERIPH_GPIOB); G

54、PIOPinTypeOut(GPIO_PORTB_BASE, GPIO_PIN_0|GPIO_PIN_2); GPIOPinWrite(GPIO_PORTB_BASE,lcden,0x00); / lcden=0; write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01); / 在开始清屏write_com(0x80+0x10); /数据指针地址/lcd模块结束,矩阵键盘模块开始 unsigned char KeyScan(void) if (GPIOPinRead(KEY_PORT2, KEY_PIN2) = 0x30) / 如果按下KEY2 num=17; return num;

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!