ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:274.19KB ,
资源ID:19882520      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/19882520.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(通信工程专业课程设计基于SEP3203的电子琴模型文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

通信工程专业课程设计基于SEP3203的电子琴模型文档格式.docx

1、调试过程中,需要查看按键的状态,需要查看是否正确检测到了按键,是否能够给出正确的键码,所以增加了这一功能。功能描述:利用LED数码管,显示按下的按键。2、总体设计2.1基本功能使用的模块第一部分包括两个主要软件模块和两个外围的硬件模块:2.2加入附加功能之后的模块组成加入第二部分后的框图如下:增加了一个新的程序模块和硬件模块。程序运行的流程如下:第二部分是对第一部分的完善和改进,但是在程序执行的流程中,仅仅在处理键码信息步骤,增加了“根据键码控制点亮数码管”这一部分。3、可行性分析该系统包含了输入、处理、输出三个部分。其中,输入即为按键,使用矩阵键盘完成,实际的电子琴键盘含有更多的按键,但由于

2、这仅仅是模型,所以,不需要使用那么多的按键。处理部分是基于SEP3203的程序,通过输入的按键信息,修改寄存器的相应位,使得最终能够输出相应的PWM波,控制蜂鸣器响。此外,还可以根据输入的按键信息,将输入的按键值显示在LED七段数码管上。输出即为蜂鸣器和LED数码管,硬件电路已经在实验箱上连接好。4、详细设计与分工日志4.1.1 器件原理采用矩阵键盘,矩阵键盘有两种驱动方式:一种是行扫描法,另一种是高低电平翻转法。这里采用了行扫描法。包括两个步骤:判断键盘中有无键按下:将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根

3、行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。判断闭合键所在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。4.1.2 相关代码键盘中断的调用:void keyhandler(void) / 键盘中断处理函数 mask_irq(INT_EXT15); / 屏蔽键盘中断 / 找到哪个键被按下,并打印 findkey(); unmask_irq(INT_EXT15); / 打

4、开键盘中断 /这里的键盘中断处理的不仅仅是打印键值, /还包括了重置PWM波发出的寄存器.寻找被按下的按键:void findkey(void) U32 KEYTIME = 0x100000; U32 KEYTIME2 = 0x10000; U32 dly = 0; U16 intstatus; U8 col, row; / 清除garfield中断源 *(RP)PORTH_INTRCLR |= 0x8; / 记录下中断状态值,用于判断行地址 intstatus = rucb(0x62); wucb(0x60, 0); /屏蔽UCB中断 if (!(intstatus & KEY_ROW_MA

5、SK) wucb(0x60, KEY_ROW_MASK); return; wucb(0x62, KEY_ROW_MASK); row = intstatus & KEY_ROW_MASK; int i; for(i = 0; i KEY_ROW_NUM; i+) if(row & (1= 1; key_code = key_code_maprowcol; /利用行列取得键码 b=b_code_maprowcol; l=l_code_maprowcol; pwm(); led(); if (key_code) /排除无效按键 wucb(0x5a, 0); /所有的列线置0 while (ruc

6、b(0x5a) & intstatus) = 0) /按键还未抬起 int i; if (dly+ = 0) for (i = 0; KEYTIME; i +); / 在等待较长时间后,打印键值 DBG_Printf(key = %cn, key_code); else KEYTIME2; / 下一次的判断周期 wucb(0x5a,0x0); / 再次ucb行清除中断状态,因为判断 wucb(0x62,KEY_ROW_MASK);4.2发声器件4.2.1 PWM波输出原理发声器件即为蜂鸣器,通过控制输出的PWM波的波形来控制发出的声音。PWM波包括两个参数:频率和占空比。控制频率,可以控制发出

7、声音的频率;控制占空比,可以控制声音的响度。在所用开发板GE01中,PWM 模块中包含了2 个PWM 通道,彼此相互独立。相关寄存器:地址寄存器名称宽度描述复位值0x1000c000PWMC(TCTL)32PWM_1控制寄存器0000_40000x1000c004PWMS(TPRER)PWM_1采样寄存器0000_00000x1000c008PWMP(TCMP)PWM_1周期寄存器0000_FFFE0x1000c00cPWMCNT(TCR)PWM_1计数器寄存器高16位为保留位bit15中断请求状态(0 = FIFO 满、1 = FIFO 不满)bit14中断请求使能 (0 = 不使能(缺省)

8、、1 = PWM 中断使能)bit 13FIFO 有效状态(0 = FIFO 满、1 = FIFO 不满)bit 12 PWM 使能 (0 = PWM 不使能、1 = PWM 使能)bit 1110 选择playback 模式下采样被重放的次数(00 = 没重复,01 = 播放两次、10 = 重复3 次(播放4次)、11 = 重复7 次(播放8次)bit 90 (PRESCALER)用来提供分频因子的(prescaler+1),对系统时钟进行分频。缺省值是0。1 = 2 分频、2 = 4 分频Bit 150 PWMS 采样值 PWM 采样寄存器是FIFO 的输入。此值和一个自由计数的计数器比较

9、。当大于计数器值时PWM 输出为高,反之输出为低。bit15-0 Period 值/定时值 在tone 模式时,其用于设置计数器的复位值。计数器计数到此值就复位一次,PWM 输出也相应翻转一次。bit15-0 当前的计数值 它保存着自由计数的计数器的当前值。依据上述寄存器各位的功能,通过合适的赋值便可以实现本实验所要求的基本功能。主函数:int main(void) if(E_OK != ModulePwm()error in pwm labn);success in pwm labn while(1); return 1;STATUS模块初始化STATUS ModulePwm(void) /

10、* system initialized */ system_init(); /* 固定周期发音实验 */ #ifdef FIX_LAB sample = 0X5555DDDD; if(E_OK != set_fix() return E_CTX; #endif /* 设置周期发音实验 */ #ifdef UNFIX_LAB= set_unfix(0Xf0) run_pwm(); return E_OK;STATUS set_fix(void)#ifdef GE01MB *(RP)(PWM2_P) = 0X0000FFFE;#else *(RP)(PWM1_P) = 0X0000FFFE;#e

11、ndifSTATUS set_unfix(U8 prescaler) *(RP)(PWM2_C) = 0X00001c00 | (U32)prescaler; *(RP)(PWM1_C) = 0X00001c00 | (U32)prescaler;void run_pwm(void)#ifdef FIX_LAB #ifdef GE01MB *(RP)(PWM2_C) |= 0X00001CFF; while(1) *(RP)(PWM2_S) = 0X0000FFFF&sample; *(RP)(PWM2_S) = sample16; #else *(RP)(PWM1_C) |= 0X00001

12、CFF; *(RP)(PWM1_S) = 0X0000FFFF& *(RP)(PWM1_S) = sample#endif #ifdef UNFIX_LAB *(RP)(PWM2_P) = 0X00008ffe; *(RP)(PWM1_P) = 0X00008ffe; return ;4.3 LED显示4.3.1 动态显示原理图 十二动态显示LED的连接由图,六个数码管每个都有一个选择信号,当置“1”时,该数码管的相关段亮。对于此动态显示电路,有六个数码管,使用的频率由定时器产生,为500Hz,即周期为2ms。此外,将每个数码管相同的段连在一起到段数据线上。在第一个2ms,第一个数码管允许点亮

13、,同时,需要点亮的段置“1”,在这2ms内,只有第一个数码管亮。在第二个2ms,第二个数码管允许点亮,同时,需要点亮的段置“1”,在这2ms内,只有第二个数码管亮如此,每个2ms只有一个数码管亮,所以,不会相互影响,导致显示不清。而且,由于每个数码管刷新的周期非常小,本实验中为12ms,小于人眼的分辨时间。所以,看起来,好像同时亮了。4.3.2 定时器输出如图,定时器用到的IO端口位置如下:TIMER 是片内集成的 32bit 定时器,该模块共包括4个通道,每个通道包括一个 32 位计数器,以及一个加载计数寄存器。计数器的重新加载、计数使能以及中断的产生受到控制寄存器的各个控制位的控制。定时器

14、的工作原理是:首先要设定定时器的初值,然后启动定时器。一旦启动,定时器就从初值开始累计增加或减小(在实验所用的芯片中是递减)。每增加或减小一个数需要特定的时间,这个特定的时间是累加指令的机器周期,是由处理器的晶振的频率(本实验中晶振的频率是75MHz)决定的。计数值从初值计至 0 时,TIMER 模块发出中断,然后计数器跳至用户配置的值,重复递增或递减过程。在中断寄存器允许的情况下处理器响应中断,通过中断服务程序执行特定的任务。TIMER中的一个通道的功能结构如下图:TIMER 有两种工作模式:正常工作模式 TIMER 在正常工作模式时,当通道使能后计数器锁存加载计数寄存器的值,然后在系统时钟

15、的驱动下递减计数。当计数到零时,产生一个计数到零的标志用于设置相应的中断标志位,若中断未被屏蔽则产生中断;同时,计数器重新锁存加载计数寄存器的值开始一个新的计数周期。自由工作模式 TIMER 在自由工作模式时,当通道使能后计数器锁存加载计数寄存器的值,然后在系统时钟的驱动下递减计数。同时,计数器加载数据 32H FFFFFFFF 开始一个新的计数周期。TIMER 中四个通道的中断都可以通过各自的控制寄存器屏蔽。任意一个通道计数完毕都会产生一个中断。TIMER 的中断输出是四个中断源的线或。查询中断源有两种方法:(一)查询各个通道的中断屏蔽状态寄存器是否被置 1;(二)查询 TIMER中断屏蔽状

16、态寄存器,看各个通道相应位是否被置 1。清除中断的方法也有两种:(一)读各个通道的中断状态清除寄存器,相应通道的中断会被清除;(二)读 TIMER 中断状态清除寄存器,所有通道的中断都会被清除。查询到中断源后,如果不重新配置加载计数寄存器,计数器会按照原来的配置继续计数,直到计数完毕再发出中断。如果要重新配置,清完中断后应该先将计数器关闭(disable) ,然后配置新的计数值,再将计数器打开(enable)。4.3.3 相关寄存器名称读/写0x10003000T1LCRR/W通道1加载计数寄存器32b00x10003004T1CCRR通道1当前计数值寄存器0x10003008T1CRW/R通

17、道1控制寄存器0x1000300CT1ISCR通道1中断状态清除寄存器0x10003010T1IMSR通道1中断屏蔽状态寄存器0x10003014T2LCR通道2加载计数寄存器0x10003018T2CCR通道2当前计数值寄存器0x1000301CT2CR通道2控制寄存器0x10003020T2ISCR通道2中断状态清除寄存器0x10003024T2IMSR通道2中断屏蔽状态寄存器0x10003028T3LCR通道3加载计数寄存器0x1000302CT3CCR通道3当前计数值寄存器0x10003030T3CR通道3控制寄存器0x10003034T3ISCR通道3中断状态清除寄存器0x10003

18、038T3IMSR通道3中断屏蔽状态寄存器0x1000303CT4LCR通道4加载计数寄存器0x10003040T4CCR通道4当前计数值寄存器0x10003044T4CR通道4控制寄存器0x10003048T4ISCR通道4中断状态清除寄存器0x1000304CT4IMSR通道4中断屏蔽状态寄存器0x100030A0TIMSRTIMER中断屏蔽状态寄存器0x100030A4TISCRTIMER中断状态清除寄存器0x100030A8TISRTIMER中断状态寄存器调用LED显示:int led(void) char *s1,*s2,*s3; s1=There is no LED on GE00

19、n; s2=Error in Led lab!n s3=Succeeded in Led lab! #ifdef GE00 DBG_Printf(s1); return; #else = ModuleLed() /PRINT(s2); else /PRINT(s3); DBG_Printf(/while(1);/return E_OK;LED显示模块:STATUS ModuleLed(void) / 系统初始化 /* GPIO initialized */ GPIO_Init(); /* led lab body */ if(key_code=1) LedDisPlay(display1);

20、/ 显示用户设定的内容2 LedDisPlay(display2);3) LedDisPlay(display3);4 LedDisPlay(display4);5 LedDisPlay(display5);6 LedDisPlay(display6);7 LedDisPlay(display7);8 LedDisPlay(display8);9 LedDisPlay(display9);LED显示程序:void LedDisPlay(U8 data) U8* SegData; / 十六进制数字翻译成7段译码值 Hex2Seg(data, SegData); LedOut(SegData,10

21、); / 在led上显示翻译码值Void Hex2Seg (U8 hexdata, U8 * p) int i; for (i=0;i9;i+) / 将要显示的数值,通过查找7段译码表翻译成码值 *p+ = SEGMENThexdatai;LED输出void LedOut(U8 data,U32 times) int Segment_i,Bit_i,i; U8 Segment_Data; U8 tempData; for(i = 0; times; for (Bit_i = 0; Bit_i 8 ;Bit_i+) / 依次串行导入八个led的显示内容 / 获得一个led显示的码值 Segment_Data=*(data +Bit_i ); / 将7段译码值依次串行输入到GPIO口中 for (Segment_i = 0; Segment_i Segment_i) & 0x1; / 写入74HC595的输入端,同时拉低PD3 *(RP)PORTD_

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1