专注电子技术学习与研究
当前位置:单片机教程网 >> STM32 >> 浏览文章

M62429音量控制stm32单片机程序

作者:huqin   来源:本站原创   点击数:  更新时间:2014年05月06日   【字体:

M62429音量控制

 


 
(*特别注意:最后D10位当时钟线位下降沿时,数据线为高,以此判断数据传输结束,否则,没有音频输出) 
stm32程序
#define SET_CLK1 (GPIOD->BSRR = GPIO_Pin_10)//AUX
#define RESET_CLK1 (GPIOD->BRR = GPIO_Pin_10)
#define SET_DAT (GPIOD->BSRR = GPIO_Pin_11)
#define RESET_DAT (GPIOD->BRR = GPIO_Pin_11)
#define SET_CLK2 (GPIOD->BSRR = GPIO_Pin_12)//CMMB
#define RESET_CLK2 (GPIOD->BRR = GPIO_Pin_12)
#define SET_CLK(no) {(no==2)?SET_CLK2:SET_CLK1;}
#define RESET_CLK(no) {(no==2)?RESET_CLK2:RESET_CLK1;}

const u8 vol_H4[]={0x03,0x01,0x20,0x0};                                                                                                    //D7.D8=0dB--(-3)dB
const u8 vol_l5[]={0x15,0x05,0x19,0x09,0x11,0x01,0x1e,0x0e,0x16,0x06,                                                   //D2--D6
  0x1a,0x0a,0x12,0x02,0x1c,0x0c,0x14,0x04,0x18,0x08,                                              //0dB-(-80dB)
  0x10,0x00
};
 
 typedef enum
{
AUX =1,
CMMB=2
}CHANNEL;

static void delay(u16 value)
{
u8 i,j,k;
for(i=value;i>0;i--)
 
for(j=2;j>0;j--)
 
for(k=4;k>0;k--);
}
 
void set_volume(CHANNEL channel,u8 db)//AUX/CMMB
{
u8 L,H,i;
u16 volume;
volume=db;
volume=80-db;
L=volume/4;
H=volume%4;
volume=((0x00+vol_l5[L])<<4)+((vol_H4[H]<<2)+0x03);
volume=volume<<5;
RESET_DAT;
RESET_CLK(channel);
for(i=0;i<11;i++)
{
RESET_DAT;
delay(5);
RESET_CLK(channel);
delay(5);
if(volume&0x8000) SET_DAT;
else RESET_DAT;
delay(5);
SET_CLK(channel);
delay(5);
volume=volume<<1;
}
SET_DAT;
delay(5);
RESET_CLK(channel);
delay(5);
}   
 
关闭窗口

相关文章