久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4126|回復: 5
打印 上一主題 下一主題
收起左側

普通MP3模塊升級為紅外控制程序(STC15F104單片機紅外+MP3模塊)

[復制鏈接]
跳轉到指定樓層
樓主










單片機源程序如下:
  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黑下載附件…………
復制代碼

所有資料51hei提供下載:
STC15F104紅外 MP3模塊.zip (153.14 KB, 下載次數: 70)





評分

參與人數 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
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 | 只看該作者
不錯的理念,學習一下,謝謝分享。
回復

使用道具 舉報

5#
ID:703285 發表于 2020-11-30 08:49 | 只看該作者
無意中又翻到這個帖子,補充說下另一種接法。我最后用的是stc15w201s,利用開漏模式實現。四個io腳分別接按鍵的高電平端,短按設置為500,長按設置為8000,非常完美實現了各項功能。或許mp3板電路不同,我的按鍵高電平端串接各種電阻實現不同功能的,按照樓主的io腳接按鍵兩端反倒功能不正常。
回復

使用道具 舉報

6#
ID:703285 發表于 2020-11-30 08:50 | 只看該作者
無意中又翻到這個帖子,補充說下另一種接法。我最后用的是stc15w201s,利用開漏模式實現。四個io腳分別接按鍵的高電平端,短按設置為500,長按設置為8000,非常完美實現了各項功能;蛟Smp3板電路不同,我的按鍵高電平端串接各種電阻實現不同功能的,按照樓主的io腳接按鍵兩端反倒功能不正常。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 爱草视频| 久久夜视频 | 国产精品久久久久久久一区二区 | 日日草夜夜草 | 美女在线观看av | 亚洲高清一区二区三区 | 国产激情在线观看 | 精品一区av | 99久久免费观看 | 日韩欧美在线观看视频网站 | 欧美影院久久 | 亚洲区视频 | 免费观看www| 美女黄视频网站 | 欧美成人精品欧美一级 | 不卡一二区| 欧美综合久久 | 成人乱人乱一区二区三区软件 | 国产成人精品一区二区三区视频 | 人碰人操| 日日干天天操 | 久久久久国产一区二区三区四区 | 亚洲人成网亚洲欧洲无码 | 日日噜噜夜夜爽爽狠狠 | 国产一伦一伦一伦 | 欧美日韩网站 | 日韩一区二区免费视频 | 波多野结衣中文字幕一区二区三区 | 国产精品久久久久久久久久免费看 | 一区二区成人 | 日韩欧美中文 | 在线国产一区 | 小h片免费观看久久久久 | 一区二区视频在线 | 中日av | 黑人巨大精品欧美黑白配亚洲 | 日本久久精品 | 久久国产精品视频 | 91视频在线 | 亚洲欧美另类在线 | 久久99精品久久久久 |