当前位置:文档之家› 基于温度感应的智能音乐播放器

基于温度感应的智能音乐播放器

任务书一、课程设计的目的课程设计是自动化专业集中实践环节的主要内容之一。

训练正确地应用单片机,培养解决工业控制、工业检测等领域具体问题的能力。

学生通过所做课题,熟悉单片机应用系统开发研制的过程,软硬件设计的工作方法、内容及步骤,对学生进行基本技能训练。

例如组成系统、编程、调试、绘图等。

使学生理论联系实际,提高动手能力和分析问题、解决问题的能力。

通过本课程设计,主要达到以下目的:1.使学生增进对单片机的感性认识,加深对单片机理论方面的理解。

2.使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通讯等。

3.使学生了解和掌握单片机应用系统的软/硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。

二、课程设计的要求1.学生需认真阅读课程设计任务书,熟悉有关设计资料及参考资料,熟悉各种设计规范的有关内容,认真完成任务书规定的设计内容。

2.课程设计的成果为“课程设计报告”。

课程设计报告内容要正确,概念要清楚,完成任务书所规定的内容,附有原理图及程序流程图,程序清单,文字要通顺,书写要工整,设计图纸必须符合规范。

3.课程设计报告应在2000字以上(含相关图纸和计划书等),用A4纸打印。

三、课程设计的选题参考(可另自行拟题或参考教材和实验指导书)1.交通灯系统设计2.计时器系统设计3.出租车计价器系统设计4.频率计系统设计5.温度控制系统设计6.音乐播放系统设计四、时间安排及成绩评定课程设计时间:6月8日下午布置课程设计,6月12日下午4:30在信息行政楼八层自动化系会议室辅导课程设计,6月14日全天(自动化1、2班),6月15日全天(自动化3、4班),6月16日全天(交控1班)在信息行政楼B202CPLD 实验室上机调试电路及程序,6月23日下午各班长收齐设计报告交给辅导老师。

辅导老师根据学生的设计资料,设计报告书、图纸等进行评定。

课程设计成绩按百分制分评定。

五、参考资料:牛昱光主编《单片机原理与接口技术》电子工业出版社51单片机实验指导书胡汉才主编《单片机原理及其应用》清华大学出版社出版何立民主编《单片机应用文集》北京航空航天大学出版社出版太原理工大学信息学院自动化系2016/05/23基于温度感应的智能音乐播放器摘要燥热或是寒冷的天气都会使人烦躁,这时可以听音乐来缓解疲劳,但如果听着不合适的音乐就会适得其反。

或是当你寒冷的冬天在洗澡的时候,温度较高高,这时候需要激情的音乐使你更加兴奋;或是在舒适的泡澡时,需要舒缓的音乐来愉悦身心。

手动控制在这里就显得不那么方便,因此需要一个智能播放器可以根据不同温度来播放不同的音乐。

本设计利用51单片机的数码管来完成时间的显示,并利用蜂鸣器实现音乐功能,通过DH11温湿度传感器来采集温度。

并且,通过对定时器初值的设定来产生不同频率的声音,利用定时器中断来完成对音乐节拍长度的控制。

通过音频功率放大器,将单片机输出的信号放大,再通过喇叭播放乐曲。

此设计摆脱了传统音乐播放器的手动操作,取而代之的是智能化操作,能为人们的日常生活提供便利,且成本低廉,值得推广。

关键词:音乐播放;音频转换;温度采集;AbstractHot weather or cold weather will make people irritable, then you can listen to music to ease fatigue, but if listening to inappropriate music will be counterproductive. Or when you are cold in the winter when the bath, the temperature is high, this time the need for passionate music to make you more excited; or in a comfortable bath, the need for soothing music to enjoy the physical and mental. Manual control here is not so convenient, so you need a smart player can play different colors according to different music.The design of the use of 51 single-chip digital control to complete the time display, and the use of buzzer to achieve music function, through the DH11 temperature and humidity sensor to collect temperature. And, by setting the initial value of the timer to produce different frequencies of sound, the use of timer interrupt to complete the control of the length of the music beat. Through the audio power amplifier, the microcontroller output signal amplification, and then through the speaker to play music. This design out of the traditional music player manual operation, replaced by intelligent operation, for people's daily life to facilitate, and low cost, it is worth promoting.Key words:Music player; audio conversion; Temperature collection目录任务书 (1)摘要 (3)一、总体设计 (5)1.1设计概要 (5)1.2具体功能 (5)1.3设计的硬件流程 (5)二、硬件设计 (6)2.1单片机(STC89C51)介绍 (6)2.2原理图 (6)2.2.1 主控程序 (6)2.2.2 供电、程序下载、串口通信模块 (7)2.2.3 数码管及锁存器 (7)2.2.4 DH11温湿度传感器 (8)2.2.5 蜂鸣器 (8)2.2.6 独立键盘 (9)2.3线路接线 (9)三、软件设计 (10)3.1声音信号 (10)3.2节拍信号 (10)3.3音频转换 (10)3.4软件流程设计 (10)3.5程序 (12)四、调试及运行 (21)4.1调试运行步骤 (21)4.2运行结果 (21)五、实验总结 (22)参考资料 (22)1.1设计概要在基于51单片机的音乐播放器中,采用DH11温湿度传感器为硬件基础,通过其对周围温湿度的采集,控制音乐播放。

单片机需外接+5V稳压电源,单片机工作时,用软件对定时器初值进行设定,从而得到所需要的声音频率;通过8位共阴极数码管,可显示温度;将单片机输出的信号放大,接入蜂鸣器即可发声。

1.2具体功能(1)对周围温度进行采集,当采集的温度达到不同设定值时,通过喇叭能播放不同的音乐。

要求播放出的音乐的音阶准确,不能有太大偏差,否则会造成音乐声音刺耳难听;音乐播放必须连贯,即音乐必须有节奏感;喇叭放出的音乐声音响亮,不能太小,否则不能达到乐曲的作用。

(2)在共阴数码管上显示出采集到的温度(摄氏度),包括温度及单位,当采集到温度后,立即在数码管上显示出温度,实时显示。

(3)将音乐编写好存储在单片机中,一共有三首歌曲选择,可通过独立键盘模块选择音乐播放,K1-K3按键分别选择音乐1-音乐3,K4按键为停止播放。

1.3设计的硬件流程2.1单片机(STC89C51)介绍STC89C51RC是采用8051核的ISP(In System Programming)在系统可编程芯片,最高工作时钟频率为80MHz,片内含4K Bytes的可反复擦写1000次的Flash 只读程序存储器,器件兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,具有在系统可编程(ISP)特性,配合PC端的控制程序即可将用户的程序代码下载进单片机内部,省去了购买通用编程器,而且速度更快。

STC89C51RC系列单片机是单时钟/机器周期(1T)的兼容8051 内核单片机,是高速/低功耗的新一代8051单片机,全新的流水线/精简指令集结构,内部集成MAX810 专用复位电路。

2.2原理图2.2.1 主控程序2.2.2 供电、程序下载、串口通信模块2.2.3 数码管及锁存器数码管数码管锁存器2.2.4 DH11温湿度传感器2.2.5 蜂鸣器2.2.6 独立键盘2.3线路接线三、软件设计3.1声音信号声音是音频振动的结果,振动的频率高则为高音,频率低则为低音。

音频范围为20HZ-200KHZ之间,而人类耳朵比较容易辨识的声音大概是200HZ-20KHZ。

一般音响电路是以正弦波信号驱动喇叭,产生悦耳的音乐的。

在数字电路里,则是以脉冲信号驱动喇叭以产生声音。

同样的频率,脉冲信号或正弦信号产生的音效,对于人类的耳朵来说很难有所区别。

若用单片机产生声音,可利用程序产生频率,送到输入/输出端口,再从该点连接到喇叭的驱动电路,即可驱动喇叭。

若要产生音频脉冲,只要算出某一音频的周期,再将此周期除以2,即为半周期的时间。

利用定时器计时半周期时间,每当计时终止后就将P1.0反相,然后重复计时再反相。

就可在P1.0引脚上得到此频率的脉冲。

3.2节拍信号音阶的频率是固定的,而节拍有快有慢,拍子越短节奏越快,拍子越长节奏越慢。

控制发音的时间有两种方法:调用延时子程序或采用定时器中断。

本次设计采用的是定时器中断。

然后在程序执行时顺序查此表,取出音符代码,查频率表,置入T/C口,取出节拍代码,供定时器使用,启动后即可发出声音。

3.3音频转换利用单片机的内部定时器使其工作计数器模式(MODEL1)下,改变其计数值TH0及TL0以产生不同频率的方法产生不同音阶。

3.4软件流程设计程序开始运行时先对单片机进行初始化,其中包括定时器及其工作方式的选择、外部中断设定、定时器初值的设定。

程序流程图如下:3.5程序#include <reg52.h>#include <intrins.h>typedef unsigned char U8;typedef signed char S8;typedef unsigned int U16;typedef signed int S16;typedef unsigned long U32;typedef signed long S32;typedef float F32;typedef double F64;#define uchar unsigned char#define uint unsigned int#define Data_0_time 4//----------------IO口定义区--------------------//sbit P2_0 = P2^0 ;sbit dula=P2^6;sbit wela=P2^7;//----------------定义区--------------------//U8 U8FLAG,k;U8 U8count,U8temp;U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;U8U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_t emp;U8 U8comdata;U8 outdata[5]; //定义发送的字节数U8 indata[5];U8 count, count_r=0;U8 str[5];U16 U16temp1,U16temp2;U8table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};void delayms(U16 xms){U16 i,j;for(i=xms;i>0;i--){for(j=110;j>0;j--);}}void Delay(U16 j){ U8 i;for(;j>0;j--){for(i=0;i<27;i++);}}void Delay_10us(void){U8 i;i--;i--;i--;i--;i--;i--;}void COM(void){U8 i;for(i=0;i<8;i++){U8FLAG=2;while((!P2_0)&&U8FLAG++);Delay_10us();Delay_10us();Delay_10us();U8temp=0;if(P2_0)U8temp=1;U8FLAG=2;while((P2_0)&&U8FLAG++);//超时则跳出for循环if(U8FLAG==1)break;//判断数据位是0还是1// 如果高电平高过预定0高电平值则数据位为1U8comdata<<=1;U8comdata|=U8temp; //0}//rof}//-----湿度读取子程序------------//--------------------------------//----以下变量均为全局变量--------//----温度高8位== U8T_data_H------//----温度低8位== U8T_data_L------//----湿度高8位== U8RH_data_H-----//----湿度低8位== U8RH_data_L-----//----校验8位== U8checkdata-----//----调用相关子程序如下----------//---- Delay();, Delay_10us();,COM();//--------------------------------void RH(void){//主机拉低18msP2_0=0;Delay(180);P2_0=1;//总线由上拉电阻拉高主机延时20usDelay_10us();Delay_10us();Delay_10us();Delay_10us();//主机设为输入判断从机响应信号P2_0=1;//判断从机是否有低电平响应信号如不响应则跳出,响应则向下运行if(!P2_0) //T !{U8FLAG=2;//判断从机是否发出80us 的低电平响应信号是否结束while((!P2_0)&&U8FLAG++);U8FLAG=2;//判断从机是否发出80us 的高电平,如发出则进入数据接收状态while((P2_0)&&U8FLAG++);//数据接收状态COM();U8RH_data_H_temp=U8comdata;COM();U8RH_data_L_temp=U8comdata;COM();U8T_data_H_temp=U8comdata;COM();U8T_data_L_temp=U8comdata;COM();U8checkdata_temp=U8comdata;P2_0=1;//数据校验U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);if(U8temp==U8checkdata_temp){U8RH_data_H=U8RH_data_H_temp;U8RH_data_L=U8RH_data_L_temp;U8T_data_H=U8T_data_H_temp;U8T_data_L=U8T_data_L_temp;U8checkdata=U8checkdata_temp;}//fi}//fi}char code dx516[3] _at_ 0x003b;sbit BEEP=P2^3; //喇叭输出脚sbit P10=P1^0;sbit K1= P3^0;sbit K2= P3^1;sbit K3= P3^2;sbit K4= P3^3;uchar th0_f; //在中断中装载的T0的值高8位uchar tl0_f; //在中断中装载的T0的值低8位//T0的值,及输出频率对照表uchar code freq[36*2]={0xA9,0xEF,//00220HZ ,1 //00x93,0xF0,//00233HZ ,1#0x73,0xF1,//00247HZ ,20x49,0xF2,//00262HZ ,2#0x07,0xF3,//00277HZ ,30xC8,0xF3,//00294HZ ,40x73,0xF4,//00311HZ ,4#0x1E,0xF5,//00330HZ ,50xB6,0xF5,//00349HZ ,5#0x4C,0xF6,//00370HZ ,60xD7,0xF6,//00392HZ ,6#0x5A,0xF7,//00415HZ ,70xD8,0xF7,//00440HZ 1 //120x4D,0xF8,//00466HZ 1# //130xBD,0xF8,//00494HZ 2 //140x24,0xF9,//00523HZ 2# //150x87,0xF9,//00554HZ 3 //160xE4,0xF9,//00587HZ 4 //170x3D,0xFA,//00622HZ 4# //180x90,0xFA,//00659HZ 5 //190xDE,0xFA,//00698HZ 5# //200x29,0xFB,//00740HZ 6 //210x6F,0xFB,//00784HZ 6# //220xB1,0xFB,//00831HZ 7 //230xEF,0xFB,//00880HZ `10x2A,0xFC,//00932HZ `1#0x62,0xFC,//00988HZ `20x95,0xFC,//01046HZ `2#0xC7,0xFC,//01109HZ `30xF6,0xFC,//01175HZ `40x22,0xFD,//01244HZ `4#0x4B,0xFD,//01318HZ `50x73,0xFD,//01397HZ `5#0x98,0xFD,//01480HZ `60xBB,0xFD,//01568HZ `6#0xDC,0xFD,//01661HZ `7 //35};//定时中断0,用于产生唱歌频率timer0() interrupt 1{TL0=tl0_f;TH0=th0_f; //调入预定时值BEEP=~BEEP; //取反音乐输出IO}//******************************//音乐符号串解释函数//入口:要解释的音乐符号串,输出的音调串,输出的时长串changedata(uchar *song,uchar *diao,uchar *jie){uchar i,i1,j;char gaodi; //高低+/-12音阶uchar banyin;//有没有半个升音阶uchar yinchang;//音长uchar code jie7[8]={0,12,14,16,17,19,21,23}; //C调的7个值*diao=*song;for(i=0,i1=0;;){gaodi=0; //高低=0banyin=0;//半音=0yinchang=4;//音长1拍if((*(song+i)=='|') || (*(song+i)==' ')) i++; //拍子间隔和一个空格过滤switch(*(song+i)){case ',': gaodi=-12;i++;//低音break;case '`': gaodi=12;i++; //高音break;}if(*(song+i)==0) //遇到0结束{*(diao+i1)=0; //加入结束标志0*(jie+i1)=0;return;}j=*(song+i)-0x30; i++; //取出基准音j=jie7[j]+gaodi; //加上高低音yinc: switch(*(song+i)){case '#': //有半音j加一个音阶i++;j++;goto yinc;case '-': //有一个音节加长yinchang+=4;i++;goto yinc;case '_': //有一个音节缩短yinchang/=2;i++;goto yinc;case '.': //有一个加半拍yinchang=yinchang+yinchang/2;i++;goto yinc;}*(diao+i1)=j; //记录音符*(jie+i1)=yinchang; //记录音长i1++;}}//******************************************//奏乐函数//入口:要演奏的音乐符号串void play(uchar *songdata){uchar i,c,j=0;uint n;uchar xdata diaodata[112]; //音调缓冲uchar xdata jiedata[112]; //音长缓冲changedata(songdata,diaodata,jiedata); //解释音乐符号串TR0=1;for(i=0;diaodata[i]!=0;i++) //逐个符号演奏{tl0_f=freq[diaodata[i]*2]; //取出对应的定时值送给T0 th0_f=freq[diaodata[i]*2+1];for(c=0;c<jiedata[i];c++) //按照音长延时{for(n=0;n<32000;n++);if((!K1)||(!K2)||(!K4)||(!K3))//发现按键,立即退出播放{TR0=0;return;}}TR0=0;for(n=0;n<500;n++); //音符间延时TR0=1;}TR0=0;}//两只老虎uchar code xianjian[]={"|1_2_3_1_1_2_3_1|4_5_6_4_5_6_|1_2_3_1_1_2_3_1|4_5_6_4_5_6_|1_2_3_1_1_2_3_1|4_5_6_ 4_5_6_|"};//童话uchar code song3[]={"5_5_4_3.|3_4_3_|3_4_3_4_3_2_1-|1_3_5_6.|6_6_5_2_2_4_3-|1_3_5_6_|6_6_7_6_5_4_3_4_3_2 _1_--|"};//世上只有妈妈好uchar code mamahao[]={"6.5_35|`16_5_6-|35_6_53_2_|1_,6_5_3_2-|""2.3_55_6_|321-|5.3_2_1_,6_1_|,5--"};void main(){/* 系统初始化*/Delay(20000);TMOD = 0x01; //使用定时器0的16位工作模式TR0 = 0;ET0 = 1; //定时器0中断EA = 1; //打开总中断Delay(1); //延时100US(12M晶振)while(1){//调用温湿度读取子程序RH();//串口显示程序str[0]=U8RH_data_H; // 把湿度整数给予SRT0.(直接使用即可)str[1]=U8RH_data_L; // 把湿度小数给予SRT1.==0(为零,不用)str[2]=U8T_data_H; // 把温度整数给予SRT2.(直接使用即可)str[3]=U8T_data_L; // 把温度小数给予SRT3.==0(为零,不用)str[4]=U8checkdata; // 校验位(不用)dula=1;P0=table[str[2]/10];dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayms(1);dula=1;P0=table[str[2]%10];dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(1);dula=1;P0=table[12];dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayms(1);if(str[2]>30){play(song3); //播放音乐}if(str[2]>32){play(xianjian); //播放音乐}if(!K3){while(!K3);play(mamahao); //播放音乐}if(!K1){while(!K1);play(xianjian); //播放音乐}if(!K2){while(!K2);play(song3); //播放音乐}}}四、调试及运行4.1调试运行步骤1、检查串口的接口是否连接正确。

相关主题