⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 梵天科技FM模块:9903-80110C,9903-80110H,9805M8-1418.C51代码例程!
💻 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 + -