1、定时器控制的音乐实验实验六:定时器控制的音乐实验一、实现功能:1、可以在学习版上运行,也可以用PROTEUS仿真出好人一生平安。二、实验步骤:1、用PROTEUS软件画出仿真电路图此图与学习版原理图部分电路对应。用到的原器件:单片机:AT89C51 按键:BUTTON 电阻:RES 电容:CAP 晶振:CRYSTAL 发光二极管:LED_YELLOW 扬声器:SOUNDER 2、用编译软件分别对汇编语言和C51进行编译,生成目标文件,参考程序附后3、对编译好的HEX文件调至电路图仿真,分析仿真结果,两种程序有何异同,可以单步执行进行联调。4、分别用CH341软件(USB驱动)和STC_ISP软
2、件(下载软件)把HEX文件配置到学习版并执行,分析结果。5、在此程序的基础上改写程序,并能在按键的控制下播放10首曲子。三程序附件:附件1:用定时器T0的中断实现渴望主题曲的播放C语言程序#include /包含51单片机寄存器定义的头文件sbit sound=P34; /将sound位定义为P3.4unsigned int C; /储存定时器的定时常数/以下是C调低音的音频宏定义#define l_dao 262 /将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 /将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 /将“l_
3、mi”宏定义为低音“3”的频率311Hz#define l_fa 349 /将“l_fa”宏定义为低音“4”的频率349Hz#define l_sao 392 /将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 /将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 /将“l_xi”宏定义为低音“7”的频率494Hz/以下是C调中音的音频宏定义#define dao 523 /将“dao”宏定义为中音“1”的频率523Hz#define re 587 /将“re”宏定义为中音“2”的频率587Hz#define mi 659 /将“m
4、i”宏定义为中音“3”的频率659Hz#define fa 698 /将“fa”宏定义为中音“4”的频率698Hz#define sao 784 /将“sao”宏定义为中音“5”的频率784Hz#define la 880 /将“la”宏定义为中音“6”的频率880Hz#define xi 987 /将“xi”宏定义为中音“7”的频率523H /以下是C调高音的音频宏定义#define h_dao 1046 /将“h_dao”宏定义为高音“1”的频率1046Hz#define h_re 1174 /将“h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 /将“h_
5、mi”宏定义为高音“3”的频率1318Hz#define h_fa 1396 /将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 /将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 /将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 /将“h_xi”宏定义为高音“7”的频率1975Hz/*函数功能:1个延时单位,延时200ms*/void delay() unsigned char i,j; for(i=0;i250;i+) for(j=0;j250;j+) ; unsigned i
6、nt code f =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
7、_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个延时单位 unsigned char code JP =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
8、,1,4, 10, 4,2,2,4,1,1,4, 10 ;/*函数功能:主函数*/ void main(void) unsigned char i,j; /以下是渴望片头曲的一段简谱 EA=1; /开总中断 ET0=1; /定时器T0中断允许 TMOD=0x00; / 使用定时器T0的模式1(13位计数器) while(1) /无限循环 i=0; /从第1个音符f0开始播放 while(fi!=0xff) /只要没有读到结束标志就继续播放 C=460830/fi; TH0=(8192-C)/32; / 13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; / 13位计数器TL
9、0低5位的赋初值方法 TR0=1; /启动定时器T0 for(j=0;jJPi;j+) /控制节拍数 delay(); /延时1个节拍单位 TR0=0; /关闭定时器T0 i+; /播放下一个音符 /*函数功能: T0的中断服务子程序,使P3.7引脚输出音频的方波*/ void Time0(void ) interrupt 1 using 1 sound=!sound; /将P3.4引脚输出电平取反,形成方波 TH0=(8192-C)/32; / 13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; / 13位计数器TL0低5位的赋初值方法 附件2:用定时器T0和外部0的中断
10、实现十首曲的播放C语言程序#include /包含51单片机寄存器定义的头文件sbit sound=P34; /将sound位定义为P3.4unsigned int C; /储存定时器的定时常数unsigned char * JP; /unsigned int * f; /unsigned char t0 =0; / 中断次数unsigned char ww =255;/延时长度控制unsigned char i =0; /播放时控制第几个音节/以下是C调低音的音频宏定义#define l_dao 262 /将“l_dao”宏定义为低音“1”的频率262Hz#define l_re 286 /
11、将“l_re”宏定义为低音“2”的频率286Hz#define l_mi 311 /将“l_mi”宏定义为低音“3”的频率311Hz#define l_fa 349 /将“l_fa”宏定义为低音“4”的频率349Hz#define l_sao 392 /将“l_sao”宏定义为低音“5”的频率392Hz#define l_la 440 /将“l_a”宏定义为低音“6”的频率440Hz#define l_xi 494 /将“l_xi”宏定义为低音“7”的频率494Hz/以下是C调中音的音频宏定义#define dao 523 /将“dao”宏定义为中音“1”的频率523Hz#define re
12、587 /将“re”宏定义为中音“2”的频率587Hz#define mi 659 /将“mi”宏定义为中音“3”的频率659Hz#define fa 698 /将“fa”宏定义为中音“4”的频率698Hz#define sao 784 /将“sao”宏定义为中音“5”的频率784Hz#define la 880 /将“la”宏定义为中音“6”的频率880Hz#define xi 987 /将“xi”宏定义为中音“7”的频率523H /以下是C调高音的音频宏定义#define h_dao 1046 /将“h_dao”宏定义为高音“1”的频率1046Hz#define h_re 1174 /将“
13、h_re”宏定义为高音“2”的频率1174Hz#define h_mi 1318 /将“h_mi”宏定义为高音“3”的频率1318Hz#define h_fa 1396 /将“h_fa”宏定义为高音“4”的频率1396Hz#define h_sao 1567 /将“h_sao”宏定义为高音“5”的频率1567Hz#define h_la 1760 /将“h_la”宏定义为高音“6”的频率1760Hz#define h_xi 1975 /将“h_xi”宏定义为高音“7”的频率1975Hz/*函数功能:1个延时单位,延时200ms*/void delay(unsigned char w0) uns
14、igned char j,k; for(k=0;kw0;k+) for(j=0;j250;j+) ; /以下是渴望片头曲的一段简谱 unsigned int code SongJianPu0=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,m
15、i,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个延时单位 unsigned char code JiePai0 =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,
16、 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 ;/以下是 的一段简谱 unsigned int code SongJianPu4=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
17、_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;unsigned char code JiePai4 =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
18、,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 ;/以下是 老鼠爱大米 一段简谱 unsigned int code SongJianPu2=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,
19、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,s
20、ao,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; / unsigned char code JiePai2 = 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,
21、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; /以下是迟来的爱 片头曲的一段简谱 unsigned int code SongJianPu3= mi,re,mi,sa
22、o,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
23、,mi,sao,la,sao,la,sao,mi,dao, 0xff ; unsigned char code JiePai3 =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 ;/以下是 义勇军进行曲 片头曲的一段简谱 unsigned in
24、t code SongJianPu1=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
25、,sao,mi,dao,l_sao,dao,l_sao,dao,l_sao,dao,dao, 0xff ; unsigned char code JiePai1 =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 ;/以下是 的一段简谱 unsigned int code SongJianPu5= 0xff
26、 ; unsigned char code JiePai5 =2, ;/以下是 的一段简谱 unsigned int code SongJianPu6= 0xff ; unsigned char code JiePai6 =3, ;/以下是 的一段简谱 unsigned int code SongJianPu7= 0xff ; unsigned char code JiePai7 =7, ;/以下是 的一段简谱 unsigned int code SongJianPu8= 1, 0xff ; unsigned char code JiePai8 =8, ;/以下是 的一段简谱 unsigned
27、 int code SongJianPu9= 1, 0xff ; unsigned char code JiePai9 =1, ;/*函数功能:主函数*/ void main(void) unsigned char i,j; TMOD =0X00;/设TIMER0在MODE1(13位计数器) TCON =0X01;/外部中断INT0,下降沿触发 IE =0x83;/开中断(INT0,TIMER0) IP =0x00;/设置中断优先级 f=SongJianPu0; JP=JiePai0; while(1) /无限循环 i=0; /从第1个音符f0开始播放 while(fi!=0xff) /只要没有读到结束标志就继续播放 C=460830/fi; TH0=(8192-C)/32; /可证明这是13位计数器TH0高8位的赋初值方法 TL0=(8192-C)%32; /可证明这是13位计数器TL0低5位的赋初值方法 TR0=1; /启动定时器T0 for(j=0;jJPi;j+) /控制节拍数 delay(ww); /延时1个节拍单位 TR0=0; /关闭定时器T0 i+; /播放下一个音符 /*函数功能:定时器T0的中断服务子程序,使P3.7引脚输出音频的方波*/ void Time0(void ) interrupt 1 using 1
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1