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

📄 fm80110.c

📁 FM发射IC FM80110的驱动
💻 C
字号:
#include <BasType.h>
#include <FM80110.h>
#include <RegDefs.h>
#include <intrins.h>
#include <TM1616.h>

#define FM80110_Delay()    _nop_();_nop_();_nop_();_nop_();_nop_()

FLAG flag;
UINT8 CurFreq_Low,CurFreq_high;
//UINT16  g_CurFreq=8900;
//*****************寄存器设置*************************//
#define Register0  0x14
#define Register1  0x15
#define Register2  0x16
#define Register3  0x17
#define Register4  0x18
#define Register5  0x19
#define Register6  0x1A

#define Reg2_Data  0x00
#define Reg3_Data  0xCC
#define Reg4_Data  0x01   //静音关闭
#define Reg4_Data_mute  0x21    //静音打开
#define Reg5_Data  0x00
/**
MCU写FM80110模式下,写寄存器地址
**/
void FM80110_SPI_Write_adr(UINT8 Address_val){
        UINT8 i;
     FM80110_Data_in();//把DATA口设置为输入
     for(i=0;i<8;i++)
     	{
     	FM80110_clk0();
		if(Address_val & 0x80)
			{
		FM80110_da1();
			}
		else
			{
		FM80110_da0();
			}
		FM80110_Delay();
		FM80110_clk1();
		FM80110_Delay();
	if(i==2)
		{
		FM80110_Delay();
		FM80110_clk0();
		FM80110_da0();// 写数据入FM80110的时候4和5位之间为0
		FM80110_Delay();
		FM80110_clk1();
		FM80110_Delay();
		}
	Address_val <<=1;
     	}
  
}

/**
MCU读FM80110模式下,写入寄存器地址
**/
void FM80110_SPI_Reads_adr(UINT8 Address_val){
	  UINT8 i;
     FM80110_Data_in();//把DATA口设置为输出
     for(i=0;i<8;i++)
     	{
     	FM80110_clk0();
		if(Address_val & 0x80)
			{
		FM80110_da1();
			}
		else
			{
		FM80110_da0();
			}
		FM80110_Delay();
		FM80110_clk1();
		FM80110_Delay();
	if(i==2)
		{
		FM80110_clk0();
		FM80110_da1();// 写数据入FM80110的时候4和5位之间为1
		FM80110_Delay();
		FM80110_clk1();
		FM80110_Delay();
		}
		Address_val <<=1;
		
	
	}
}

/**
MCU写FM80110一个字节
**/
void FM80110_SPI_Write_1bitdata(UINT8 Data_val){ 
  UINT8 i;
  for(i=0;i<8;i++)
  	{
       FM80110_clk0();
		if(Data_val & 0x80)
			{
		FM80110_da1();
			}
		else
			{
		FM80110_da0();
			}
		FM80110_Delay();
		FM80110_clk1();
		FM80110_Delay();

		Data_val <<=1;
  	}
	
}

/**
MCU读FM80110一个字节
**/
UINT8 FM80110_SPI_Reads_1bitdata(){
	UINT8 i;
	UINT8 Data_val;
	
	for(i=0;i<8;i++)
		{
		FM80110_clk1();
		if(FM80110_teat_data)
		Data_val |=0x01;
		FM80110_Delay();
		
		FM80110_clk0();
              if(i==7)
              	{
              FM80110_en1();//
              	}
		Data_val<<=1;
		FM80110_Delay();
		}	
	return Data_val;
	}

/**
写一个寄存器
adr:寄存器地址
data_temp:写入寄存器数据
**/
void Write_one_register(UINT8 adr,UINT8 data_temp){
  //  FM80110_en0();
	//FM80110_clk1();
	FM80110_SPI_Write_adr(adr);
	FM80110_SPI_Write_1bitdata(data_temp);
	FM80110_clk0();
	//FM80110_da0();
	FM80110_en1();
	FM80110_Delay();
	FM80110_clk1();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_clk0();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_en0();
}

/**
读一个寄存器的数据
adr:寄存器地址
返回寄存器中的数据
**/
UINT8 Read_one_register(UINT8 adr){
 UINT8 temp_val;
	FM80110_en0();
	FM80110_clk0();
	FM80110_SPI_Reads_adr(adr);
	FM80110_Data_out();//把DATA口设置为输入
		FM80110_clk0();
		FM80110_Delay();
	temp_val=FM80110_SPI_Reads_1bitdata();
	       FM80110_clk1();
		   FM80110_Delay();
		   FM80110_clk0();

return temp_val;
}
/**
初始化FM80110
**/
void FM80110_Init(void){

       FM80110_Data_in();
       FM80110_clk1();
	FM80110_en1();
	FM80110_da1();
	SetCurFreq(8900);
	Write_one_register(Register2, Reg2_Data);
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	Write_one_register(Register3, Reg3_Data);
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	Write_one_register(Register4, Reg4_Data);
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	Write_one_register(Register5, Reg5_Data);
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	SetCurFreq(8900);
	
}

/**
设置写入寄存器的频率值
入口参数为:要设置的参数
**/
void SetCurFreq(UINT16 Freq_out){
	UINT16 CurFreq;

	CurFreq=Freq_out/Freq_ref;

	CurFreq_Low=CurFreq & 0xFF;
	CurFreq >>=8;
	CurFreq_high=CurFreq & 0xFF;

	Write_one_register(Register0, CurFreq_high);
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	Write_one_register(Register1, CurFreq_Low);
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
	FM80110_Delay();
       flag.CurFreq=Freq_out;
	Display_Freq(Freq_out);
	}
/**
改变频率
**/
void ChangeCurFreq(bit Direct){

	FM80110_Mute(1);
      if(Direct)
      		{
      		flag.CurFreq +=Freq_Step;
      		}
	else
		{
		flag.CurFreq -=Freq_Step;
		}
	
	if(flag.CurFreq>Frequency_max)
		{
		flag.CurFreq=Frequency_min;
		}
	if(flag.CurFreq<Frequency_min)
		{
		flag.CurFreq=Frequency_max;
		}
	
	SetCurFreq(flag.CurFreq);
       FM80110_Mute(0);
}

void delay_us (UINT8 i)	 

{		

	while (--i);
	return ;

}

/*=============================
== 函数名称:delay_ms() 
== 函数功能:ms delay process.
==入口参数: INT16U time
==出口参数:
==============================*/

void delay_ms (UINT8 time) 

{ 
	unsigned int  Temptime = time * 2;	

    	while (Temptime != 0) 
    	
		{       
        	delay_us(236); 
        	Temptime--; 
    	} 

}

/**
功能:版本1:只在三个频点上选择
**/
void SetFreq(bit Direct){

	if(Direct)
      		{
      		flag.CurFreq +=100;
      		}
	else
		{
		flag.CurFreq -=100;
		}
	
	if(flag.CurFreq>9100)
		{
		flag.CurFreq=8900;
		}
	if(flag.CurFreq<8900)
		{
		flag.CurFreq=9100;
		}
	
	SetCurFreq(flag.CurFreq);
	
	}

/**
功能:开关静音
**/
void FM80110_Mute(bit mute_temp){
	if(mute_temp)
		{
		Write_one_register(Register4, Reg4_Data_mute);
		}
	if(mute_temp==0)
		{
		Write_one_register(Register4, Reg4_Data);
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -