广西科技大学单片机课程设计报告_第1页
广西科技大学单片机课程设计报告_第2页
广西科技大学单片机课程设计报告_第3页
广西科技大学单片机课程设计报告_第4页
广西科技大学单片机课程设计报告_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、广西科技大学课程设计说明书单片机课程设计报告题目:利用蜂鸣器实现音乐播放功能 班 别: 姓 名: 指导教师: 柯宝中 日期:2016年10月10日一、课程设计目标1、培养综合运用知识和独立开展实践创新的能力;2、学习和掌握单片机中常用接口电路的应用和设计技术,充分认识理论知识对应用技术的指导性作用,进一步加强理论知识与应用相结合的实践和锻炼。通过这次设计实践能够进一步加深对专业知识和理论知识学习的认识和理解,使自己的设计水平和对所学的知识的应用能力以及分析问题解决问题的能力得到全面提高。二、研究方法及手段应用1、将任务分成若干模块,查阅相关论文资料,分模块调试和完成任务;2、通过单片机进行实际

2、调试,实现预期的功能。三、课程设计预期效果1、完成实验环境搭建;2、实现歌曲播放及歌名显示。四、实验原理与设计1、蜂鸣器及其工作原理:蜂鸣器按其结构分主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型。电磁式蜂鸣器由振荡器、电磁线圈、磁铁、振动膜片及外壳等组成。接通电源后,振荡器产生的音频信号电流通过电磁线圈,使电磁线圈产生磁场,振动膜片在电磁线圈和磁铁的相互作用下,周期性地振动发声。本实验采用的是电磁式蜂鸣器。蜂鸣器按其是否带有信号源又分为有源和无源两种类型。有源蜂鸣器只需要在其供电端加上额定直流电压,其内部的震荡器就可以产生固定频率的信号,驱动蜂鸣器发出声音。无源蜂鸣器可以理解成与喇叭一样,需要在

3、其供电端上加上高低不断变化的电信号才可以驱动发出声音。本实验采用的是有源蜂鸣器。 2、 蜂鸣器发声原理本实验由于采用有源蜂鸣器,只需将引脚端口P34清零,蜂鸣器即可发声;P34置位,蜂鸣器停止发声。采用置1置0的方法只能使蜂鸣器发声或停止发声,想要使蜂鸣器发出声音,必须对蜂鸣器发出声音的音频和节拍进行控制。音调:不同音高的乐音是用C、D、E、F、G、A、B来表示,这7个字母就是音乐的音名,它们一般依次唱成DO、RE、MI、FA、SO、LA、SI,即唱成简谱的1、2、3、4、5、6、7,相当于汉字“多来米发梭拉西”的读音,这是唱曲时乐音的发音,所以叫“音调”,即Tone。把C、D、E、F、G、A

4、、B这一组音的距离分成12个等份,每一个等份叫一个“半音”。两个音之间的距离有两个“半音”,就叫“全音”。在钢琴等键盘乐器上,CD、DE、FG、GA、AB两音之间隔着一个黑键,他们之间的距离就是全音;EF、BC两音之间没有黑键相隔,它们之间的距离就是半音。通常唱成1、2、3、4、5、6、7的音叫自然音,那些在它们的左上角加上号或者b号的叫变化音。叫升记号,表示把音在原来的基础上升高半音,b叫降记音,表示在原来的基础上降低半音。例如高音DO的频率(1046Hz)刚好是中音DO的频率(523Hz)的一倍,中音DO的频率(523Hz)刚好是低音DO频率(266 Hz)的一倍;同样的,高音RE的频率(

5、1175Hz)刚好是中音RE的频率(587Hz)的一倍,中音RE的频率(587Hz)刚好是低音RE频率(294 Hz)的一倍。节拍:节拍是让音乐具有旋律(固定的律动),而且可以调节各个音的快满度。“节拍”,即Beat,简单说就是打拍子,就像我们听音乐不自主的随之拍手或跺脚。若1拍实0.5s,则1/4 拍为0.125s。至于1拍多少s,并没有严格规定,就像人的心跳一样,大部分人的心跳是每分钟72下,有些人快一点,有些人慢一点,只要听的悦耳就好。音持续时间的长短即时值,一般用拍数表示。休止符表示暂停发音。)控制发声频率:要产生音频脉冲,只要算出某一音频的周期(1/频率),然后将此周期除以2,即为半

6、周期的时间。利用定时器计时这半个周期时间,每当计时到后就将输出脉冲的I/O反相,然后重复计时此半周期时间再对I/O反相,就可在I/O脚上得到此频率的脉冲。利用STC89C52RC的内部定时器使其工作在计数器模式MODE1下,改变计数值TH0及TL0从而产生不同频率。此外结束符和休止符可以分别用代码00H和FFH来表示,若查表结果为0x00,则表示曲子终了;若查表结果为0xff,则产生相应的停顿效果。以标准音高A为例,A的频率是440Hz,周期T=1/440=2272us。在占空比为50%的情况下,导通时间=断开时间=半周期t=2272us/2=1136us,利用P34端口的位操作,经过不断地反

7、相变换即可得到标准音高A的音频脉冲。端口导通时间与断开时的时间利用定时器实现。具体的方法是将单片机定时器的中断触发时间设为半周期t,这样每隔半周期端口反相,输出连续的对应音高的频率。设晶振的频率为f0,中断触发时间(半周期)为t,定时器工作在模式1时计数器的初值为THL,高8位为THL,低8位为TL。时钟周期即为1/f0,定时器每一次累加用去一个机器周期,一个机器周期包含12个时钟周期,即定时器每次加一所用时间是12/f0。定时器在模式1下计时采用16位数,最大计数为216-1(65535),再次加一(65536)溢出触发中断。根据以上分析可得如下关系:音频对应定时器初值的高8位TH=THL/

8、(28)=(65536-t*f/12)/256;音频对应定时器初值的低8位TL=THL%(28)=(65536-t*f/12)%256;附:八度12音阶定时器初值表(只含自然音)低音音名频率Hz晶振12MHz晶振11.0592MHz中音音名频率Hz晶振12MHz晶振11.0592MHz高音音名频率Hz晶振12MHz晶振11.0592MHzDo2620xF8850xF91BDo5230xFC430xFC8EDo10460xFE210xFE47Re2940xF95A0xF9DFRe5870xFCAD0xFCEDRe11750xFE560xFE76Mi3300xFA130xFA8AMi6590xFD

9、0A0xFD43Mi13180xFE850xFEA1Fa3490xFA680xFAD8Fa6980xFD340xFD6AFa13970xFE9A0xFEC7So3920xFB040xFB68So7840xFD820xFDB3So15680xFEC10xFED9La4400xFB900xFBE9La8800xFDC80xFDF3La17600xFEE40xFEF9Si4940xFC0C0xFC5BSi9880xFE060xFE2DSi19760xFF030xFF16*简谱编码将简谱中的每个音符进行编码,每个音符用一个unsigned char字符类型表示,简谱可用一个unsigned char字

10、符数组表示。字符的前四位表示音频,可以表示0-f共十六个音符。本实验中采用了中音区和高音区。中音do-si分别编码为17,高音do-si分别编码为8E,停顿编为0。字符的后四位表示节拍,节拍以十六分音符为单位(在本程序中为165ms),一拍即四分音符等于4个十六分音符,编为4,其它的播放时间以此类推。以0xff作为曲谱的结束标志。程序从数组中取出一个数,然后分离出高4位得到音调 ,将值赋给定时器0,得到音调;接着分离出该数的低4位,得到节拍。3、程序流程图及说明五、程序设计#include <reg51.h> /包含所选单片机的定义头文件sbit SPEAKER = P27; /定

11、义音乐输出口#define uchar unsigned charsbit LCD_RS = P20; sbit LCD_RW = P21;sbit LCD_EN = P22;sbit led = P10;typedef struct /定义音符结构unsigned int mFreq;/发声频率(对应的定时器初值)unsigned int mDelay; /发声时值CNote;unsigned char ReloadH; /定义定时器T1重装值unsigned char ReloadL;uchar code cdis1 = "Now playing: " uchar co

12、de cdis2 = " Guo ge "/*函数:T1_ISR()功能:定时器T1中断服务函数,产生音乐振荡频率*/void T1_ISR() interrupt 3TR1 = 0;TH1 = ReloadH;TL1 = ReloadL;TR1 = 1;SPEAKER = !SPEAKER; /音乐声频的半个波/*函数:Delay()功能:延时0.00165.536s参数:t>0时,延时(t*0.001)s t=0时,延时65.536s*/void Delay(unsigned int t)doTH0 = 0xFC;/定时器赋初值,定时1msTL0 = 0x66+1

13、7;TR0 = 1;/启动定时器while ( !TF0 );/等待定时器溢出TR0 = 0;/关闭定时器TF0 = 0;/清除溢出标志 while ( -t != 0 );/循环t次/*函数:Sound()功能:演奏一个音符参数:*note,音符指针,指向要演奏的音符*/void Sound(CNote *note) /利用定时器T1发出音符的频率if ( note->mFreq != 0 )ReloadH = (unsigned char)(note->mFreq >> 8);ReloadL = (unsigned char)(note->mFreq);TH1

14、 = 0xFF;TL1 = 0xF0;TR1 = 1;Delay(note->mDelay); /发声延时TR1 = 0; /停止发声TF1 = 0;SPEAKER = 1;Delay(5); /*函数:Play()功能:演奏一段乐曲参数:music,要演奏的乐曲*/void delay1(int ms) uchar t; while(ms-) for(t = 0; t < 120; t+); void Play(CNote music)unsigned int n = 0;while(1)if ( musicn.mDelay = 0 ) break;Sound(&(mus

15、icn);n+;/* 定义音符表 */ 音频变量名 定时器初值 音频率值 音名 #define A 0xEFA3 / 110.000Hz A#define As 0xF08E / 116.541Hz A#define B 0xF16C / 123.471Hz B#define c 0xF23D / 130.813Hz c#define cs 0xF303 / 138.591Hz c#define d 0xF3BE / 146.832Hz d#define ds 0xF46E / 155.563Hz d#define e 0xF514 / 164.814Hz e#define f 0xF5B1

16、/ 174.614Hz #define fs 0xF645 / 184.997Hz f#define g 0xF6D1 / 195.998Hz g#define gs 0xF755 / 207.652Hz g#define a 0xF7D1 / 220.000Hz a#define as 0xF847 / 233.082Hz a#define b 0xF8B6 / 246.942Hz b#define c1 0xF91F / 261.626Hz c1 (中央C)#define c1s 0xF982 / 277.183Hz c1#define d1 0xF9DF / 293.665Hz d1#d

17、efine d1s 0xFA37 / 311.127Hz d1#define e1 0xFA8A / 329.628Hz e1#define f1 0xFAD9 / 349.228Hz f1#define f1s 0xFB23 / 369.994Hz f1#define g1 0xFB68 / 391.995Hz g1#define g1s 0xFBAA / 415.305Hz g1#define a1 0xFBE9 / 440.000Hz a1(标准音)#define a1s 0xFC24 / 466.164Hz a1#define b1 0xFC5B / 493.883Hz b1#defi

18、ne c2 0xFC8F / 523.251Hz c2#define c2s 0xFCC1 / 554.365Hz c2#define d2 0xFCEF / 587.330Hz d2#define d2s 0xFD1B / 622.254Hz d2#define e2 0xFD45 / 659.255Hz e2#define f2 0xFD6C / 698.456Hz f2#define f2s 0xFD91 / 739.989Hz f2#define g2 0xFDB4 / 783.991Hz g2#define g2s 0xFDD5 / 830.609Hz g2#define a2 0x

19、FDF4 / 880.000Hz a2#define a2s 0xFE12 / 932.328Hz a2#define b2 0xFE2D / 987.767Hz b2#define c3 0xFE48 / 1046.500Hz c3#define c3s 0xFE60 / 1108.730Hz c3#define d3 0xFE78 / 1174.660Hz d3#define d3s 0xFE8E / 1244.510Hz d3# #define e3 0xFEA3 / 1318.510Hz e3#define f3 0xFEB6 / 1396.910Hz f3#define f3s 0x

20、FEC9 / 1479.980Hz f3#define g3 0xFEDA / 1567.980Hz g3#define g3s 0xFEEB / 1661.220Hz g3#define a3 0xFEFA / 1760.000Hz a3#define a3s 0xFF09 / 1864.660Hz a3# #define b3 0xFF17 / 1975.530Hz b3/定义发声时值/T*4全音符,T*2二分音符,T四分音符,T/2八分音符,T/4十六分音符#define T625code CNote MusicTab =0,T/2,d2,T/2,g2,T+T/2,g2,T/2,g2,T

21、/2,g2,T/2,d2,T/3,e2,T/3,f2s,T/3,g2,T,g2,T,0,T/2,b2,T/2,g2,T/2,a2,T/4,b2,T/4,d3,T,d3,T,b2,T/2+T/4,b2,T/4,g2,T/2,b2,T/2,d3,T/2+T/4,b2,T/4,a2,T,a2,2*T,e3,T,d3,T,a2,T,b2,T,d3,T/2,b2,T/2,0,T/2,d3,T/2,b2,T/2,a2,T/4,b2,T/4,g2,T,b2,T,0,T,d2,T/2+T/4,e2,T/4,g2,T/4,g2,T/4,b2,T/2+T/4,b2,T/4,d3,T/2,d3,T/2,a2,T/2

22、,a2,T/4,a2,T/4,e2,T,a2,T+T/2,d2,T/2,g2,T+T/2,g2,T/2,b2,T+T/2,b2,T/2,d3,2*T,g2,T/2+T/4,b2,T/4,d3,T/2,d3,T/2,e3,T,d3,T,b3,T/2+T/4,g2,T/4,d3,T/3,d3,T/3,d3,T/3,b2,T/2,0,T/2,g2,T/2,0,T/2,d2,T,g2,T,b2,T/2+T/4,g2,T/4,d3,T/3,d3,T/3,d3,T/3,b2,T/2,0,T/2,g2,T/2,0,T/2,d2,T,g2,T,d2,T,g2,T,d2,T,g2,T,g2,T,0,T,0,0;

23、bit lcd_busy() bit result; LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; delay1(1); result = (bit)(P0&0x80); LCD_EN = 0; return(result); /* * 写指令或数据* start=0, 写入命令; start=1, 写入数据*/void lcd_write(bit start, uchar in_data) uchar Hdata,Ldata;while(lcd_busy(); Hdata=in_data&0xf0; /取高四位 Ldata=(in_data<&

24、lt;4)&0xf0; /取低四位 if(start=0) LCD_RS = 0; /写入命令 else LCD_RS = 1; /写入数据LCD_RW = 0; LCD_EN = 0;delay1(1);P0 = Hdata; /发送高四位 LCD_EN = 1; delay1(1); LCD_EN = 0;delay1(1);P0 = Ldata; /发送低四位 LCD_EN = 1; delay1(1); LCD_EN = 0;delay1(1);/* LCD初始化设定 */void lcd_init() delay1(15); lcd_write(0,0x28); /16*2显

25、示,5*7点阵,4位数据 delay1(5); lcd_write(0,0x28); delay1(5); lcd_write(0,0x28); delay1(5); lcd_write(0,0x0c); /显示开,关光标 delay1(5); lcd_write(0,0x06); /移动光标 delay1(5); lcd_write(0,0x01); /清除LCD的显示内容 delay1(25); /延时/* 设定显示位置 */void lcd_pos(uchar pos) lcd_write(0,pos|0x80); /数据指针=80+地址变量void main() /主程序 uchar m; lcd_init(); /LCD1602初始化lcd_pos(0x00); /设置显示位置为第

温馨提示

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

评论

0/150

提交评论