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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3989|回復: 2
收起左側

代碼規范的組合音響 單片機程序開源

[復制鏈接]
ID:651494 發表于 2020-1-6 11:05 | 顯示全部樓層 |閱讀模式
1,VFD 16311顯示+按鍵
2,360度編碼開關
3,紅外遙控6221轉發和解碼
4,音量IC PT2314控制
5,PLL收音 AM/FM控制
6,DVD通訊數據處理

編程規范,代碼風格標準
仔細研究,對初學者應該有一點的幫助,附上源碼
  1. // Copyright (c) 2006,PTC-SZ-SD
  2. // All rights reserved.
  3. // 文件名稱:Tuner.c
  4. // 文件標識:見配置管理計劃書
  5. // 摘 要:調用LC72130的驅動程序,實現對tuner接口函數的實現

  6. #include "..\source\tuner.h"
  7. //全局變量       
  8. bit b_band = 1;                   //b_band = 1 FM ;0  AM
  9. bit b_tuner_flag;                 //=1收音狀態,=0非
  10. bit b_tuner_auto_flag;            //全自動搜索
  11. unsigned char tuner_muted_time;   //收音靜音時間控制
  12. unsigned int   FMfreq = 8750;
  13. unsigned int   AMfreq = 522;
  14. unsigned char tuned_current_count;
  15. unsigned char backup_tuned_FMcount = 30; //
  16. unsigned char backup_tuned_AMcount = 10;

  17. //模塊內部變量
  18. unsigned char  LC_dataout[3];                //定義輸出中頻數據緩存數組      
  19. unsigned char  IN2_cdata[3];                 //定義IN2模式數據緩存數組
  20. unsigned char  IN1_cdata;                    //定義一個字節IN1地址緩存
  21. unsigned int   IN1_pdata;                    //定義16bit的分頻數據緩存
  22. unsigned long  IF_count;                     //中頻記數器
  23. unsigned char tuned_FMcount; //存儲的電臺臺號
  24. unsigned char tuned_AMcount;
  25. bit b_IF_cte_flag = 0;
  26. bit b_tuner_mute_flag;            //收音靜音標志
  27. bit b_tuner_stereo_flag;          //立體聲單聲道標志
  28. bit b_tuned_flag = 0;             // b_tuned_flag = 1 收到臺,0 無臺
  29. bit b_tuner_search_to_max_flag;   //搜索頻段完成標志
  30. bit b_tuner_scan_flag;            //自動搜索
  31. bit b_tuner_auto_all_ok_flag;     //全自動結束

  32. /*********************************************************************************************
  33. Function: Tuner PLL72131讀寫控制
  34. *********************************************************************************************/
  35. /* Description:
  36. //           HAOYUE's Tuner
  37. //   Macro : No need Macro define
  38. //   Crystal Frequency:  4.5MHz
  39. //   BO1(Out Port): Low -> AM, High -> FM;
  40. //   BO2(Out Port): Low -> Normal, High -> Enable IF count and Mute output(for search station);
  41. //   BO3(Out Port): Low -> MONO, High -> Stereo; (For LC72131)
  42. //   BO4(Out Port): NO USE
  43. //   IO1: No use(10K resistor connected to GND in order to lock-IF)
  44. //   IO2(output Port): Low -> Stereo led on, High -> MONO led on
  45. */
  46. void  Send_A_byte_to_72131(unsigned char temp)
  47. {
  48.           unsigned char i;
  49.           for(i = 0; i < 8; i++)
  50.           {
  51.                     LC72131_CLK = 0;
  52.                     NOP;
  53.                     NOP;
  54.                     if (temp & 0x01)
  55.                     {
  56.                               LC72131_DI = 1;
  57.                     }
  58.                     else
  59.                     {
  60.                               LC72131_DI = 0;
  61.                     }
  62.                     temp >>= 1;
  63.                     LC72131_CLK = 1;
  64.           }
  65. }

  66. void  Send_CMD_to_72131(unsigned char cmd,unsigned char part1,unsigned char part2,unsigned char part3)
  67. {
  68.            LC72131_CE = 0;
  69.            Send_A_byte_to_72131(cmd);     //PL72131_IN1_ADD,PL72131_IN2_ADD
  70.            LC72131_CE = 1;
  71.           
  72.            Send_A_byte_to_72131(part1);
  73.            Send_A_byte_to_72131(part2);
  74.            Send_A_byte_to_72131(part3);
  75.           
  76.            LC72131_CE = 0;
  77. }


  78. void  Read_data_from_72131(void)
  79. {
  80.               unsigned char i;
  81.               unsigned char j;
  82.               unsigned char value;

  83.               LC72131_CE = 0;
  84.               Send_A_byte_to_72131(0x2a);         //讀命令
  85.               LC72131_CE = 1;
  86.                            
  87.               LC_dataout[0] = 0;
  88.               LC_dataout[1] = 0;
  89.               LC_dataout[2] = 0;             

  90.            for( i = 0; i < 3; i++)
  91.            {
  92.                        value = 0;   
  93.           for( j = 0; j < 8; j++)
  94.           {
  95.                     LC72131_CLK = 0;
  96.               NOP;
  97.               NOP;
  98.               NOP;
  99.               NOP;
  100.               NOP;
  101.                     value <<=1;
  102.                           if( LC72131_DO )
  103.                            {
  104.                                     value |= 0x01;
  105.                            }
  106.                           LC72131_CLK = 1;
  107.                            NOP;
  108.               NOP;
  109.               NOP;
  110.               NOP;
  111.                  }
  112.                  LC_dataout[i] = value;               
  113.              }   
  114.       LC72131_CE = 0;
  115. }

  116. /*********************************************************************************************
  117. Function: FM模式狀態設置和數據輸入讀出
  118. *********************************************************************************************/                                  
  119. void  FM_IN1_mode(void)
  120. {
  121.            if(b_IF_cte_flag)
  122.            {
  123.                 IN1_cdata = 0x26;   // H  R3 R2 R1 R0    XS   CTE    DVS  SNS   L
  124.                                     //    0   0  1  0    0     0      1    0
  125.                                     //R3~R0為25KHZ參考頻率設置,XS晶體4.5M
  126.                                     //CTE=0記數復位  ,CTE=1開始記數
  127.                                     //DVS SNS(10)fmin 10~160MHZ  (00)AMIN 0.5~10M   (01)AMIN 2~40MHZ
  128.      }
  129.      else
  130.      {
  131.                  IN1_cdata = 0x22;
  132.      }
  133.           
  134.            IN1_pdata = (FMfreq + 1070) / 5;  //DVS = 1, SNS = 0覺得實際分頻系數是參考頻率的2倍 = 0.25X2 = 0.5(顯示圓整10倍)          
  135.            Send_CMD_to_72131(0x28,(unsigned char)(IN1_pdata),(unsigned char)((IN1_pdata) >> 8),IN1_cdata);
  136. }

  137. void  FM_IN2_mode(void)       
  138. {   
  139.            IN2_cdata[0] = 0x02  ;   // BO4      BO3       BO2            BO1             IO2 IO1 IOC2 IOC1; IOC2=1,指定IO2為輸出,IOC1=0,指定IO1為輸入
  140.                                     // no use   stereo1   1(if & mute)   AM 1=低電平 FM 0=開路
  141.      /*設置if/mute,b02 high ---->控制mute和if接收*/
  142.      if(b_tuner_mute_flag)     
  143.            {
  144.                     IN2_cdata[0] &= 0xdf;//BO2 = 1 mute off  BO2 = 0 mute on
  145.      }
  146.      else
  147.      {
  148.               IN2_cdata[0] |= 0x20;//BO2 = 1 mute off  BO2 = 0 mute on
  149.      }
  150.      /*設置if/mute,b03 high ---->控制stereo*/
  151.      if(b_tuner_stereo_flag)
  152.            {
  153.                     IN2_cdata[0] &= 0xbf;//BO3 = 1 stereo  BO3 = 0 mono
  154.      }
  155.      else
  156.      {
  157.               IN2_cdata[0] |= 0x40;//BO3 = 1 stereo  BO3 = 0 mono
  158.      }
  159.      IN2_cdata[1] = 0x22;        //end_UC              
  160.            //IN2_cdata[1] = 0x32;      // 準備寫入:DNC  DOC0   DOC1  DOC2   UL0  UL1     DZ0   DZ1
  161.                                //            x    0     1     1      0   0        1    0
  162.            IN2_cdata[2] = 0x12;      // TEST0-TEST1-TEST2   IFS   DLC-TBC-GT1-GT0
  163.                                      // 0     0    0       1     0   0   1   0
  164.                                      // TEST0~2 必須為0, 正常模式IFS=1,=0為靈敏度衰減模式
  165.                                // DLC電荷泵正常為0 ,TBC=1控制BO1輸出8HZ,40%占空基準信號
  166.                                // GT1,GT0(00 4MS  01 8MS  10 32MS  11 64MS)門控時間
  167.                                // 中頻記數/門控時間=中頻(FM=10.7MHZ,AM=450KHZ)          
  168.      Send_CMD_to_72131(0x29,IN2_cdata[0],IN2_cdata[1],IN2_cdata[2]);
  169. }

  170. void FM_Send(void)
  171. {
  172.            FM_IN2_mode();
  173.            FM_IN1_mode();

  174. }
  175. /*********************************************************************************************
  176. Function: AM模式狀態設置和數據輸入讀出
  177. *********************************************************************************************/
  178. void  AM_IN1_mode(void)
  179. {       
  180.            if(b_IF_cte_flag)
  181.            {
  182.                        IN1_cdata = 0xc4;
  183.            }
  184.            else
  185.            {
  186.                        IN1_cdata = 0xc0;   // H  R3 R2 R1 R0    XS   CTE    DVS  SNS   L
  187.                                     //    1   0  0  1    0     0      0    0
  188.                                     // R3~R0為9KHZ參考頻率設置,XS晶體4.5M
  189.                                     // CTE=0記數復位  ,CTE=1開始記數
  190.                                     // DVS SNS(10)fmin 10~160MHZ  (00)AMIN 0.5~10M   (01)AMIN 2~40MHZ
  191.      }
  192.           
  193.            IN1_pdata = ((AMfreq + 450) / 3) << 4; //參考頻率是3K,AM是1倍關系,中頻450K //P0 to P3 must be set to 0
  194.            Send_CMD_to_72131(0x28,(unsigned char) IN1_pdata,(unsigned char) (IN1_pdata >> 8),IN1_cdata);
  195. }

  196. void  AM_IN2_mode(void)       
  197. {            
  198.            IN2_cdata[0] = 0x12;    // BO4     BO3        BO2          BO1                       IO2   IO1 IOC2 IOC1; IOC2=1,指定IO2為輸出,IOC1=0,指定IO1為輸入
  199.                                    // no use   stereo1   1(if & mute)     AM 1=低電平 FM 0=開路
  200.      if(b_tuner_mute_flag)     
  201.            {
  202.                     IN2_cdata[0] &= 0xdf;//BO2 = 1 mute off  BO2 = 0 mute on
  203.      }
  204.      else
  205.      {
  206.               IN2_cdata[0] |= 0x20;//BO2 = 1 mute off  BO2 = 0 mute on
  207.      }
  208.      
  209.      if(b_tuner_stereo_flag)
  210.            {
  211.                     IN2_cdata[0] &= 0xbf;//BO3 = 1 stereo  BO3 = 0 mono
  212.      }
  213.      else
  214.      {
  215.               IN2_cdata[0] |= 0x40;//BO3 = 1 stereo  BO3 = 0 mono
  216.      }
  217.      IN2_cdata[1] = 0xa4;                             
  218.            //IN2_cdata[1] = 0xc4;    // 準備寫入:DNC  DOC0   DOC1  DOC2   UL0  UL1     DZ0   DZ1
  219.                                        // x    0     1     1      0   0        1    0
  220.            IN2_cdata[2] = 0x11;    // TEST0-TEST1-TEST2   IFS   DLC-TBC-GT1-GT0
  221.                                    // 0     0    0       1     0   0   1   0
  222.                                    // TEST0~2 必須為0, 正常模式IFS=1,=0為靈敏度衰減模式
  223.                              // DLC電荷泵正常為0 ,TBC=1控制BO1輸出8HZ,40%占空基準信號
  224.                              // GT1,GT0(00 4MS  01 8MS  10 32MS  11 64MS)門控時間
  225.                              // 中頻記數/門控時間=中頻(FM=10.7MHZ,AM=450KHZ)          
  226.      Send_CMD_to_72131(0x29,IN2_cdata[0],IN2_cdata[1],IN2_cdata[2]);
  227. }   


  228. void AM_Send(void)
  229. {
  230.            AM_IN1_mode();
  231.            AM_IN2_mode();
  232. }

  233. /*********************************************************************************************
  234. Function: IF數據獲得和判斷
  235. *********************************************************************************************/
  236. void  Get_IF_value(bit band)
  237. {
  238.           b_IF_cte_flag =0;  //記數前復位
  239.                  if(band)
  240.           {             
  241.         FM_IN1_mode();
  242.     }
  243.     else
  244.     {
  245.               AM_IN1_mode();
  246.     }
  247.      
  248.           b_IF_cte_flag =1; //中頻記數開始
  249.           b_tuner_mute_flag = 1;  //mute控制開,if數據輸入          
  250.           if(band)
  251.           {             
  252.         FM_IN1_mode();
  253.     }
  254.     else
  255.     {
  256.               AM_IN1_mode();
  257.     }      
  258. //  system_time = 10;   //50ms
  259. //  while(system_time);
  260.     system_time = 6;      //60ms
  261.     while(LC72131_DO && system_time);           
  262.     Read_data_from_72131();
  263. // Read_data_from_72131();  
  264.     IF_count = ( ( ((unsigned long) LC_dataout[0]) << 16 ) | ( ((unsigned long) LC_dataout[1]) << 8 ) | (unsigned long) LC_dataout[2] ) & 0x0fffff;
  265.         
  266. }       

  267. void  FM_IF_compare(void)
  268. {          
  269.          if( (LC_dataout[0] & 0x10) != 0x10)    //判斷UL,PLL鎖存了才判斷中頻,否則很多雜臺
  270.          {
  271.                     b_tuned_flag = 0;     //當沒收到臺
  272.          }
  273.          else
  274.          {     
  275.                     // if (LC72131_SD == 1)     
  276.          if((IF_count > 342250 ) && (IF_count < 342550 ))      //FM門控時間32MS,  342400/32 =10700
  277.          {                      
  278.              b_tuned_flag = 1;
  279.              b_IF_cte_flag =0;  //中頻計數器復位
  280.              FM_IN1_mode();
  281.                
  282.          }
  283.    }
  284. }

  285. void  AM_IF_compare(void)
  286. {
  287.          if( (LC_dataout[0] & 0x10) != 0x10)    //判斷UL,PLL鎖存了才判斷中頻,否則很多雜臺
  288.          {
  289.                     b_tuned_flag = 0;     //當沒收到臺
  290.          }
  291.          else
  292.          {   
  293.                       // if (LC72131_SD == 1)           
  294.         if((IF_count > 3200 ) && (IF_count < 4000 ))      //FM門控時間8MS,  3600/8 = 450
  295.         {              
  296.              b_tuned_flag = 1;
  297.              b_IF_cte_flag =0;
  298.              AM_IN1_mode();
  299.         }
  300.    }
  301. }
復制代碼
51hei.png

全部程序51hei下載地址,注意不含原理圖:
dvdmcu_code.rar (207.58 KB, 下載次數: 32)
回復

使用道具 舉報

ID:827391 發表于 2022-12-7 10:51 | 顯示全部樓層
這個就是另外一個貼子的主控程序,我現在想把手頭上的功放板升級一下。更換一下藍牙前級,有這方面問題想請教你一下479361682
回復

使用道具 舉報

ID:1051585 發表于 2022-12-15 16:20 | 顯示全部樓層
感謝樓主,新手學習的好資料。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 婷婷不卡| 亚洲视频在线播放 | 欧美日韩三级在线观看 | 成人在线一区二区 | 日韩欧美视频 | 久久久久久91香蕉国产 | av手机在线看 | 黄色精品 | 精品一二三 | 99精品在线观看 | 99精品国产一区二区三区 | 一区二区在线观看av | 青青久久 | 99re热精品视频 | 国产不卡在线播放 | 在线观看国产视频 | 成人乱人乱一区二区三区软件 | 99免费在线观看视频 | 成人免费观看男女羞羞视频 | 亚洲欧美日韩中文在线 | 操皮视频| 天天色av | 国产一区二区视频免费在线观看 | 69福利影院 | 日本一区二区视频 | 国产专区在线 | 亚洲免费毛片 | 黄在线免费观看 | 一区二区伦理电影 | 国产欧美日韩精品一区二区三区 | 天天夜夜操| 欧美日韩精品影院 | 久久综合一区二区三区 | 亚洲在线 | 男人的天堂亚洲 | 羞羞视频免费在线观看 | 亚洲国产成人精 | 国产色 | 国产精品伦一区二区三级视频 | 情侣av| 亚洲性在线 |