定时器控制的音乐实验.docx
《定时器控制的音乐实验.docx》由会员分享,可在线阅读,更多相关《定时器控制的音乐实验.docx(13页珍藏版)》请在冰豆网上搜索。
![定时器控制的音乐实验.docx](https://file1.bdocx.com/fileroot1/2023-1/4/5c0b4a78-0222-4900-ae6a-d161c30af376/5c0b4a78-0222-4900-ae6a-d161c30af3761.gif)
定时器控制的音乐实验
实验六:
定时器控制的音乐实验
一、实现功能:
1、可以在学习版上运行,也可以用PROTEUS仿真出《好人一生平安》。
二、实验步骤:
1、用PROTEUS软件画出仿真电路图
此图与学习版原理图部分电路对应。
用到的原器件:
单片机:
AT89C51按键:
BUTTON电阻:
RES电容:
CAP
晶振:
CRYSTAL发光二极管:
LED_YELLOW扬声器:
SOUNDER
2、用编译软件分别对汇编语言和C51进行编译,生成目标文件,参考程序附后
3、对编译好的HEX文件调至电路图仿真,分析仿真结果,两种程序有何异同,可以单步执行进行联调。
4、分别用CH341软件(USB驱动)和STC_ISP软件(下载软件)把HEX文件配置到学习版并执行,分析结果。
5、在此程序的基础上改写程序,并能在按键的控制下播放10首曲子。
三.程序附件:
附件1:
用定时器T0的中断实现"渴望"主题曲的播放C语言程序
#include//包含51单片机寄存器定义的头文件
sbitsound=P3^4;//将sound位定义为P3.4
unsignedintC;//储存定时器的定时常数
//以下是C调低音的音频宏定义
#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz
#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz
#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz
#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz
#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz
#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz
#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#definedao523//将“dao”宏定义为中音“1”的频率523Hz
#definere587//将“re”宏定义为中音“2”的频率587Hz
#definemi659//将“mi”宏定义为中音“3”的频率659Hz
#definefa698//将“fa”宏定义为中音“4”的频率698Hz
#definesao784//将“sao”宏定义为中音“5”的频率784Hz
#definela880//将“la”宏定义为中音“6”的频率880Hz
#definexi987//将“xi”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz
#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz
#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz
#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz
#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz
#defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz
#defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz
/*******************************************
函数功能:
1个延时单位,延时200ms
******************************************/
voiddelay()
{unsignedchari,j;
for(i=0;i<250;i++)
for(j=0;j<250;j++)
;
}
unsignedintcodef[]={re,mi,re,dao,l_la,dao,l_la,//每部分对应一小节音符l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,re,l_la,dao,re,l_la,dao,re,mi,re,
0xff};//以0xff作为
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsignedcharcodeJP[]={4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10
};
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
unsignedchari,j;
//以下是《渴望》片头曲的一段简谱
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TMOD=0x00;//使用定时器T0的模式1(13位计数器)
while
(1)//无限循环
{
i=0;//从第1个音符f[0]开始播放
while(f[i]!
=0xff)//只要没有读到结束标志就继续播放
{
C=460830/f[i];
TH0=(8192-C)/32;//13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32;/13位计数器TL0低5位的赋初值方法
TR0=1;//启动定时器T0
for(j=0;jdelay();//延时1个节拍单位
TR0=0;//关闭定时器T0
i++;//播放下一个音符
}
}
}
/***********************************************
函数功能:
T0的中断服务子程序,使P3.7引脚输出音频的方波
*************************************************/
voidTime0(void)interrupt1using1
{
sound=!
sound;//将P3.4引脚输出电平取反,形成方波
TH0=(8192-C)/32;//13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32;//13位计数器TL0低5位的赋初值方法
}
附件2:
用定时器T0和外部0的中断实现十首曲的播放C语言程序
#include//包含51单片机寄存器定义的头文件
sbitsound=P3^4;//将sound位定义为P3.4
unsignedintC;//储存定时器的定时常数
unsignedchar*JP;//
unsignedint*f;//
unsignedchart0=0;//中断次数
unsignedcharww=255;//延时长度控制
unsignedchari=0;//播放时控制第几个音节
//以下是C调低音的音频宏定义
#definel_dao262//将“l_dao”宏定义为低音“1”的频率262Hz
#definel_re286//将“l_re”宏定义为低音“2”的频率286Hz
#definel_mi311//将“l_mi”宏定义为低音“3”的频率311Hz
#definel_fa349//将“l_fa”宏定义为低音“4”的频率349Hz
#definel_sao392//将“l_sao”宏定义为低音“5”的频率392Hz
#definel_la440//将“l_a”宏定义为低音“6”的频率440Hz
#definel_xi494//将“l_xi”宏定义为低音“7”的频率494Hz
//以下是C调中音的音频宏定义
#definedao523//将“dao”宏定义为中音“1”的频率523Hz
#definere587//将“re”宏定义为中音“2”的频率587Hz
#definemi659//将“mi”宏定义为中音“3”的频率659Hz
#definefa698//将“fa”宏定义为中音“4”的频率698Hz
#definesao784//将“sao”宏定义为中音“5”的频率784Hz
#definela880//将“la”宏定义为中音“6”的频率880Hz
#definexi987//将“xi”宏定义为中音“7”的频率523H
//以下是C调高音的音频宏定义
#defineh_dao1046//将“h_dao”宏定义为高音“1”的频率1046Hz
#defineh_re1174//将“h_re”宏定义为高音“2”的频率1174Hz
#defineh_mi1318//将“h_mi”宏定义为高音“3”的频率1318Hz
#defineh_fa1396//将“h_fa”宏定义为高音“4”的频率1396Hz
#defineh_sao1567//将“h_sao”宏定义为高音“5”的频率1567Hz
#defineh_la1760//将“h_la”宏定义为高音“6”的频率1760Hz
#defineh_xi1975//将“h_xi”宏定义为高音“7”的频率1975Hz
/*******************************************
函数功能:
1个延时单位,延时200ms
******************************************/
voiddelay(unsignedcharw0)
{
unsignedcharj,k;
for(k=0;kfor(j=0;j<250;j++)
;
}
//以下是《渴望》片头曲的一段简谱
unsignedintcodeSongJianPu0[]={re,mi,re,dao,l_la,dao,l_la,//每部分对应一小节音符
l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,
l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,
re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,
mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,
re,l_la,dao,re,l_la,dao,re,mi,re,
0xff};//以0xff作为
//以下是简谱中每个音符的节拍
//"4"对应4个延时单位,"2"对应2个延时单位,"1"对应1个延时单位
unsignedcharcodeJiePai0[]={4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,
4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10
};
//以下是《》的一段简谱
unsignedintcodeSongJianPu4[]={re,mi,re,dao,l_la,dao,l_la,//每部分对应一小节音符
l_sao,l_mi,l_sao,l_la,dao,l_la,dao,sao,la,mi,sao,re,mi,re,mi,sao,mi,
l_sao,l_mi,l_sao,l_la,dao,l_la,l_la,dao,l_la,l_sao,l_re,l_mi,l_sao,
re,re,sao,la,sao,fa,mi,sao,mi,la,sao,mi,re,mi,l_la,dao,re,
mi,re,mi,sao,mi,l_sao,l_mi,l_sao,l_la,dao,l_la,dao,re,l_la,dao,re,mi,
re,l_la,dao,re,l_la,dao,re,mi,re,
0xff};
unsignedcharcodeJiePai4[]={4,1,1,4,1,1,2,2,2,2,2,8,4,2,3,1,2,2,10,4,2,2,4,4,2,2,2,2,4,2,2,2,2,2,2,2,10,4,4,4,2,2,4,2,4,4,4,2,2,2,2,2,2,10,4,2,2,4,4,2,2,2,2,6,
4,2,2,4,1,1,4,10,4,2,2,4,1,1,4,10
};
//以下是《老鼠爱大米》一段简谱
unsignedintcodeSongJianPu2[]={
dao,dao,re,mi,mi,re,dao,re,re,dao,re,mi,mi,re,dao,dao,l_sao,l_la,l_sao,l_sao,l_sao,l_la,dao,dao,
dao,dao,dao,dao,re,re,dao,re,mi,mi,mi,sao,la,re,re,mi,re,dao,dao,dao,re,mi,sao,sao,l_sao,l_sao,
l_la,dao,dao,dao,mi,re,dao,dao,re,dao,dao,mi,mi,sao,sao,sao,sao,sao,sao,la,la,mi,re,
dao,dao,dao,re,mi,mi,mi,sao,sao,sao,sao,la,dao,dao,la,sao,mi,re,dao,dao,l_la,re,mi,sao,
sao,sao,sao,la,sao,la,mi,re,dao,dao,dao,re,mi,mi,mi,sao,sao,sao,sao,la,h_dao,h_dao,la,sao,mi,re,
re,re,re,dao,mi,fa,sao,re,re,mi,re,dao,dao,mi,re,dao,dao,mi,re,
mi,dao,mi,la,sao,sao,mi,sao,la,la,sao,sao,la,sao,sao,mi,re,dao,
0xff};//
unsignedcharcodeJiePai2[]={2,1,1,2,2,2,1,1,6,1,1,2,2,2,2,6,1,1,3,1,1,1,1,5,4,
2,2,2,1,1,4,2,1,1,2,2,2,1,1,4,2,1,1,2,2,2,1,1,6,1,1,
2,1,1,1,3,2,2,2,1,1,10,2,1,1,2,1,1,2,1,1,4,2,2,
2,2,2,1,1,6,1,1,2,2,2,1,1,2,2,2,2,2,2,2,2,6,1,1,
2,2,1,2,1,4,2,2,2,2,2,1,11,6,1,1,2,2,2,1,1,2,2,2,1,1,
2,2,8,2,1,1,2,2,8,2,1,1,4,2,1,1,4,2,2,
2,2,2,1,1,6,1,1,2,1,1,2,1,1,4,1,2,1};
//以下是《迟来的爱》片头曲的一段简谱
unsignedintcodeSongJianPu3[]={mi,re,mi,sao,la,sao,mi,re,dao,re,
mi,re,mi,re,mi,re,dao,dao,l_la,
l_sao,l_sao,l_la,dao,dao,re,mi,sao,sao,mi,sao,
la,sao,mi,re,mi,re,dao,l_la,dao,sao,mi,
re,mi,re,mi,sao,la,sao,mi,re,dao,re,
mi,re,mi,re,mi,re,dao,dao,l_la,
l_sao,l_sao,l_la,dao,dao,re,mi,sao,sao,mi,sao,
la,sao,mi,re,mi,re,mi,la,sao,mi,re,
dao,mi,mi,sao,la,sao,la,sao,mi,dao,
0xff};
unsignedcharcodeJiePai3[]={2,2,6,2,2,2,1,1,1,1,10,2,2,6,2,2,2,2,2,
10,2,2,2,4,1,1,2,4,1,1,6,2,6,1,1,6,2,2,2,2,2,
10,2,2,6,2,2,2,1,1,1,1,10,2,2,6,2,2,2,2,2,
10,2,2,2,4,1,1,2,4,2,2,
6,2,6,1,1,6,2,2,2,2,2,10,2,2,2,10,2,2,2,2,10
};
//以下是《义勇军进行曲》片头曲的一段简谱
unsignedintcodeSongJianPu1[]={l_sao,dao,dao,dao,dao,l_sao,l_la,l_xi,dao,dao,
mi,dao,re,mi,sao,sao,mi,mi,dao,mi,sao,mi,re,re,la,sao,re,mi,sao,mi,sao,mi,re,mi,dao,mi,
l_sao,l_la,dao,dao,mi,mi,sao,sao,re,re,re,l_la,re,l_sao,dao,dao,mi,mi,sao,dao,mi,sao,sao,la,sao,mi,dao,
sao,sao,sao,mi,sao,l_sao,dao,mi,dao,sao,sao,sao,mi,dao,l_sao,dao,l_sao,dao,l_sao,dao,dao,
0xff};
unsignedcharcodeJiePai1[]={2,6,2,3,1,2,1,1,4,4,
2,2,1,1,4,4,3,1,3,1,3,1,4,8,4,4,4,4,2,4,2,2,1,1,4,8,
3,1,2,2,3,1,2,2,2,1,1,4,6,2,6,2,6,2,8,3,1,2,2,4,4,3,1,
1,2,1,4,4,4,4,3,1,1,2,1,4,4,4,4,4,4,4,4,8
};
//以下是《》的一段简谱
unsignedintcodeSongJianPu5[]={0xff};
unsignedcharcodeJiePai5[]={2,
};
//以下是《》的一段简谱
unsignedintcodeSongJianPu6[]={0xff};
unsignedcharcodeJiePai6[]={3,
};
//以下是《》的一段简谱
unsignedintcodeSongJianPu7[]={0xff};
unsignedcharcodeJiePai7[]={7,
};
//以下是《》的一段简谱
unsignedintcodeSongJianPu8[]={1,0xff};
unsignedcharcodeJiePai8[]={8,
};
//以下是《》的一段简谱
unsignedintcodeSongJianPu9[]={1,0xff};
unsignedcharcodeJiePai9[]={1,
};
/*******************************************
函数功能:
主函数
******************************************/
voidmain(void)
{
unsignedchari,j;
TMOD=0X00;//设TIMER0在MODE1(13位计数器)
TCON=0X01;//外部中断INT0,下降沿触发
IE=0x83;//开中断(INT0,TIMER0)
IP=0x00;//设置中断优先级
f=SongJianPu0;
JP=JiePai0;
while
(1)//无限循环
{
i=0;//从第1个音符f[0]开始播放
while(f[i]!
=0xff)//只要没有读到结束标志就继续播放
{
C=460830/f[i];
TH0=(8192-C)/32;//可证明这是13位计数器TH0高8位的赋初值方法
TL0=(8192-C)%32;//可证明这是13位计数器TL0低5位的赋初值方法
TR0=1;//启动定时器T0
for(j=0;jdelay(ww);//延时1个节拍单位
TR0=0;//关闭定时器T0
i++;//播放下一个音符
}
}
}
/***********************************************************
函数功能:
定时器T0的中断服务子程序,使P3.7引脚输出音频的方波
************************************************************/
voidTime0(void)interrupt1using1