#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
评论0