久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: SI4730 收音機芯片資料與程序 [打印本頁]

作者: liuda    時間: 2015-1-20 15:33
標題: SI4730 收音機芯片資料與程序
在網上看到關于這個SI4730的收音機芯片的資料比較少,所以現在特發上來,共有緣人參考,
如有不對之處,請指出。!!

由于時間倉促,自動搜臺就沒有編寫,望有緣人寫好后發上來分享。!!!!
晶振:24MHz
單片機:at89s52
注:轉載請注明出處,否則追究法律責任!!!
日期:2010-03-06
版本:v1.0
設計者:sws
*/


#include"reg52.h"
#include"intrins.h"


typedef unsigned char uchar;
typedef unsigned int uint;
#define HIGH 1
#define LOW 0
#define SI4730_HIGH    //4730選擇地址定義
//#define SI4730_LOW
#define Max_freq_FM 10800      //108MHz
#define Min_freq_FM 8750   //87.5MHz
#define max_freq_AM 1701 //1701KHz
#define min_freq_AM 531
#define    FM_RECEIVER 0x20 //FM調諧頻率 page.52
#define    FM_TRNSMITTER 0x30
#define    AM_RECEIVER 0x40 //AM調諧頻率
#define    TX_TUNE_MEASURE 0x32
uint Frequency_fm=875;
uint Frequency_am=531;

bit Mode = 0;
sbit KEY_UP = P2^2;   //向上搜臺
sbit KEY_DW = P2^3;   //向下搜臺
sbit FM_AM_Choose = P2^4; //FM與AM選擇
bit FM_AM_ = 0;

/******************************************************
START condition:

SCLK: -----------|______

SDIO:-----|_____________
       1 |   2 | 3

STOP condition:

SCLK: ____|--------------

SDIO:____________|-------
1 | 2   |   3

DATA:

SCLK:_______________|---|________|----|_______

SDIO:___________|------------|____________|----
   |<==========>|


RESET:

SENB:__|---------------------------------------------
SDIO:_________________________________________|------
RST: ___________|------------------------------------
SCLK:__|---------------------------------------------
       |    1    |      2               |   3

******************************************************/
sbit Si4730_Reset = P1^3;
sbit Si4730_SCLK = P1^2;
sbit Si4730_SDIO = P1^1;

//如果SI4730的第六腳(SEN)接高電平那么地址是0x23,0x22
//如果SI4730的第六腳(SEN)接低電平那么地址是0xc7,0xc6

//#if 0 //address switch
#ifdef SI4730_LOW
#define READ_ADDR   0x23
#define WRITE_ADDR 0x22
#endif

#ifdef SI4730_HIGH
#define READ_ADDR   0xc7
#define WRITE_ADDR 0xc6
#endif

#define SCLK_HIGH Si4730_SCLK = HIGH
#define SCLK_LOW Si4730_SCLK = LOW

#define SDIO_HIGH Si4730_SDIO = HIGH
#define SDIO_LOW Si4730_SDIO = LOW
#define READ_SDIO Si4730_SDIO


//===============FM START===================

void _NOP()
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}

void Si4730_Delay(unsigned char k)
{
uchar i,j;
for(i=150;i>0;i--)
   for(j=k;j>0;j--);
}

#define I2C_CLK_Delay() _NOP()


void ResetSi47XX_2w()
{
   Si4730_Reset = LOW;
   SCLK_HIGH;
   Si4730_Delay(100);
   SDIO_HIGH;
   Si4730_Delay(250);
   Si4730_Reset = HIGH;  
}

void Si4730_start()
{
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_ack()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
    I2C_CLK_Delay();
    SDIO_HIGH;
}

void Si4730_stop()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_writebyte(uchar write_data)   
{
uchar i;
for(i=8;i!=0;i--)    // 循環移入8個位
{
   READ_SDIO = (bit)(write_data & 0x80);
   SCLK_HIGH;
   I2C_CLK_Delay();
   SCLK_LOW; //SDA數據線上數據變化
   write_data <<= 1;   //調整發送位
}
}

void Operation_Si4730_Write(uchar *data1,uchar numByte)
{
uchar j;

Si4730_start();
Si4730_writebyte(WRITE_ADDR);//器件地址 0xc6
Si4730_ack();
I2C_CLK_Delay();
for(j=LOW;j<numByte;j++,*data1++)
{
   Si4730_writebyte(*data1);
   Si4730_ack();
   I2C_CLK_Delay();
}
Si4730_stop(); //發送結束
}

void Si4730_Power_Up_FM_AM_Choose(unsigned char mod) //fm,am選擇
{
unsigned char write_buf[3]={0x01,0xd0,0x05};
switch(mod)
{
   case FM_RECEIVER:        //si4730
      write_buf[1] = 0xd0; //使用時鐘晶振,32.768khz ,FM模式
      write_buf[2] = 0x05; //模擬L/R輸出  
      break;

     case AM_RECEIVER:           //si4730
       write_buf[1] = 0xd1; //使用時鐘晶振,32.768khz ,AM模式
       write_buf[2] = 0x05; //模擬L/R輸出
       break;
}
Operation_Si4730_Write(&(write_buf[0]), 3);//need wait >=300mS
Si4730_Delay(250);
Si4730_Delay(250);
Si4730_Delay(120);
}

void Si4730_Tune(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[5];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫入高字節
write_buf[3] = Channel_Freq;     //寫入低字節

write_buf[4]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 5);  
}

void Search_FM()   //調用手動FM 頻率調整子程序 menu = 15
{
   if(Mode)
   {
    Frequency_fm += 10;   //步進+0.1MHz
    if(Frequency_fm > Max_freq_FM)
     Frequency_fm = Min_freq_FM;
   }

   else
   {
    Frequency_fm -= 10;   //步進-0.1MHz
    if(Frequency_fm < Min_freq_FM)
     Frequency_fm = Max_freq_FM;
   }
// Si4730_Power_Up(FM_RECEIVER); //向上搜臺
Si4730_Tune(FM_RECEIVER,Frequency_fm); //FM收音芯片數據刷新一次
}

//=================fm end============

//===============am start==============

void Si4730_Tune_AM(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[6];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫入高字節
write_buf[3] = Channel_Freq;     //寫入低字節

write_buf[4]= 0x00;
write_buf[5]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 6);  
}

void Search_AM()   //調用手動FM 頻率調整子程序 menu = 95
{
   if(Mode)
   {
    Frequency_am += 9;   //步進+9KHz
    if(Frequency_am > max_freq_AM)
     Frequency_am = min_freq_AM;
   }

   else
   {
    Frequency_am -= 9;   //步進-9KHz
    if(Frequency_am < min_freq_AM)
     Frequency_am = max_freq_AM;
   }
// Si4730_Power_Up(AM_RECEIVER); //向上搜臺
Si4730_Tune_AM(AM_RECEIVER,Frequency_am); //AM收音芯片數據刷新一次
}

//=======================am end========================

//==============main start=======================

void main()
{
ResetSi47XX_2w();
Si4730_Delay(250);
while(1)
{
   if(!FM_AM_Choose)
   {
    Si4730_Delay(100);
    if(!FM_AM_Choose)
    {
      FM_AM_ = ~FM_AM_;
      if(!FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(FM_RECEIVER); //fm選擇
      }
      else if(FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(AM_RECEIVER ); //am選擇
      }

    }
   }


    if(!FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {
      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺
      Search_FM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺
      Search_FM();
      }
    }
   }

    else if(FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {
      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺
      Search_AM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺
      Search_AM();
      }
    }
   }
}
}

//=================main end=====================



作者: 李友明    時間: 2015-1-20 16:02
這個沒有顯示頻率的,我不會加上顯示頻率,用的是1602,
作者: 李友明    時間: 2015-1-20 16:08
include"reg52.h"
#include"intrins.h"
#include "LCD1602_4w.h"

typedef unsigned char uchar;
typedef unsigned int uint;
#define HIGH 1
#define LOW 0
#define SI4730_HIGH    //4730選擇地址定義
//#define SI4730_LOW
#define Max_freq_FM 10800      //108MHz
#define Min_freq_FM 8750   //87.5MHz
#define max_freq_AM 1701 //1701KHz
#define min_freq_AM 531
#define    FM_RECEIVER 0x20 //FM調諧頻率 page.52
#define    FM_TRNSMITTER 0x30
#define    AM_RECEIVER 0x40 //AM調諧頻率
#define    TX_TUNE_MEASURE 0x32
uint Frequency_fm=875;
uint Frequency_am=531;

bit Mode = 0;
sbit KEY_UP = P2^2;   //向上搜臺
sbit KEY_DW = P2^3;   //向下搜臺
sbit FM_AM_Choose = P2^4; //FM與AM選擇
bit FM_AM_ = 0;

//LCD1602_4w
sbit LCD_RS = P1^0;            
sbit LCD_RW = P1^1;
sbit LCD_EP = P1^2;
#define LCD_EN  LCD_EP
#define LCD_DATA    P0



/******************************************************
START condition:

SCLK: -----------|______

SDIO:-----|_____________
       1 |   2 | 3

STOP condition:

SCLK: ____|--------------

SDIO:____________|-------
1 | 2   |   3

DATA:

SCLK:_______________|---|________|----|_______

SDIO:___________|------------|____________|----
   |<==========>|


RESET:

SENB:__|---------------------------------------------
SDIO:_________________________________________|------
RST: ___________|------------------------------------
SCLK:__|---------------------------------------------
       |    1    |      2               |   3

******************************************************/
sbit Si4730_Reset = P1^3;
sbit Si4730_SCLK = P1^2;
sbit Si4730_SDIO = P1^1;

//如果SI4730的第六腳(SEN)接高電平那么地址是0x23,0x22
//如果SI4730的第六腳(SEN)接低電平那么地址是0xc7,0xc6

//#if 0 //address switch
#ifdef SI4730_LOW
#define READ_ADDR   0x23
#define WRITE_ADDR 0x22
#endif

#ifdef SI4730_HIGH
#define READ_ADDR   0xc7
#define WRITE_ADDR 0xc6
#endif

#define SCLK_HIGH Si4730_SCLK = HIGH
#define SCLK_LOW Si4730_SCLK = LOW

#define SDIO_HIGH Si4730_SDIO = HIGH
#define SDIO_LOW Si4730_SDIO = LOW
#define READ_SDIO Si4730_SDIO


//===============FM START===================

void _NOP()
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}

void Si4730_Delay(unsigned char k)
{
uchar i,j;
for(i=150;i>0;i--)
   for(j=k;j>0;j--);
}

#define I2C_CLK_Delay() _NOP()


void ResetSi47XX_2w()
{
   Si4730_Reset = LOW;
   SCLK_HIGH;
   Si4730_Delay(100);
   SDIO_HIGH;
   Si4730_Delay(250);
   Si4730_Reset = HIGH;  
}

void Si4730_start()
{
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_ack()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
    I2C_CLK_Delay();
    SDIO_HIGH;
}

void Si4730_stop()
{
    SDIO_LOW;
    I2C_CLK_Delay();
    SCLK_HIGH;
    I2C_CLK_Delay();
    SDIO_HIGH;
    I2C_CLK_Delay();
    SCLK_LOW;
}

void Si4730_writebyte(uchar write_data)   
{
uchar i;
for(i=8;i!=0;i--)    // 循環移入8個位
{
   READ_SDIO = (bit)(write_data & 0x80);
   SCLK_HIGH;
   I2C_CLK_Delay();
   SCLK_LOW; //SDA數據線上數據變化
   write_data <<= 1;   //調整發送位
}
}

void Operation_Si4730_Write(uchar *data1,uchar numByte)
{
uchar j;

Si4730_start();
Si4730_writebyte(WRITE_ADDR);//器件地址 0xc6
Si4730_ack();
I2C_CLK_Delay();
for(j=LOW;j<numByte;j++,*data1++)
{
   Si4730_writebyte(*data1);
   Si4730_ack();
   I2C_CLK_Delay();
}
Si4730_stop(); //發送結束
}

void Si4730_Power_Up_FM_AM_Choose(unsigned char mod) //fm,am選擇
{
unsigned char write_buf[3]={0x01,0xd0,0x05};
switch(mod)
{
   case FM_RECEIVER:        //si4730
      write_buf[1] = 0xd0; //使用時鐘晶振,32.768khz ,FM模式
      write_buf[2] = 0x05; //模擬L/R輸出  
      break;

     case AM_RECEIVER:           //si4730
       write_buf[1] = 0xd1; //使用時鐘晶振,32.768khz ,AM模式
       write_buf[2] = 0x05; //模擬L/R輸出
       break;
}
Operation_Si4730_Write(&(write_buf[0]), 3);//need wait >=300mS
Si4730_Delay(250);
Si4730_Delay(250);
Si4730_Delay(120);
}

void Si4730_Tune(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[5];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫入高字節
write_buf[3] = Channel_Freq;     //寫入低字節

write_buf[4]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 5);  
}

void Search_FM()   //調用手動FM 頻率調整子程序 menu = 15
{
   if(Mode)
   {
    Frequency_fm += 10;   //步進+0.1MHz
    if(Frequency_fm > Max_freq_FM)
     Frequency_fm = Min_freq_FM;
   }

   else
   {
    Frequency_fm -= 10;   //步進-0.1MHz
    if(Frequency_fm < Min_freq_FM)
     Frequency_fm = Max_freq_FM;
   }
// Si4730_Power_Up(FM_RECEIVER); //向上搜臺
Si4730_Tune(FM_RECEIVER,Frequency_fm); //FM收音芯片數據刷新一次
}

//=================fm end============

//===============am start==============

void Si4730_Tune_AM(char mod,unsigned short Channel_Freq)
{
unsigned char write_buf[6];

write_buf[0]= mod;
write_buf[1]= 0x00;

write_buf[2] = Channel_Freq >> 8;   //寫入高字節
write_buf[3] = Channel_Freq;     //寫入低字節

write_buf[4]= 0x00;
write_buf[5]= 0x00;

   Operation_Si4730_Write(&(write_buf[0]), 6);  
}

void Search_AM()   //調用手動FM 頻率調整子程序 menu = 95
{
   if(Mode)
   {
    Frequency_am += 9;   //步進+9KHz
    if(Frequency_am > max_freq_AM)
     Frequency_am = min_freq_AM;
   }

   else
   {
    Frequency_am -= 9;   //步進-9KHz
    if(Frequency_am < min_freq_AM)
     Frequency_am = max_freq_AM;
   }
// Si4730_Power_Up(AM_RECEIVER); //向上搜臺
Si4730_Tune_AM(AM_RECEIVER,Frequency_am); //AM收音芯片數據刷新一次
}

//=======================am end========================

//==============main start=======================

void main()
{
ResetSi47XX_2w();
Si4730_Delay(250);
while(1)
{
   if(!FM_AM_Choose)
   {
    Si4730_Delay(100);
    if(!FM_AM_Choose)
    {
      FM_AM_ = ~FM_AM_;
      if(!FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(FM_RECEIVER); //fm選擇
      }
      else if(FM_AM_)
      {
         Si4730_Power_Up_FM_AM_Choose(AM_RECEIVER ); //am選擇
      }

    }
   }


    if(!FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {
      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺
      Search_FM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺
      Search_FM();
      }
    }
   }

    else if(FM_AM_)
    {
   // ResetSi47XX_2w();
    if(!KEY_UP)
    {

      Si4730_Delay(100);
      if(!KEY_UP)
      {
         Mode = HIGH; //向上搜臺
      Search_AM();
      }
    }

    if(!KEY_DW)
    {
      Si4730_Delay(100);
      if(!KEY_DW)
      {
         Mode = LOW; //向下搜臺
      Search_AM();
      }
    }
   }
}
}

//=================main end=====================

新建文件夾 (3).rar (5.93 KB, 下載次數: 74)

先不管1602怎么定義接MCU,現在報錯,說什么沒定義,你幫看一下



作者: 李友明    時間: 2015-1-20 16:11
我只是你這程序加上#include "LCD1602_4w.h",然后加上1602的接線定義后翻譯出錯,請求版主大家幫看一下,怎么樣在你發的程序上加上頻率顯示,MCU你可隨便定義,我改就行,期盼你的回復
作者: q642071377    時間: 2015-3-29 15:02
我現在也要做si4730收音機,一起努力吧
作者: xyz101531411    時間: 2015-8-16 00:13
好東西,學習,學習,
作者: 51單片機1234    時間: 2019-1-10 16:35

好東西,學習,學習,
作者: 這一生只為你    時間: 2019-11-8 08:59
正在找它的資料,感謝分享!
作者: 1314520jieber    時間: 2021-11-8 12:24
timer.h:  #ifndef __TIMER_H_  #define __TIMER_H_  //如果外部需要使用這些變量或函數,直接包含頭文件即可。  //如果不對外開放的函數,就不需要添加  //注:在C源文件中,函數聲明要補全  extern int timerCnt;  extern int timerStatu;  extern void TimerStart();  extern void TimerStop();  extern void TimerInit();  #endif
作者: HAISONC    時間: 2024-9-23 21:34
這個程序用不了哦




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日韩中文字幕一区二区 | 精品亚洲国产成av人片传媒 | 久久亚洲一区二区三 | 九色 在线 | 超碰在线播 | 精品国产一级 | 99福利视频 | 亚洲精品永久免费 | 在线视频h | 亚洲自拍偷拍av | 夜夜爽99久久国产综合精品女不卡 | 日韩www | 综合久久综合久久 | 亚洲va欧美va天堂v国产综合 | 日韩精品一区二区三区视频播放 | 成人在线视频观看 | 国产在线观看免费 | 精品国产一区二区 | www.中文字幕.com | 九九综合 | 欧美一区二区在线视频 | 老子午夜影院 | 国产高清视频在线观看 | av色噜噜 | 99精品欧美一区二区蜜桃免费 | 日韩中文字幕久久 | 狠狠夜夜| 亚洲色图婷婷 | 中文字幕在线视频免费观看 | 日韩久久久久久 | 国产在线一区观看 | 伊人伊人网 | 中文字幕一区二区三区乱码在线 | 久久99视频精品 | 日韩欧美国产成人一区二区 | 中文字幕免费视频 | 天天操天天舔 | 天天操天天怕 | 国产精品视频免费观看 | 国产精品视频网 | 成人一区在线观看 |