基于51单片机音乐播放器课程设计报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];

相关文档
最新文档