网站导航: 首页 > 设计参考 > 正文 文章搜索
TEA5767收音机模块的C51控制程序
 
文章编号:
090106101433
文章分类: 单片机 51系列
点 击:
...
关 键 词: TEA5767,收音机
文章来源:
网络,作者:大炮
摘 要:
这几天做个项目,用到飞利浦的TEA5767的收音机模块,在网上搜了下相关的内容,发现很多人都在问,可是提供编程指导的很少,可能是高手都不屑回答这些小问题吧,在这里我把我的部分程序及TEA5767的相关资料放上来吧...

这几天做个项目,用到飞利浦的TEA5767的收音机模块,在网上搜了下相关的内容,发现很多人都在问,可是提供编程指导的很少,可能是高手都不屑回答这些小问题吧。在这里我把我的部分程序及TEA5767的相关资料放上来吧,给需要的人一些参考。(注:无锡硅动力的SP3767和TEA5767完全兼容,有中文资料)

TEA5767采用I2C或者三线接口控制,我是用的I2C,单片机用STC89C52,带1K EEPROM。

TEA5767读写数据都是5个字节,其中PLL参数14位,具体数据格式请看datasheet.。以下程序中的函数可以直接在主程序中调用。

 
  1. #include "iic.c"   
  2. #define max_freq 108000   
  3. #define min_freq 87500   
  4. unsigned char radio_write_data[5]={0x29,0xc2,0x20,0x11,0x00};        //要写入TEA5767的数据   
  5. unsigned char radio_read_data[5];        //TEA5767读出的状态   
  6. unsigned int default_pll=0x29c2;//0x29f9;        //默认存台的pll,87.8MHz   
  7. //unsigned int max_pll=0x339b;            //108MHz时的pll,   
  8. //unsigned int min_pll=9000;            //70MHz时的pll   
  9.   
  10. void radio_write(void)   
  11. {   
  12.     unsigned char i;   
  13.     iic_start();   
  14.     iic_write8bit(0xc0);        //TEA5767写地址   
  15.     if(!iic_testack())   
  16.     {   
  17.         for(i=0;i<5;i++)   
  18.         {   
  19.             iic_write8bit(radio_write_data[i]);   
  20.             iic_ack();   
  21.         }   
  22.     }   
  23.     iic_stop();       
  24. }   
  25.   
  26. //读TEA5767状态,并转换成频率   
  27. void radio_read(void)   
  28. {   
  29.     unsigned char i;   
  30.     unsigned char temp_l,temp_h;   
  31.     pll=0;   
  32.     iic_start();   
  33.     iic_write8bit(0xc1);        //TEA5767读地址   
  34.     if(!iic_testack())   
  35.     {   
  36.         for(i=0;i<5;i++)   
  37.         {   
  38.             radio_read_data[i]=iic_read8bit();   
  39.             iic_ack();   
  40.         }   
  41.     }   
  42.     iic_stop();   
  43.     temp_l=radio_read_data[1];   
  44.     temp_h=radio_read_data[0];   
  45.     temp_h&=0x3f;   
  46.     pll=temp_h*256+temp_l;   
  47.     get_frequency();   
  48. }   
  49.   
  50. //由频率计算PLL   
  51. void get_pll(void)   
  52. {   
  53.     unsigned char hlsi;   
  54.     unsigned int twpll=0;   
  55.     hlsi=radio_write_data[2]&0x10;   
  56.     if (hlsi)   
  57.         pll=(unsigned int)((float)((frequency+225)*4)/(float)32.768);    //频率单位:k   
  58.     else  
  59.         pll=(unsigned int)((float)((frequency-225)*4)/(float)32.768);    //频率单位:k   
  60. }   
  61. //由PLL计算频率   
  62. void get_frequency(void)   
  63. {   
  64.     unsigned char hlsi;   
  65.     unsigned int npll=0;   
  66.     npll=pll;   
  67.     hlsi=radio_write_data[2]&0x10;   
  68.     if (hlsi)   
  69.         frequency=(unsigned long)((float)(npll)*(float)8.192-225);    //频率单位:KHz   
  70.     else  
  71.         frequency=(unsigned long)((float)(npll)*(float)8.192+225);    //频率单位:KHz   
  72. }   
  73.   
  74. //手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD   
  75. void search(bit mode)   
  76. {   
  77.     radio_read();           
  78.     if(mode)   
  79.     {   
  80.         frequency+=100;   
  81.         if(frequency>max_freq)   
  82.             frequency=min_freq;   
  83.     }   
  84.     else  
  85.     {   
  86.         frequency-=100;   
  87.         if(frequency<min_freq)   
  88.             frequency=max_freq;   
  89.     }             
  90.     get_pll();   
  91.     radio_write_data[0]=pll/256;   
  92.     radio_write_data[1]=pll%256;   
  93.     radio_write_data[2]=0x20;   
  94.     radio_write_data[3]=0x11;   
  95.     radio_write_data[4]=0x00;   
  96.     radio_write();   
  97. }   
  98.   
  99. //自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台   
  100. void auto_search(bit mode)   
  101. {   
  102.     radio_read();   
  103.     get_pll();   
  104.     if(mode)   
  105.         radio_write_data[2]=0xa0;   
  106.     else  
  107.         radio_write_data[2]=0x20;       
  108.     radio_write_data[0]=pll/256+0x40;   
  109.     radio_write_data[1]=pll%256;       
  110.     radio_write_data[3]=0x11;   
  111.     radio_write_data[4]=0x00;   
  112.     radio_write();   
  113.     radio_read();   
  114.     while(!(radio_read_data[0]&0x80))     //搜台成功标志   
  115.     {   
  116.         radio_read();   
  117.         disp_freq(9,1);   
  118.     }       
  119. }   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4