找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8134|回复: 11
打印 上一主题 下一主题
收起左侧

基于51单片机红外遥控音乐台灯设计生产实习报告

  [复制链接]
跳转到指定楼层
楼主

红外遥控音乐台灯的设计生产实习报告


摘要
随着计算机技术的发展, 单片机的应用范围也不断扩大,目前单片机渗透到工作和生活的各个领域。在以单片机为核心的控制系统中,红外遥控成为目前使用比较广泛的一种无线通信和遥控手段。本课程设计提出一种基于单片机的红外遥控音乐台灯的设计方法。主要采用单片机为控制核心,以红外信号为通信手段,通信扬声器发声、LED发光二极管发光来完成音乐台灯的功能。本设计具有无线、非接触控制,抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点及特色。通过本设计可以完成简单的音乐台灯的功能。通过本次实习设计,我对单片机中断系统等知识有了进一步的了解,对单片机的相关知识做到理论联系实际。

目  录
摘  要
Abstract
第1章  绪论
1.1  概述
1.2  主要功能
第2章  电路设计
2.1  整体电路设计
2.2  电路模块设计
2.2.1  单片机最小系统电路
2.2.2  红外解码电路
2.2.3  音乐播放模块电路
2.2.4   LED灯具组电组                                                                  
第3章  程序设计
3.1  红外解码程序
3.2  音乐播放程序
第4章  硬件调试
生产实习总结
参考文献
附录1  整体电路图及实物图
附录2  电路元件
附录3  程序源码


第1章 绪论
1.1  概述
利用单片机演奏音乐是单片机爱好者的兴趣之一,应用的范围也比较广泛。所谓音乐播放器,由单片机进行信息处理,再经过信号放大,由蜂鸣器发出乐曲声。我们知道,振动产生声音,振动频率不同所发出的声音也就不同。有规律的振动发出的声音叫“乐音”。音乐由音频和节拍构成,音频即发声的频率;节拍即延时的长短。因此利用单片机的定时器,产生一定频率的方波,即可以产生一定频率的声音。再利用单片机软件延时的方法来产生不同的节拍。把音频和节拍结合起来,进行合理的排列,即可播放出比较悦耳的音乐。本文比较详细地介绍了音乐播放器的工作原理、设计思路、硬件的选择及相关作用、软件的实现方法以及详细的程序清单。
控制单片机播放音乐的方式有很多,多数使用者利用单片机存储音乐与控制播放。本设计利用STC89C51单片机及少数外围电路控制音乐播放,产生两首不同的歌曲。 对于单片机产生音乐,关键是控制频率的输出。本设计采用了定时器T0中断的方法产生不同频率的脉冲,从而产生不同频率的声音。此外,使用红外一体化头VS1838B接收红外信号,通过外部中断INT0来进行对红外信号的解码,由单片机内部程序对不同的键值完成不同的操作。并且使用常用的无源蜂鸣器进行发声,实现了一个简单的遥控音乐播放器的功能。
1.2  主要功能
本次设计所要实现为以STC89C51为核心的红外遥控音乐及LED灯具组的功能。首先,我们选择耐压值为12V的白色发光二极管作为本次设计的灯具组成器件。其次,选用ULN2003及扬声器的语音模块通过对所选的音乐进行编码输入到单片机后再解码到语音模块来实现我们的台灯音乐播放功能

第2章 电路设计
2.1 整体电路设计
根据设计要求,红外遥控音乐台灯可以分为三个模块进行设计:
1.单片机最小系统电路:单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的最小的系统单元。
对51系列单片机来说,最小系统一般应该包括:单片机、时钟电路、复位电路。本设计中使用的单片机为STC89C51,晶振电路使用12MHZ的晶振。复位电路:由电容串联电阻构成,当系统一上电,RST脚将会出现高电平,当RST脚的高电平持续两个机器周期以上就将复位。
2.红外解码电路:本电路主要用于对红外遥控器发出的红外信号进行解码,然后程序根据解码后的不同键值相应完成不同的功能。
3.音乐播放模块:本模块采用ULN2003及扬声器组成语音系统对经单片机解码后所得的音乐代码的数字量放大再转换为模拟量实现音乐的播放。
4.LED灯具组:我们选用耐压值为12V的发光二极管总共为12个。每4个led分为一组,分别与单片机A8、A9、A10管脚相连,从而实现台灯的三档亮度调节。
分析各模块电路的功能,画出原理框图如图2-1所示:
图2-1 红外遥控音台灯原理框图

2.2  电路模块设计
2.2.1 单片机最小系统电路
图2-2 单片机最小系统电路图
由图2-2可以知道,单片机最小系统主要由复位电路、时钟电路等组成。
1.复位电路:由电容串联电阻构成,并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定。
典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位。一般教科书推荐C 取10uF,R取8.2K左右。当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平。单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。
2.时钟电路:单片机内部有一个高增益反相放大器,引脚XTAL1 和XTAL2 分别是该放大器的输入端和输出端,如果引脚XTAL1 和XTAL2 两端跨接上晶体振荡器(晶振)或陶瓷振荡器就构成了稳定的自激振荡电路,该振荡电路的输出可直接送入内部时序电路。
单片机的时钟可由两种方式产生,即内部时钟方式和外部时钟方式。
(1)内部时钟方式。内部时钟方式即是由单片机内部的高增益反相放大器和外部跨接的晶振、微调电容构成时钟电路产生时钟的方法。外接晶振(陶瓷振荡器)时,C1、C2 的值通常选择为30Pf左右;C1、C2 对频率有微调作用,晶振或陶瓷谐振器的频率范围可在1.2MHz ~12MHz之间选择。为了减小寄生电容,更好地保证振荡器稳定、可靠地工作,振荡器和电容应尽可能安装得与单片机引脚XTALl 和XTAL2 靠近。由于内部时钟方式外部电路接线简单,单片机应用系统中大多采用这种方式。内部时钟方式产生的时钟信号的频率就是晶振的固有频率,常用fsoc 来表示。
(2)外部时钟方式。外部时钟方式即完全用单片机外部电路产生时钟的方法,外部电路产生的时钟信号被直接接到单片机的XTAL1引入,此时XTAL2 开路。
3.内外程序存储器选择控制端EA/Vpp,决定了单片机访问内部或外部的程序存储器。EA高电平时,访问内部程序存储器,但当程序计数器(PC)值超过0FFFFH时,单片机自动转向外部程序存储器。当EA低电平时,不管单片机有无内部存储器,只访问外部存储器[1]。
2.2.2  红外解码电路
红外解码电路如图2-3所示:

图2-3 红外解码电路图
由图2-3知道,红外解码电路中主要元件为红外一体化接收头VS1838B。
一体化红外接收头VS1838B是集信号放大、滤波、检波、整形于一体的红外接收器,电路内置PIN二极管和前置放大器,采用可以红外滤波的环氧树脂材料封装,可靠性高,不易受环境影响并可以防止非控制信号的输出脉冲出现。
内部结构如图2-4所示:
图2-4 VS1838B内部结构图
VS1838B内置带通滤波器、积分器、和自动增益控制电路以抑制各种干扰和噪音。数据信号和干扰信号的主要区别在于载波频率、脉冲波长和工作周期上。所以数据信号应该满足载波信号的频率尽量接近带通滤波器的中心频率(38KHZ);脉冲长度在300us以上;数据的编码类型相兼容。而本系统选用的VS1838B在这三方面和NEC编码格式是相配的
2.2.3 音乐播放模块
音乐播放模块电路如图2-5所示:


图2-5 音乐播放模块电路图

1.ULN2003:高压大电流达林顿晶体管阵列,由七个硅NPN复合晶体管组成。电路特点: ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。具有电流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动的系统。本设计中用于扬声器的驱动,同时可以为再次扩展时提供驱动电路。

2.2.4  LED灯具组

3程序设计
分析红外遥控音乐播放和控制led台灯亮度的功能,包括选择播放三首歌曲、不同歌曲对应不同台灯亮度。根据以上功能,可心得出结论:该程序设计的主要工作,即核心问题是红外信号的解码。因为,无论是播放音乐的哪一个操作,还是控制不同台灯亮度,都是建立在对红外信号的正确解码下的。首先进行正确的红外解码,然后根据解码后的键值进行播放歌曲与显示台灯亮度。按照以上得出的结论,画出程序流程图如图3-1所示:
图3-1 程序流程图
结合程序流程图,可以知道:将整个程序的设计分为两个模块,即:红外解码、播放及亮灯。
3.1  红外解码程序
在进行程序设计之前,先分析一下红外信号的波形。每当次按键按下,红外发射器会发出一串脉冲,红外接收器会收到这一串脉冲宽度不等的脉冲波形流,其脉冲流包括:(1)前导码:第1个脉冲波形;(2)用户码1:第2到第9个脉冲波形;(3)用户码2:第10到第17个脉冲波形;(4)数据码:第18到第25个脉冲波形;(5)数据反码:第26到第33个脉冲波形;(6) 连续按键脉冲:第34和第35个脉冲为结束脉冲,在每次按键结束后会有两个结束脉冲,如果一直按键不放的话,会一直发送连续按键脉冲,并可以认为在收到10个连续按键脉冲后是下一个按键(本次设计中不考虑连续按键脉冲)。其码型结构如图3-2所示:
图3-2 红外信号码型图
由图3-2可知:红外信号码型中本次设计中要使用的部分,即是图3-2中的8位键数据码。下面分析具体的怎样进行红外信号的解码。
红外信号为采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的“1”,其波形如图3-3所示。
图3-3 红外信号脉冲宽度图
上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,即产生了如图3-2所示的有效码组序列。在图3-3中同样可以看到引导码脉宽为9ms,间隔4.5ms。在红外信号经过解码电路后,原码型中的高低电平进行反转。在得到的新码型中,去掉第一个下降沿(引导码),第二个下降沿开始即为有效码序列,应该进行解码并记录。在本设计中,将解码后的信号引入外部中断1,由于是下降沿有效,故IT1=1[2]。红外解码源码如下:
3.2  播放及亮灯程序
分析音乐播放的过程,其为不同频率声音的组合,当一组恰当频率声音组合按照一定的先后顺序与节拍播放时,即可产生音乐。故要产生音频信号,只要算出某一音频的周期,将此周期除以2即为半周期的时间,利用定时器计时此半周期时间,计时到后取反输出,重复此过程即得到此频率的声音信号。此信号从P3.2脚输出,用ULN2003驱动扬声器播放音乐。其中每个音符使用两个字节表示:低位字节(偶地址)代表音级,表示的音级为c、﹟c、d、﹟d、e、f、……a3、﹟a3、b3;高位字节(奇地址)代表音符的时值(节拍),表示拍数为1/8拍(0.10s)~8拍(6.40s)。
程序设计中用软件延时程序来控制音级, 与红外解码共用定时器0进行节拍的控制。红外信号解码后,蜂鸣器播放音乐源码如下:
  1. #include "reg52.h"                                          //此文件中定义了单片机的一些特殊功能寄存器
  2.             
  3. typedef unsigned int u16;                //对数据类型进行声明定义
  4. typedef unsigned char u8;
  5. sbit IRIN=P3^2;
  6. u8 IrValue[6];
  7. u8 Time;
  8. u8 DisplayData[8];
  9. u8 code smgduan[17]={
  10. 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  11. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};
  12. //0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F、H的显示码
  13. /*******************************************************************************
  14. * 函 数 名         : delay
  15. * 函数功能                               : 延时函数,i=1时,大约延时10us
  16. *******************************************************************************/
  17. void delay(u16 i)
  18. {
  19.               while(i--);            
  20. }/*******************************************************************************
  21. * 函数名         : IrInit()
  22. * 函数功能                               : 初始化红外线接收
  23. * 输入           : 无
  24. * 输出                       : 无
  25. *******************************************************************************/
  26. void IrInit()
  27. {
  28.               IT0=1;//下降沿触发
  29.               EX0=1;//打开中断0允许
  30.               EA=1;              //打开总中断
  31.               IRIN=1;//初始化端口
  32. }
  33. /*******************************************************************************
  34. * 函 数 名       : main
  35. * 函数功能                            : 主函数
  36. * 输    入       : 无
  37. * 输    出                  : 无
  38. *******************************************************************************/
  39. void main()
  40. {            
  41.               IrInit();
  42.               while(1)
  43.               {            
  44.                             DisplayData[0] = smgduan[IrValue[2]/16];
  45.                             DisplayData[1] = smgduan[IrValue[2]%16];
  46.                             DisplayData[2] = smgduan[16];
  47.                   DigDisplay();                           
  48.               }                           
  49. }
  50. /*******************************************************************************
  51. * 函数名         : ReadIr()
  52. * 函数功能                               : 读取红外数值的中断函数
  53. * 输入           : 无
  54. * 输出                       : 无
  55. *******************************************************************************/
  56. void ReadIr() interrupt 0
  57. {
  58.               u8 j,k;
  59.               u16 err;
  60.               Time=0;                                                                     
  61.               delay(700);              //7ms
  62.               if(IRIN==0)                            //确认是否真的接收到正确的信号
  63.               {            
  64.                            
  65.                             err=1000;                                                        //1000*10us=10ms,超过说明接收到错误的信号
  66.                             /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  67.                             侯,程序死在这里*/            
  68.                             while((IRIN==0)&&(err>0))              //等待前面9ms的低电平过去                             
  69.                             {                                         
  70.                                           delay(1);
  71.                                           err--;
  72.                             }
  73.                             if(IRIN==1)                                          //如果正确等到9ms低电平
  74.                             {
  75.                                           err=500;
  76.                                           while((IRIN==1)&&(err>0))                            //等待4.5ms的起始高电平过去
  77.                                           {
  78.                                                         delay(1);
  79.                                                         err--;
  80.                                           }
  81.                                           for(k=0;k<4;k++)                            //共有4组数据
  82.                                           {                                                      
  83.                                                         for(j=0;j<8;j++)              //接收一组数据
  84.                                                         {
  85.                                                                       err=60;                           
  86.                                                                       while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  87.                                                                       {
  88.                                                                                     delay(1);
  89.                                                                                     err--;
  90.                                                                       }
  91.                                                                       err=500;
  92.                                                                       while((IRIN==1)&&(err>0))              //计算高电平的时间长度。
  93.                                                                       {
  94.                                                                                     delay(10);              //0.1ms
  95.                                                                                     Time++;
  96.                                                                                     err--;
  97.                                                                                     if(Time>30)
  98.                                                                                     {
  99.                                                                                                   return;
  100.                                                                                     }
  101.                                                                       }
  102.                                                                       IrValue[k]>>=1;              //k表示第几组数据
  103.                                                                       if(Time>=8)                                         //如果高电平出现大于565us,那么是1
  104.                                                                       {
  105.                                                                                     IrValue[k]|=0x80;
  106.                                                                       }
  107.                                                                       Time=0;                            //用完时间要重新赋值                                                                                                
  108.                                                         }
  109.                                           }
  110.                             }
  111.                                if(IrValue[2]!=~IrValue[3])
  112.    { EX1=1;
  113.      return; }
复制代码



第4章  硬件调试
根据上述设计电路画出电路原理图,根据原理图焊接电路板,实物图如图4-1所示:

图4-1 实物图
在本设计中使用的红外遥控器如图4-2所示,遥控器各按键相应码值如图4-3所示:
      
图4-2 红外遥控器              图4-3 遥控器按键码值
红外遥控音乐台灯的设计中,对于红外遥控器未将全部的按键设计功能,本设计使用按键对应码值及功能如表4-1所示:
表4-1 遥控器按键、码值及功能表
遥控器按键
按键对应码值
功能
数字键0
数字键1
16
0c
      关闭台灯
1档
数字键2
18
      2档
数字键3
5e
3档
根据设计功能进行硬件调试,调试过程如下:
(1)单片机上电,此时无按键按键,台灯不亮,蜂鸣器不工作。
(2)按下数字键1,对应码值0c,台灯亮度为1档,蜂鸣器工作,播放曲目1:祝你平安
(3)按下数字键2,对应码值18,台灯亮度为2档,蜂鸣器工作,播放曲目2:八月桂花
(4)按下数字键3,对应码值5e,台灯亮度为3档,蜂鸣器工作,播放曲目3:菊花台

生产实习总结
为期17天的生产实习结束了。这段时间以来,我们经历了很多,学到了很多,同样也领悟了很多。俗话说实践是检验真理的唯一标准。我们生活学习都在学校,接触的是课本是公式,然而自己动手做东西的机会少之又少。所以此次生产实习是我们锻炼自身的好机会,通过所学的知识将其结合到实际生产之中,并在这个过程中发现自己的不足然后解决它。同样,此次生产实习也是对我们三年来学习能力的一个检验,因而需用百分之两百的力气及汗水来完成此次实习。
一、实习过程
我们所选的课题为遥控音乐台灯的设计,其中涉及到单片机程序编写及调试,电路设计,3d打印等多项知识储备。因此,我们小组三人决定分工合作,一人负责程序编写和调试,其他两人分别负责电路设计和3d打印设计这两部分。历时三天,我们实现了单片机红外控制程序及音乐编码与解码等和3dmax软件的设计操作等必须的技能的掌握。接下来就是电路的设计与电路板的制备过程,相比前面的操作,这两项显得容易多,毕竟我们三年来都在接触与之相关的课程。因而我们在一天半内完成了电路板的印制。经初步的电路调试发现红外控制与led灯组不匹配,经过反复的盘查查找出了错误为复位电路设计出错,经改正后最终实现了基本设计要求。由此可见在做任何东西的时候都不是一蹴而就的,需要我们反复的验证并查找错误然后改进,因为金字塔不是一天就能建成的。
二、实习体会
  历时17天的生产实习已经接近尾声了,我们小组每个人在这实习过程中都收获良多,仿佛是对自己的系统进行了一次updata,清理了我们脑海中错误的知识印象,加深那些我们模糊知识的记忆,弄清了那些似懂非懂得知识理解。此次生产实习让我们学会了很多,也懂得了很多在枯燥的学习中没法获得到的知识和道理。回顾这三个星期,我们明白了一个道理:人生不可能存在一帆风顺的事,只有自己勇敢地面对人生中的每一个挫折和失败,才能通往自己的罗马大道。在这三周里,我们烦躁过,懈怠过,失败更是家常便饭。但在每次失落的时候我们都会反省自己,告诉自己清楚自己应该做的是什么,在挫折面前我們应该善用于扬长避短的方法来促进自己,提高自己的综合水平能力。在学习方面虽然自己普通平凡,但是我们会努力提高,做到最好,不管遇到什么困扰我们都不会跌倒,我会不懈努力。


参考文献
[1] 张毅刚.MCS-51单片机应用设计.哈尔滨:哈尔滨工业大学出版社,2003
[2] 求是科技.8051系列单片机C程序设计完全手册.北京:人民邮电出版社,2006
[3] 李升.单片机原理与接口技术.北京:北京大学出版社,2011


附录1  整体电路图及实物图
  



附录2  电路元件
1
单片机
STC89C51
1片
2
滑动变阻器
W201
1个
3
Carmp3遥控器

1个
4
达林顿晶体管
ULN2003
1片
5
红外一体接收头
VS1838B
1个
6
电容
30PF
2个

Dc插座

1个
8
电解电容
10UF
1个
9
电阻
1K
1个
10
电阻
512R
12个
11
四角按键开关

1个
12
晶振
12MHz
1个
13
白色发光二极管

12个
14
扬声器
2W4R
1个
15
排针及排插

若干

附录3  程序源码
单片机源程序如下:

  1. #include <REG52.H>   
  2. #include <INTRINS.H>  
  3. sbit Beep =  P1^5;
  4. typedef unsigned int u16;                //对数据类型进行声明定义
  5. typedef unsigned char u8;

  6. sbit led1=P2^0;
  7. sbit led2=P2^1;
  8. sbit led3=P2^2;

  9. sbit IRIN=P3^2;
  10. u8 t1;

  11. u8 IrValue[6];
  12. u8 Time;

  13. unsigned char code music[];


  14. unsigned char n=0;  //n为节拍常数变量   
  15. unsigned char code music_tab[] ={    //祝你平安
  16. 0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,
  17. 0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
  18. 0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,
  19. 0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
  20. 0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,
  21. 0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
  22. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,
  23. 0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
  24. 0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,
  25. 0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
  26. 0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,
  27. 0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
  28. 0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,
  29. 0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
  30. 0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,
  31. 0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
  32. 0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,
  33. 0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
  34. 0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,
  35. 0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
  36. 0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,
  37. 0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
  38. 0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,
  39. 0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
  40. 0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,
  41. 0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
  42. 0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,
  43. 0x00
  44. };  

  45. unsigned char code song[] ={     //八月桂花
  46. 0x18, 0x30, 0x1C , 0x10, 0x20, 0x40, 0x1C , 0x10,  
  47. 0x18, 0x10, 0x20 , 0x10, 0x1C, 0x10, 0x18 , 0x40,  
  48. 0x1C, 0x20, 0x20 , 0x20, 0x1C, 0x20, 0x18 , 0x20,  
  49. 0x20, 0x80, 0xFF , 0x20, 0x30, 0x1C, 0x10 , 0x18,  
  50. 0x20, 0x15, 0x20 , 0x1C, 0x20, 0x20, 0x20 , 0x26,  
  51. 0x40, 0x20, 0x20 , 0x2B, 0x20, 0x26, 0x20 , 0x20,  
  52. 0x20, 0x30, 0x80 , 0xFF, 0x20, 0x20, 0x1C , 0x10,  
  53. 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20,  
  54. 0x30, 0x20, 0x2B , 0x40, 0x20, 0x20, 0x1C , 0x10,  
  55. 0x18, 0x10, 0x20 , 0x20, 0x26, 0x20, 0x2B , 0x20,  
  56. 0x30, 0x20, 0x2B , 0x40, 0x20, 0x30, 0x1C , 0x10,  
  57. 0x18, 0x20, 0x15 , 0x20, 0x1C, 0x20, 0x20 , 0x20,  
  58. 0x26, 0x40, 0x20 , 0x20, 0x2B, 0x20, 0x26 , 0x20,  
  59. 0x20, 0x20, 0x30 , 0x80, 0x20, 0x30, 0x1C , 0x10,  
  60. 0x20, 0x10, 0x1C , 0x10, 0x20, 0x20, 0x26 , 0x20,  
  61. 0x2B, 0x20, 0x30 , 0x20, 0x2B, 0x40, 0x20 , 0x15,  
  62. 0x1F, 0x05, 0x20 , 0x10, 0x1C, 0x10, 0x20 , 0x20,  
  63. 0x26, 0x20, 0x2B , 0x20, 0x30, 0x20, 0x2B , 0x40,  
  64. 0x20, 0x30, 0x1C , 0x10, 0x18, 0x20, 0x15 , 0x20,  
  65. 0x1C, 0x20, 0x20 , 0x20, 0x26, 0x40, 0x20 , 0x20,  
  66. 0x2B, 0x20, 0x26 , 0x20, 0x20, 0x20, 0x30 , 0x30,  
  67. 0x20, 0x30, 0x1C , 0x10, 0x18, 0x40, 0x1C , 0x20,  
  68. 0x20, 0x20, 0x26 , 0x40, 0x13, 0x60, 0x18 , 0x20,  
  69. 0x15, 0x40, 0x13 , 0x40, 0x18, 0x80, 0x00  
  70. };
  71. unsigned char code song2[]={
  72. 0x64,0x62,0x52,0x62,0x04,0x62,0x72,0x62,
  73. 0x52,0x68,0x44,0x42,0x52,0x62,0x72,0x64,
  74. 0x54,0x52,0x42,0x04,0x64,0x72,0x62,0x82,
  75. 0x76,0x82,0x72,0x72,0x62,0x76,0x22,0x64,
  76. 0x52,0x62,0x74,0x62,0x52,0x54,0x52,0x42,
  77. 0x54,0x42,0x72,0x64,0x62,0x52,0x64,0x04,
  78. 0x62,0x72,0x62,0x52,0x68,0x44,0x42,0x52,
  79. 0x62,0x72,0x64,0x54,0x52,0x42,0x54,0x04,
  80. 0x64,0x72,0x62,0x82,0x76,0x82,0x72,0x72,
  81. 0x62,0x78,0x64,0x52,0x62,0x74,0x62,0x52,
  82. 0x52,0x46,0x46,0x02,0x42,0x52,0x64,0x62,
  83. 0x72,0x84,0x82,0xc2,0xb2,0xa2,0xa2,0x82,
  84. 0x78,0x82,0x72,0x62,0x52,0x44,0x32,0x42,
  85. 0x54,0x52,0x42,0x54,0x42,0x52,0x64,0x62,
  86. 0x72,0x84,0x82,0xc2,0xb2,0xa2,0xb2,0xa8,
  87. 0x74,0x72,0x62,0x92,0xa2,0x42,0x52,0x68,
  88. 0x58,0x4f,0x0f,0x00

  89. }; //菊花台

  90. /*******************************************************************************
  91. * 函 数 名         : delay
  92. * 函数功能                               : 延时函数,i=1时,大约延时10us
  93. *******************************************************************************/
  94. void delay1(u16 i)
  95. {
  96.               while(i--);            
  97. }
  98. /*******************************************************************************
  99. * 函数名         : IrInit()
  100. * 函数功能                               : 初始化红外线接收
  101. * 输入           : 无
  102. * 输出                       : 无
  103. *******************************************************************************/

  104. void IrInit()
  105. {
  106.               IT0=1;//下降沿触发
  107.               EX0=1;//打开中断0允许
  108.               EA=1;              //打开总中断
  109.               PX0=1;
  110.               IRIN=1;//初始化端口
  111. }


  112. void int0()  interrupt 1   //采用计数器0 控制节拍   
  113. {  TH0=0xd8;  
  114.    TL0=0xef;  
  115.    n--;  
  116. }  

  117. void delay (unsigned char m)   //控制频率延时   
  118. {  
  119. unsigned i=3*m;  
  120. while(--i);  
  121. }  

  122. void delayms(unsigned char a)  //豪秒延时子程序   
  123. {  
  124.   while(--a);                  //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!   
  125. }  

  126. void beep()  
  127. { unsigned char p,m;   //m为频率常数变量   
  128.   unsigned char i=0;  
  129.   TMOD&=0x0f;  
  130.   TMOD|=0x01;  
  131.   TH0=0xd8;TL0=0xef;  
  132.   IE=0xff;
  133. play:  
  134.    while(t1)  
  135.     {  
  136.     a:               switch (t1)
  137.               {
  138.                             case 1:              p=music_tab[i];break;
  139.                             case 4: p=song[i];break;
  140.                             case 7: p=song2[i];break;
  141.               }
  142.        if(p==0x00)       { i=0, delayms(1000); goto play;}     //如果碰到结束符,延时1秒,回到开始再来一遍   
  143.        else if(p==0xff)  { i=i+1;delayms(100),TR0=0; goto a;}  //若碰到休止符,延时100ms,继续取下一音符   
  144.             else        
  145.                                                                       {
  146.                                                                                     switch (t1)
  147.                                                                                     {
  148.                                                                                                   case 1:m=music_tab[i++], n=music_tab[i++]; break;
  149.                                                                                                   case 4:m=song[i++], n=song[i++];break;
  150.                                                                                                   case 7:m=song2[i++], n=song2[i++];break;
  151.                                                                                     }
  152.                                                                                     }  //取频率常数 和 节拍常数   
  153.              TR0=1;                                             //开定时器0   
  154.            while((n!=0)&&t1) Beep=~Beep,delay(m);                         //等待节拍完成, 通过P1口输出音频(可多声道哦!)   
  155.        TR0=0;                                             //关定时器0   
  156.     }  
  157. }
  158. void main()
  159. {
  160.               IrInit();
  161.               while(1)
  162.               {
  163.                             if(t1) beep();
  164.               }
  165. }
  166. void ReadIr() interrupt 0
  167. {
  168.               u8 j,k;
  169.               u16 err;
  170.               Time=0;                                                                     
  171.               delay1(700);              //7ms
  172.               if(IRIN==0)                            //确认是否真的接收到正确的信号
  173.               {            
  174.                            
  175.                             err=1000;                                                        //1000*10us=10ms,超过说明接收到错误的信号
  176.                             /*当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时
  177.                             侯,程序死在这里*/            
  178.                             while((IRIN==0)&&(err>0))              //等待前面9ms的低电平过去                             
  179.                             {                                         
  180.                                           delay1(1);
  181.                                           err--;
  182.                             }
  183.                             if(IRIN==1)                                          //如果正确等到9ms低电平
  184.                             {
  185.                                           err=500;
  186.                                           while((IRIN==1)&&(err>0))                            //等待4.5ms的起始高电平过去
  187.                                           {
  188.                                                         delay1(1);
  189.                                                         err--;
  190.                                           }
  191.                                           for(k=0;k<4;k++)                            //共有4组数据
  192.                                           {                                                      
  193.                                                         for(j=0;j<8;j++)              //接收一组数据
  194.                                                         {

  195.                                                                       err=60;                           
  196.                                                                       while((IRIN==0)&&(err>0))//等待信号前面的560us低电平过去
  197.                                                                       {
  198.                                                                                     delay1(1);
  199.                                                                                     err--;
  200.                                                                       }
  201.                                                                       err=500;
  202.                                                                       while((IRIN==1)&&(err>0))              //计算高电平的时间长度。
  203.                                                                       {
  204.                                                                                     delay1(10);              //0.1ms
  205.                                                                                     Time++;
  206.                                                                                     err--;
  207.                                                                                     if(Time>30)
  208.                                                                                     {
  209.                                                                                                   return;
  210.                                                                                     }
  211.                                                                       }
  212.                                                                       IrValue[k]>>=1;              //k表示第几组数据
  213.                                                                       if(Time>=8)                                          //如果高电平出现大于565us,那么是1
  214.                                                                       {
  215.                                                                                     IrValue[k]|=0x80;
  216.                                                                       }
  217.                                                                       Time=0;                            //用完时间要重新赋值                                                                                                
  218.                                                         }
  219.                                           }
  220.                             }
  221.                                if(IrValue[2]!=~IrValue[3])
  222.    { EX1=1;
  223.      return; }

  224.                 switch(IrValue[2])
  225.    {
  226.                                case 0x16:                //0
  227.                                           led1=1;led2=1;led3=1;
  228.                                 t1=0;
  229.                                           break;
  230.                             case 0x0c:                //1
  231.                                           led1=0;led2=1;led3=1;
  232.                                 t1=1;
  233.                                           break;
  234. ……………………

  235. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

完整论文下载(word格式 可编辑):
遥控音乐台灯.zip (2.28 MB, 下载次数: 115)



评分

参与人数 2黑币 +55 收起 理由
喵咔 + 5
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2017-10-19 22:00 | 只看该作者
好资料,51黑有你更精彩!!!
回复

使用道具 举报

板凳
ID:229527 发表于 2017-11-16 10:04 | 只看该作者
谢谢了 楼主!
回复

使用道具 举报

地板
ID:261731 发表于 2017-12-14 20:29 | 只看该作者
谢谢楼主
回复

使用道具 举报

5#
ID:87193 发表于 2017-12-15 09:34 | 只看该作者
谢谢楼主分享,资料挺详细的
回复

使用道具 举报

6#
ID:281262 发表于 2018-5-18 10:16 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:332780 发表于 2018-5-18 10:27 | 只看该作者
刚接触 希望能学到东西 谢谢大家
回复

使用道具 举报

8#
ID:281262 发表于 2018-5-20 15:59 | 只看该作者
谢谢楼主
回复

使用道具 举报

9#
ID:364711 发表于 2018-7-4 11:59 | 只看该作者

谢谢楼主
回复

使用道具 举报

10#
ID:364711 发表于 2018-7-4 12:54 | 只看该作者

谢谢楼主
回复

使用道具 举报

11#
ID:15207 发表于 2018-7-4 21:22 | 只看该作者
红外解码正好需要,先下载后面用的到
回复

使用道具 举报

12#
ID:611470 发表于 2020-5-14 20:16 来自手机 | 只看该作者
这两个是什么?

IMG_20200514_201150.jpg (25.71 KB, 下载次数: 16)

IMG_20200514_201150.jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表