找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3261|回复: 5
收起左侧

普通MP3模块升级为红外控制程序(STC15F104单片机红外+MP3模块)

[复制链接]
ID:424598 发表于 2019-3-5 20:17 | 显示全部楼层 |阅读模式
MP3图.jpg

IMG_20190305_191803.PNG


IMG_20190305_191809.PNG


IMG_20190305_191934.PNG

单片机源程序如下:
  1. /************************************************************
  2.   单片机: STC15F104W/STC15W104
  3.   晶振:   12.000MHz
  4.   功能:   红外遥控(4个IO口实现5个功能)
  5.                     1.上一首  2.下一首  3.暂停  4.音量+  5.音量-

  6.   注:单片机供电必需用USB口供电,不能用DC口供电
  7. *************************************************************/
  8. #include <STC15F2K60S2.H>
  9. #define uchar unsigned char
  10. #define uint unsigned int
  11. #define T50MS (65536-50000) //12T模式

  12. /*************        用户系统配置        **************/
  13. //烧录频率请选12.000MHz
  14. #define MAIN_Fosc                12000000L        //定义主时钟, 模拟串口和红外接收会自动适应。5~36MHZ
  15. #define D_TIMER0                125                        //选择定时器时间, us, 红外接收要求在60us~250us之间
  16. #define        User_code                0x00FF                //定义红外接收用户码(38K的迷你遥控器通用)

  17. /*************        以下宏定义用户请勿修改        **************/
  18. #define freq_base                        (MAIN_Fosc / 1200)
  19. #define Timer0_Reload                (65536 - (D_TIMER0 * freq_base / 10000))

  20. /*************        本地变量声明        **************/
  21. bit                P_IR_RX_temp;                //Last sample
  22. bit                B_IR_Sync;                        //已收到同步标志
  23. uchar        IR_SampleCnt;                //采样计数
  24. uchar        IR_BitCnt;                        //编码位数
  25. uchar        IR_UserH;                        //用户码(地址)高字节
  26. uchar        IR_UserL;                        //用户码(地址)低字节
  27. uchar        IR_data;                        //数据原码
  28. uchar        IR_DataShit;                //数据反码

  29. bit                B_IrUserErr;                //User code error flag
  30. bit                B_IR_Press;                        //Key press flag,include repeat key.
  31. uchar        IR_code;                        //IR code        红外键码

  32. //MP3 IO口接线说明
  33. sbit A1=P3^4;                        //接Next/V++的左侧(高电平)
  34. sbit A2=P3^5;                        //接Prev/V++的右侧(低电平)
  35. sbit B1=P3^1;                        //接Prev/V--的左侧(高电平)
  36. sbit B2=P3^0;                        //接Prev/V--的右侧(低电平)

  37. sbit P_IR_RX    =P3^2;           //定义红外接收输入端口
  38. uchar k,data1=0x01; //k=模式值

  39. /*************        本地函数声明        **************/
  40. //////////////////////////////////////////
  41. void DelayMS(uint time)//延时函数,有参函数
  42. {
  43.         uint i4,j4;
  44.         for(i4=time; i4>0; i4--)
  45.         for(j4=110; j4>0; j4--);
  46. }

  47. /////////////////////////////////////////////////////////////
  48. //判断接收的编码,执行相应功能(根据需要自行修改)
  49. void _data_(void)
  50. {
  51.         switch(IR_data)        //红外接收成功
  52.         {
  53.                 //不要修改A1、A2、B1、B2的值,都是已经测试好的
  54.                 case 0x07: //上一首
  55.                         k=1;
  56.                         A1=0;A2=0;B1=0;B2=1;
  57.                         DelayMS(2000);                //相当于按下轻触按键后再松开(这里用延时再还原的方法进行模拟)
  58.                         A1=1;A2=0;B1=1;B2=0;
  59.                          break;
  60.                  case 0x09:        //下一首
  61.                          k=1;
  62.                          B1=0;B2=0;
  63.                         DelayMS(2000);                //同上可根据需求自行修改延时时间
  64.                         B1=1;B2=0;
  65.                          break;
  66.                  case 0x15: //暂停
  67.                          A1=0;A2=1;B1=0;B2=1;
  68.                         DelayMS(2000);                //同上可根据需求自行修改延时时间
  69.                         A1=1;A2=0;B1=1;B2=0;                                               
  70.                         break;               
  71.                 case 0x40: //音量+
  72.                         k=1;
  73.                         A1=1;A2=0;B1=0;B2=0;
  74.                         DelayMS(20000);                //同上可根据需求自行修改延时时间
  75.                         A1=1;A2=0;B1=1;B2=0;
  76.                         break;
  77.                 case 0x19: //音量-
  78.                         k=1;
  79.                         A1=0;A2=0;B1=0;B2=1;
  80.                         DelayMS(20000);                //同上可根据需求自行修改延时时间
  81.                         A1=1;A2=0;B1=1;B2=0;
  82.                         break;
  83.                 default:break;
  84.         }
  85.         IR_data=0x00;                                //必须清零
  86. }
  87. ////////////////////////////////////////////
  88. void main(void)         //主函数
  89. {
  90.         IE   = 0x82;   //开总中断和T0中断允许
  91.         IE2  = 0x04;   //T2中断允许
  92.         TMOD = 0;                //for STC15Fxxx系列        Timer0 as 16bit reload timer.
  93.         TH0  = Timer0_Reload / 256;
  94.         TL0  = Timer0_Reload % 256;
  95.         T2L  = T50MS;  //初始化计时值5ms中断一次
  96.     T2H  = T50MS >> 8;
  97.         TR0  =1;
  98.         k    =0;A1=1;A2=0;B1=1;B2=0; //初始化

  99.         while(1)  //无限循环
  100.         {
  101.                 switch(k) //判断k的值
  102.                 {
  103.                         case 0: AUXR=0x00; //停止中断                                                
  104.                                         break;
  105.                         case 1: AUXR=0x10; //开启中断         
  106.                                         break;                       
  107.                 }
  108.         }                        
  109. }
  110. /*************红外接收部分程序是引用STC官方的资料******************************/
  111. /******************** 红外采样时间宏定义, 用户不要随意修改        *******************/

  112. #if ((D_TIMER0 <= 250) && (D_TIMER0 >= 60))
  113.         #define        D_IR_sample                        D_TIMER0                //定义采样时间,在60us~250us之间
  114. #endif

  115. #define D_IR_SYNC_MAX                (15000/D_IR_sample)        //SYNC max time
  116. #define D_IR_SYNC_MIN                (9700 /D_IR_sample)        //SYNC min time
  117. #define D_IR_SYNC_DIVIDE        (12375/D_IR_sample)        //decide data 0 or 1
  118. #define D_IR_DATA_MAX                (3000 /D_IR_sample)        //data max time
  119. #define D_IR_DATA_MIN                (600  /D_IR_sample)        //data min time
  120. #define D_IR_DATA_DIVIDE        (1687 /D_IR_sample)        //decide data 0 or 1
  121. #define D_IR_BIT_NUMBER                32                                        //bit number

  122. //*******************************************************************************************
  123. //**************************** IR RECEIVE MODULE ********************************************

  124. void IR_RX_HT6121(void)
  125. {
  126.         uchar        SampleTime;

  127.         IR_SampleCnt++;                                                        //Sample + 1

  128.         F0 = P_IR_RX_temp;                                                //Save Last sample status
  129.         P_IR_RX_temp = P_IR_RX;                                        //Read current status
  130.         if(F0 && !P_IR_RX_temp)                                        //Last sample is high,and current sample is low, so is fall edge
  131.         {
  132.                 SampleTime = IR_SampleCnt;                        //get the sample time
  133.                 IR_SampleCnt = 0;                                        //Clear the sample counter

  134.                          if(SampleTime > D_IR_SYNC_MAX)                B_IR_Sync = 0;        //large the Maxim SYNC time, then error
  135.                 else if(SampleTime >= D_IR_SYNC_MIN)                                        //SYNC
  136.                 {
  137.                         if(SampleTime >= D_IR_SYNC_DIVIDE)
  138.                         {
  139.                                 B_IR_Sync = 1;                                        //has received SYNC
  140.                                 IR_BitCnt = D_IR_BIT_NUMBER;        //Load bit number
  141.                         }
  142.                 }
  143.                 else if(B_IR_Sync)                                                //has received SYNC
  144.                 {
  145.                         if(SampleTime > D_IR_DATA_MAX)                B_IR_Sync=0;        //data samlpe time to large
  146.                         else
  147.                         {
  148.                                 IR_DataShit >>= 1;                                        //data shift right 1 bit
  149.                                 if(SampleTime >= D_IR_DATA_DIVIDE)        IR_DataShit |= 0x80;        //devide data 0 or 1
  150.                                 if(--IR_BitCnt == 0)                                //bit number is over?
  151.                                 {
  152.                                         B_IR_Sync = 0;                                        //Clear SYNC
  153.                                         if(~IR_DataShit == IR_data)                //判断数据正反码
  154.                                         {
  155.                                                 if((IR_UserH == (User_code / 256)) &&
  156.                                                         IR_UserL == (User_code % 256))
  157.                                                                 B_IrUserErr = 0;        //User code is righe
  158.                                                 else        B_IrUserErr = 1;        //user code is wrong
  159.                                                        
  160.                                                 IR_code      = IR_data;
  161.                                                 B_IR_Press   = 1;                        //数据有效
  162.                                                 _data_();
  163.                                         }
  164.                                 }
  165.                                 else if((IR_BitCnt & 7)== 0)                //one byte receive
  166. ……………………

  167. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
STC15F104红外 MP3模块.zip (153.14 KB, 下载次数: 68)

评分

参与人数 1黑币 +80 收起 理由
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:703285 发表于 2020-3-17 21:15 | 显示全部楼层
多谢楼主,正是我想要的.没有看明白你的mode转换功能是怎么实现的?看你只接了四个io口呢?
不知道我的stc15w104能不能直接用?如果有短按长按不同功能就更好了,8脚基本够一般音箱改装用了.
回复

使用道具 举报

ID:686739 发表于 2020-3-18 12:17 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:706197 发表于 2020-3-29 14:03 | 显示全部楼层
不错的理念,学习一下,谢谢分享。
回复

使用道具 举报

ID:703285 发表于 2020-11-30 08:49 | 显示全部楼层
无意中又翻到这个帖子,补充说下另一种接法。我最后用的是stc15w201s,利用开漏模式实现。四个io脚分别接按键的高电平端,短按设置为500,长按设置为8000,非常完美实现了各项功能。或许mp3板电路不同,我的按键高电平端串接各种电阻实现不同功能的,按照楼主的io脚接按键两端反倒功能不正常。
回复

使用道具 举报

ID:703285 发表于 2020-11-30 08:50 | 显示全部楼层
无意中又翻到这个帖子,补充说下另一种接法。我最后用的是stc15w201s,利用开漏模式实现。四个io脚分别接按键的高电平端,短按设置为500,长按设置为8000,非常完美实现了各项功能。或许mp3板电路不同,我的按键高电平端串接各种电阻实现不同功能的,按照楼主的io脚接按键两端反倒功能不正常。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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