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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 14269|回復: 9
打印 上一主題 下一主題
收起左側

SI4730 收音機芯片資料與程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:72519 發表于 2015-1-20 15:33 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在網上看到關于這個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=====================


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:71523 發表于 2015-1-20 16:02 | 只看該作者
這個沒有顯示頻率的,我不會加上顯示頻率,用的是1602,
回復

使用道具 舉報

板凳
ID:71523 發表于 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,現在報錯,說什么沒定義,你幫看一下


回復

使用道具 舉報

地板
ID:71523 發表于 2015-1-20 16:11 | 只看該作者
我只是你這程序加上#include "LCD1602_4w.h",然后加上1602的接線定義后翻譯出錯,請求版主大家幫看一下,怎么樣在你發的程序上加上頻率顯示,MCU你可隨便定義,我改就行,期盼你的回復
回復

使用道具 舉報

5#
ID:75609 發表于 2015-3-29 15:02 | 只看該作者
我現在也要做si4730收音機,一起努力吧
回復

使用道具 舉報

6#
ID:88407 發表于 2015-8-16 00:13 | 只看該作者
好東西,學習,學習,
回復

使用道具 舉報

7#
ID:229361 發表于 2019-1-10 16:35 | 只看該作者

好東西,學習,學習,
回復

使用道具 舉報

8#
ID:403593 發表于 2019-11-8 08:59 | 只看該作者
正在找它的資料,感謝分享!
回復

使用道具 舉報

9#
ID:166475 發表于 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
回復

使用道具 舉報

10#
ID:838732 發表于 2024-9-23 21:34 | 只看該作者
這個程序用不了哦
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线免费观看亚洲 | 日韩在线免费播放 | www.蜜桃av.com | 天天久久 | 中国一级特黄真人毛片免费观看 | 日韩在线小视频 | 国产精品一区一区 | 激情网站 | 欧美日韩电影一区 | 国产精品视频yy9299一区 | 欧美中文字幕一区二区三区亚洲 | 日韩欧美三区 | 欧美在线一区二区视频 | 欧美日韩亚洲国产 | 国产免费色 | 欧美日韩精品一区二区 | 日本a视频 | h视频免费看 | 国产成人亚洲精品自产在线 | 一本综合久久 | 日韩欧美在线一区 | 每日更新av | 久久99精品久久久久久国产越南 | 精品视频国产 | 亚洲欧美在线观看视频 | 欧美精品一区二区三区在线四季 | 欧美中文在线 | 999久久久精品 | 高清国产一区二区 | 国产成人精品一区二区三区在线 | 日韩国产中文字幕 | 精品亚洲91 | 亚洲欧洲精品成人久久奇米网 | 黄网站在线观看 | 欧美高清视频 | 精品国产欧美一区二区三区成人 | 一区二区免费在线 | 亚洲欧美视频一区 | 欧美综合一区二区 | 久久精品亚洲精品国产欧美kt∨ | 久久久久久av |