閑來無事,做了一塊200*2.1聲道功放板
貢獻出來學習
PADS畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
功放PCB.png (171.3 KB, 下載次數: 45)
下載附件
2023-10-18 20:58 上傳
按鍵板.png (50.93 KB, 下載次數: 46)
下載附件
2023-10-18 20:58 上傳
8X8LED.jpg (78.57 KB, 下載次數: 46)
下載附件
2023-10-18 20:58 上傳
單片機源程序如下:
- #include <INTRINS.H>
- #include "STC15.h" //主控芯片的頭文件
- #include "intrins.h" //需要使用nop()函數故而包含該頭文件
- #include "delay.h"
- #include "i2c.h"
- #include "sc2314.h"
- #include "key.h"
- #include "tm1618.h"
- //#include "iap.h"
- //寄存器引用及申明
- /************************常用數據類型定義*************************/
- #define u8 uint8_t
- #define u16 uint16_t
- #define u32 uint32_t
- typedef unsigned char uint8_t;
- typedef unsigned int uint16_t;
- typedef unsigned long uint32_t;
- unsigned char idata sound_dats; //音量常數
- unsigned char idata sound_ch; //通道常數
- unsigned char idata sub_dats; //低音常數
- unsigned char idata tre_dats; //高音常數
- unsigned char idata test_data;
- /****************************************************************************/
- #define SetdatAdd 0x0002 //設置參數存儲初始地址
- #define voladd 0x00 //音量存儲地址
- #define chadd 0x01 //通道存儲地址
- #define subadd 0x03 //低音存儲地址
- #define treadd 0x04 //低音存儲地址
- #define test 0x05 //測試存儲地址
- #define FOSC 11059200UL //系統外部時鐘頻率(無符號長整型)
- #define BAUD 9600 //欲配置的串口通信波特率值
- /************************端口/引腳定義區域************************/
- sbit MUTE=P1^2; //
- sbit STBY=P1^3; //
- sbit BLUE=P3^6; //
- //----------------------------------------------------------------
- /************************用戶自定義數據區域***********************/
- bit IR_KEY=0; //遙控按鍵按下標志
- bit IR_Flag=0; //紅外數據接收完成標志位
- u8 IR_time=0; //下降沿之間的時間計數值
- u8 IR_code[4]; //用戶碼+用戶碼+數據碼+數據反碼
- u8 IR_data[33]; //引導碼+32個位數據各自占用的時間
- //unsigned char IR_Key = 0x0; //IR待處理鍵值
- /**************************函數聲明區域***************************/
- void delay(u16 Count); //延時函數聲明
- void Time0_init(void); //定時計數器0初始化函數
- void Int0_init(void); //外部中斷0初始化函數
- void IR_decode(void); //紅外解碼函數(用于得到鍵值)
- void IR_control(void); //紅外控制函數(用戶控制LED燈)
- void IR_deal(void); //紅外解碼
- void Key_deal(unsigned char dat);
- void Key_scanf(void);
- void UART_init(void); //串口初始化函數聲明
- void SendData(u8 dat); //串口發送單字節數據函數聲明
- void SendString(u8 *s); //串口發送字符串函數聲明
- /****************************************************************/
- //定時計數器0初始化函數Time0_init(),無形參,無返回值
- /****************************************************************/
- void IO_init(void) //
- {
- // P1M0 = 0x0c; //STC15W204S IO配置
- // P1M1 = 0x30;
- // P5M0 = 0x00;
- // P5M1 = 0x30;
- // P3M0 = 0x40;
- // P3M1 = 0x00;
- // //STC15W408AS IO配置
- P0M0 = 0x00; P0M1 = 0x00;
- P1M0 = 0x0c; P1M1 = 0x10;
- P2M0 = 0x00; P2M1 = 0x00;
- P3M0 = 0x40; P3M1 = 0x04;
- P4M0 = 0x00; P4M1 = 0x00;
- P5M0 = 0x00; P5M1 = 0x00;
- P6M0 = 0x00; P6M1 = 0x00;
- P7M0 = 0x00; P7M1 = 0x00;
- }
- /****************************************************************/
- //定時計數器0初始化函數Time0_init(),無形參,無返回值
- /****************************************************************/
- void Time0_init(void) //278微秒@11.0592MHz
- {
- AUXR &= 0x7F; //定時器時鐘12T模式
- TMOD &= 0xF0; //T0工作在工作方式2,8位自動重裝載模式
- TMOD |= 0x02; //T0工作在工作方式2,8位自動重裝載模式
- TL0 = 0x00; //定時初值為0,則T0定時時間達到最大(約0.278ms)
- TH0 = 0x00; //定時初值為0,則T0定時時間達到最大(約0.278ms)
- TF0 = 0; //清除TF0標志
- ET0=1; //使能T0的溢出中斷
- TR0=1; //開啟T0運行控制位,允許T0開始計數
- //定時時間計算:t=256*12/11.0592=277.77us
- }
- /****************************************************************/
- //外部中斷0初始化函數Int0_init(),無形參,無返回值
- /****************************************************************/
- void Int0_init(void)
- {
- IT0=1; //配置外部中斷0信號觸發方式為邊沿觸發(下降沿有效)
- EX0=1; //使能INT0中斷
- EA=1; //打開單片機總中斷開關EA
- }
- /****************************************************************/
- //紅外解碼函數IR_decode(),用于得到鍵值,無形參,無返回值
- /****************************************************************/
- void IR_decode(void)
- {
- u8 i,j,k;
- u8 Timer_Value,IR_Value;
- k=1; //先讓變量k等于1,因為k為0時取出的將會是“引導碼的時間間隔”
- for(i=0;i<4;i++) //外層循環4次為了得到4個數據字節
- {
- for(j=0;j<=7;j++) //內層循環8次為了拼合8個數據位為1個字節
- {
- Timer_Value=IR_data[k]; //取出相應紅外位的“時間間隔”數據
- if(Timer_Value>7) //若“時間間隔”比7大那肯定是“1碼”反之為“0碼”
- IR_Value|=0x80; //通過按位或運算高位填1
- if(j<7)
- IR_Value>>=1;
- k++;
- }
- IR_code[i]=IR_Value; //得到紅外數據后放回IR_code[]數組
- IR_Value=0; //清零IR_Value變量
- }
- IR_KEY=1; //紅外按鍵按下標志位置1
- }
- /****************************************************************/
- //紅外控制函數IR_control(),無返回值
- /****************************************************************/
- void IR_control(void)
- {
- wir_1618((IR_code[2])/10,0);
- wir_1618((IR_code[2])%10,1);
- wir_1618((IR_code[3])/10,2);
- wir_1618((IR_code[3])%10,3);
- switch(IR_code[2])
- {
- case 0x45: //開關機按鍵
- {
- BLUE = ~BLUE;
- STBY = ~STBY;
- MUTE = ~MUTE;
- if(STBY ==1) //開機
- {
- sound_ch=RdFROM(chadd);
- Delay_50us(4);
- crl_dsp();
- ch(sound_ch);
- if(sound_ch==0){WrToROM(chadd,0);AUX1();}
- if(sound_ch==1){WrToROM(chadd,1);DVD();}
- if(sound_ch==2){WrToROM(chadd,2);}
- if(sound_ch==3){WrToROM(chadd,3);}
- }
- };break;
- //*************************************
-
- case 0x46: //聲道切換
- {
- if(STBY==1)
- {
- sound_ch=RdFROM(chadd);
- Delay_50us(2);
- crl_dsp();
- if(sound_ch>=3)//4)
- {
- sound_ch=0;
- }
- else
- sound_ch++;
- ch(sound_ch);
- if(sound_ch==0){WrToROM(chadd,0);AUX1();}
- if(sound_ch==1){WrToROM(chadd,1);DVD();}
- if(sound_ch==2){WrToROM(chadd,2);}
- if(sound_ch==3){WrToROM(chadd,3);}
- }
- };
- break;
- //***************************
- case 0x15://09************************VOL -
- {
- if(STBY==1)
- {
- sound_dats=RdFROM(voladd);
- if(sound_dats>0)
- {
- // BLUE = ~BLUE;
- sound_dats--;
- write_add(0x88,sound_dats);
- // vol_dsp();
- dis_str(3,(30-sound_dats)/10);
- dis_str(4,(30-sound_dats)%10);
- WrToROM(voladd,sound_dats);
- }
- if(sound_dats==0)
- {
- BLUE = 1;
- sound_dats++;
- }
- }
- };break;
- //************************************
- case 0x07: //09************************VOL +
- {
- if(STBY==1)
- {
- sound_dats=RdFROM(voladd);
- if(sound_dats<30)
- {
- sound_dats++;
- write_add(0x88,sound_dats);
- WrToROM(voladd,sound_dats);
- }
- if(sound_dats==30)
- {
- BLUE = 1;
- sound_dats--;
- }
- }
- };break;
- //************************************
- case 0x16: //靜音
- {
- if(STBY==1)
- {
- MUTE = ~MUTE;
- BLUE = ~BLUE;
- }
- };break;
- //***********************************************************
- case 0x40: //***********高音+
- {
- if(STBY==1)
- {
- tre_dats=RdFROM(treadd);
- if(tre_dats<10)
- {
- tre_dats++;
- tre(tre_dats);
- WrToROM(treadd,tre_dats);
- }
- if(tre_dats==10)
- {
- tre_dats--;
- }
- }
- break;
- }
- //***********************************************************
- case 0x44: //***********高音-
- {
- if(STBY==1)
- {
- tre_dats=RdFROM(treadd);
- if(tre_dats>0)
- {
- tre_dats--;
- tre(tre_dats);
- WrToROM(treadd,tre_dats);
- }
- if(tre_dats==0)
- {
- tre_dats++;
- }
- }
- break;
- }
- //***********************************************************
- case 0x0d: //***********低音+
- {
- if(STBY==1)
- {
- sub_dats=RdFROM(subadd);
- if(sub_dats<10)
- {
- sub_dats++;
- bass(sub_dats);
- WrToROM(subadd,tre_dats);
- }
- if(sub_dats==0)
- {
- sub_dats++;
- }
- }
- break;
- }
- //***********************************************************
- case 0x19: //***********低音-
- {
- if(STBY==1)
- {
- sub_dats=RdFROM(subadd);
- if(sub_dats>0)
- {
- sub_dats--;
- bass(sub_dats);
- WrToROM(subadd,tre_dats);
- }
- if(sub_dats==0)
- {
- sub_dats++;
- }
- }
- break;
- }
- //*************************************
- case 0x43: //關藍燈
- {
- BLUE = 0;
- crl_dsp();
- break;
- }
- //*************************************
- case 0x0c: //關藍燈
- {
- DVD();
- break;
- }
- //*************************************
- case 0x09: //2314初始化
- {
- sc2314_init();
- BLUE =1;
- WrToROM(test,0x01);
- Delay_ms(100);
- test_data=RdFROM(test);
- BLUE = ~BLUE;
- Delay_ms(100);
- if(test_data==1)
- {
- BLUE = ~BLUE;
- Delay_ms(100);
- BLUE = ~BLUE;
- }
- else
- MUTE = 0;
- break;
- }
- default: break;
- }
-
- IR_KEY=0;//遙控處理完成,清零該標志位
- }
- /****************************************************************/
- //紅外調用函數
- //***************************************************
- void IR_deal()
- {
- u8 x,y,z; //變量x控制循環
- //變量y用于存放紅外碼高位,變量z用于存放紅外碼低位
- if(IR_Flag) //紅外數據接收完成標志位
- {
- IR_decode(); //遙控數據解碼
- IR_Flag=0;
- }
- if(IR_KEY) //遙控按鍵按下標志
- {
- IR_control();
- SendString("|****遙控碼值****:");
- for(x=0;x<4;x++) //輸出紅外的4個字節碼
- {
- if(IR_code[x]/16<0x10) //若數據高8位為數字則轉換為對應ASCII碼打印出來
- y=IR_code[x]/16+0x30;
- if(IR_code[x]/16>0x09) //若數據高8位為字母則轉換為對應ASCII碼打印出來
- y=IR_code[x]/16+0x37;
- if(IR_code[x]%16<0x10) //若數據低8位為數字則轉換為對應ASCII碼打印出來
- z=IR_code[x]%16+0x30;
- if(IR_code[x]%16>0x09) //若數據低8位為字母則轉換為對應ASCII碼打印出來
- z=IR_code[x]%16+0x37;
- SendData(' '); //打印空格為了優化顯示
- SendData('0'); //打印'0'字符
- SendData('x'); //打印'x'字符
- SendData(y); //打印數據高8位
- SendData(z); //打印數據低8位
- SendData(' '); //打印空格為了優化顯示
- }
- SendString("\r\n"); //打印回車換行
- SendString("|***************************************************|\r\n");
- IR_KEY=0;//清除紅外按鍵按下標志位
- }
- }
- /****************************************************************/
- //串口初始化函數UART_init(),無形參,無返回值
- /****************************************************************/
- void UART_init(void)
- {
- SCON=0x50; //10位數據異步通信模式,允許接收
- T2L=(65536-(FOSC/4/BAUD)); //設置波特率重裝值
- T2H=(65536-(FOSC/4/BAUD))>>8; //設置波特率重裝值
- AUXR|=0x14; //T2為1T模式,并啟動定時器2
- AUXR|=0x01; //選擇定時器2為串口1的波特率發生器
- EA=1; //使能單片機總中斷開關EA
- }
- /****************************************************************/
- //串口發送單字節數據SendData(),有形參dat用于接收欲發送的單字節數據,
- //無返回值
- /****************************************************************/
- void SendData(u8 dat)
- {
- SBUF=dat; //發送數據到發送緩沖區內
- while(TI==0); //等待串口數據發送完畢
- TI=0; //清除發送完成標志位TI
- }
- /****************************************************************/
- //串口發送字符串函數SendString(),有形參*s屬于指針變量,用于指向要
- //發送的字符串首字節,通過指針的自增,逐一取出字符依次發送直至字符串
- //結束標志'\0',無返回值
- /****************************************************************/
- void SendString(u8 *s)
- {
- while(*s!='\0')
- {
- SendData(*s); //調用SendData()函數依次發送單字節數據
- s++; //指針自增,便于發送下一個數據
- }
- }
- /****************************************************************/
- /***************************主函數區域****************************/
- void main(void)
- {
- Delay_50us(10);
- IO_init();
- Time0_init(); //定時計數器0初始化函數
- Int0_init(); //外部中斷0初始化函數
- WrToROM(voladd,20);
- Delay_ms(1);
- WrToROM(chadd,0);
- Delay_ms(1);
- WrToROM(subadd,5);
- Delay_ms(1);
- WrToROM(treadd,5);
- Delay_ms(1);
- sc2314_init();
- UART_init(); //串口初始化
- Delay_ms(1);
- SendString("|******串口準備完畢******|\r\n");
- BLUE=1;
- MUTE=1;
- STBY=0;
- while(1)
- {
- // if(ON_flag==0)BLUE =0;
- IR_deal();
- if(IR_KEY==0)
- {
- Key_scanf(); //按鍵掃描
- key_process();
-
- // IR_KEY==0;
- }
- }
- }
- /****************************************************************/
- //外部中斷0中斷服務函數INT0_ISR(),無形參,無返回值
- /****************************************************************/
- void INT0_ISR() interrupt 0
- {
- static u8 IR_bit; //變量IR_bit用于指示紅外數據的位數
- static bit Start_Flag; //位變量Start_Flag用于指示是否開始處理
- if(Start_Flag)
- {
- if(IR_time<70&&IR_time>32) //判斷引導碼(9ms+4.5ms)
- //IR_time大約要溢出32次(9ms/0.278ms)到70次(可以大于(9+4.5)/0.278)
- IR_bit=0; //清除位數變量,確保當前IR_bit為0,表示引導碼
- IR_data[IR_bit]=IR_time; //存儲相應位時間寬度
- IR_time=0; //清零時間寬度計數值
- IR_bit++; //位數變量自增
- if(IR_bit==33) //如果達到了33位(引導碼+32個數據位)
- {
- IR_Flag=1; //紅外數據接收完成標志位置1
- IR_bit=0; //位數變量清零
- }
- }
- else //外部中斷0檢測到下降沿,即將開始引導碼
- {
- IR_time=0; //清零時間計數值
- Start_Flag=1; //紅外數據產生第一次下降沿,意味著數據即將開始
- }
- }
- /****************************************************************/
- //定時計數器0中斷服務函數TIMER0_ISR(),無形參,無返回值
- /****************************************************************/
- void TIMER0_ISR() interrupt 1
- {
- IR_time++;
- }
復制代碼
單片機程序和PCB文件下載:
TA3116功放.zip
(6.31 MB, 下載次數: 89)
2023-10-18 21:00 上傳
點擊文件名下載附件
全部資料 下載積分: 黑幣 -5
|