亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? sp3767.c

?? T5767收音機(jī)IIC協(xié)議和控制部分源碼
?? C
字號:
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>

#include "SP3767.h"

#define		NOP()		_nop_()


sbit	UpKey = P1 ^ 0;
sbit	DnKey = P1 ^ 1;
sbit	LED = P1 ^ 2;
sbit	SDA = P1 ^ 4;
sbit	SCL = P1 ^ 5;





#define HAND	1
//#define HAND
#define NUM 20
unsigned short code FRQ_TAB[] =
{
	880,
	920,
	960,
	1000,
	1040,
	876,
	885,
	897,
	926,
	937,
	966,
	975,
	997,
	1011,
	1017,
	1024,
	1043,
	1058,
	1066,
	1071,
	1079,
};
unsigned char index;

void DelayMs(unsigned char i)
{
	unsigned char j;
	j = 200; 
	do{
		do{
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
		}while(j --);
	}while(i --);
}

void I2CStart(void)
{/*
	SDA = 1;
	SCL = 1;
	NOP();
	SDA = 0;
	NOP();
	SCL = 0;*/
	
	SCL = 1;
	SDA = 1;
	SDA = 0;
	NOP();
	NOP();
	NOP();
	SCL = 0;
}

void I2CStop(void)
{/*
	SCL = 0;
	SDA = 0;
	NOP();
	SCL = 1;
	NOP();
	SDA = 1;
	EA = 1;*/
	
	SCL = 1;
	SDA = 0;
	NOP();
	NOP();
	NOP();
	SDA = 1;
	NOP();
	NOP();
	NOP();
}

bit WaitAck(void)
{
	unsigned char retry = 255;		//因故障接收方無ACK,重試255次
	SDA = 1;
	NOP();
	SCL = 1;
	NOP();
//	m24C01Error = 0x00;
	while(SDA)
    {
		retry --;
		if(!retry)
		{
			I2CStop();
//			m24C01Error = ERROR;		// 24C01出錯
			return 0;
		}
	}
	SCL = 0;
	return 1;
}

void SendAck(void)
{
	SDA = 0;
	NOP();
	SCL = 1;
	NOP();
	SCL = 0;
}

void SendNotAck(void)
{
	SDA = 1;
	NOP();
	SCL = 1;
	NOP();
	SCL = 0;
}

void I2CSendByte(unsigned char ch)
{
	unsigned char i = 8;
	while(i--)
    {
		SCL = 0;
		NOP();
		SDA = (bit)(ch & 0x80);
		SCL = 1;
		ch <<= 1;
		NOP();
	}
	SCL = 0;
}
unsigned char I2CRecvByte(void)
{
	unsigned char i = 8;
	unsigned char dat = 0;
	SDA = 1;
	while(i--)
	{
		dat <<= 1;
		SCL = 0;
		NOP();
		SCL = 1;
		NOP();
		NOP();
		NOP();
		dat |= SDA;
	}
	SCL = 0;
	return(dat);
}

BYTE SP3767Read(void)
{
	unsigned char i;

	I2CStart();					// 啟動總線
	I2CSendByte(0xc1);			// 發(fā)送設(shè)備寫地址

	if(WaitAck())				// 等待應(yīng)答
	{
		for(i = 0; i < 5; i ++)
		{
			bFmReadData[i] = I2CRecvByte();
			SendAck();			// 發(fā)送應(yīng)答
		}
		SendNotAck();				// 發(fā)送NoAck
		I2CStop();					// 停止總線	
		return 1;
	}
	else return 0;

}

BYTE SP3767Write(void)
{
	unsigned char i;

	I2CStart();						// 啟動總線
	I2CSendByte(0xc0);				// 發(fā)送設(shè)備地址
	
	if(WaitAck())					// 等待應(yīng)答
	{
		for(i = 0; i < 5; i ++)
		{
			I2CSendByte(bFmWriteData[i]);
			if(!WaitAck())
			{
				I2CStop();
				printf("write 3767 err0\n");
				return 0;
			}
		}
		I2CStop();						// 停止總線
		return 1;
	}
	else
	{
		I2CStop();						// 停止總線
		printf("write 3767 err1\n");
		return 0;
	}
}

WORD CalculatePLL(void)
{
	if(fHILOInjection)
		return (WORD)((((DWORD)wFmFreq * 100000) + 225000) >> 13);//HILO injection=1
	else
		return (WORD)((((DWORD)wFmFreq * 100000) - 225000) >> 13);//HILO injection=0
}

WORD ConvertPLL(WORD wPll)
{
	if(fHILOInjection)
		return (((((DWORD)wPll << 13) - 225000) / 100000) + 1);	// HILo injection=1;
	else
		return (((((DWORD)wPll << 13) + 225000) / 100000) + 1);// HILo injection=0;
}

bit FmInit(void)
{
	unsigned char TP_BYTE_0;

	for(TP_BYTE_0 = 0; TP_BYTE_0 < 5; TP_BYTE_0 ++)
	{
		bFmReadData[TP_BYTE_0] = 0;
		bFmWriteData[TP_BYTE_0] = 0;
	}

	fHILOInjection = FM_HI_INJEC;


	bFmWriteData[2] = 0x00;//low injection ,stereo on,left not muted,right not muted,SW port1 low
#ifdef BAND_USA
	bFmWriteData[3] = 0x1e;//SW port2 low,standby off,US/Europe FM band limit,xtal=32.768kHz,Soft-mute on,HCC on,SNC on,pin 14 is SW port1;
#else
	bFmWriteData[3] = 0x3e;
#endif
	bFmWriteData[4] = 0x40;
#define		SP3767_ID		0x00
#define		SP3767_RSV		0x00
	if(SP3767Read())
	{
		if((bFmReadData[3] & 0x0F) == SP3767_ID && bFmReadData[4] == SP3767_RSV)
			return 1;
		else return 0;
	}
	else return 0;
}

bit FmSetFreq(void)
{
	WORD TP_WORD_0;
#define wPLL	TP_WORD_0
	wPLL = CalculatePLL();
	if (fHILOInjection)
		bFmWriteData[2] |= FM_HI_INJECTION_EN;
	else
		bFmWriteData[2] &= FM_LO_INJECTION_EN;

	bFmWriteData[0]=((wPLL >> 8) & FM_CMD_MUTE_DIS) & FM_CMD_SEARCH_DIS; //not mute and not in search mode
	bFmWriteData[1] = wPLL ;
	bFmWriteData[2] &= 0xF0;

	return SP3767Write();
}

bit Search(bit fSearchUp)
{
	unsigned short wPLL;		//		TP_WORD_1 //TP_BYTE_2
	unsigned short wTimeOut2;	//		TP_WORD_3 // TP_BYTE_6
	unsigned char bNowStopLevel;//		TP_BYTE_14

	unsigned char bLevel;
	unsigned char bIFCounter;
	unsigned short wFreqSave;
	

//===========指定頻率 =============
	if(fHand)
	{	
//		fHILOInjection = FM_LO_INJEC;
		fHILOInjection = FM_HI_INJEC;
		bNowStopLevel = FM_CMD_STOP_HIGH;			// Use Low Level for search default
		wFreqSave = wFmFreq;		
		printf("wFmFreq: %d.%d MHz\n",(unsigned short)(wFmFreq / 10),(unsigned short)(wFmFreq % 10));
		wPLL = CalculatePLL();
		printf("PLL: %x\n",(unsigned short)wPLL);	
		bFmWriteData[0] = ((BYTE)(wPLL >> 8) & (~FM_CMD_SEARCH_EN) | FM_CMD_MUTE_EN);
		bFmWriteData[1] = (BYTE)wPLL;
		bFmWriteData[2] = (((BYTE)fSearchUp) << 7) | bNowStopLevel;
		bFmWriteData[2] |= FM_HI_INJECTION_EN;
	
		SP3767Write();		//Start Search
		DelayMs(10);
		SP3767Read();
		bLevel = (bFmReadData[3] & 0xF0) >> 4;	
		DelayMs(100);
		SP3767Read();
		bIFCounter = bFmReadData[2] & FM_GET_IF;
		printf("bLevel: %d,		bIFCounter: %x\n",(unsigned short)bLevel,(unsigned short)bIFCounter);
		return 1;
	}
//===================end=======================

//===================下面是自動=======================
RETRY:
	bNowStopLevel = FM_CMD_STOP_MID;			// Use Low Level for search default
	fHILOInjection = FM_HI_INJEC;

	while(1)
	{
		wFreqSave = wFmFreq;
		wPLL = CalculatePLL();
		printf("Search wFmFreq: %d.%d MHz\n",(unsigned short)(wFmFreq / 10),(unsigned short)(wFmFreq % 10));
		printf("Search PLL: %x\n",(unsigned short)wPLL);
		bFmWriteData[0] = ((BYTE)(wPLL >> 8) | FM_CMD_SEARCH_EN | FM_CMD_MUTE_EN);
		bFmWriteData[1] = (BYTE)wPLL;		
		bFmWriteData[2] = (((BYTE)fSearchUp) << 7) | bNowStopLevel;
		bFmWriteData[2] |= FM_HI_INJECTION_EN;

		SP3767Write();		//Start Search
		DelayMs(100);
		wTimeOut2 = 0xFFFF;
		SP3767Read();
		do
		{
			wPLL = bFmReadData[0] & 0x3F;
			wPLL = (wPLL << 8) | bFmReadData[1];
			wFmFreq = ConvertPLL(wPLL);
			printf("current freq: %d\n",wFmFreq);
			wPLL = CalculatePLL();
			bFmWriteData[0] = ((BYTE)(wPLL >> 8) | FM_CMD_SEARCH_EN | FM_CMD_MUTE_EN);
			bFmWriteData[1] = (BYTE)wPLL;
			SP3767Write();		//Start Search
			DelayMs(100);
			if(!SP3767Read()) return FALSE;
			wTimeOut2 --;
			if(wTimeOut2 == 0) return FALSE;	//Time Out
			if(bFmReadData[0] & FM_SEARCH_BAND) //Reach the band limit
			{
				printf("band over\n");
				if(fSearchUp)
					wFmFreq = 875;
				else wFmFreq = 1080;
				goto RETRY;
			}
		}while((bFmReadData[0] & FM_SEARCH_FINISH) == FALSE);	//wait search finish

		bIFCounter = bFmReadData[2] & FM_GET_IF;
		bLevel = (bFmReadData[3] & 0xF0) >> 4;

		if(0x31 < bIFCounter && bIFCounter < 0x3E && bLevel >= 7)
		{
			if(wFmFreq == wFreqSave)
			{
				if(fSearchUp)
					wFmFreq ++;
				else wFmFreq --;
				goto RETRY;
			}
		}
		else
		{
			if(fSearchUp)
				wFmFreq ++;
			else wFmFreq --;

			if(wFmFreq >= BAND_MAX)
				wFmFreq = BAND_MIN;
			if(wFmFreq <= BAND_MIN)
				wFmFreq = BAND_MAX;
			goto RETRY;
		}

		wPLL = ((WORD)(bFmReadData[0] & 0x3f)) << 8;
		wPLL |= bFmReadData[1];
		wFmFreq = ConvertPLL(wPLL);
		printf("bLevel: %d,		bIFCounter: %x\n",(unsigned short)bLevel,(unsigned short)bIFCounter);
		printf("radio return revise PLL: %x\n", wPLL);
		printf("radio return revise freq: %d.%d MHz\n",(unsigned short)(wFmFreq / 10),(unsigned short)(wFmFreq % 10));
		return 1;
	}
}

void mInitSTDIO()
{
	SCON = 0x50;
	PCON = 0x80;
	TMOD = 0x20;
	TH1 = 0xf3;  /* 24MHz晶振, 9600bps */
	TR1 = 1;
	TI = 1;
}

void main(void)
{
	unsigned char cnt;	

	DelayMs(100);

	cnt = 0;
	mInitSTDIO();

	cnt = 5;
	printf("\nstart...\n");
	while(cnt -- > 0)
	{
		LED = 0;
		DelayMs(100);
		LED = 1;
		DelayMs(100);
	}


	printf("Init SP3767\n");
	if(FmInit())
		printf("SP3767 OK\n");
	else printf("SP3767 Err\n");
	cnt = 36;
	printf("Search...\n");
#ifdef HAND
	index = 0;
	fHand = 1;
	wFmFreq = FRQ_TAB[index];
#else
	wFmFreq = 875;
#endif
	if(Search(1))
	{
		if(FmSetFreq())
			printf("set ok!\n\n");
		else
			printf("set error!\n\n");
	}
	else
		printf("search err\n\n");

	while(1)
	{
		if(!UpKey)
		{
			while(!UpKey);
#ifdef HAND
			if(index == NUM) index = 0;
			else index ++;
			wFmFreq = FRQ_TAB[index];
			fHand = 1;
#else
			wFmFreq ++;
#endif
			if(Search(1))
			{
				if(!FmSetFreq())
					printf("set err\n\n");
				else printf("set ok\n\n");
			}
			else printf("search err\n\n");
		}
		if(!DnKey)
		{
			while(!DnKey);
#ifdef HAND
			if(index == 0)
				index = NUM;
			else index --;
			wFmFreq = FRQ_TAB[index];
			fHand = 1;
#else
			wFmFreq --;
#endif
			if(Search(0))
			{
				if(!FmSetFreq())
					printf("set err\n\n");
				else printf("set ok\n\n");
			}
			else printf("search err\n\n");
			fHand = 0;
		}
	}
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久精品免费精品国产| 国产精品一区免费视频| 日韩欧美激情四射| 国产99一区视频免费| 无码av免费一区二区三区试看 | 成人精品视频一区二区三区| 亚洲免费资源在线播放| 欧美日韩午夜在线| 国产精品羞羞答答xxdd| 亚洲mv大片欧洲mv大片精品| 欧美经典一区二区| 91在线国内视频| 精品影视av免费| 一个色综合av| 中文无字幕一区二区三区| 欧美日韩免费一区二区三区视频| 国产aⅴ精品一区二区三区色成熟| 亚洲电影中文字幕在线观看| 国产精品久久久久久久久果冻传媒| 欧美猛男超大videosgay| 99久久久久免费精品国产| 九一九一国产精品| 亚洲色图欧洲色图| 中文字幕一区二区三区视频| 日韩欧美一级二级| 欧美日本韩国一区二区三区视频| 不卡的av电影| 成人动漫视频在线| 国产一区999| 精品中文av资源站在线观看| 亚洲亚洲精品在线观看| 中文字幕av不卡| 亚洲精品在线一区二区| 欧美日本在线播放| 欧美丝袜丝nylons| 99re热视频精品| 麻豆精品蜜桃视频网站| 亚洲精品国产高清久久伦理二区| 亚洲欧洲日韩女同| 久久久久久久久久看片| 久久久亚洲精品石原莉奈| 制服丝袜在线91| 欧美精品xxxxbbbb| 欧美性大战久久久| 欧美精品99久久久**| 欧洲激情一区二区| 欧美色偷偷大香| 91国偷自产一区二区三区成为亚洲经典 | 欧美日韩亚洲高清一区二区| 91视频国产资源| 国产精品一区一区三区| 成人免费看片app下载| 高清beeg欧美| 91麻豆精品一区二区三区| 99精品久久99久久久久| 在线一区二区三区| 欧美伊人久久久久久久久影院| 欧美日韩夫妻久久| 在线不卡一区二区| 欧美色综合网站| 欧美日韩一级片在线观看| 91丨porny丨中文| 欧美在线|欧美| 欧美猛男gaygay网站| 精品日产卡一卡二卡麻豆| 精品国产91亚洲一区二区三区婷婷 | 亚洲综合色视频| 视频在线观看一区二区三区| 免费av成人在线| 国产成人午夜高潮毛片| 成人高清视频在线观看| 精品1区2区3区| 日韩欧美在线1卡| 亚洲国产精品国自产拍av| 国产精品每日更新| 曰韩精品一区二区| 蜜桃免费网站一区二区三区| 亚洲成人动漫在线观看| 激情国产一区二区| caoporm超碰国产精品| 日本久久电影网| 91丨九色丨国产丨porny| 欧美在线一区二区| 91麻豆精品国产91久久久久久久久 | 国产三区在线成人av| 亚洲四区在线观看| 日韩高清在线不卡| 成人av网站在线观看免费| 在线免费观看视频一区| 久久免费视频色| 国产精品久久久久久久久快鸭| 日韩精品乱码免费| 国产一区二区调教| 91色porny蝌蚪| 91精品国产黑色紧身裤美女| 精品久久久三级丝袜| 国产精品久久777777| 麻豆91免费观看| 91免费观看国产| 欧美精品一区二区高清在线观看| 国产精品久久久久永久免费观看 | 岛国精品在线观看| 欧美视频一二三区| 国产精品免费久久久久| 亚洲成人在线免费| 97se亚洲国产综合自在线不卡| 日韩视频在线永久播放| 久久精品在线观看| 午夜精品福利一区二区三区av | 另类综合日韩欧美亚洲| 日本道免费精品一区二区三区| 日韩一区二区免费视频| 亚洲激情男女视频| 国产精品综合二区| 欧美一区二区日韩| 综合久久一区二区三区| 国产成人精品免费| 精品日韩欧美一区二区| 午夜av区久久| 色综合久久久久综合| 欧美一级理论性理论a| 亚洲精品亚洲人成人网在线播放| 日韩和欧美一区二区| 欧美怡红院视频| 国产三级精品视频| 久久精品国产成人一区二区三区 | 亚洲成人7777| www.欧美亚洲| 精品日韩在线一区| 久久99久久精品欧美| 欧美日本乱大交xxxxx| 亚洲国产日韩a在线播放| 91原创在线视频| 亚洲欧美日韩在线| a美女胸又www黄视频久久| 国产精品国产三级国产普通话三级 | 中文字幕欧美一| 9i看片成人免费高清| 国产亚洲一区二区三区在线观看| 国产精品18久久久久久久久 | 日本成人在线电影网| 色天天综合久久久久综合片| 中文一区二区在线观看 | 不卡的av电影| 亚洲婷婷综合色高清在线| 精品一区二区成人精品| 制服丝袜激情欧洲亚洲| 手机精品视频在线观看| 欧美大胆人体bbbb| 麻豆精品在线看| 久久久99精品免费观看| 九色|91porny| 国产精品久久久久三级| 波多野洁衣一区| 一区二区三区色| 91国偷自产一区二区三区成为亚洲经典 | 欧美群妇大交群的观看方式| 三级亚洲高清视频| 欧美男男青年gay1069videost| 麻豆91在线播放| 久久夜色精品国产欧美乱极品| 国产福利精品导航| 欧美高清在线一区二区| 99久久久久免费精品国产 | 91麻豆精品国产91久久久久久久久| 免费看精品久久片| 欧美岛国在线观看| 成人激情图片网| 亚洲欧美综合另类在线卡通| 欧美日韩美少妇| 久久精品国产免费看久久精品| 国产日韩三级在线| 91色九色蝌蚪| 久久9热精品视频| 国产精品美女久久久久aⅴ国产馆| 在线中文字幕一区二区| 视频一区二区不卡| 国产精品色噜噜| 91国产免费看| 婷婷六月综合网| 久久久久久免费毛片精品| 色婷婷久久久综合中文字幕| 日韩精品一级中文字幕精品视频免费观看 | 精品国产一区二区三区av性色| 国产成人综合亚洲网站| 日本一区二区免费在线观看视频| 日本丰满少妇一区二区三区| 蜜臀av性久久久久蜜臀av麻豆| 中文字幕亚洲区| 欧美精品v国产精品v日韩精品| proumb性欧美在线观看| 偷窥国产亚洲免费视频| 自拍视频在线观看一区二区| 欧美日韩精品久久久| 日韩和欧美一区二区三区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 欧美亚洲动漫另类| 麻豆专区一区二区三区四区五区| 欧美mv日韩mv国产网站app| 欧美网站大全在线观看|