播放生日快乐歌曲
安徽冶金科技职业学院
实 训 报 告
课题名称 播放生日快乐歌
系 部
班 级
学生姓名
指导教师
年 月 日
播放生日快乐歌的原理:
通过80C51乐曲播放电路中,P1.7接发声器SOND,P1.0接启动键,按一次K0就播放一遍生日快乐歌;控制输出方波形频率用定时/计数器比延时程序更加准确,根据C音调、半周期和fosc=12MHz条件下选播放乐曲除了控制频率还有控制时间的问题用26]和生日快乐歌曲音符节拍长度数组L[26],两数组序号具有对应关系。
例如200ms;遇休止符0;停止发音频,但仍当做一个音符,按其节拍长短控制定时时间。当一个音符播放结束,T1停,转入下一个音符,中间间隔延时10ms。
设计算3CB0H
因此3c,TL1=0xb0
生日快乐歌曲编程:
#include //包含访问sfr库函数regsbit K0=P1^0; //定义启动键
sbit SOND=P1^7; //定义发声器unsigned char i,j; //定义字符型循环变量iunsigned char code th[22]={ //定义音符频率定时数组高
0,196,202,208,211,216,220,224,226,229,232,233,236,238,240,241,242,244,244,246,267,248};
unsigned char code tl[22]={ //定义音符频率定时数组低
0,12,27,21,7,4,16,12,4,12,9,20,2,8,6,2,22,5,26,1,4,3};
unsigned char s[26]={ //定义生日快乐歌曲音符序数数组
12,12,13,12,15,14,12,12,13,12,16,15,12,12,19,17,15,14,13,0,18,18,17,15,16,15};
unsigned char L[26]={ //定义生日快乐歌曲音符节拍长度数组4,4,8,8,8,16,4,4,8,8,8,16,4,4,8,8,8,8,16,8,4,4,8,8,8,16};
void main(){ //主函数
unsigned int t; //定义循环变量t
TMOD=0x10; //T0定时器方式1定时器方式1
TH1=0x3c;TL1=0xb0; //置1初值0ms
IP=0x02;IE=0x8a; //置0为高优先级中断,0、1开中断
while(1){ //无限循环
while(K0==1); //等待按0按下while(K0==0); //等待按0释放for(i=0;i<26;i++){ //歌曲音符节拍循环
if(s[i]==0) {SOND=0; //若歌曲音符序数为
TR0=0;} //T0停止运行
else {TH0=th[s[i]]; //否则,置0初值TL0=tl[s[i]]; //置0初值低
TR0=1;} //T0运行
j=L[i];TR1=1; //置0ms计数器初值,1运行
while(TR1==1); //等待1停止运行
TR0=0;SOND=0; //T0停止运行,停止发声
for(t=0;t<2000;t++);}}} //音符间隔延时为0ms
void t0() interrupt 1 { //T0中断函数
SOND=~SOND; //输出取反(产音频方波)TH0=th[s[i]]; TL0=tl[s[i]];} //重置0初