求c51单片机蜂鸣器演奏《青花瓷》c语言程序( 二 )

< t; t1++) //双重循环, 共延时t个半拍 for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音TR0 = 0; //关闭T0, 停止发音}//--------------------------------------void song() //演奏一个音符{TH0 = timer0h; //控制音调TL0 = timer0l;TR0 = 1; //启动T0, 由T0输出方波去发音delay(time); //控制时间长度}//--------------------------------------void main(void){unsigned char k, i;TMOD = 1; //置T0定时工作方式1ET0 = 1; //开T0中断EA = 1; //开CPU中断while(1) { i = 0; time = 1; while(time) { k = sszymmh[i] + 7 * sszymmh[i + 1] - 1; //第i个是音符, 第i+1个是第几个八度 timer0h = FREQH[k]; //从数据表中读出频率数值 timer0l = FREQL[k]; //实际上, 是定时的时间长度 time = sszymmh[i + 2]; //读出时间长度数值 i += 3; song(); //发出一个音符 }}}/*======================================应网友要求,下面再详细写一下乐谱和数据的转换关系 。以李叔同大师的《送别》的前二小节来说明转换的方法 。这部分的歌词是:"长 亭 外,古 道 边,";这部分的乐谱是:| 5 35 1 - | 6 16 5 - | 。(注意:乐谱中的1是高音,上边是带点的;还有些音符,应该有下划线,在这里都无法标出 。感兴趣的网友应该去查看正规的乐谱 。)那么,据此就可以写出《送别》前二小节的数据表://--------------------------------------*///code unsigned char sszymmh[] = {//5, 2, 2, 3, 2, 1, 5, 2, 1, 1, 3, 4, //嗦,中音,2个半拍; 咪,中音,1个半拍; 嗦,中音,1个半拍; 哆,高音,4个半拍//6, 2, 2, 1, 3, 1, 6, 2, 1, 5, 2, 4,//啦,中音,2个半拍; 哆,高音,1个半拍; 啦,中音,1个半拍; 嗦,中音,4个半拍//0, 0, 0};//结束标记/*--------------------------------------记住:三个数字一组,代表一个音符 。第一个数字是1234567之一,代表音符哆来咪发...;第二个数字是0123之一,代表低音、中音、高音、超高音;第三个数字是半拍的个数,代表时间长度 。当三个数字都是0,就代表乐曲数据表的结尾 。用这个数据表,替换掉程序中《世上只有妈妈好》的数据表,本程序就可以播放《送别》的前两小节 。*/
【求c51单片机蜂鸣器演奏《青花瓷》c语言程序】

猜你喜欢