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

📄 tv.c

📁 单片机控制I2C高频头!!能自动搜台
💻 C
字号:
#include <reg52.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <absacc.h>
#include "intrins.h"


#define uchar   unsigned char
#define uint    unsigned int
#define ulong   unsigned long

#define SIO_BUFFER_LEN      0x20
#define SIO_LEN_MASK        0x1F

#define NOKEYPRESS		0
#define LONGKEY1		1
#define LONGKEY2		2
#define LONGKEY3		3
#define LONGKEY4		4
#define LONGKEY5		5


#define SaveCH          0xd0
#define CHhow           0xd1




//描 述:                                                                   //
//--------------------------------------------------------------------------//

                                                                                                /* 频率单位为KHz     */
    
#define PLLCON1 0x8e             /* 控制字1    第3字节*/


#define	OP_READ	0xa1		// 器件地址以及读取操作
#define	OP_WRITE 0xa0		// 器件地址以及写入操作

#define MIN_frequency   1328
#define MAX_frequency   15000

                                 /*  有关I2C变量   */
#define AddPllWr 0xc2                                 /*TSA5522写地址*/
#define AddPllRd 0xc3

sbit IRIN=P3^2 ;                                 /*TSA5522读地址*/
sbit         SDA   = P3^4;                                  /*串行数据-----------P0.0*/
sbit         SCL   = P3^3;                                  /*串行时钟-----------P0.1*/

sbit	AN1 = P1^2;
sbit    AN2 = P1^3;
sbit    AN3 = P1^4;
sbit    AN4 = P1^5;
sbit    AN5 = P1^6;

sbit    led1 = P0^0;
sbit    led2 = P0^1;
sbit    led3 = P0^2;
sbit    led4 = P0^3;
sbit    led5 = P0^4;
sbit    led6 = P0^5;
sbit    led7 = P0^6;
sbit    led8 = P0^7;



unsigned char code ch_SaveAdd[100]={0xff,0x00,0x02,0x04,0x06,0x08,0x0a,0x0c,0x0e, 
								 0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,
								 0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,
								 0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x3e,
								 0x40,0x42,0x44,0x46,0x48,0x4a,0x4c,0x4e,
								 0x50,0x52,0x54,0x56,0x58,0x5a,0x5c,0x5e,
								 0x60,0x62,0x64,0x66,0x68,0x6a,0x6c,0x6e,
								 0x70,0x72,0x74,0x76,0x78,0x7a,0x7c,0x7e,
								 0x80,0x82,0x84,0x86,0x88,0x8a,0x8c,0x8e,
								 0x90,0x92,0x94,0x96,0x98,0x9a,0x9c,0x9e,
								 0xa0,0xa2,0xa4,0xa6,0xa8,0xaa,0xac,0xae,
								 0xb0,0xb2,0xb4,0xb6,0xb8,0xba,0xbc,0xbe,
								 0xc0,0xc2,0xc4};


uchar idata KEYREPEAT;
uchar idata keytime;


uchar idata PLLdataH;
uchar idata PLLdataL;

uchar idata TempPLLdataH;
uchar idata TempPLLdataL;

uchar idata PLLCON2;
uint  idata frequency;
uchar idata CH;

uchar idata MAX_ch;
uchar idata CHADD;


void delayms(unsigned char ms);
uchar keyz(void);
void  processkey(void);
void  processIR(void);


void Start(void); 
void Stop(void); 
void SendACK(void); 
void SendNoACK(void); 
unsigned char SendByte(unsigned char d); 
unsigned char ReadByte(void); 



unsigned char IRCOM[4] ;
bit flag ;

void delay(unsigned char x) ;

void Autosearch(void);
void sendfrequency(void);


void save(void);
void SetChan(unsigned char chan); 
unsigned char ReadChan(void); 
//void TIME_Hex2Str(unsigned long curTime,char *Str);
//void Printf_TimeStr(uint fre);

void write_byte(unsigned char addr, unsigned char write_data);
unsigned char read_random(unsigned char random_addr);





void main(void)
{
uchar a;




keytime			= 0;
KEYREPEAT       = 0;

frequency       = 0;

CH=read_random(SaveCH);
MAX_ch=read_random(CHhow);
a=ReadChan();
a=a&0x07;
SetChan(CH);

IE=0x81 ;
TCON=0x01 ;
IT0=1 ;
flag=0 ;

//Autosearch();
while( 1 )
    {
	processkey();
	}
}

	 


void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}

uchar keyz(void)
{

 	if(AN1==0)
		{
		delayms(40);
		if (AN1==1)
		{return NOKEYPRESS;}
 		return LONGKEY1;
		}
		

	if(AN2==0)
		{
		delayms(40);
		if (AN2==1)
		{return NOKEYPRESS;}
		return LONGKEY2;
		}
		
 	if(AN3==0)
		{
		delayms(40);
		if (AN3==1)
		{return NOKEYPRESS;}
 		return LONGKEY3;
		}
		

	if(AN4==0)
		{
		delayms(40);
		if (AN4==1)
		{return NOKEYPRESS;}
		return LONGKEY4;
		}
	
	if(AN5==0)
		{
		delayms(40);
		if (AN5==1)
		{return NOKEYPRESS;}
		return LONGKEY5;
		}		 

 return NOKEYPRESS;



}

void processkey(void)
{
	uchar a;	
	switch(keyz())
		{
	case LONGKEY1:
			CH++;
			SetChan(CH);
		
			break;
	case LONGKEY2:
			CH--;
			SetChan(CH);
			break;

	case LONGKEY3:
			Autosearch();
			break;
	case LONGKEY4:
			frequency++;
			sendfrequency();
    		a=ReadChan();
	 		a=a&0x07;

			break;

	case LONGKEY5:
			frequency--;
			sendfrequency();
    		a=ReadChan();
	 		a=a&0x07;
			break;


	case NOKEYPRESS:
			break;
		}
}

void processIR(void)
{ uchar a;
    if(flag)
  {
   switch (IRCOM[2])
	{
    case 0x0E:
      CH--;
	  SetChan(CH);
    break ;
    case 0x12:
     CH++;
     SetChan(CH);;
    break ;
    case 0x15:
		frequency++;
		sendfrequency();
  		a=ReadChan();
	    a=a&0x07;   
   break ;
    case 0x09:
		frequency--;
		sendfrequency();
  		a=ReadChan();
	    a=a&0x07;   
     break ;
    case 0x05:
     Autosearch();
     break ;
    case 0x48:
     led6=~led6 ;
     break ;
    case 0x0F:
     led7=~led7 ;
     break ;
    case 0x11:
     save(); ;
     break ;
   	}
   flag=0 ;
  }
}




/*--------选择频道--------------------------------------------*/
void SetChan(unsigned char chan)
{     
  		uchar a;
        if(chan==0)CH=MAX_ch;
		if(chan>MAX_ch|chan>99)CH=1;
		

		CHADD=ch_SaveAdd[CH];

//	Printf_TimeStr(CH);
	frequency=(read_random(CHADD)*256)+read_random(CHADD+1);
	
//	Printf_TimeStr(frequency);
//	Printf_TimeStr(CHADD);
	
	 a=ReadChan();
	write_byte(SaveCH,CH);

	sendfrequency();
}

/*-----------读状态----------------------------------------------*/
unsigned char ReadChan(void)
{
        unsigned char i; 
        Start();                                                 /* 发送I2C 总线起始条件*/
        SendByte(AddPllRd);                         /*发送被控器总线读地址*/
        i = ReadByte(); 
        SendNoACK();                                         /*最后一个字节,发送非应答信号*/
        Stop();                                                 /*发送I2C 总线停止条件*/
        return (i); 
}

unsigned char read_current()
// 在当前地址读取
{
	unsigned char read_data;
	Start();
	SendByte(OP_READ);
	read_data = ReadByte();
	Stop(); 
	delayms(20);
	return read_data;
}


/*------------字节数据传送子程序发送一个字节数据或地址给被控器---------------*/
unsigned char SendByte(unsigned char a)
{
        unsigned char i,j; 
        for(i = 0;i < 8;i++)
        {
                if((a & 0x80) == 0)
                        SDA = 0; 
                else
                        SDA = 1; 
                _nop_(); 
                        SCL = 1; /*置时钟线为高通知被控器开始*/
                _nop_();_nop_();/*保证时钟高周期大于4 us*/
                SCL = 0; 
                _nop_(); 
                a = a << 1; 
        }
        _nop_(); 
        SDA = 1; 
        _nop_(); 
                SCL = 1; 
        j = 0; 
        while (SDA == 0) 
                if ((++j) == 0) {SCL = 0;return (1);} /*检测256次还未收到应答,返回1*/
        _nop_(); 
        SCL = 0; 
        return (0);  /*成功,返回0*/
}

/*---------------------------------------------------------------------------*/
unsigned char ReadByte(void)                /*数据接收子程序从被控器接收一个字节数据*/
{
        unsigned char i; 
        unsigned char bdata Sin; 
        SDA = 1; 
        for (i = 0;i < 8;i++)
        {
                Sin <<= 1; 
                SCL = 0; 
                _nop_(); 
                SCL = 1; 
                if(SDA == 1)
                        Sin|= 0x01; 
                else
                        Sin&= 0xfe; 
                _nop_(); 
        }
	
        return(Sin); 
}

/*-----------发送应答位--------------------------------------------------*/
void SendACK()
{
        SCL = 0; 
        _nop_(); 
        SDA = 0; 
        _nop_(); 
        SCL = 1; 
        _nop_(); 
        SCL = 0; 
}

/*------------发送非应答位-----------------------------------------------*/
void SendNoACK()
{
        SCL = 0; 
        _nop_(); 
        SDA = 1; 
        _nop_(); 
        SCL = 1; 
        _nop_(); 
        SCL = 0; 
}

/*---------------------------------------------------------------------------*/
void Start(void)                /*START 启动I2C 总线子程序发送I2C 起始条件*/
{
        SDA = 1;                                 /* 发送起始条件的数据信号*/
        _nop_(); 
        SCL = 1;                                 /*发送起始条件的时钟信号*/
        _nop_();         /*起始条件建立时间大于4.7 s*/
        SDA = 0;                                 /*发送起始信号*/
        _nop_();         /*起始条件锁定时间大于4 s*/
        SCL = 0;                                 /*钳住I2C 总线准备发送或接收数据*/
}

/*-----------STOP 停止I2C 总线子程序发送I2C 总线停止条件-------------------*/
void Stop(void)
{
        SDA = 0; 
        _nop_(); 
        SCL = 1; 
        _nop_(); 
        SDA = 1; 
        _nop_(); 
} 



unsigned char read_random(unsigned char random_addr)
{
	Start();
	SendByte(OP_WRITE);
	SendByte(random_addr);
	return(read_current());
}

void write_byte(unsigned char addr, unsigned char write_data)
{
	Start();
	SendByte(OP_WRITE);
	SendByte(addr);
	SendByte(write_data);
	Stop();
	delayms(20);		// 写入周期
}


void sendfrequency(void)
{	
	PLLdataH=frequency/256;
    PLLdataL=frequency%256;

    PLLCON2=(frequency)<(3300)?(0xa0):(frequency)<(7900)?(0x90):(0x30); 
 

		Start();                                                 /* 发送I2C 总线起始条件  */
        SendByte(AddPllWr);                          /* 发送被控器总线写地址    */
        SendByte(PLLdataH);         /* 发送频率数据高 第1字节*/
        SendByte(PLLdataL);         /* 发送频率数据低 第2字节*/
        SendByte(PLLCON1);                                 /* 发送控制字1    第3字节*/
        SendByte(PLLCON2);         /* 发送控制字1    第4字节*/
        Stop();    			/*发送I2C 总线停止条件   */

}

void Autosearch(void)
{	uchar a;
//	uint b;
	frequency=MIN_frequency;
	CHADD=0;
    MAX_ch=0;


	while(frequency<MAX_frequency)
	{//SendCommand("A2");
	 sendfrequency();
	 delayms(200);
 	 a=ReadChan();
	 a=a&0x07;

	 if(a==2|a==3|a==0|a==1)
	 	{while(a==0|a==1)
			{frequency--;
			 sendfrequency();
			 delayms(200);
			 a=ReadChan();
	 		 a=a&0x07;
			}
		 MAX_ch++;


	//	 frequency=frequency-6;
		 TempPLLdataH=frequency/256;
		 TempPLLdataL=frequency%256;
	  	 write_byte(CHADD,TempPLLdataH);
		 write_byte(CHADD+1,TempPLLdataL);
		 
//		 b=(read_random(CHADD))*256+read_random(CHADD+1);          /*数据读取  检查*/
//		 if(frequency==b)
//		 {
		 
//		 Printf_TimeStr(frequency);
//		 Printf_TimeStr(MAX_ch);
//		 Printf_TimeStr(frequency);
//		 b=(read_random(CHADD))*256+read_random(CHADD+1);
//		 Printf_TimeStr(b);
//		 Printf_TimeStr(CHADD);

//		 a=ReadChan();
//		 a=a&0x07;
		
//		 SendCommand("SAVE!OK");
         CHADD=CHADD+2;
		 frequency=frequency+100;
		 
//		 }
//     	else  
//		 {
//		 SendCommand("SAVE!failing");
//		 return;
//		 }
		 }
  
     frequency=frequency+10;
	 
     
	}
 write_byte(CHhow,MAX_ch);
 CH=1;
 SetChan(CH);
}

void save(void)
{
 CH=read_random(SaveCH);
 CHADD=ch_SaveAdd[CH];

 TempPLLdataH=frequency/256;
 TempPLLdataL=frequency%256;
 write_byte(CHADD,TempPLLdataH);
 write_byte(CHADD+1,TempPLLdataL);
}


//0.14ms延时
void delay(unsigned char x)    //x*0.14MS
{
 unsigned char i  ;
 while(x--)
 {
  for (i = 0  ; i<13  ; i++) {}
 }
}

void IR_IN() interrupt 0
{
 unsigned char i,j,k,N=0  ;
 EA = 0  ;
 I1:
 for (i=0  ;i<4  ;i++)
 {
  if (IRIN==0) break  ;
  if (i==3) {EA =1  ;return  ;}
 }
 delay(20)  ;      //延时2.8mS
 if (IRIN==1) goto I1  ;    //确认IR信号出现

 while (!IRIN)              //等 IR 变为高电平
  {delay(1)  ;}
 
 for (j=0  ;j<4  ;j++)
 { 
  for (k=0  ;k<8  ;k++)
  {
   while (IRIN)            //等 IR 变为低电平
   {delay(1)  ;}

   while (!IRIN)          //等 IR 变为高电平
   {delay(1)  ;}

   while (IRIN)           //计算IR高电平时长
   {
    delay(1)  ;
    N++  ;           
    if (N>=30) {EA=1  ;return  ;}
   }
   IRCOM[j]=IRCOM[j] >> 1  ;       //把IRCOM右移一位
   if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80  ;}  //如果高电平时间太于8*0.14=1.12ms,就将此为置1(否则为0)
   N=0  ;
  }//end for k
 }//end for j
 
 if ((IRCOM[0]!=~IRCOM[1])||(IRCOM[2]!=~IRCOM[3])){
  EA=1  ;return  ;
 }
 flag=1 ;   //置接收有效标志
 processIR();
 EA = 1  ;
}


⌨️ 快捷键说明

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