久久久久久久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)
2015-1-20 16:08 上傳
點擊文件名下載附件
先不管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视频精品
|
日韩欧美国产成人一区二区
|
中文字幕免费视频
|
天天操天天舔
|
天天操天天怕
|
国产精品视频免费观看
|
国产精品视频网
|
成人一区在线观看
|