版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机课程设计实验报告电子音调发生器姓名:日期:2009年 6 月 29 日星期一目录(一)实验目的.错误 !未定义书签。(二)设计任务及要求.错误 !未定义书签。(三)工作原理及设计思路.错误 !未定义书签。(四)实现功能设计.错误 !未定义书签。(五)软件设计.错误 !未定义书签。(六)电路设计.错误 !未定义书签。(七)调试.错误 !未定义书签。(八)实验体会错误 !未定义书签。(一)实验目的1了解计算机发声原理。2 熟悉定时器和键盘扫描电路的工作原理及编程方法。(二)设计任务及要求利用实验平台上的开关 k0-k7 和蜂鸣器设计电子音调发生器,要求:1利用实验平台上开关 k0-k7 进行
2、音调选择, 即拨动不同的开关产生不同的音调,依次拨动 K0K7,蜂鸣器发出 1234567i 八个音调。2编写 2支歌曲,并可进行选择播放。(三)工作原理及设计思路音节由不同频率的方波产生, 音节与频率的关系如表 1 所示。要产生音频方波,只要算出某一音频的周期( 1/ 频率),然后将此周期除以 2,即为半周期的时间。利用计时器计时此半周期时间,每当计时到后就将输出方波的 I/0 反相,然后重复计时此半周期时间再对 I/O 反相,就可在 I/O 脚得到此频率的方波。 在 ZKS-03 实验仪上,产生方波的 I/O 脚选用,通过跳线选择器 JP1 将单片机的与蜂鸣器的驱动电路相连。 这样输出不同
3、频率的方波, 蜂鸣器便会发出不同的声音。另外,音乐的节拍是由延时实现的,如果 1 拍为秒, 1/4 拍是秒。只要设定延时时间,就可求得节拍的时间。 延时作为基本延时时间, 节拍值只能是它的整数倍,每个音节相应的定时器初值X 可按下法计算:( 1/2 ) *(1/f)=(12/fose)*(216-x) 即 x=216-(fose/24f)其中 f: 音调频率,当晶振 fose= 时,音节“ 1”相应的定时器初值为 x, 则可得x=63777D=F921H其它的可同样求得。表 1频率( Hz)X(HEX)音调1262F9212294F9E13330FA8C4349FAD85392FB686440
4、FBE97494FC5Bi523FC8F(四)实现功能设计实现两个主要功能: 电子琴与音乐播放; 一个辅助功能: 在液晶上显示相关信息。1、电子琴: 4*4 的矩阵 16 个按键,按键 0 实现两个功能的切换,其余按键分别发出音调低音 5、 6、 7,中音 1、 2、 3、 4、 5、 6、7,高音 1、2、3、4、5。发音的同时在液晶显示屏上显示出对应的音调。2、音乐播放:按键0 实现两个功能的切换,按键1 实现播放类型选择(单曲循环播放、所有循环播放) ,其余按键分别对应一首歌。目前已经有9 首歌。播放的同时,在液晶上显示出歌名。(五)软件设计根据要实现的功能,流程图如下:开始系统初始化功
5、能选择音乐#include <>#include <>#define nop _nop_()#define uchar unsigned char#define uint unsigned int#define PAI_BASE 15#define MUSIC_NUM 9#define SCAN_CYCLE 500#define BEEP P3_3/*液晶显示相关变量 */sbit LCD_RS = P27;sbit LCD_RW = P26;sbit LCD_EN = P25;static uchar th0_f; 0c0f0c0F0F.Record();."
6、;);break;case 2:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("6.");Record();break;case 3:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("7.");Record();break;case 4:disptime
7、_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("1");Record();break;case 5:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("2");Record();break;case 6:disptime_flag=0;th0_f=c_musicFreqk
8、ey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("3");Record();break;case 7:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("4");Record();break;case 8:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreq
9、key-1%256;TR0 = 1;lcd_init();lcd_string("5");Record();break;case 9:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string("6");Record();break;case 10:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_ini
10、t();lcd_string("7");Record();break;case 11:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".1");Record();break;case 12:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".2
11、");Record();break;case 13:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".3");Record();break;case 14:disptime_flag=0;th0_f=c_musicFreqkey-1/256;tl0_f=c_musicFreqkey-1%256;TR0 = 1;lcd_init();lcd_string(".4");Record();break
12、;case 15:disptime_flag=0;P2_4=0;lcd_init();Record_flag+;if(Record_flag=1)Record_counter=0;Record_time=0;lcd_string("Record ");else if(Record_flag=2)lcd_init();lcd_string(" Record play ");Record_music+Record_counter=0x00;Music_flag=1;Rplay_flag=1;TH0=0;TL0=0;TR0=0;while(key=keysca
13、n()!=15);else if (Record_flag=3)lcd_init();lcd_string("Electone ");Music_flag=0;Rplay_flag=0;Record_flag=0;Freq_flag=1;break;case 16:P3_3=0;TR0=0;Record();break;if(key=0) P3_3=0;break;void Music(void)P2_4=0;Freq_flag=1;lcd_init();disptime_flag=1;lcd_string("Music");Music_flag=0;k
14、ey=16;delay(10);s_musicCounter=10;s_tableCounter=0;TR0=0;P3_3=0;while(1)if(s_musicCounter=1)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving(" Happy Birthday ");/ lcd_string(" Happy Birthday ");else if(s_musicCounter=2)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving(" T
15、wo Butterflies ");else if(s_musicCounter=3)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("Mouse Loves Rice ");else if(s_musicCounter=4)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving(" Awakening ");else if(s_musicCounter=5)Music_flag=1;disptime_flag=0;lcd_init();lcd_
16、moving(" dae jang geum ");else if(s_musicCounter=6)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("walking on Road of Life ");else if(s_musicCounter=7)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("Most romantic thing");else if(s_musicCounter=8)Music_flag=1;dis
17、ptime_flag=0;lcd_init();lcd_moving("After 1000 years");else if(s_musicCounter=9)Music_flag=1;disptime_flag=0;lcd_init();lcd_moving("Lonely life");else if(key>10) TR0=0;P3_3=0; while(key2=(key=keyscan() nop;TR0=1;key2=key;if(key=0)P3_3=0;Freq_flag=0;Music_flag=0;K0_flag=0;TR0=0
18、;break;else if(key=1)musicAutoFlag=musicAutoFlag;if(musicAutoFlag=1) P2_4=1;else P2_4=0;else if(key=15) disptime();else if(key>9&&key<15) nop;elses_musicCounter=key-1;s_tableCounter=0;void main(void)/*主程序入口 */IE=0;P0=0xff;P2=0xff;/*初始化 T*/TMOD=0x11;/*Timer0 、Timer1 工作在案 MODE1,16位定时器 */
19、TH1=(65536-10000)/256;/* 设定 Timer1 每 10ms中断一次 */TL1=(65536-10000)%256;TR1=1;TH0=(65536-SCAN_CYCLE)/256; /*设定 Timer0 每隔 SCAN_CYCLEu中断一次*/TL0=(65536-SCAN_CYCLE)%256;TR0 = 1;ET0 = 1;ET1 = 1;EA=1;P2_4=0;P3_3=0;/* 关喇叭 */while(1)if(K0_flag=0)Electone();/电子琴功能else Music();/播放音乐/ 定时中断 0, 用于产生唱歌频率void timer0
20、() interrupt 1 using 1if(Freq_flag=1)TL0=tl0_f;TH0=th0_f; /调入预定时值BEEP=BEEP;/取反音乐输出IOelseTH0=(65536-SCAN_CYCLE)/256; /*设定 Timer0 每隔 SCAN_CYCLEu中断一次*/TL0=(65536-SCAN_CYCLE)%256;void timer1() interrupt 3 using 2uchar ucharTemp,ucharTemp1,TH0temp,TL0temp; uint temp;static uchar paiCounter,paiNum;TH1=(65
21、536-10000)/256; /* 设定 Timer1 每 10ms中断一次 8ms*/ TL1=(65536-10000)%256;if(Record_flag=1) Record_time+;timecounter();/时间每秒加一,正常显示if (Music_flag=1)if(+paiCounter>=paiNum)/*音乐一拍的时间到了 */paiCounter=0;if(Rplay_flag=2) if(TR0=0) TR0=1;s_musicCounter=0x20;switch(s_musicCounter)/*根据当前音乐编号查找下一个音乐标识码 */case 0x
22、01:ucharTemp=c_music1s_tableCounter+;break; case 0x02:ucharTemp=c_music2s_tableCounter+;break; case 0x03:ucharTemp=c_music3s_tableCounter+; break; case 0x04:ucharTemp=c_music4s_tableCounter+;break; case 0x05:ucharTemp=c_music5s_tableCounter+; break; case 0x06:ucharTemp=c_music6s_tableCounter+; break
23、; case 0x07:ucharTemp=c_music7s_tableCounter+; break; case 0x08:ucharTemp=c_music8s_tableCounter+; break; case 0x09:ucharTemp=c_music9s_tableCounter+; break;case0x20:ucharTemp=Record_musics_tableCounter+;break;case 0x00:ucharTemp=c_music0s_tableCounter+; break; default:break;if(ucharTemp=0x00)/*如果查到
24、0x00 则表示本首歌曲结束*/Freq_flag=0;paiNum=4*PAI_BASE;/*停止发声 */*本首歌曲 结束 后停顿4*PAI_BASE*10ms=600ms再继续播放*/P3_3=0;/*把喇叭关掉*/s_tableCounter=0;if(musicAutoFlag=1)/*如果歌曲自动循环播放功能打开则跳到下一首歌曲*/s_musicCounter+;if(s_musicCounter>(uchar)MUSIC_NUM)s_musicCounter=0x01;else/*如果查到非0x00 则表示是音乐标识码 */paiNum=(ucharTemp&0x0
25、f)*PAI_BASE;/*音乐标识码的低四位为节拍码 */ucharTemp1=(ucharTemp&0xf0)>>4;/*音乐标识码的高四位为音频码 */if(ucharTemp1=0)/*如果音频码为零则表示不发音 */P3_3=0;Freq_flag=0;temp=65536-SCAN_CYCLE;TH0temp=temp>>8;/*temp/256相当于右移 8 位*/TL0temp=temp-(temp>>8)<<8);/*temp%256*/TH0=TH0temp;TL0=TL0temp;Freq_flag=0;else/*
26、如果音频码不为零则按此改变Timer0的中断周期*/Freq_flag=0;temp=c_musicFrequcharTemp1-1;TH0temp=temp>>8;/*temp/256相当于右移 8 位*/TL0temp=temp-(temp>>8)<<8);/*temp%256*/TH0=TH0temp;TL0=TL0temp;th0_f=TH0;/*保存新的代表音频的 Timer0 周期值 */tl0_f=TL0;Freq_flag=1;程序说明:在此程序中,主要分为三大块:1、键盘扫描; 2、液晶显示; 3、音频产生。程序大部分时间在扫描4*4 矩阵
27、键盘,通过线反转法读入数据,判断按键;若实现的是电子琴功能,则用1602 显示按键对应的谱,若实现的是音乐播放功能,则显示对应的歌名;音频产生由T0、T1 两个定时器来完成, T0 实现 I/O/口的反转,产生音频, T1 实现延时,即音乐的节拍。(六)电路设计本电路由 89S52、LCD1602、16 个按键、复位电路、 12M晶振、 7805、 9V 电池等组成。完成单片机的基本连接即晶振及复位电路后,用 P1 口 8 个口连接并控制 4*4 ,即 16 个按键构成的键盘,由 P0 口以及、控制液晶显示器 LCD1602,用输出不同音调的频率控制蜂鸣器发音。蜂鸣器电路:晶振及复位电路开关连
28、接电路:LCD1602电路连接:(七)调试此次实验的的硬件电路很简单,外围电路只有一个4*4矩阵,复位电路,晶振电路,蜂鸣器。主要是软件的编写与调试。在没加液晶显示前:问题一:程序写好,烧录在单片机中,单片机没有反应,经检查硬件电路没有问题,最后发现是单片机坏了,换了一块单片机就可以用了。问题二:当使用电子琴功能的时候,按键不放手,会出现嘟嘟声声音不连续改动程序,将放开按键设置为关定时器,这样按键不放声音就连续。问题三:功能无法切换。功能标志设定为 bit 型,判断功能的时候用 case 语句,运行时不知什么原因无法判别,将 case 语句改用 if 语句程序可以判别,切换功能可以实现。问题四
29、:在播放音频的空隙时间有一个固定的音频杂音。检查电路,蜂鸣器使用 NPN管来驱动,在没有音频的时候若输出为高电平, 则三极管饱和导通, 蜂鸣器发声,在无需音频的地方加上 P3_3=0;语句,可以消除杂音。效果明显。问题五:音乐循环播放功能无法切换。程序 if 条件出错,无法切换,改后切换功能可以实现。加上液晶显示后:问题六:按键不灵敏。重新写程序,在延时程序中加入键盘扫描,按键灵敏且不影响其他功能的实现。(八)实验体会硬件电路需要动脑子的地方少, 键盘可以买到, 只要插到 P1 口就行,但是为了锻炼一下自己的动手能力,自己买了 16 个按键,一个一个焊上去,焊出 4*4 矩阵,这样对键盘也有根深层次的了解。每次写程序都有很多收获, 每
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 股权质押合同范本
- 基于大数据分析的2024年度苹果树苗木种植承包合同
- 二零二四年度采购代理合同3篇
- 足浴店转让协议书范本 版
- 房产交易过程中卖方隐瞒房产瑕疵的违约责任合同20242篇
- 2006年广东省建设工程施工合同(范本)
- 2024年度游戏开发及发行合同
- 《多极化趋势讲》课件
- 领导培训完员工总结
- 医院新入职员工年终总结
- 道法认识生命(作业)【后附答案解析】2024-2025学年七年级道德与法治上册(统编版2024)
- 9知法守法 依法维权 第2课时 守法不违法 (教学设计)-部编版道德与法治六年级上册
- 三方代付工程款协议书范本2024年
- 【道法】爱护身体 课件-2024-2025学年统编版道德与法治七年级上册
- 第二次月考测评卷(5-6单元)(试题)-2024-2025学年六年级数学上册人教版
- 医学课件抗痉挛体位摆放
- 2024年统编版七年级上册道德与法治 第三单元 珍爱我们的生命 第八课 生命可贵 第2课时 敬畏生命 教学课件
- IATF16949组织环境因素识别表
- 《积极心理学(第3版)》 课件 第11章 宽容、篇终 积极心理学的应用与展望
- 职业素质养成(吉林交通职业技术学院)智慧树知到答案2024年吉林交通职业技术学院
- 5.5《方程的意义》(课件)-2024-2025学年人教版数学五年级上册
评论
0/150
提交评论