基于51单片机音乐播放器课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于51单片机音乐播放器课程设计报告
课程设计
课程设计名称:单片机课程设计专业班级电科0901 学生姓名:学号:200948360118 指导教师:课程设计时间: 2012-9-20~2012-9-28
电子信息科学与技术专业课程设计任务书
说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
一设计任务及要求
利用单片机定时器完成控制音乐的频率,每个音调响的时长,来达到播放出音乐。并且实时监测红外接收管是否触发中断,来判断是否遥控器按下了播放/暂停键、上一首、下一首,进而实时处理。并把信息显示在1602液晶上。音高与频率的对应关系下表:
二设计原理图
单片机与1602液晶、红外接收管SM0038接线图
单片机驱动蜂鸣器电路及红外遥控器键码
本次实验所用按键及对应编码:
(1)上一首 07 (2) 下一首 15 (3)播放/暂停 09
三程序设计框图
Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256;
装入的初值 (10ms的初装值)
Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256;
装入的初值
TH1 = Sound_Temp_TH1;
TL1 = Sound_Temp_TL1;
TMOD |= 0x11;
ET0 = 1;
ET1 = 0;
PT0 = 0;
TR0 = 0;
TR1 = 0;
EA = 1;
void write_cmd(uchar cmd)//1602写命令lcd_rs=0;
lcd_w=0;
P0=cmd;
delay(7);
lcd_en=1;
delay(6);
lcd_en=0;
void write_date(uchar date)//1602写数据lcd_rs=1;
lcd_w=0;
P0=date;
delay(7);
lcd_en=1;
delay(6);
lcd_en=0;
void init_1602()//初始化1602
lcd_en=0;
write_cmd(1);
write_cmd(0x84);
write_cmd(0x38);
write_cmd(0x0f);
write_cmd(0x06);
void inte1_init()//红外中断 // 计算TL1应// 计算TH1应IT1 = 1;//外部中断,下降沿中断
EX1 = 1;//开外部中断
PX1 = 1;//
EA = 1;//开总中断
IRIN=1; //读引脚前,先置高
void jiema() //红外解码
uchar i,j;
for(j=0;j<4;j++)
irma[j]=0;//清除上次的码
for(i=0;i<8;i++)
irma[j]=irma[j]>>1;//右移1位
while(!IRIN);//等待0.56ms低电平结束
time2_init();//启动定时,0.8ms
while(!TF2);//等到0.8ms时间到
TR2=0;//关定时器
TF2=0;//清标志位
if(IRIN)//发送是1,其高电平时间长,大于0.565ms
irma[j]|=0x80;//把最高位置1
while(IRIN);//等待高电平结束,以便于进入下一位的解码 } void Lcd_displays(uchar add,char *s)//1602显示字符串
uchar i;
write_cmd(add);
for(i=0;i write_date(s[i]); void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed)//播放歌曲函数 unsigned int NewFreTab[12]; //新的频率表 unsigned char i,j; unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表 j = i + Signature; if(j > 11) j = j-12; NewFreTab[i] = FreTab[j]*2; NewFreTab[i] = FreTab[j]; if(Octachord == 1) NewFreTab[i]>>=2; else if(Octachord == 3) NewFreTab[i]<<=2; SoundLength = 0; while(Sound[SoundLength] != 0x00) //计算歌曲长度 SoundLength+=2; Point = 0; Tone = Sound[Point];