《电子琴设计报告.wps》由会员分享,可在线阅读,更多相关《电子琴设计报告.wps(17页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、课程设计要求一、课程设计要求设计基于 55 单片机的电子琴电路,用 C/OS-II 操作系统的移植代码。设计的电子琴可以有如下功能:1、可以完成弹奏和演奏两种功能2、按下弹奏按键可以开始弹奏,按某个按键就能发出相应音调的声音。3、按下演奏按键时就开始自动弹奏(生日歌)歌曲。二、系统方案论证二、系统方案论证为实现各模块的功能,分别做了几种不同的设计方案并进行了论证。1、控制器 采用 AT89C55 单片机作为主控芯片。优点:AT89C55 作为一种比较成熟的单片机型号,广泛的应用于各领域技术比较熟练,价格相对比较便宜。并且与 51 有相同的内核,熟悉程度深,操作快捷方便,可以直接用窗口下载程
2、序,便于程序下载调试。2、琴弦方案一:矩阵键盘 利用 8 个 IO 口得到 8 个按键,可使操作界面变得简单,接线也相对短。方案二:铜线 利用铜线焊接成琴弦虽然使软件简洁,程序扫描快,效率更高是仿古而制,具有弹琴的味道但是不容易焊接和连线,会占据较多的空间,所以我们选择方案一。3、音频部分方案一:三极管喇叭 该方案便于调试,音质相对较好,但相对而言接线较为复杂。关键在三极管的设计但不是很稳定。方案二:蜂鸣器虽然声音有点难听,但是接线简单,价格低廉。整体电路简单,为了较好的音质,选择方案一。三、系统硬件电路设计三、系统硬件电路设计 1、基本原理 本设计基于单片机技术原理,以单片机芯片 AT89C
3、55 作为核心控制器,通过硬件电路的制作以及软件程序的编制,设计制作出一个电子琴系统。整个设计包括两大部分:硬件部分和软件部分。硬件部分以单片机为核心,配以所需的外围模块设计;软件部分主要利用 keil和 proteus 的联合编程达到硬件电路的设计要求。另外还需要 C/OS-II 操作系统的移植代码。该电子琴主要由键盘模块,弹奏和演奏转换按键模块,发生电路模块以及单片机的扩展模块组成。本设计以硬件软件为指导思想,充分发挥单片机功能,大部分功能通过软件编程来实现,电路简单明了,系统稳定性高。2、单片机 AT89C55 介绍 *主要性能参数:与 MCS-51 产品指令和引脚完全兼容 20K 字节
4、可重擦写 Flash 闪速存储器 1000 次擦写周期1 全静态擦写周期:0Hz33Hz 三级加密程序存储器 256*8 字节内部 RAM 32 个可编程 I/O 口线 三个 16 位定时/计数器 8 个中断源 低功耗空闲和掉电模式 *功能特性概述:这个 AT89C55 的是一种低功耗,高性能 8 位 CMOS 单片机,具有 20K 字节可重擦写 Flash闪速存储器,该设备是采用 Atmel 的高密度非易失性内存技术,并与业界标准 80C51 指令集和引脚兼容,片上闪存程序存储器可重新编程的系统或由传统的非易失性内存编程通过将通用的 8 位 CPU 与 Flash 在 monolithicc
5、hip 芯片,AT89C55 是一个强大的微型计算机提供了一个高度灵活和成本有效地解决许多嵌入式控制应用。*引脚配置:图一 AT89C55 芯片图*引脚说明:Vcc:电源供电 GND:地 P0 口:P0口是一个8位漏极开路的双向I/O口。作为输出口,每位能驱动8个TTL逻辑电平。对P0端口写“1”时,引脚用作高阻抗输入。当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。在这种模式下,P0具有内部上拉电阻。在 flash编程时P0口也用来接收指令字节;在程序校验时,输出指令字节。程序校验时,需要外部上拉电阻。P1 口:P1 口是一个具有内部上拉电阻的8 位双向I/O 口,p1 输
6、出缓冲器能驱动4 个TTL 逻辑电平。对P1 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX),具体如表一所示。2 表一 在flash编程和校验时,P1口接收低8位地址字节。P2口:P2 口是一个具有内部上拉电阻的8 位双向I/O 口,P2 输出缓冲器能驱动4 个TTL 逻辑电平。对P2 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引
7、脚由于内部电阻的原因,将输出电流(IIL)。在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX DPTR)时,P2 口送出高八位地址。在这种应用中,P2 口使用很强的内部上拉发送1。在使用8位地址(如MOVX RI)访问外部数据存储器时,P2口输出P2锁存器的内容。在flash编程和校验时P2口也接收高8位地址字节和一些控制信号。P3 口:P3 口是一个具有内部上拉电阻的8 位双向I/O 口,p2 输出缓冲器能驱动4 个TTL 逻辑电平。对P3 端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(I
8、IL)。P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。表二 P3口功能表在 flash 编程和校验时,P3 口也接收一些控制信号。RST:复位输入。关于这两个机器周期针高,而振荡器运行重置设备。ALE:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8 位地址的输出脉冲。在flash编程时,此引脚也用作编程输入脉冲。在一般情况下,ALE 以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,特别强调,在每次访问外部数据存储器时,ALE脉冲将会跳过。如果需要,通过将地址为8EH的SFR的第0位置“1”,ALE操作将无效。这一位置“1”,ALE 仅在执行
9、MOVX 或MOVC指令时有效。否则,ALE 将被微弱拉高。这个ALE 使能标志位(地址为8EH的SFR的第0位)的设置对微控制器处于外部执行模式下无效。:程序存储允许()输出是外部程序存储器的读选通信号,当 AT89C52 由外部程序存储器取指令(或数据)时,每个机器周期两次有效,即输出两个脉冲。在3此期间,当访问外部数据存储器,将跳过两次信号。:外部访问允许。欲使 CPU 仅访问外部程序存储器(地址为 0000HFFFFH)端必须保持低电平(接地)。需注意的是:如果加密位被编程,复位时内部会锁存 EA端状态。如 EA 端为高电平(接 Vcc 端),CPU 则执行内部程序存储器中的指令。Fl
10、ash 存储器编程时,该引脚加上+12V 的编程允许电源 Vpp,当然这必须是该器件是使用 12V编程电压 Vpp。XTAL1:振荡器反相放大器及内部时钟发生器的输入端。XTAL2:振荡器反相放大器的输出端。用户软件写入 1 秒不应该对这些非上市地点,因为它们可用于未来的产品援引新功能。在这种情况下,重置或新位无效值将始终为 0。定时器 2:控制和状态位载于登记 T2CON(见表 2)和 T2MOD(见表 4 定时器 2)。登记册对(RCAP2H,RCAP2L 的)是捕捉/定时器 2 装入寄存器的 16 位捕捉模式或 16 位自动重载模式。3、74LS373 简介74ls373 是常用的地址锁
11、存器芯片,它实质是一个是带三态缓冲输出的 8D 触发器,在单片机系统中为了扩展外部存储器,通常需要一块 74ls373 芯片。当 74LS373 用作地址锁存器时,应使 OE 为低电平,此时锁存使能端 C 为高电平时,输出 Q0Q7 状态与输入端 D1D7状态相同;当 C 发生负的跳变时,输入端 D0D7 数据锁入 Q0Q7。51 单片机的 ALE 信号可以直接与 74LS373 的 C 连接。在 MCS-51 单片机系统中,常采用 74LS373 作为地址锁存器使用,其连接方法如上图所示。其中输入端 1D8D 接至单片机的 P0 口,输出端提供的是低 8 位地址,G 端接至单片机的地址锁存允
12、许信号 ALE。输出允许端 OE 接地,表示输出三态门一直打开。图二 74LS373 芯片图4、6264 简介 Intel 6264 的容量为 8KB,是 28 引脚双列直插式芯片,采用 CMOS 工艺制造 A12A0(address inputs):地址线,可寻址 8KB 的存储空间。D7D0(data bus):数据线,双向,三态。4 OE(output enable):读出允许信号,输入,低电平有效。WE(write enable):写允许信号,输入,低电平有效。CE1(chip enable):片选信号 1,输入,在读/写方式时为低电平。CE2(chip enable):片选信号 2,
13、输入,在读/写方式时为高电平。VCC:+5V 工作电压。GND:信号地。Intel 6264 的操作方式由 OE,WE,CE1,CE2 的共同作用决定 写入:当 WE 和 CE1 为低电平,且 OE 和 CE2 为高电平时,数据输入缓冲器打开,数据由数据线 D7D0 写入被选中的存储单元。读出:当 OE 和 CE1 为低电平,且 WE 和 CE2 为高电平时,数据输出缓冲器选通,被选中单元的数据送到数据线 D7D0 上。保持:当 CE1 为高电平,CE2 为任意时,芯片未被选中,处于保持状态,数据线呈现高阻状态。图三 626 芯片图5、各模块电路图键盘模块 图四 键盘模块电路图5弹奏和演奏转换
14、按键模块 图五 弹奏和演奏转换按键电路图发生电路模块 图六 单片机发生电路模块电路图单片机扩展模块 图七 单片机扩展模块电路图6四、系统软件设计四、系统软件设计 1、主要部分流程图 图九 代码移植后的文件开始Zi_zou=1?Tan_zou=1?Zi_zou=1tan_zou=1Song();播放歌曲Key_san()键扫Sound(),判断按键播放音调结束 图八 主要流程图2、程序(主程序见附录)C/OS-II 操作系统中代码移植后的程序包括如下图所示的文件7五、软件调试及分析五、软件调试及分析 1、keil 调试成功的截图 图十 keil 调试成功图2、prtoteus 中的仿真图 图十一
15、 protues 仿真图六、实物的组装与调试六、实物的组装与调试 1、实物照片 图十二 电子琴实物照片8 2、中途遇到的问题及解决方案我们按照焊接的要求依照原理图完成电路板的焊接后,逐个检测各个模块的的工作情况。结果发现了一下几点问题,最后通过我们的修改调试通过,最终完成了实物的设计。刚开始只编出了单片机的电子琴程序,然后就碰到了非常的棘手的在 C/OS-II 操作系统中代码移植问题,不论怎么修改始终就是错误,这期间我们组都快崩溃了,但是最后通过老师和同学的帮助还是移植成功了。从中也对代码移植有了初步的认识,对以后的学习有很大帮组的。在焊接的过程中也有问题,由于电路连线较复杂,单片机要扩展,连
16、线多,一不小心就焊接错了,然后浪费时间去检查,但是最后焊接总算是成功的。通过上述调试过程我们发现亲自动手做的必要性。实践才是硬道理。七、心得体会七、心得体会 通过本次课程设计,让我对单片机专业课程的学习有了更加浓厚的兴趣。更值得一提的是,本次课程设计的完美收场,为我以后的设计生活奠定了充足的信心,让我更有动力去尝试一些原本不自信的设计,让我真正体会到了理论联系实际的重要性和愉悦性。众所周知,纯粹的理论学习是乏味的、空闲的,只有把理论运用到我们的实际生活中那样我们才可以找到学习的兴趣,才能更好的促进我们的学习。总之:实践才是硬道理。我想课程设计的目的不外乎让我们在实践中更好的理解和掌握理论知识。
17、所以课程设计是很必要的,对于每次课程设计我们都应该很认真的去对待,这次的课程设计又让我们学到书本上没学的知识,关于代码移植的知识,这对我们以后的学习和工作都会很有帮助的。同时,本次课程设计让我们又一次亲身体会到团队的力量。不仅仅是本次课程设计,近点包括我们的学习生活,远点包括我们的工作生活。团队精神的重要性得到了一次又一次的诠释。一个人的力量是有限的,但是如果把几个人的力量成线性或者成指数的叠加在一起,将会是多么惊人的一股力量!虽然这个道理大家都懂,但是我们是否能最大限度的发挥一个团队应用的实力就给我们的人际交往和处事能力提了一个不小的要求。9附录附录1、电路图2、程序#include#inc
18、lude#define uchar unsigned char#define uint unsigned int/*/*mytest system timer initial#define TIME_10mS (OS_TICKS_PER_SEC/100)#define TIME_50mS (OS_TICKS_PER_SEC/20)#define TIME_100mS (OS_TICKS_PER_SEC/10)#define TIME_200mS (OS_TICKS_PER_SEC/5 )#define TIME_500mS (OS_TICKS_PER_SEC/2 )#define TIME_1
19、S (OS_TICKS_PER_SEC)#define TIME_2S (OS_TICKS_PER_SEC*2)#define TIME_3S (OS_TICKS_PER_SEC*3)#define TIME_4S (OS_TICKS_PER_SEC*4)#define TIME_5S (OS_TICKS_PER_SEC*5)/*/*mytest system crystalloid#define XA_CRYSTAL_FREQ (INT32U)(11059200L)/*/*SCR crystalloid#define CFG_SCR_4 SCR&0 x03#define CFG_SCR_16
20、SCR&0 x07#define CFG_SCR_64SCR&0 x0B10#define OS_CFG_SCRCFG_SCR_4/*/*mytest system#define TASK_STK_SIZE 100/*64 unsigned char#define NUMBER_TASKS 20 /*/*mytest task stack define/OS_STK xdata AnPrintfStkTASK_STK_SIZE;/在创建任务的同时,任务堆栈即被创建/OS_STK xdata BnPrintfStkTASK_STK_SIZE;OS_STK xdata key_scanTASK_S
21、TK_SIZE;OS_STK xdata zi_zouTASK_STK_SIZE;/*/*OS_EVENTOS_EVENT xdata*AnPrintfWait;/声明事件指针变量OS_EVENT xdata*BnPrintfWait;/sfr AUXR=0X8E;sbit BEEP=P10;sbit zi_zou_flag=P17;sbit tan_zou_flag=P16;uchar time;uchar th0_f;/在中断中装载的 T0 的值的高 8 位uchar tl0_f;/在中断中装载的 T0 的值的低 8 位/*INT8U xdata OSCtxSwCtrMax;/INT8U
22、xdata AnPrintfData =louxiaoxiao1rn;/INT8U xdata BnPrintfData =louxiaoxiao2rn;unsigned char code yuepu=5,1,1,5,1,1,6,1,2,5,1,2,1,2,2,7,1,4,5,1,1,5,1,1,6,1,2,5,1,2,2,2,2,1,2,4,5,1,1,5,1,1,5,2,2,3,2,2,1,2,2,7,1,2,6,1,2,4,2,1,4,2,1,3,2,2,1,2,2,2,2,2,1,2,4;/祝你生日快乐乐谱unsigned char code TH_0=0 xF2,0 xF3,0 x
23、F5,0 xF5,0 xF6,0 xF7,0 xF8,0 xF9,0 xF9,0 xFA,0 xFA,0 xFB,0 xFB,0 xFC,0 xFC,0 xFC,0 xFD,0 xFD,0 xFD,0 xFD,0 xFE,0 xFE,0 xFE,0 xFE,0 xFE,0 xFE,0 xFE,0 xFF;/28 个音阶高八位频率表装进定时器高八位unsigned char code TL_0=0 x42,0 xC1,0 x17,0 xB6,0 xD0,0 xD1,0 xB6,0 x21,0 xE1,0 x8C,0 xD8,0 x68,0 xE9,0 x5B,0 x8F,0 xEE,0 x44,
24、0 x6B,0 xB4,0 xF4,0 x2D,0 x47,0 x77,0 xA2,0 xB6,0 xDA,0 xFA,0 x16;/28 个音阶低八位频率表装进定时器低八位unsigned char code tone=115,102,91,86,77,68,61,57;/*unsigned char table9=21:33:56;unsigned char code addr_table82=11 0,0,0,4,1,0,1,4,2,0,2,4,3,0,3,4;*/-void TimeTickInitial(void);void AnPrintf(void*dataptr);/*Star
25、tup Task void BnPrintf(void*dataptr);/*8 Identical Tasks void delay(uchar t);void delay_ms(uint xms);void delay8us(uchar x);void sound(uchar x);void keyscan();void zizou();/void louxiaoxiao(void*padaptr);/void lcd_ds1302(void*padaptr);/void Serial_initialize(void);/static void XAInit(void);/static v
26、oid TimerInit(INT8U tmr,INT16U freq,INT8U prio);/static void SeryComm0Init(INT16U baud);/*/*void main()OSInit();BnPrintfWait=OSSemCreate(1);/建立一个信号量,从 OSEventFreeList 中申请一个 ECB 信号量/并 进 行 初 始 化(用cnt初 始 化ECB(Sem)-OSEventCnt);返回一个已初始化的 ECB 的指针/初值为 0 /以下创建两个任务/任务不能被主程序调用,只能建立或激活OSTaskCreate(keyscan,/建立第
27、一个任务/指向任务的指针 (void*)0,/传递给任务的参数 (void*)&key_scanTASK_STK_SIZE-1,/任务堆栈栈顶的指针 /上面的指针为 0,递增,进栈操作向大地址方向发展,为TASK_STK_SIZE-1,递减,进栈操作向小地址方向发展 0 x07);/*OSTaskCreate(AnPrintf,/建立第一个任务/指向任务的指针 (void*)0,/传递给任务的参数 (void*)&AnPrintfStkTASK_STK_SIZE-1,/任务堆栈栈顶的指针 /上面的指针为 0,递增,进栈操作向大地址方向发展,为12TASK_STK_SIZE-1,递减,进栈操作向
28、小地址方向发展 0 x06);/任务的优先级别OSTaskCreate(BnPrintf,/建立第二个任务 (void*)0,(void*)&BnPrintfStkTASK_STK_SIZE-1,0 x05);*/OSTaskCreate(zizou,/建立第二个任务 (void*)0,(void*)&zi_zouTASK_STK_SIZE-1,0 x04);TimeTickConfig();/定时器 0 初始化 OSStart();/开始多任务处理 /*/*任务优先级的反转现象在剥夺式 OS 中,当任务以独占方式使用共享资源时,低优先级的任务可能先于高优先级任务得到系统调度而运行的现象备注:
29、决定任务得到运行的条件不仅仅是优先级,还有任务所需的资源。造成的结果:Task_B 优先于 Task_A 得到运行。问题的严重性:如果 Task_B 之类的任务较多时,甚至会影响系统的设计目标。原因:低优先级的任务独占共享资源,迫使高优先级任务因等待资源而让出 CPU。解决办法:暂时提升获得共享资源任务的优先级别,尽快释放共享资源,之后再恢复其原有的优先级别。*/void AnPrintf(void*dataptr)/A 任务/任务 A 的初始化 /INT8U i;INT8U err;dataptr=dataptr;/任务 A 的循环体 while(1)OSSemPend(BnPrintfWa
30、it,0,&err);/请求信号量 BnPrintfWait keyscan();OSSemPost(BnPrintfWait);OSTimeDlyHMSM(0,0,10,0);void BnPrintf(void*dataptr)/B 任务要等待 A 任务之后才执行 INT8U err;13 dataptr=dataptr;while(1)OSSemPend(BnPrintfWait,0,&err);/请求信号量 BnPrintfWait zizou();OSSemPost(BnPrintfWait);OSTimeDlyHMSM(0,0,20,0);void delay(uchar t)uc
31、har t1;unsigned long t2;for(t1=0;t1t;t1+)/延时半拍函数,控制音乐节奏 for(t2=0;t20;i-)for(j=110;j0;j-);/*延迟 8us*/void delay8us(uchar x)14 uchar i,j;for(i=0;ix;i+)for(j=0;j1;j+);/*用于弹奏时八个音符(阶)的发音*/void sound(uchar x)uchar i;for(i=0;i120;i+)BEEP=0;delay8us(tonex);BEEP=1;delay8us(tonex);/*键扫:*/void keyscan()uchar te
32、mp;while(1)if(!tan_zou_flag)P2=0Xff;temp=P2;temp=0 xff&temp;if(temp!=0 xff)delay_ms(10);temp=P2;temp=0 xff&temp;if(temp!=0 xff)temp=P2;switch(temp)case 0 x7f:sound(7);break;case 0 xbf:sound(6);break;15case 0 xdf:sound(5);break;case 0 xef:sound(4);break;case 0 xf7:sound(3);break;case 0 xfb:sound(2);b
33、reak;case 0 xfd:sound(1);break;case 0 xfe:sound(0);break;while(temp!=0 xff)/按键没放开一直发声 temp=P2;temp=temp&0 xff;OSTimeDlyHMSM(0,0,2,0);void zizou()uchar k,i;while(1)if(!zi_zou_flag)/自奏,实现生日歌的自动弹奏i=0;while(i75)if(zi_zou_flag)/BEEP=1;break;k=yuepui+7*yuepui+1-1;th0_f=TH_0k;tl0_f=TL_0k;time=yuepui+2;i+=3
34、;/song();OSTimeDlyHMSM(0,0,2,0);163、元件清单元器件清单见表三 表三 元器件清单 组件 数量 组件 数量STC89C55 一片 30pf 瓷片电容 两个6264 芯片 一个 10k 电阻 11 个74LS373 芯片 一个 PNP 普通三极管 一个11.0592M 晶振 一个 蜂鸣器 一个按键 十个 芯片底座 三个5V 电源 一个 10uf 极性电容 一个排针 若干 电源接口 一个排插 若干 导线 若干4、参考文献1 Jean J Labrosse嵌入式实时操作系统C/OS-IIM.邵贝贝译北京:北京航空航天大学出版社,20032 任哲.嵌入式实时操作系统C/
35、OS-II原理及应用M北京:北京航空航天大学出版社,20033 沈睿.C/OS-在DSP2407 上若干移植问题的研究J.中国水运,2007,5(5):43-44.4 马忠梅编著.单片机的C语言应用程序设计M.北京:北京航空航天出版社,2OO3.5 徐灵伟,刘飞.基于C/OS-的嵌入式中断实现与扩展C.北京:中国控制与决策学会,2007:999-10026 何立民.单片机高级教程-应用与设计M.北京:北京航空航天大学出版社,2000.8:103-109.7 李建忠.单片机原理与应用M.西安:西安电子科技大学出版社,2002,2:121-123.8 戴佳,苗龙,陈斌.51单片机应用系统开发典型实例M,北京:中国电力出版社,2005,7:121-137.9 张洪润,易涛.单片机应用技术教程M.北京:清华大学出版社,2003,10:119-122.10 蔡朝洋.单片机控制实习与专题制作M.北京:北京航空航天大学出版社,2006,11:317-323.11丁明亮,唐前辉.51单片机应用设计与仿真-基于Keil C与Proteus 北京:北京航空航天大学出版社12 程相波,卫安军.基于MCS51单片机的八路抢答器设计方法研究J.北京工业职业技术学院学报,2007,(02):31-34.
限制150内