利用蜂鸣器和单片机演奏简单的音乐.doc_第1页
利用蜂鸣器和单片机演奏简单的音乐.doc_第2页
利用蜂鸣器和单片机演奏简单的音乐.doc_第3页
利用蜂鸣器和单片机演奏简单的音乐.doc_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

利用蜂鸣器和单片机演奏简单的音乐实验原理图实验程序/* = */* - */* 曲谱存贮格式 uchar code 数组名音高,音长,音高,音长. */* 音高由三位数字组成: */* 个位是表示 17 这七个音符. */* 十位是表示音符所在的音区,1-低音,2-中音,3-高音; */* 百位表示这个音符是否要升半音 0(不写)-不升,1-升半音。 */* 音长最多由三位数字组成: */* 个位表示音符的时值,其对应关系是: */* 数值(n) 0 1 2 3 4 5 6 */* - */* 几分音符 1 2 4 8 16 32 64 */* 即:音符=2n ,这样做的目的是为了节省曲谱的存贮空间。 */* 十位表示音符的演奏效果(0-2),0-普通,1-连音,2-顿音。 */* 百位是符点位,0(不写)-无符点,1-有符点。 */* - */* 调用演奏子程序的方法为: */* play(乐曲数组名,调号,升降八度,演奏速度,开始指针,结束指针) */* 调号(0-11)是指乐曲升多少个半音演奏;升降八度(1-3)是指在演奏 */* 在哪个八度演奏: 1-降八度,2-不升不降,3-升八度.开始指针(0- ) */* 是从哪个音符开始演奏,结束指针是演奏到哪个音符为止. */* - */本程序用T0 来产生音调,用T1 产生音长#include #define uchar unsigned char#define yx 4/5 /* 定义普通音符演奏的长度分率 */#define plen 2 /* 定义晶振的时钟周期(us) */#define uchar unsigned char#define uint unsigned intsbit speaker=P35;/* -下面是曲谱 - */uchar code sound100=25,2,23,3,25,3,31,1,26,2,31,3,26,3,25,1,25,2,21,3,22,3,23,2,22,3,21,3,22,0,25,2,23,3,25,3,31,102,27,3,26,2,31,2,25,1,25,2,22,3,23,3,24,102,17,3, 21,0;uchar tc0,tc1,sc0,sc1; /* 音长和音符两个计数器初值暂存 */void play(sound,dh,sj,speed,point1,point2)uchar code sound; /* 接受乐曲数组的地址 */uchar speed,sj,dh; /* 速度、八度、调号 */uint point1,point2; /* 乐曲开始、结束指针 */uint code fftab12=262,277,294,311,330,349,369,392,415,440,466,494; /* 频率表*/uchar code stab7=0,2,4,5,7,9,11; /* 17 在频率表中的位置 */uchar code ltab7=1,2,4,8,16,32,64;uchar tl,ts,sl,sm,sh,slen,xg,ii,fd;uint point,hz,tc,sc,len,len0,len1,len2,len4,i,ftab12;speaker=1;for(i=0;i11)ii=ii-12;ftabi=fftabii*2;elseftabi=fftabii;if(sj=1) ftabi=2;if(sj=3) ftabi=2;point=point1;ts=soundpoint;tl=soundpoint+1; /* 读出第一个音符和它时时值 */tc=65535-10000/plen; /* 算出10ms 的初装值 */tc0=tc%256; /* 计算TL1 应装入的初值 */tc1=tc/256; /* 计算TH1 应装入的初值 */len0=12000/speed; /* 算出1 分音符的长度(几个10ms) */len4=len0/4; /* 算出4 分音符的长度 */len4=len4-len4*yx; /* 普通音最长间隔标准 */TMOD=0x11;TH1=tc1; TL1=tc0;ET0=1; EA=1;TR0=0; TR1=1;while(point=2; /* 若是低音 */if (sm=3) hz=2; /* 若是高音 */sc=(50000/hz)*10/plen; /* 计算脉冲个数 */sc=65536-sc; /* 计算计数器初值 */sc0=sc%256; /* 算出TL0 应装初值 */sc1=sc/256; /* 算出TH0 应装初值 */TH0=sc1; /* 装入初值 */TL0=sc0+12; /* 加12 是对中断延时的补偿 */slen=ltabtl%10; /* 算出是几分音符 */xg=tl/10%10; /* 算出音符类型(0 普通1 连音2 顿音) */fd=tl/100;len=len0/slen; /* 算出连音音符演奏的长度(多少个10ms)*/if (fd=1) len=len+len/2;if(xg!=1)if(xg=0) /* 算出普通音符的演奏长度 */if (slen0;i-) /* 发规定长度的音 */while(TF1=0);TH1=tc1; TL1=tc0;TF1=0;if(len2!=0)TR0=0; speaker=1;for(i=len2;i0;i-) /* 音符间的间隔 */while(TF1=0);TH1=tc1; TL1=tc0;TF1=0;point+=2; /* 音符指针下移 */ts=soundpoint; tl=soundpoint+1; /* 读出下一个音符和它时时值 */void yin() interrupt 1 /* 音符发生程序(中断服务程序)*/speaker=speaker;TH0=sc1; TL0=sc0;/=main()while(1)play(sound,0,

温馨提示

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

评论

0/150

提交评论