專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機驅動收音機模塊程序

作者:佚名   來源:本站原創(chuàng)   點擊數:  更新時間:2013年08月17日   【字體:

這是從http://www.torrancerestoration.com/bbs/dpj-20623-1.html 這個制作里面截取的一段子程序,調用函數請下載里面的附件.

radio.h文件如下:
#ifndef _RADIO_H_
#define _RADIO_H_


uint8 radio_read[5];//定義2個五字節(jié)數組保存寫入控制寄存器及讀取數據的內存空間
uint8 radio_write[5]={0x00,0x00,0xd0,0x17,0x00};
//uint16 pll;//14位PLL的值保存于一個字
static unsigned long frequency; //電臺頻率保存變量

/*-------------------------------------------------------------------------------------------------------------------
寫寄存器1
msb                            lsb
MUTE   SM    PLL13   PLL12   PLL11   PLL10   PLL09   PLL08
1:靜音   1:搜索模式  PLL13->PLL8
0:正常   0:非搜索  預置或搜索電臺的頻率值高6位
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
寫寄存器2
msb                            lsb
PLL7   PLL6   PLL5   PLL4   PLL3   PLL2   PLL1   PLL0
PLL7->PLL0
預置或搜索電臺頻率的低8位
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
寫寄存器3
msb                            lsb
SUD    SSL1   SSL0   HLSI   MS    ML    MR    SWP1
1:向上搜臺  0    0:不搜索  1:本振高出電臺 1:單聲道  1:左聲道靜音 1:右聲道靜音 可編程輸出口設置 
0:向下搜臺  0    1:ADC為5停止  225KHz  0:立體聲  0:右聲道正常 0:右聲道正常 1:SWPOR1高
    1    0:ADC為7停止 0:本振低于電臺             0:SWPOR1低
    1    1:ADC為10停止  225KHz
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
寫寄存器4
msb                            lsb
SWP2   STBY   BL    XTAL   SMUTE   HHC    SNC    SI
可編程輸出口 1:待機   1:76~91MHz  1:晶振32768Hz 1:軟件靜音開 1:高電平切割開 1:立體聲消噪開 
1:SWPOR2高  0:正常   0:87.5~108MHz 0:13MHz   0:軟件靜音關 0:高電平切割關 0:立體聲消噪關
0:SWPOR2低
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
寫寄存器5
msb                            lsb
PLLREF   DTC    -    -    -    -    -    -
    1:去重時間75uS
    0:去重時間50uS
--------------------------------------------------------------------------------------------------------------------*/
/*---------------------------------------------------------
函數功能:電臺頻率到PLL的轉換
調用形式:Convert_PLL();
參數:
返回值:
修改時間:
備注:HLSI為1,采用高本振狀態(tài)、XTAL=1,32.768KHz、PLLREF=0
---------------------------------------------------------*/
void Convert_PLL(void)
{
uint16 pll;
uint8 pll1,pll2;//高低位pll值暫存變量
pll=((frequency+225000)*4)/32768;// 單位均為Hz
pll1=pll/256;
pll2=pll%256;
radio_write[0]=pll1;
radio_write[1]=pll2;
}

/*---------------------------------------------------------
函數功能:初始化RADIO模塊
調用形式:Radio_Init();
參數:
返回值:
修改時間:
備注:轉換PLL值、寫控制字
---------------------------------------------------------*/
void Radio_Init(void)
{
//frequency=93400000;//初始電臺頻率93.4MHz
//radio_write[0]=0x00;
//radio_write[1]=0x00;
//radio_write[2]=0xf0;
radio_write[3]=0x40;
//radio_write[4]=0x00;
//Convert_PLL();
frequency=93400000;
SendString(RADIO_ADDRESS,radio_write,5);
}

/*--------------------------------------------------------------------------------------------------------------------
讀寄存器1
msb                            lsb
RF    BLF    PLL13   PLL12   PLL11   PLL10   PLL9   PLL8
1:發(fā)現電臺  1:波段到頭  PLL13->PLL8
  or搜索到頭 0:波段未到頭 搜索或預置電臺頻率高6位
0:未發(fā)現電臺
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
讀寄存器2
msb                            lsb
PLL7   PLL6   PLL5   PLL4   PLL3   PLL2   PLL1   PLL0
PLL7->PLL0
搜索或預置電臺頻率低8位
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
讀寄存器3
msb                            lsb
STERE0   IF6    IF5    IF4    IF3    IF2    IF1    IF0
1:立體聲  IF6->IF0
0:單聲道  中頻IF計數器結果
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
讀寄存器4
msb                            lsb
LEV3   LEV2   LEV1   LEV0   CI3    CI2    CI1    CI0
LEV3->LEV0              CI3->CI0
ADC輸出電平              芯片識別(均為0)
--------------------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------------------
讀寄存器5
均為保留位
--------------------------------------------------------------------------------------------------------------------*/
void Convert_Frequency()
{
frequency=radio_read[0]&0x3f;
frequency<<=8;
frequency|=radio_read[1];
frequency=frequency*8192-225000;
}

void Radio_Ing(void)
{
static bit k=0;
bit i=0;
uint8 n=0;
uint16 j;
if(!k)
{
k=1;
radio_write[3]=0x17;
}

Convert_PLL();
SendString(RADIO_ADDRESS,radio_write,5);

Display_8x16(0,0,frequency%100000000/10000000);
Display_8x16(8,0,frequency%10000000/1000000);
Display_8x16(16,0,10);
Display_8x16(24,0,frequency%1000000/100000);

/*ReceiveString(RADIO_ADDRESS,radio_read,5);
Display_8x16(0,0,(radio_read[3]&0x80)>>7);
Display_8x16(8,0,(radio_read[3]&0x40)>>6);
Display_8x16(16,0,(radio_read[3]&0x20)>>5);
Display_8x16(24,0,(radio_read[3]&0x10)>>4);*/
for(j=0;j<500;j++)
Display();

while(1)
{
if(ir_value==0x16||ir_value==0x0c||ir_value==0x18||ir_value==0x5e||ir_value==0x08||ir_value==0x1c||ir_value==0x5a||ir_value==0x42||ir_value==0x52||ir_value==0x4a)
{
while(1)
{
if(!i)
{
i=1;
ClearBuf();
//Display_8x16(16,0,10);
}
 //if(n==4) frequency*=10;
 if(ir_value==0x16)
 {ir_value=0xff;Display_8x16(8*n,0,0);if(!n)frequency=0;n++;}
 else if(ir_value==0x0c)
  {ir_value=0xff;Display_8x16(8*n,0,1);if(!n)frequency=100000000;else if(n==1)frequency+=10000000;else if(n==2) frequency+=1000000;else if(n==3)frequency+=100000;n++;}
 else if(ir_value==0x18)
  {ir_value=0xff;Display_8x16(8*n,0,2);if(!n)frequency=2*100000000;else if(n==1)frequency+=2*10000000;else if(n==2) frequency+=2*1000000;else if(n==3)frequency+=2*100000;n++;}
 else if(ir_value==0x5e)
  {ir_value=0xff;Display_8x16(8*n,0,3);if(!n)frequency=3*100000000;else if(n==1)frequency+=3*10000000;else if(n==2) frequency+=3*1000000;else if(n==3)frequency+=3*100000;n++;}
 else if(ir_value==0x08)
  {ir_value=0xff;Display_8x16(8*n,0,4);if(!n)frequency=4*100000000;else if(n==1)frequency+=4*10000000;else if(n==2) frequency+=4*1000000;else if(n==3)frequency+=4*100000;n++;}
 else if(ir_value==0x1c)
  {ir_value=0xff;Display_8x16(8*n,0,5);if(!n)frequency=5*100000000;else if(n==1)frequency+=5*10000000;else if(n==2) frequency+=5*1000000;else if(n==3)frequency+=5*100000;n++;}
 else if(ir_value==0x5a)
  {ir_value=0xff;Display_8x16(8*n,0,6);if(!n)frequency=6*100000000;else if(n==1)frequency+=6*10000000;else if(n==2) frequency+=6*1000000;else if(n==3)frequency+=6*100000;n++;}
 else if(ir_value==0x42)
  {ir_value=0xff;Display_8x16(8*n,0,7);if(!n)frequency=7*100000000;else if(n==1)frequency+=7*10000000;else if(n==2) frequency+=7*1000000;else if(n==3)frequency+=7*100000;n++;}
 else if(ir_value==0x52)
  {ir_value=0xff;Display_8x16(8*n,0,8);if(!n)frequency=8*100000000;else if(n==1)frequency+=8*10000000;else if(n==2) frequency+=8*1000000;else if(n==3)frequency+=8*100000;n++;}
 else if(ir_value==0x4a)
  {ir_value=0xff;Display_8x16(8*n,0,9);if(!n)frequency=9*100000000;else if(n==1)frequency+=9*10000000;else if(n==2) frequency+=9*1000000;else if(n==3)frequency+=9*100000;n++;}
 else if(ir_value==0x43)
  {ir_value=0xff;Convert_PLL();SendString(RADIO_ADDRESS,radio_write,5);n=0;i=0;break;}
 //if(n==2)
 //n++;
for(j=0;j<100;j++)
Display();
}
}

else if(ir_value==0x15)
 {
 ir_value=0xff;//清除
 frequency=frequency+100000;
 Convert_PLL();
 SendString(RADIO_ADDRESS,radio_write,5);
 break;
 }
 
 else if(ir_value==0x07)
  {
  ir_value=0xff;
  frequency=frequency-100000;
  Convert_PLL();
  SendString(RADIO_ADDRESS,radio_write,5);
  break;
  }
 else if(ir_value==0x44||ir_value==0x40)//自動搜臺
  {
   while(1)
   {
   
   if(ir_value==0x40)//向上自動搜臺
   {frequency+=100000;if(frequency>108000000)frequency=78000000;}
   else {frequency-=100000;if(frequency<78000000)frequency=108000000;}
   Convert_PLL();
   SendString(RADIO_ADDRESS,radio_write,5);
   
   if(frequency>108000000||frequency<78000000)break;
   
   ReceiveString(RADIO_ADDRESS,radio_read,5);
   Convert_Frequency();
   
   if(((radio_read[2]&0x7f<0x3E)&(radio_read[2]&0x7f>0x31)|(radio_read[3]>>4)>5|(radio_read[0]&0x80)))
   break;
   else if(ir_value==0x43){break;}
   
   Display_8x16(0,0,frequency%100000000/10000000);
   Display_8x16(8,0,frequency%10000000/1000000);
   Display_8x16(16,0,10);
   Display_8x16(24,0,frequency%1000000/100000);
   Display();
   }
  ir_value=0xff;
  break;
  }
 else if(ir_value==0x46)//待機or正常
  {
  if(radio_write[3]&0x40)
  radio_write[3]&=0xbf;
  else radio_write[3]|=0x40;
  ir_value=0xff;
  //i=0;
  break;
  }
 else if(ir_value==0x43||matrix.S==FIRST)
  {
  ir_value=0xff;
 // i=0;
  k=0;
  //Radio_Init();不待機即可后臺運行
  matrix.S=FIRST;
  break;
  }
}
}

void Radio_Key(void)
{
 if(!KEY_ENTER)
 {
 DelayMs(SCAN_DELAY);
  if(!KEY_ENTER)
  {
  while(!KEY_ENTER)
  ;
  matrix.S=FIRST;
  }
 }
}

/*
void Radio_Read1()
{
ReceiveString(0xc0,radio_read,5);
Convert_Frequency();

if(radio_read[0]&0x80)
temp[6]=duanma[1];
else temp[6]=duanma[0];


if(radio_read[0]&0x40)
{
temp[7]=duanma[1];
}
else temp[7]=duanma[0];


temp[0]=duanma[frequency/100];
temp[1]=duanma[frequency%100/10];
temp[2]=duanma[frequency%10];

}
*/

#endif

關閉窗口

相關文章