找回密码
 立即注册

QQ登录

只需一步,快速开始

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

TA3116做的200W功放 附单片机程序和PCB文件

  [复制链接]
跳转到指定楼层
楼主
闲来无事,做了一块200*2.1声道功放板
贡献出来学习
PADS画的原理图和PCB图如下:(51hei附件中可下载工程文件)



单片机源程序如下:
  1. #include <INTRINS.H>
  2. #include        "STC15.h"                //主控芯片的头文件
  3. #include  "intrins.h"        //需要使用nop()函数故而包含该头文件
  4. #include  "delay.h"
  5. #include  "i2c.h"
  6. #include  "sc2314.h"
  7. #include  "key.h"
  8. #include  "tm1618.h"
  9. //#include "iap.h"        

  10. //寄存器引用及申明
  11. /************************常用数据类型定义*************************/
  12. #define u8  uint8_t
  13. #define u16 uint16_t
  14. #define u32 uint32_t

  15. typedef unsigned char    uint8_t;
  16. typedef unsigned int     uint16_t;
  17. typedef unsigned long    uint32_t;

  18. unsigned char idata sound_dats;   //音量常数
  19. unsigned char idata sound_ch;     //通道常数
  20. unsigned char idata sub_dats;     //低音常数
  21. unsigned char idata tre_dats;     //高音常数
  22. unsigned char idata test_data;

  23. /****************************************************************************/
  24. #define SetdatAdd   0x0002  //设置参数存储初始地址
  25. #define voladd    0x00      //音量存储地址
  26. #define chadd     0x01      //通道存储地址
  27. #define subadd    0x03      //低音存储地址
  28. #define treadd    0x04      //低音存储地址
  29. #define test      0x05 //测试存储地址

  30. #define FOSC 11059200UL     //系统外部时钟频率(无符号长整型)
  31. #define BAUD 9600           //欲配置的串口通信波特率值
  32. /************************端口/引脚定义区域************************/

  33. sbit MUTE=P1^2;                                                        //
  34. sbit STBY=P1^3;                                                  //
  35. sbit BLUE=P3^6;                                                        //

  36. //----------------------------------------------------------------

  37. /************************用户自定义数据区域***********************/

  38. bit IR_KEY=0;                                                                //遥控按键按下标志
  39. bit IR_Flag=0;                                                        //红外数据接收完成标志位
  40. u8 IR_time=0;                                                          //下降沿之间的时间计数值
  41. u8 IR_code[4];                                                        //用户码+用户码+数据码+数据反码
  42. u8 IR_data[33];                                                        //引导码+32个位数据各自占用的时间
  43. //unsigned char IR_Key        = 0x0;        //IR待处理键值
  44. /**************************函数声明区域***************************/
  45. void delay(u16 Count);                        //延时函数声明
  46. void Time0_init(void);                        //定时计数器0初始化函数
  47. void Int0_init(void);                                //外部中断0初始化函数
  48. void IR_decode(void);                                //红外解码函数(用于得到键值)
  49. void IR_control(void);                        //红外控制函数(用户控制LED灯)
  50. void IR_deal(void);                                                //红外解码
  51. void Key_deal(unsigned char dat);
  52. void Key_scanf(void);
  53. void UART_init(void);                                //串口初始化函数声明
  54. void SendData(u8 dat);                        //串口发送单字节数据函数声明
  55. void SendString(u8 *s);                        //串口发送字符串函数声明

  56. /****************************************************************/
  57. //定时计数器0初始化函数Time0_init(),无形参,无返回值
  58. /****************************************************************/
  59. void IO_init(void)        //
  60. {
  61. //        P1M0 = 0x0c;     //STC15W204S IO配置
  62. //        P1M1 = 0x30;
  63. //        P5M0 = 0x00;
  64. //        P5M1 = 0x30;
  65. //        P3M0 = 0x40;
  66. //        P3M1 = 0x00;

  67. //      //STC15W408AS IO配置
  68.     P0M0 = 0x00; P0M1 = 0x00;
  69.     P1M0 = 0x0c; P1M1 = 0x10;
  70.     P2M0 = 0x00; P2M1 = 0x00;
  71.     P3M0 = 0x40; P3M1 = 0x04;
  72.     P4M0 = 0x00; P4M1 = 0x00;
  73.     P5M0 = 0x00; P5M1 = 0x00;
  74.     P6M0 = 0x00; P6M1 = 0x00;
  75.     P7M0 = 0x00; P7M1 = 0x00;

  76. }

  77. /****************************************************************/
  78. //定时计数器0初始化函数Time0_init(),无形参,无返回值
  79. /****************************************************************/
  80. void Time0_init(void)        //278微秒@11.0592MHz
  81. {
  82.         AUXR &= 0x7F;        //定时器时钟12T模式
  83.         TMOD &= 0xF0;        //T0工作在工作方式2,8位自动重装载模式
  84.         TMOD |= 0x02;        //T0工作在工作方式2,8位自动重装载模式
  85.         TL0 = 0x00;                //定时初值为0,则T0定时时间达到最大(约0.278ms)
  86.         TH0 = 0x00;                //定时初值为0,则T0定时时间达到最大(约0.278ms)
  87.         TF0 = 0;                        //清除TF0标志
  88.         ET0=1;                                //使能T0的溢出中断
  89.         TR0=1;                                //开启T0运行控制位,允许T0开始计数
  90.         //定时时间计算:t=256*12/11.0592=277.77us
  91. }
  92. /****************************************************************/
  93. //外部中断0初始化函数Int0_init(),无形参,无返回值
  94. /****************************************************************/
  95. void Int0_init(void)
  96. {
  97.         IT0=1;        //配置外部中断0信号触发方式为边沿触发(下降沿有效)
  98.         EX0=1;        //使能INT0中断
  99.         EA=1;                //打开单片机总中断开关EA
  100. }
  101. /****************************************************************/
  102. //红外解码函数IR_decode(),用于得到键值,无形参,无返回值
  103. /****************************************************************/
  104. void IR_decode(void)
  105. {
  106.         u8 i,j,k;                                                               
  107.         u8 Timer_Value,IR_Value;

  108.         k=1;                                                                                                        //先让变量k等于1,因为k为0时取出的将会是“引导码的时间间隔”
  109.         for(i=0;i<4;i++)                                                        //外层循环4次为了得到4个数据字节
  110.         {
  111.                 for(j=0;j<=7;j++)                                                //内层循环8次为了拼合8个数据位为1个字节
  112.                 {
  113.                         Timer_Value=IR_data[k];                //取出相应红外位的“时间间隔”数据
  114.                         if(Timer_Value>7)                                        //若“时间间隔”比7大那肯定是“1码”反之为“0码”
  115.                                 IR_Value|=0x80;                                        //通过按位或运算高位填1
  116.                         if(j<7)                                                                                
  117.                                 IR_Value>>=1;                                                
  118.                         k++;                                                                                
  119.                 }
  120.                 IR_code[i]=IR_Value;                                //得到红外数据后放回IR_code[]数组
  121.                 IR_Value=0;                                                                        //清零IR_Value变量
  122.         }
  123.         IR_KEY=1;                                                                                        //红外按键按下标志位置1
  124. }
  125. /****************************************************************/
  126. //红外控制函数IR_control(),无返回值
  127. /****************************************************************/
  128. void IR_control(void)
  129. {
  130.   wir_1618((IR_code[2])/10,0);
  131.   wir_1618((IR_code[2])%10,1);
  132.   wir_1618((IR_code[3])/10,2);
  133.   wir_1618((IR_code[3])%10,3);
  134.                 switch(IR_code[2])
  135.                 {
  136.                                 case 0x45:               //开关机按键
  137.                            {
  138.           BLUE = ~BLUE;
  139.                                         STBY = ~STBY;        
  140.                                         MUTE = ~MUTE;
  141.                                         if(STBY ==1)     //开机
  142.                                                 {        
  143.                                                         sound_ch=RdFROM(chadd);
  144.                                                         Delay_50us(4);
  145.                                                         crl_dsp();
  146.                                                         ch(sound_ch);
  147.                                                         if(sound_ch==0){WrToROM(chadd,0);AUX1();}
  148.                                                         if(sound_ch==1){WrToROM(chadd,1);DVD();}
  149.                                                         if(sound_ch==2){WrToROM(chadd,2);}               
  150.                                                         if(sound_ch==3){WrToROM(chadd,3);}        
  151.                                                 }                                 
  152.                                  };break;
  153. //*************************************               
  154.         
  155.                          case 0x46:              //声道切换
  156.           {
  157.                                  if(STBY==1)        
  158.                                          {
  159.                                                 sound_ch=RdFROM(chadd);
  160.             Delay_50us(2);
  161.                                                  crl_dsp();
  162.                                                 if(sound_ch>=3)//4)
  163.                                                          {
  164.                                                          sound_ch=0;
  165.                                                          }
  166.                                                 else
  167.                                                          sound_ch++;
  168.                                                 ch(sound_ch);
  169.                                                 if(sound_ch==0){WrToROM(chadd,0);AUX1();}
  170.                                                 if(sound_ch==1){WrToROM(chadd,1);DVD();}
  171.                                                 if(sound_ch==2){WrToROM(chadd,2);}
  172.                                                 if(sound_ch==3){WrToROM(chadd,3);}
  173.                                          }
  174.                                         };
  175.                                         break;
  176. //***************************
  177.                         case 0x15://09************************VOL -
  178.           {
  179.                                  if(STBY==1)        
  180.                                          {
  181.                                                 sound_dats=RdFROM(voladd);
  182.                                                 if(sound_dats>0)
  183.                                                  {
  184. //                                                         BLUE = ~BLUE;
  185.                                                          sound_dats--;
  186.                                                         write_add(0x88,sound_dats);
  187. //                                                vol_dsp();
  188.                                                   dis_str(3,(30-sound_dats)/10);
  189.                                                   dis_str(4,(30-sound_dats)%10);
  190.                                                          WrToROM(voladd,sound_dats);                                                                                             
  191.                                                          }
  192.                                                  if(sound_dats==0)
  193.                                                 {
  194.                                                         BLUE = 1;
  195.                                                         sound_dats++;                                                        
  196.                                                 }
  197.                                   }
  198.                                         };break;
  199. //************************************
  200.                         case 0x07:            //09************************VOL +
  201.           {
  202.                                  if(STBY==1)        
  203.                                          {
  204.                                         sound_dats=RdFROM(voladd);
  205.                                         if(sound_dats<30)
  206.                                                 {
  207.                                                         sound_dats++;
  208.                                                         write_add(0x88,sound_dats);
  209.                                                         WrToROM(voladd,sound_dats);                                                                                                      
  210.                                                         }
  211.                                         if(sound_dats==30)
  212.                                                         {
  213.                                                                 BLUE = 1;
  214.                                                     sound_dats--;
  215.                                                         }
  216.                                                 }

  217.                                         };break;

  218. //************************************      
  219.                         case 0x16:     //静音
  220.           {
  221.                                  if(STBY==1)        
  222.                                          {
  223.                                                 MUTE = ~MUTE;
  224.                                                 BLUE = ~BLUE;
  225.                                          }
  226.                                         };break;        
  227. //***********************************************************
  228.                 case 0x40:          //***********高音+
  229.                                  {
  230.                                 if(STBY==1)        
  231.                                          {
  232.                                         tre_dats=RdFROM(treadd);
  233.                                         if(tre_dats<10)
  234.                                                 {
  235.                                                         tre_dats++;
  236.                                                         tre(tre_dats);
  237.                                                         WrToROM(treadd,tre_dats);                                                                                                      
  238.                                                         }
  239.                                         if(tre_dats==10)
  240.                                                         {
  241.                                                  tre_dats--;
  242.                                                         }
  243.                                                 }

  244.                                  break;
  245.                                  }
  246. //***********************************************************
  247.                 case 0x44:          //***********高音-
  248.                                  {
  249.                                 if(STBY==1)        
  250.                                          {
  251.                                         tre_dats=RdFROM(treadd);
  252.                                         if(tre_dats>0)
  253.                                                 {
  254.                                                         tre_dats--;
  255.                                                         tre(tre_dats);
  256.                                                         WrToROM(treadd,tre_dats);                                                                                                      
  257.                                                         }
  258.                                         if(tre_dats==0)
  259.                                                         {
  260.                                                  tre_dats++;
  261.                                                         }
  262.                                                 }

  263.                                  break;
  264.                                  }
  265. //***********************************************************
  266.                 case 0x0d:          //***********低音+
  267.                                  {
  268.                                 if(STBY==1)        
  269.                                          {
  270.                                         sub_dats=RdFROM(subadd);
  271.                                         if(sub_dats<10)
  272.                                                 {
  273.                                                         sub_dats++;
  274.                                                         bass(sub_dats);
  275.                                                         WrToROM(subadd,tre_dats);                                                                                                      
  276.                                                         }
  277.                                         if(sub_dats==0)
  278.                                                         {
  279.                                                  sub_dats++;
  280.                                                         }
  281.                                                 }

  282.                                  break;
  283.                                  }
  284. //***********************************************************
  285.                 case 0x19:          //***********低音-
  286.                                  {
  287.                                 if(STBY==1)        
  288.                                          {
  289.                                         sub_dats=RdFROM(subadd);
  290.                                         if(sub_dats>0)
  291.                                                 {
  292.                                                         sub_dats--;
  293.                                                         bass(sub_dats);
  294.                                                         WrToROM(subadd,tre_dats);                                                                                                      
  295.                                                         }
  296.                                         if(sub_dats==0)
  297.                                                         {
  298.                                                  sub_dats++;
  299.                                                         }
  300.                                                 }

  301.                                  break;
  302.                                  }
  303. //*************************************               
  304.                         case 0x43:     //关蓝灯
  305.           {

  306.                                                 BLUE = 0;
  307.                                                 crl_dsp();
  308.                                                 break;        
  309.                                   }               
  310. //*************************************               
  311.                         case 0x0c:     //关蓝灯
  312.           {

  313.             DVD();
  314.                                                 break;        
  315.                                   }        
  316. //*************************************               
  317.                         case 0x09:     //2314初始化
  318.           {
  319.                  sc2314_init();
  320.                                          BLUE =1;
  321.                                          WrToROM(test,0x01);
  322.                                          Delay_ms(100);               
  323.                                          test_data=RdFROM(test);        
  324.                                          BLUE = ~BLUE;
  325.                                          Delay_ms(100);                                                
  326.                                          if(test_data==1)
  327.                                                 {
  328.                                                         BLUE = ~BLUE;
  329.                                                         Delay_ms(100);
  330.                                                         BLUE = ~BLUE;
  331.                                                 }        
  332.                                                 else
  333.                                                         MUTE = 0;                                       
  334.                                    break;        
  335.                                   }                                                
  336.                         default: break;

  337.         }
  338.         
  339.         IR_KEY=0;//遥控处理完成,清零该标志位
  340. }

  341. /****************************************************************/
  342. //红外调用函数
  343. //***************************************************
  344. void IR_deal()
  345. {
  346.         u8 x,y,z;                                   //变量x控制循环
  347.                                                                            //变量y用于存放红外码高位,变量z用于存放红外码低位
  348.         if(IR_Flag)        //红外数据接收完成标志位                                
  349.                 {
  350.                         IR_decode();         //遥控数据解码        
  351.                         IR_Flag=0;                        
  352.                 }
  353.                 if(IR_KEY)                         //遥控按键按下标志               
  354.                 {
  355.                                 IR_control();               
  356.                                 SendString("|****遥控码值****:");
  357.                                 for(x=0;x<4;x++)                                                //输出红外的4个字节码
  358.                                 {
  359.                                         if(IR_code[x]/16<0x10)                //若数据高8位为数字则转换为对应ASCII码打印出来
  360.                                                 y=IR_code[x]/16+0x30;
  361.                                         if(IR_code[x]/16>0x09)                //若数据高8位为字母则转换为对应ASCII码打印出来
  362.                                                 y=IR_code[x]/16+0x37;
  363.                                         if(IR_code[x]%16<0x10)                //若数据低8位为数字则转换为对应ASCII码打印出来
  364.                                                 z=IR_code[x]%16+0x30;
  365.                                         if(IR_code[x]%16>0x09)                //若数据低8位为字母则转换为对应ASCII码打印出来
  366.                                                 z=IR_code[x]%16+0x37;
  367.                                         SendData(' ');                                                //打印空格为了优化显示
  368.                                         SendData('0');                                                //打印'0'字符
  369.                                         SendData('x');                                                //打印'x'字符
  370.                                         SendData(y);                                                        //打印数据高8位
  371.                                         SendData(z);                                                        //打印数据低8位
  372.                                         SendData(' ');                                                //打印空格为了优化显示
  373.                                 }
  374.                                 SendString("\r\n");                                        //打印回车换行
  375.                                 SendString("|***************************************************|\r\n");               
  376.                                 IR_KEY=0;//清除红外按键按下标志位
  377.            }
  378. }
  379. /****************************************************************/
  380. //串口初始化函数UART_init(),无形参,无返回值
  381. /****************************************************************/
  382. void UART_init(void)
  383. {
  384.         SCON=0x50;                                                                                //10位数据异步通信模式,允许接收
  385.         T2L=(65536-(FOSC/4/BAUD));           //设置波特率重装值
  386.   T2H=(65536-(FOSC/4/BAUD))>>8;        //设置波特率重装值
  387.   AUXR|=0x14;                                //T2为1T模式,并启动定时器2
  388.   AUXR|=0x01;                               //选择定时器2为串口1的波特率发生器
  389.   EA=1;                                                                                                        //使能单片机总中断开关EA
  390. }
  391. /****************************************************************/
  392. //串口发送单字节数据SendData(),有形参dat用于接收欲发送的单字节数据,
  393. //无返回值
  394. /****************************************************************/
  395. void SendData(u8 dat)
  396. {
  397.         SBUF=dat;                        //发送数据到发送缓冲区内
  398.         while(TI==0);        //等待串口数据发送完毕
  399.         TI=0;                                        //清除发送完成标志位TI        
  400. }
  401. /****************************************************************/
  402. //串口发送字符串函数SendString(),有形参*s属于指针变量,用于指向要
  403. //发送的字符串首字节,通过指针的自增,逐一取出字符依次发送直至字符串
  404. //结束标志'\0',无返回值
  405. /****************************************************************/
  406. void SendString(u8 *s)
  407. {
  408.         while(*s!='\0')
  409.         {
  410.                 SendData(*s);        //调用SendData()函数依次发送单字节数据
  411.                 s++;                                        //指针自增,便于发送下一个数据
  412.         }
  413. }
  414. /****************************************************************/

  415. /***************************主函数区域****************************/

  416. void main(void)
  417. {
  418.         Delay_50us(10);
  419.         IO_init();
  420.         Time0_init();                //定时计数器0初始化函数
  421.         Int0_init();                //外部中断0初始化函数
  422.         WrToROM(voladd,20);
  423.   Delay_ms(1);
  424.         WrToROM(chadd,0);
  425.         Delay_ms(1);
  426.         WrToROM(subadd,5);
  427.         Delay_ms(1);
  428.         WrToROM(treadd,5);
  429.         Delay_ms(1);
  430.         sc2314_init();
  431.         UART_init();                //串口初始化
  432.         Delay_ms(1);
  433.         SendString("|******串口准备完毕******|\r\n");
  434.   BLUE=1;
  435.         MUTE=1;
  436.         STBY=0;        
  437.         while(1)
  438.         {
  439. //                if(ON_flag==0)BLUE =0;
  440.                 IR_deal();
  441.                 if(IR_KEY==0)                                
  442.                 {
  443.                 Key_scanf();                //按键扫描
  444.                 key_process();
  445.                         
  446. //    IR_KEY==0;

  447.                 }
  448.         }
  449. }

  450. /****************************************************************/
  451. //外部中断0中断服务函数INT0_ISR(),无形参,无返回值
  452. /****************************************************************/
  453. void INT0_ISR() interrupt 0
  454. {
  455.         static u8 IR_bit;                                                  //变量IR_bit用于指示红外数据的位数
  456.         static bit Start_Flag;                                //位变量Start_Flag用于指示是否开始处理
  457.         if(Start_Flag)                                                               
  458.         {
  459.                 if(IR_time<70&&IR_time>32)        //判断引导码(9ms+4.5ms)
  460.                 //IR_time大约要溢出32次(9ms/0.278ms)到70次(可以大于(9+4.5)/0.278)
  461.                         IR_bit=0;                                                                        //清除位数变量,确保当前IR_bit为0,表示引导码
  462.                 IR_data[IR_bit]=IR_time;                //存储相应位时间宽度
  463.                 IR_time=0;                                                                        //清零时间宽度计数值
  464.                 IR_bit++;                                                                                //位数变量自增
  465.                 if(IR_bit==33)                                                        //如果达到了33位(引导码+32个数据位)
  466.                 {
  467.                         IR_Flag=1;                                                                //红外数据接收完成标志位置1
  468.                         IR_bit=0;                                                                        //位数变量清零
  469.                 }
  470.         }
  471.         else                                                                                                        //外部中断0检测到下降沿,即将开始引导码
  472.         {
  473.                 IR_time=0;                                                                        //清零时间计数值
  474.                 Start_Flag=1;                                                                //红外数据产生第一次下降沿,意味着数据即将开始
  475.         }
  476. }
  477. /****************************************************************/
  478. //定时计数器0中断服务函数TIMER0_ISR(),无形参,无返回值
  479. /****************************************************************/
  480. void TIMER0_ISR() interrupt 1
  481. {
  482.         IR_time++;

  483. }
复制代码



单片机程序和PCB文件下载: TA3116功放.zip (6.31 MB, 下载次数: 81)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:1083996 发表于 2023-10-19 15:06 | 只看该作者
TPA3116这个片子已经有点落伍了;
现在比较好的是TPA3251和TPA3255,价格不贵,容易制作,音质好;
搭配蓝牙5.3和32bit/384kHz解码芯片,效果感人;
当然不能忘记了助教--单片机
回复

使用道具 举报

板凳
ID:499742 发表于 2023-10-19 16:06 | 只看该作者
TA3116以前还是用得比较多效率高,功率大
回复

使用道具 举报

地板
ID:128989 发表于 2023-10-29 00:36 | 只看该作者
不错的功放,学习了
回复

使用道具 举报

5#
ID:187261 发表于 2023-11-11 02:50 | 只看该作者
PCB需要用pads这个软件才能打开
回复

使用道具 举报

6#
ID:1034178 发表于 2023-11-26 17:34 来自手机 | 只看该作者
现在很多自带i2c接囗的功放芯片不需要用pt2314
回复

使用道具 举报

7#
ID:774081 发表于 2023-12-29 15:22 | 只看该作者
这个代码又是红外又是串口又是LED点阵的,就是没看到关键的用I2C控制TPA3116的代码。
回复

使用道具 举报

8#
ID:370415 发表于 2024-3-30 00:56 | 只看该作者
老兄,没见到原理图呢
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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