闲来无事,做了一块200*2.1声道功放板
贡献出来学习
PADS画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
- #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)
|