中国矿业大学徐海学院技能考核培训姓名:陈思彤学号: 22110838 专业:信息11-2班题目:基于单片机的红外无线控制专题:音乐播放器指导教师:有鹏老师翟晓东老师设计地点:电工电子实验室时间: 2014 年 4 月通信系统综合设计训练任务书学生姓名陈思彤专业年级信息11-2班学号22110838设计日期:2014年4 月5日至2014 年4 月10 日设计题目:基于单片机的红外无线控制设计专题题目:音乐播放器设计主要内容和要求:1. 主要内容:单片机内部结构红外遥控解码C语言程序设2. 功能扩展要求实现音乐播放器的功能指导教师签字:摘要:近年来随着计算机在社会领域的渗透, 单片机的应用正在不断地走向深入。
红外线技术也被广泛应用于各个电子领域,先设计一种基于单片机的红外遥控的简易音乐播放器。
通信蜂鸣器来发声,来完成音乐播放器的功能。
该系统可实现对音乐播放的远距离遥控,且结构简单,速度快,抗干扰能力强。
通过本次课程设计,我对单片机中断系统等知识有了进一步的了解,对单片机的相关知识做到理论联系实际。
关键词:单片机,中断系统,红外遥控,音乐播放目录1 绪论 (4)1.1概述 (4)1.2功能 (4)2 硬件电路 (5)2.1总体设计方 (5)2.2单片机最小系统 (5)2.3红外遥控收发电路 (5)2.3.1 红外遥控发射电路 (6)2.3.2 红外遥控接收电路 (7)2.4蜂鸣器电路 (7)2.5 LED指示灯电路 (8)3软件编程 (9)3.1 C语言实现系统设计 (9)3.2乐谱的改编 (10)参考文献 (11)附录 (12)1 绪论1.1概述本设计采用红外线来遥控蜂鸣器使其播放音乐,红外遥控是如今广泛使用的一种通信和遥控手段;红外线遥控利用红外线来传输数据,这种情况下不需要实体连线,体积小,成本低,功能强;因此红外遥控设备已经广泛的应用在如今的电气设备的数据交互和设备控制中。
利用单片机演奏时音乐爱好者的兴趣之一,应用的范围也比较广泛。
所谓音乐播放器由单片机进行信息处理,再经过信号放大,由蜂鸣器发出乐曲声。
详细说来,演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。
这就需要单片机,在半个周期内输出低电平、另外半个周期输出高电平,周而复始。
众所周知,周期为频率的倒数,可以通过音符的频率计算出周期;因此演奏时,要根据音符的不同,把对应的、半个周期的定时时间初始值,送入定时器,再由定时器按时输出高低电平。
本文比较详细地介绍了音乐播放器的工作原理、设计思路、硬件的选择及相关作用、软件的实现方法以及详细的程序清单。
1.2功能本设计以单片机为核心实现红外遥控音乐播放器功能,主要完成功能为四首歌曲的选择播放、暂停、暂停后断点播放,播放下一曲,播放上一曲以及流水灯显示音符等功能。
本设计中使用常见的红外遥控器进行控制,使用其中的1、2、3、4四个数字键(对应功能选择1、2、3、4四首歌曲),频道加、减两个按键(对应功能上一曲、下一曲),静音键(对应功能暂停),以及确定键(对应功能播放歌曲)2 硬件电路2.1总体设计方图1系统组成框图本系统以AT89S52单片机为控制核心,以遥控器作为控制元件,以蜂鸣器作为执行器件。
通过按下遥控器相应按键向单片机发送控制信息(红外信号),单片机红外接收器收到该红外信号后进行解码然后通过P3.2口将解码后的控制信息送入单片机,单片机通过P2.5口控制蜂鸣器播放音乐2.2单片机最小系统2.3红外遥控收发电路红外线遥控是目前使用最广泛的一种通信和遥控手段。
由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。
工遥控器AT89S52 单片机音乐播放业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。
常用的红外遥控系统一般分发射和接收两个部分。
应用编/解码专用集成电路芯片来进行控制操作,如下图所示。
发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
图2红外线遥控系统框图2.3.1 红外遥控发射电路发射部分的主要元件为红外发光二极管。
它实际上是一只特殊的发光二极管;由于其内部材料不同于普通发光二极管,因而在其两端施加一定电压时,它便发出的是红外线而不是可见光。
目前大量的使用的红外发光二极管发出的红外线波长为940nm左右。
遥控器的基本组成如图所示。
它主要由形成遥控信号的微处理器芯片、晶体振荡器、放大晶体管、红外发光二极管以及键盘矩阵组成。
图4遥控器电路图工作原理:微处理器芯片IC1内部的振荡器通过2、3脚与外部的振荡晶体X 组成一个高频振荡器,产生高频振荡信号。
此信号送入定时信号发生器后进行分频产生正弦信号和定时脉冲信号。
正弦信号送入编码调制器作为载波信号;定时脉冲信号送致扫描信号发生器、键控输入编码器和指令编码器作为这些电路的时间标准信号。
IC1内部的扫描信号发生器产生五种不同时间的扫描脉冲信号,由5~9脚输出送至键盘矩阵电路。
当按下某一键时,相应于该功能按键的控制信号分别由10~14脚输入到键控编码器,输出相应功能的数码信号。
然后由指编码器输出指令码信号,经过调制器调制在载波信号上,形成包含有功能信息的高频脉冲串,由17脚输出经过晶体管BG放大,推动红外线发光二极管D发射出脉冲调制信号2.3.2 红外遥控接收电路红外线遥控接收器的作用是将接收到的红外线遥控信号,经过放大、解调和整形后输出功能指令信号,送至微处理器进行识别和处理。
2.4蜂鸣器电路蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
2.5 LED指示灯电路3软件编程3.1 C语言实现系统设计单片机应用系统的程序设计有两种方法:一种是基于汇编语言的,另一种是基于C语言的。
汇编语言程序的机器代码生成效率高,但可读性较差,而C语言程序的可读性和可移植性远超过汇编语言。
用C语言编写单片机应用程序,不用具体组织、分配存储器资源和处理端口数据,但对数据类型与变量的定义,必须要与单片机的存储结构相关联,否则编译器不能正确地映射定位。
C语言具有以下主要特点:①语言简洁,使用方便灵活。
它是程序设计语言中规模最小的语言之一。
ANSI标准C语言只有32个关键字,9种流程控制语句。
②程序可移植性好。
③表达能力强。
具有丰富的数据结构类型和多种运算符。
用户可灵活采用多种数据类型和使用各种运算符,实现复杂运算。
④表达方式灵活。
利用C语言的多种运算符可组成各种表达式,还可采用多种方法来获得表达式的值,使程序设计具有更大的灵活性。
⑤可进行结构化程序设计。
C语言以函数作为程序设计的基本单位,非常适合结构化程序设计。
⑥可直接操作计算机硬件。
C语言具有直接访问机器物理地址的能力,C51的编译器都可直接对单片机内部的SFR和I/O端口进行操作,可以直接访问片内、片外存储器,还可以进行各种为操作。
⑦生成的目标代码质量较高。
3.2乐谱的改编单片机演奏一个音符,是通过引脚,周期性的输出一个特定频率的方波。
这就需要单片机,在半个周期内输出低电平、另外半个周期输出高电平,周而复始。
众所周知,周期为频率的倒数,可以通过音符的频率计算出周期;演奏时,要根据音符的不同,把对应的、半个周期的定时时间初始值,送入定时器,再由定时器按时输出高低电平。
在此程序中,通过两个数据表存放了事先算好的、各种音符频率所对应的、半周期的定时时间初始值。
低音、中音、高音和超高音,四个八度共28个音符。
演奏乐曲时,就根据音符的不同数值,从表中找到定时时间初始值,送入定时器即可控制音调。
10参考文献[1] 华成英.童诗白.模拟电子技术基础[M] 北京:高等教育出版社,2006 :12-3[2] 赵亮.单片机C语言编程与实例[M]. 北京:人民邮电出版社, 2003:3-432[3] 瞿贵荣.15通道红外遥控电路[J].实用电子制作,2005,(7):10.[4] 陈燕春. 学习型14路红外遥控开关[J]. 单片机开发与应用, 2005, (6): 22-25[5]胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2006:3:1-12附录附录1:程序#include <REGX51.H>#include <intrins.h>#include "delay.h"#include "decode.h"#define uchar unsigned char#define uint unsigned int#define Font_code P0 //字符码写地址#define reg_code P2 //字位码写地址sbit speaker=P2^5;#define LED P1code unsigned char shuzu[]={0XFE,0XFD,0XFB,0XF7,0XEF,0XDF,0XBF,0X7F};unsigned char timer0h,timer0l,time;//世上只有妈妈好数据表6,2,3,code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3, 3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0};code unsigned char sszymmh1[] = {5, 2, 2, 3, 2, 1, 5, 2, 1, 1, 3, 4,6, 2, 2, 1, 3, 1, 6, 2, 1, 5, 2, 4,5,2,2, 1,2,1,2,2,1,3,2,2,2,2,1,1,2,1,2,2,4,5,2,2,3,2,1,5,2,1,1,3,3,7,2,1,6,2,2,1,3,2,5,2,4,5,2,2,2,2,1,3,2,1,4,2,3,7,1,1,1,2,4,6,2,2,1,3,2,1,3,4,7,2,2,6,2,1,7,2,1,1,3,4,6,2,1,7,2,1,1,3,1,6,2,1,6,2,1,5,2,1,3,2,1,1,2,1,2,2,4,5,2,2,3,2,1,5,2,1,1,3,3,7,2,1,6,2,2,1,3,2,5,2,4,5,2,2,2,2,1,3,2,1,4,2,3,7,1,1,1,2,4,0, 0, 0};code unsigned char sszymmh2[]={6,2,1,7,2,1,1,3,3,7,2,1,1,3,2,3,3,2,7,2,6,3,2,1,6,2,3,5,2,1,6,2,2,1,3,2,5,2,6,3,2,2,4,2,3,3,2,1,4,2,2,1,3,2,3,2, 4,1,3,1,7,2,1,6,2,1,5,3,2,6,2,1,7,2,2,5,2,2,6,2,6,1,3,1,2,3,1,3,3,3,2,3,1,3,3,2,2,3,6,5,2,1,5,2,1,1,3,3,7,2,1,1,3,2,3,3,2,3,3,8,6,2,1,7,2,1,1,3,2,7,2,2,2,3,1,2,3,1,1,3,3,5,2,1,5,2,4,4,3,2,3,3,2,2,3,2,};code unsigned char sszymmh3[]={6,2,2,1,3,2,2,3,2,1,3,1,7,2,1,6,2,2,1,3,2,2,3,3,1,3,1/2,6,2,1/2,6,2,2,1,3,2,1,3,2,7,2,2,6,2,4,6,2,2,1,3,2,2,3,2,1,3,1,6,2,1,5,2,2,6,2,1,5,2,1,4,2,2,5,2,2,6,2,2,1,3,2,4,2,2,5,2,2,6,2,2,5,2,1,4,2,1,2,2,6, 6,2,2,1,3,2,2,3,2,1,3,1,7,2,1,6,2,2,1,3,2,2,3,3,1,3,1/2,6,2,1/2,6,2,2,1,3,2,1,3,2,7,2,2,6,2,4,6,2,2,1,3,2,2,3,2,1,3,1,6,2,1,5,2,2,6,2,1,5,2,1,4,2,2,5,2,2,6,2,2,1,3,2,4,2,2,5,2,2,6,2,2,5,2,1,4,2,1,2,2,6, 0,0,0};// 音阶频率表高八位code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;// 音阶频率表低八位code unsigned char FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F, //1,2,3,4,5,6,7,8,i0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};code uchar Show_Tab[]={0xC0,/*0*/0xF9,/*1*/0xA4,/*2*/0xB0,/*3*/0x99,/*4*/0x92,/*5*/0x82,/*6*/0xF8,/*7*/0x80,/*8*/0x90,/*9*/0x88,/*A*/0x83,/*b*/0xC6,/*C*/0xA1,/*d*/0x86,/*E*/0x8E /*F*/};code uchar S_Tab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsigned char Display_Buffer[8]; //显示缓冲区uchar bit_con; //字位码扫描计数器extern unsigned char key_value; //键值extern bit key_flg; //按钮按下标志extern bit cycle_flg; //循环标志void delay(unsigned char t){unsigned char t1;unsigned long t2;for(t1=0;t1<t;t1++){for(t2=0;t2<8000;t2++){;}}TR1=0;}void t0int() interrupt 3{TR1=0;speaker=!speaker;TH1=timer0h;TL1=timer0l;TR1=1;}void song(){TH1=timer0h;TL1=timer0l;TR1=1;delay(time);}void main(){unsigned char k,i,j,z;TMOD=0x10; //置CT0定时工作方式1EA=1;ET1=1;//IE=0x82 //CPU开中断,CT0开中断delay_nus(1);delay_nms(1);reg_code = 0xff; //关闭显示for(bit_con=0;bit_con<8;bit_con++) Display_Buffer[bit_con] = Show_Tab[0]; bit_con = 0;Timer0init();//定时器0初始化EX0init(); //外部中断初始化while(1){j=0;if(key_flg) //解码生效,把遥控码值转移到显示区,数据码两位显示{key_flg = 0;Display_Buffer[0] = Show_Tab[(key_value & 0xf0) >> 4];Display_Buffer[1] = Show_Tab[key_value & 0x0f];switch(z){case 0:{lop: i=0;while(i<10000){ //音乐数组长度,唱完从头再来k=sszymmh[i]+7*sszymmh[i+1]-1;if (i%3==0){j=sszymmh[i];LED=shuzu[j-1];}if (key_value==0x47) {while(1){if (key_value==0x44)break;}}if (key_value==0x19){goto lop;break;}timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh[i+2];i=i+3;song();if (key_value==0x0c){ key_value=0;z=0;break;}if (key_value==0x18){ key_value=0;z=1;break;}if (key_value==0x5e) { key_value=0;z=2;break;}if (key_value==0x08){ key_value=0;z=3;break;}if (key_value==0x40){ key_value=0;z=3; break;}if (key_value==0x43){ key_value=0;z=1; break;}}};break;case 1:{lop1: i=0;while(i<1000){ //音乐数组长度,唱完从头再来k=sszymmh1[i]+7*sszymmh1[i+1]-1;if (i%3==0){j=sszymmh[i];LED=shuzu[j-1];}if (key_value==0x47){while(1){if (key_value==0x44)break;}}if (key_value==0x19){goto lop1;break;}timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh1[i+2];i=i+3;song();if (key_value==0x0c){ key_value=0;z=0;break;}if (key_value==0x18){ key_value=0;z=1;break;}if (key_value==0x5e){ key_value=0;z=2;break;}if (key_value==0x08){ key_value=0;z=3;break;}if (key_value==0x40){ key_value=0;z=0; break;}if (key_value==0x43){ key_value=0;z=2; break;}}};break;case 2:{lop2: i=0;while(i<1000){ //音乐数组长度,唱完从头再来k=sszymmh2[i]+7*sszymmh2[i+1]-1;if (i%3==0){j=sszymmh2[i];LED=shuzu[j-1];}if (key_value==0x47){while(1){if (key_value==0x44)break;}}if (key_value==0x19){goto lop2;break;}timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh2[i+2];i=i+3;song();if (key_value==0x0c){ key_value=0;z=0;break;}if (key_value==0x18){ key_value=0;z=1;break;}if (key_value==0x5e){ key_value=0;z=2;break;}if (key_value==0x08){ key_value=0;z=3;break;}if (key_value==0x40){ key_value=0;z=1; break;}if (key_value==0x43){ key_value=0;z=3; break;}}};break;case 3:{lop3: i=0;while(i<1000){ //音乐数组长度,唱完从头再来k=sszymmh3[i]+7*sszymmh3[i+1]-1;if (i%3==0){j=sszymmh2[i];LED=shuzu[j-1];}if (key_value==0x47){while(1){if (key_value==0x44)break;}}if (key_value==0x19){goto lop3;break;}timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh3[i+2];i=i+3;song();if (key_value==0x0c){ key_value=0;z=0;break;}if (key_value==0x18){ key_value=0;z=1;break;}if (key_value==0x5e){ key_value=0;z=2;break;}if (key_value==0x08){ key_value=0;z=3;break;}if (key_value==0x40){ key_value=0;z=2; break;}if (key_value==0x43){ key_value=0;z=0; break;}}};break;}}}}附录2:电路板。