找回密码
 立即注册

QQ登录

只需一步,快速开始

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

代码规范的组合音响 单片机程序开源

[复制链接]
跳转到指定楼层
楼主
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下载地址,注意不含原理图:
dvdmcu_code.rar (207.58 KB, 下载次数: 25)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 单片机教程网

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