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

📄 pic_tea5767.c

📁 收音机TEA5767模块与PIC16F877A的应用
💻 C
字号:
#include <pic.h>
#define portbit(add,bits) ((unsigned)(&add) * 8 + (bits))
#define BUSY 0x80 
#define WRITE_DATA 0xff 
#define delay_data 0xff 
#define COMMAND 0x00 
#define LCD_CLEAR 0x01 
#define max_freq 108000 
#define min_freq 87500
#define portdata PORTB 
#define sla_address 0xc0

volatile bit E  @ portbit(PORTD,7); 
volatile bit RW @ portbit(PORTD,6); 
volatile bit RS @ portbit(PORTD,5); 

volatile unsigned char tea5767_write_data[5] = {0x29,0xc2,0x20,0x11,0x00};
volatile unsigned char tea5767_read_data[5];
volatile unsigned int pll; 
volatile unsigned long frequency;

void delay(unsigned int delay_time) 
{ 
  unsigned char i; 
  while (delay_time--) 
  { 
   for (i = 0; i <0xff; i ++) 
    { 
      } 
   } 
}   

unsigned char lcd_busy(void) 
{ 
  unsigned char temp; 
   
  portdata = 0xff; 
  RS = 0; 
  RW = 1; 
  E = 1; 
  TRISB = 0xff; 
  temp = portdata; 
  TRISB = 0x00; 
  E = 0; 
  return (temp); 
}
 
void lcd_command_writedata(unsigned char check,unsigned char data) 
{ 
  switch (check)
	  {
	   case COMMAND:
	      {
            RS = 0;
		     }
			break;
	   case WRITE_DATA:
	      {
		    RS = 1;
			}
		    break;
	   default: break;
	   }
  RW = 0; 
  portdata = data; 
  E = 1; 
  E = 0; 
  while (lcd_busy() & BUSY); 
} 

void lcd_disp(unsigned char adr,unsigned char disp_data) 
{ 
lcd_command_writedata(COMMAND,adr); 
lcd_command_writedata(WRITE_DATA,disp_data); 
} 

void lcd_init(void) 
{ 
  lcd_command_writedata(COMMAND,LCD_CLEAR); 
  lcd_command_writedata(COMMAND,0x38); 
  lcd_command_writedata(COMMAND,0x0e); 
  lcd_command_writedata(COMMAND,0x06); 
} 

void system_init(void) 
{ 
  INTCON = 0x00; 
  OPTION = 0x80; 
  TRISB = 0x00; 
  TRISD = 0x00; 
} 

void send_init(void)
 {
  INTCON = 0x00;
  SSPSTAT = 0x00;
  SSPCON = 0x00;
  SSPCON2 = 0x00;
  TRISC3 = 1;
  TRISC4 = 1;
  SSPIF = 0;
  SSPIE = 0;
  SSPSTAT = 0x40;
  SSPCON = 0x08;
  SSPCON2 = 0x00;
  SSPADD = 0x04;
  SSPEN = 1;
  }

void get_frequency(void) 
{ 
    unsigned char hlsi; 
    double npll=0;
 
    npll = (double)pll; 
    hlsi = tea5767_write_data[2] & 0x10; 
    if (hlsi) 
        frequency  =(unsigned long)((double)(npll) * (double)8.192 - 225); 
    else 
        frequency = (unsigned long)((double)(npll) * (double)8.192 + 225); 
  } 

void get_pll(void) 
{ 
    unsigned char hlsi; 

    hlsi = tea5767_write_data[2] & 0x10; 
    if (hlsi) 
        pll = (unsigned int)((double)((frequency + 225) * 4) / (double)32.768);   
    else 
        pll = (unsigned int)((double)((frequency - 225) * 4)/ (double)32.768);   
  } 

void radio_write(void)
 {
  unsigned char i;

  send_init();
  SEN = 1;
  for( i = 2; --i;);
  while (!SSPIF);
  SSPIF = 0;
  SSPBUF = sla_address;
  while (!SSPIF);
  SSPIF = 0;
  for (i = 0; i < 5; i ++)
     {
       SSPBUF = tea5767_write_data[i];
       while (!SSPIF);
       SSPIF = 0;
      }
  PEN = 1;
  while (!SSPIF);
  SSPIF = 0;
  SSPEN = 0;
  }

void radio_read(void)
 {
  unsigned char i;
  unsigned char temp_h,temp_l;

  pll = 0;
  send_init();
  SEN = 1;
  for( i = 2; --i;);
  while (!SSPIF);
  SSPIF = 0;
  SSPBUF = sla_address + 1;
  while (!SSPIF);
  SSPIF = 0;
  RCEN = 1;
  for (i = 0; i < 4; i ++)
     {
         while (!SSPIF);
         SSPIF = 0;
         tea5767_read_data[i] = SSPBUF;
         ACKDT = 0;
         ACKEN = 1;
         while (!SSPIF);
         SSPIF = 0;
         RCEN = 1;
       }
  while (!SSPIF);
  SSPIF = 0;
  tea5767_read_data[4] = SSPBUF;
  ACKDT = 1;
  ACKEN = 1;
  while (!SSPIF);
  SSPIF = 0;
  PEN = 1;
  while (!SSPIF);
  SSPIF = 0;
  temp_l = tea5767_read_data[1]; 
  temp_h = tea5767_read_data[0]; 
  temp_h &= 0x3f; 
  pll = (temp_h << 8 | temp_l); 
  get_frequency();
 }

void search(unsigned char find)
{ 
    radio_read();         
    switch (find)
    { 
       case 0x00:
        {
            frequency += 100; 
            if(frequency > max_freq) 
               {
                 frequency = min_freq; 
                 }
           } 
      break;
      case 0xff:
        {
           frequency -= 100; 
           if(frequency < min_freq) 
               {
                frequency = max_freq; 
                 }
           } 
      break;
      default :break;
        }          
    get_pll(); 
    tea5767_write_data[0] = pll / 256; 
    tea5767_write_data[1] = pll % 256; 
    tea5767_write_data[2] = 0x20; 
    tea5767_write_data[3] = 0x11; 
    tea5767_write_data[4] = 0x00; 
    radio_write();     
} 

void auto_search(unsigned char mode) 
{
    radio_read();
    get_pll();
    switch(mode)
     {
        case 0x00:
            {
              tea5767_write_data[2] = 0xa0;
              }
        break;
        case 0xff:
            {
              tea5767_write_data[2] = 0x20;  
              }
        break;
        default :break;
       } 
    tea5767_write_data[0] = pll / 256 + 0x40;
    tea5767_write_data[1] = pll % 256;    
    tea5767_write_data[3] = 0x11;
    tea5767_write_data[4] = 0x00;
    radio_write();
    radio_read();
	while((tea5767_read_data[0] & 0x80) != 0x80) 
    {
	 radio_read();	 
     } 	 
 }

void main(void)
 {
  unsigned char i;

   delay(2);
   system_init();
   lcd_init();
   radio_write();
   delay(10);
   radio_read();
   for (i = 0; i < 5; i ++)
     {
   	  lcd_disp(0x85 + i,(tea5767_read_data[i] & 0x0f) + 0x30); 
       }
   while (1)
     {
       }
    }
  

⌨️ 快捷键说明

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