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

📄 tuner.c

📁 调谐器内部控制程序
💻 C
字号:
#include "Main.h"
#include "tuner.h"

//显示的内容
extern UCHAR LED_Data1;
extern UCHAR LED_Data2;
extern UCHAR LED_Data3;

//FM当前频道,FM当前频道个数
extern UCHAR nFM;
extern UCHAR nFMs;
extern uchar select_ch;

extern bit b_mute_f;
//频道类型
extern uchar m_channel_place;
extern uchar m_B,m_C,m_E,m_IF_address;

//检测是否有视频信号的I/O口
sbit FindChannel = P1^5;

sbit m_mute = P1^4;

//Tuner段控制字
extern UCHAR nFmBand;
extern UCHAR nLowBand;
extern UCHAR nMidBand;
extern UCHAR nHigBand;

extern uint m_IF;

extern uchar lcd_cnt;
extern UCHAR taiHao;

//super 超强接收
extern bit bWSB;

//FM立体音
extern bit bMono;

//TNF8533 TNF8833   01
//TNF8533 TNF8833   02
//TNF8532 TNF8832   03
//TNF8731 TNF8731FF 04
extern UCHAR nTunerType;

//当前频道编号
UCHAR nChannel;
extern UCHAR IsChannels;

extern UCHAR idata lcd_data_line1[16];
extern UCHAR idata lcd_data_line2[16];

extern UCHAR IR_Data;
extern bit IR_Succes;

extern uchar m_taihao;
extern bit m_auto;


//中国频道
extern long int code tuner_China[100] =
{
    //VHF_LOW 12
    4975,  5775,  6575,  7725,  8525, 11225, 12025, 12825, 13625, 14425,
		15225, 16025,

		//VHF_HIG 38
		16825, 17625, 18425, 19225, 20025, 20825, 21625, 22425,	23225, 24025,
		24825, 25625, 26425, 27225, 28025, 28825, 29625, 30425, 31225, 32025,
		32825, 33625, 34425, 35225, 36025, 36825, 37625, 38425, 39225, 40025,
		40825, 41625, 42425, 43225, 44025, 44825, 45625, 46425,

		//UHF 50
		47125, 47925, 48725, 49525, 50325, 51125, 51925, 52725, 53525, 54325,
		55125, 55925, 56725, 57525, 58325, 59125, 59925, 60725, 61525, 62325,
		63125, 63925, 64725, 65525, 66325, 67125, 67925, 68725, 69525, 70325,
		71125, 71925, 72725, 73525, 74325, 75125, 75925, 76725, 77525, 78325,
		79125, 79925, 80725, 81525, 82325, 83125, 83925, 84725, 85525, 86325,
};

//欧洲频道
long int code tuner_Europe[104] =
{
    //VHF_LOW 15
	4825,  5525,  6225,  6925,  7625,   8325, 10525, 11225, 11925, 12625,
		13325, 14025, 14725, 15425, 16125,

		//VHF_HIG 40
		16825, 17558, 18225, 18925, 19625, 20325, 21025, 21725,	22425, 23125,
		23825, 24525, 25225, 25925, 26625, 27325, 28025, 28725, 29425, 30325,
		31125, 31925, 32725, 33525, 34325, 35125, 35925, 36725, 37525, 38325,
		39125, 39925, 40725, 41525, 42325, 43125, 43925, 44725, 45525, 46325,

		//UHF 49
		47125, 47925, 48725, 49525, 50325, 51125, 51925, 52725, 53525, 54325,
		55125, 55925, 56725, 57525, 58325, 59125, 59925, 60725, 61525, 62325,
		63125, 63925, 64725, 65525, 66325, 67125, 67925, 68725, 69525, 70325,
		71125, 71925, 72725, 73525, 74325, 75125, 75925, 76725, 77525, 78325,
		79125, 79925, 80725, 81525, 82325, 83125, 83925, 84725, 85525,
};

//美国频道
long int code tuner_USA[136] =
{
    //VHF_LOW 19
	5525,  6125,  6725, 7725,  8325,  8525,  9125,  9725, 10325, 10925,
		11525, 12125, 12725,13325, 13925, 14525, 15125, 15725, 16325,

		//VHF_HIG 51
		16925, 17525, 18125, 18725, 19325, 19925, 20525, 21125,	21725, 22325,
		22925, 23525, 24125, 24725, 25325, 25925, 26525, 27125, 27725, 28325,
		28925, 29525, 30125, 30725, 31325, 31925, 32525, 33125, 33725, 34325,
		34925, 35525, 36125, 36725, 37325, 37925, 38525, 39125, 39725, 40325,
		40925, 41525, 42125, 42725, 43325, 43925, 44525, 45125, 45725, 46325,
		46925,

		//UHF 66
		47125, 47725, 48325, 48925, 49525, 50125, 50725, 51325, 51925, 52525,
		53125, 53725, 54325, 54925, 55525, 56125, 56725, 57325, 57925, 58525,
		59125, 59725, 60325, 60925, 61525, 62125, 62725, 63325, 63925, 64525,
		65125, 65725, 66325, 66925, 67525, 68125, 68725, 69325, 69925, 70525,
		71125, 71725, 72325, 72925, 73525, 74125, 74725, 75325, 75925, 76525,
		77125, 77725, 78325, 78925, 79525, 80125, 80725, 81325, 81925, 82525,
		83125, 83725, 84325, 84925, 85525, 86125,
};

//法国频道
long int code tuner_France[89] =
{
    //VHF_LOW 7
	5575,  6050,  6375,  11675,  12875,   14075, 15275,


		//VHF_HIG 31
		16475, 17600, 17675, 18400, 18875, 19200, 20000, 20075,	20800, 21275,
		21600, 22475, 23675, 24875, 26075, 27275, 28475, 29675, 30875, 32075, 33275,
		34475, 35675, 36875, 38075, 39275, 40475, 41675, 42875, 44075, 45275,

		//UHF 51
		46475, 47125, 47925, 48725, 49525, 50325, 51125, 51925, 52725, 53525,
		54325, 55125, 55925, 56725, 57525, 58325, 59125, 59925, 60725, 61525,
		62325, 63125, 63925, 64725, 65525, 66325, 67125, 67925, 68725, 69525,
		70325, 71125, 71925, 72725, 73525, 74325, 75125, 75925, 76725, 77525,
		78325, 79125, 79925, 80725, 81525, 82325, 83125, 83925, 84725, 85525,
		86325,
};

bit TunerGB(uchar channel_gb)
{
	uchar nPd;
	unsigned long nDb;

	switch (m_channel_place)
	{
	case ChinaChannel:
		if (select_ch == 6)
		{
			if (channel_gb < 12)
				nPd = nLowBand;
			else if (channel_gb <= 45)
			{
				nPd = nMidBand;

			}
			else
				nPd = nHigBand;
		}
		else
		{
			if (channel_gb < 12)
				nPd = nLowBand;
			else if (channel_gb <= 50)
			{
				nPd = nMidBand;

			}
			else
				nPd = nHigBand;
		}
		nDb = tuner_China[channel_gb];
		break;
	case EuropeChannel:
		if (channel_gb < 15)
			nPd = nLowBand;
		else if (channel_gb <= 55)
			nPd = nMidBand;
		else
			nPd = nHigBand;
		nDb = tuner_Europe[channel_gb];
		break;
	case USAChannel:
		if (channel_gb < 19)
			nPd = nLowBand;
		else if (channel_gb <= 70)
			nPd = nMidBand;
		else
			nPd = nHigBand;
		nDb = tuner_USA[channel_gb];
		break;
	case FranceChannel:
		if (channel_gb < 7)
			nPd = nLowBand;
		else if (channel_gb <= 38)
			nPd = nMidBand;
		else
			nPd = nHigBand;
		nDb = tuner_France[channel_gb];
		break;
	}
    nDb = (nDb + m_IF) * 4 / 25;
    return WriteTuner(0xc0, nDb, 0xce, nPd);
}

/////////////////////////////////////////////////////////////////////////////
//写FM
bit WriteTunerFM(UINT Db)
{
    UCHAR nPortByte;
    // FM 10.7M
    unsigned long int nDb = Db + 1070;
    nDb = (nDb *4 ) /25;

    nPortByte=nFmBand;

	if(bMono)
	{
		switch(nTunerType)
		{
		case 1:
			//TNF8531 TNF8831
			nPortByte= nFmBand | 0x2;
			break;
		case 2:
			//TNF8533 TNF8833
			nPortByte= nFmBand | 0x20;
			break;
		case 3:
			//TNF8532 TNF8832
			nPortByte= nFmBand | 0x40;
			break;
		case 4:
			//TNF8731 TNF8731FF
			nPortByte= nFmBand ;
			break;
		default:
			break;
		}
	}

    return WriteTuner(Tuner5523, nDb , 0x8e, nPortByte);
}

/////////////////////////////////////////////////////////////////////////////
//读高频头(地址,控制字,返回值)
bit ReadTuner(UCHAR *STB)
{
	IICStart();
	if( !IICWriteByte(0xc0+1) )
		return FALSE;

	*STB=IICReadByte();
	// 	IICNoAck();
	IICStop();
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
//写高频头(地址,频点,控制字)
bit WriteTuner(UCHAR Adb, UINT Db, UCHAR Cb, UCHAR Pd)
{
	uchar db1,db2;
	db1 = Db >> 8;
	db2 = Db & 0xff;
	IICStart();
	if (!IICWriteByte(Adb) )
		return false;
	if (!IICWriteByte(db1) )
		return false;
	if (!IICWriteByte(db2))
		return false;
	if (!IICWriteByte(Cb) )
		return false;
	if (!IICWriteByte(Pd) )
		return false;
	IICStop();
	return true;
}

/////////////////////////////////////////////////////////////////////////////
//自动搜索FM
bit AutoFM(void)
{
    bit bResult;
    UINT i;
    UCHAR IsFMs = 0;
    UCHAR STB;
    UINT nAddress;
	for(i=780; i<=1080; i++)
	{
        bResult = WriteTunerFM(i*10);
		//   LED_Data3 = Dis_Code( i%10 );
		//   LED_Data2 = Dis_Code( (i/10)%10 + 16);
		//   LED_Data1 = Dis_Code( (i/100)%16);

        delay(0x7f);
        bResult = ReadTuner(&STB);

        if( (STB&0xf0==0xd0) && (STB&0x7==2 ))
		{
			IsFMs++; //有效FM台计数
			if(IsFMs >=50)
				return TRUE;

			nAddress = IsFMs*2+100;
			bResult = Write24xxByte(nAddress, (i*10)>>8 );
			bResult = Write24xxByte(nAddress+1, (i*10)&0xff);
		}
	}
	bResult = Write24xxByte(201, IsFMs-1); //写搜索的频道个数

    return bResult;
}

/////////////////////////////////////////////////////////////////////////////
//自动搜索频道
bit AutoChannel(void)
{
    bit bResult,bok;
    UCHAR i;
	UCHAR STB;
    unsigned long int fre;
    uchar tmp,tmp1;

    uchar nChannelMax = 0;
	IsChannels = 0;

    switch( m_channel_place)
    {
    case ChinaChannel:
		nChannelMax=100;
		break;
    case EuropeChannel:
		nChannelMax=104;
		break;
    case USAChannel:
		nChannelMax=136;
		break;
    case FranceChannel:
		nChannelMax=89;
		break;
    default:
		break;
    }

	m_mute = 1; // close
	lcd_data(0,"Search:         ");
	for (i = 0; i < nChannelMax; i++)
	{
		if (IR_Succes == 1)
		{
			if ((IR_Data == keyAudioUp) || (IR_Data == keyAudioDn))
			{
				IR_Data = ~IR_Data;
				IR_Succes = 0;
				break;
			}
			else
				IR_Succes = 0;
		}
		bResult = TunerGB(i);
		if (~bResult)
			break;
		lcd_cnt = 0xf0;
		lcd_display();
		delay(0xff);
		delay(0xff);
		delay(0xff);
		delay(0xff);
		if (m_IF_address == 0)
		{
			bResult = ReadTuner(&STB);
			if( STB == 0x79 || STB == 0x7a || STB == 0x7b)
			{

				bResult = Write24xxByte(IsChannels, i);
				IsChannels++; //有效台计数
			}
		}
		else
		{
			bResult = ReadIF(&STB);
			STB = STB | 0x20;
			if ((STB & 0xe0) == 0xe0)
			{
				bok = 0;
				tmp1 = STB & 0x1f;
				tmp1 = tmp1 >> 1;
				if ( tmp1 <= 0x04 )
					bok = 1;
				if ( (tmp1 >= 0x0b) && (tmp1 <= 0x0f) )
					bok = 1;

				if (bok)
				{
					bResult = Write24xxByte(IsChannels, i);
					IsChannels++; //有效台计数
				}
			}
		}

		taiHao = i;
		m_taihao = i;
		m_auto = 1;
		channel_show();

		tmp = tmp1 ;

		tmp = STB >> 4;
		if (tmp > 9)
			tmp = tmp + 0x37;
		else
			tmp = tmp + 0x30;
		lcd_data_line1[14] = tmp;

		tmp = STB & 0x0f;
		if (tmp > 9)
			tmp = tmp + 0x37;
		else
			tmp = tmp + 0x30;
		lcd_data_line1[15] = tmp;


	}
	bResult = Write24xxByte(0xff, IsChannels); //写搜索的频道个数
	taiHao = 0;
	bResult = Read24xxByte(taiHao,&tmp);
	bResult = TunerGB(tmp);
	if (~b_mute_f)
		m_mute = 0; // open
	lcd_data(0,"                ");
	m_auto = 0;
	channel_show();
	return bResult;
}

⌨️ 快捷键说明

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