📄 main.c
字号:
//===================================================
//
// 模块: 深圳市梵天科技有限公司-无线发射模块例程。
//
// 版本: 1.00
//
// 日期: 2007-08-03
//
// 作者: 施探宇
//
// 说明: 9903模块,80110H,80110C ,C51 控制例程
//
// 80110C: SPI协议
//
// 80110H: I2C协议
//
//===================================================
#include "at89s53.h"
//#define FM_USE_1418 1
#define FM_USE_80110 1
//===================================================
// 类型定义
//===================================================
typedef unsigned char BYTE;
typedef unsigned int WORD;
#ifdef FM_USE_80110
#define USE_SPI 1
//#define USE_I2C 1
#ifdef USE_I2C
#include "i2c.h"
#define FM_DEVID 0xc0
#define FM_ERROR 0x80
BYTE FmSet80110H(WORD wFM)
{
BYTE iAck = 0;
I2cStart();
I2cWriteByte(FM_DEVID);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 1;
// DATA[1] = Send Hi BYTE
I2cWriteByte((wFM >> 8) & 0xff);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 2;
// DATA[2] = Send Lo BYTE
I2cWriteByte((wFM ) & 0xff);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 3;
// DATA[3] = 0x00
I2cWriteByte(0x00);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 4;
// DATA[4] = 0x0C
I2cWriteByte(0x0C);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 5;
// DATA[5] = 0x11
I2cWriteByte(0x11);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 6;
// DATA[6] = 0x00
I2cWriteByte(0x00);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 7;
// DATA[7] = 0x00
I2cWriteByte(0x00);
iAck = I2cGetAck();
if(!iAck)
return FM_ERROR + 8;
I2cStop();
return 0;
}
#endif /*USE_I2C*/
#ifdef USE_SPI
//===================================================
// SPI 协议定义脚位(用于80110H)
//===================================================
sbit P_EN = P2^1;
sbit P_CLK = P2^2;
sbit P_DAT = P2^3;
//===================================================
// 延时函数
//===================================================
void SpiDelay(int n)
{
int i = 0,j = 0;
for(i = 0; i < n; i ++)
{
for(j = 0; j < 100; j++)
{
// 不一定需要100个,够用就行
}
}
}
//===================================================
// 写字节
//===================================================
void FmSendByte(BYTE Addr,BYTE Data)
{
BYTE i = 0;
// 开始写数据
P_EN = 0;
SpiDelay(1);
// 写入地址
for(i = 0 ;i < 9 ;i ++ )
{
P_CLK = 0;
SpiDelay(1);
// 第3 位后插入一个低表示写
if(i == 3 )
{
P_DAT = 0;
}
else
{
if(Addr & 0x80)
P_DAT = 1;
else
P_DAT = 0;
}
SpiDelay(1);
P_CLK = 1;
SpiDelay(1);
if(i != 3 )
Addr <<= 1;
}
// 写入数据
for(i = 0 ; i < 8 ;i ++ )
{
P_CLK = 0;
SpiDelay(1);
if(Data & 0x80)
P_DAT = 1;
else
P_DAT = 0;
SpiDelay(1);
P_CLK = 1;
SpiDelay(1);
Data >>= 1;
}
P_EN = 1;
P_CLK = 0;
P_DAT = 0;
SpiDelay(1);
}
//===================================================
// 读字节
//===================================================
BYTE FmReadByte(BYTE Addr)
{
BYTE Data = 0;
BYTE i = 0;
// 开始写数据
P_EN = 0;
SpiDelay(1);
// 写入地址
for(i = 0 ;i < 9 ;i ++ )
{
P_CLK = 0;
SpiDelay(1);
// 第3位后插入低表示写,高表示读!
if(i == 3 )
{
P_DAT = 1;
}
else
{
if(Addr & 0x80)
{
P_DAT = 1;
}
else
{
P_DAT = 0;
}
}
SpiDelay(1);
P_CLK = 1;
SpiDelay(1);
if(i != 3 )
Addr <<= 1;
}
// 此处低是必须的
P_CLK = 0;
SpiDelay(1);
// 读数据
for(i = 0 ; i < 8 ;i ++ )
{
Data <<= 1;
P_CLK = 1;
SpiDelay(1);
P_CLK = 0;
SpiDelay(1);
// CLK 由高到低读数据
if(P_DAT)
{
Data |= 1;
}
SpiDelay(1);
}
P_EN = 1;
P_CLK = 0;
P_DAT = 0;
SpiDelay(1);
return Data;
}
//===================================================
// 写频率
//===================================================
void FmSet80110C(WORD wFM)
{
FmSendByte(0x14,((wFM >> 8) & 0xff));
FmSendByte(0x15,(wFM & 0xff));
FmSendByte(0x16,0x00);
FmSendByte(0x17,0x0c);
FmSendByte(0x18,0x11);
FmSendByte(0x19,0x00);
FmSendByte(0x1A,0x00);
}
//===================================================
// 读频率
//===================================================
WORD FmRead80110C(void)
{
WORD iFM = 0;
iFM = FmReadByte(0x14);
iFM <<= 8;
iFM |= FmReadByte(0x15);
FmReadByte(0x16);
FmReadByte(0x17);
FmReadByte(0x18);
FmReadByte(0x19);
FmReadByte(0x1A);
return (iFM & 0x7fff);
}
#endif /*USE_SPI*/
#ifdef FM_USE_1418
//===================================================
// SPI 协议定义脚位(用于1418)
//===================================================
sbit P_CE = P2^1;
sbit P_CK = P2^2;
sbit P_DA = P2^3;
//===================================================
// 延时函数
//===================================================
void FmDelay(int n)
{
int i = 0,j = 0;
for(i = 0; i < n; i ++)
{
for(j = 0; j < 100; j++)
{
// 不一定需要100个,够用就行
}
}
}
//===================================================
// 写频率
//===================================================
void FmSet1418(WORD nMode)
{
char i = 0;
// 保留低11位数据
nMode &= 0x07FF;
// 开立体声
nMode |= 0x0800;
// PD0,PD1,为0,0
//nMode |= 0x3000;
// T0,T1,为1,0
nMode |= 0x4000;
// CE 置高有效.
P_CE = 1;
FmDelay(1);
// 共16位数据
for(i = 0 ;i < 16; i ++ )
{
// CK 置低,写数据
P_CK = 0;
FmDelay(1);
// 先发送低位
if(nMode & 0x01)
P_DA = 1;
else
P_DA = 0;
FmDelay(1);
// CK 置高,读数据
P_CK = 1;
FmDelay(1);
nMode >>= 1;
}
// CE 置低完成.
P_CE = 0;
P_CK = 0;
FmDelay(1);
}
#endif
//===================================================
// 起始函数
//===================================================
void main()
{
#ifdef FM_USE_1418
// 参数为实际的10倍,100K为单位
// Set to fm 87.5mHz
FmSet1418(875);
#endif
#ifdef FM_USE_80110
// 参数为实际频率的20倍,50K为单位
// Set to fm 87.5mHz
#ifdef USE_I2C
FmSet80110H(875 * 2);
#endif
#ifdef USE_SPI
FmSet80110C(875 * 2);
#endif
#endif
do{
}while(1);
}
/*EOF*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -