当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]收音机模块TEA5767的C51控制程序

  TEA5767采用I2C或者三线接口控制,我是用的I2C,单片机用STC89C52,带1K EEPROM,可以掉电存台,1602LCD显示.

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

  #include "iic.c"

  #define max_freq 108000

  #define min_freq 87500

  unsigned char radio_write_data[5]={0x29,0xc2,0x20,0x11,0x00}; //要写入TEA5767的数据

  unsigned char radio_read_data[5]; //TEA5767读出的状态

  unsigned int default_pll=0x29c2;//0x29f9; //默认存台的pll,87.8MHz

  //unsigned int max_pll=0x339b; //108MHz时的pll,

  //unsigned int min_pll=9000; //70MHz时的pll

  void radio_write(void)

  {

  unsigned char i;

  iic_start();

  iic_write8bit(0xc0); //TEA5767写地址

  if(!iic_testack())

  {

  for(i=0;i<5;i++)

  {

  iic_write8bit(radio_write_data[i]);

  iic_ack();

  }

  }

  iic_stop();

  }

  //读TEA5767状态,并转换成频率

  void radio_read(void)

  {

  unsigned char i;

  unsigned char temp_l,temp_h;

  pll=0;

  iic_start();

  iic_write8bit(0xc1); //TEA5767读地址

  if(!iic_testack())

  {

  for(i=0;i<5;i++)

  {

  radio_read_data[i]=iic_read8bit();

  iic_ack();

  }

  }

  iic_stop();

  temp_l=radio_read_data[1];

  temp_h=radio_read_data[0];

  temp_h&=0x3f;

  pll=temp_h*256+temp_l;

  get_frequency();

  }

  //由频率计算PLL

  void get_pll(void)

  {

  unsigned char hlsi;

  unsigned int twpll=0;

  hlsi=radio_write_data[2]&0x10;

  if (hlsi)

  pll=(unsigned int)((float)((frequency+225)*4)/(float)32.768); //频率单位:k

  else

  pll=(unsigned int)((float)((frequency-225)*4)/(float)32.768); //频率单位:k

  }

  //由PLL计算频率

  void get_frequency(void)

  {

  unsigned char hlsi;

  unsigned int npll=0;

  npll=pll;

  hlsi=radio_write_data[2]&0x10;

  if (hlsi)

  frequency=(unsigned long)((float)(npll)*(float)8.192-225); //频率单位:KHz

  else

  frequency=(unsigned long)((float)(npll)*(float)8.192+225); //频率单位:KHz

  }[!--empirenews.page--]

  //手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD

  void search(bit mode)

  {

  radio_read();

  if(mode)

  {

  frequency+=100;

  if(frequency>max_freq)

  frequency=min_freq;

  }

  else

  {

  frequency-=100;

  if(frequency

  frequency=max_freq;

  }

  get_pll();

  radio_write_data[0]=pll/256;

  radio_write_data[1]=pll%256;

  radio_write_data[2]=0x20;

  radio_write_data[3]=0x11;

  radio_write_data[4]=0x00;

  radio_write();

  }

  //自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台

  void auto_search(bit mode)

  {

  radio_read();

  get_pll();

  if(mode)

  radio_write_data[2]=0xa0;

  else

  radio_write_data[2]=0x20;

  radio_write_data[0]=pll/256+0x40;

  radio_write_data[1]=pll%256;

  radio_write_data[3]=0x11;

  radio_write_data[4]=0x00;

  radio_write();

  radio_read();

  while(!(radio_read_data[0]&0x80)) //搜台成功标志

  {

  radio_read();

  disp_freq(9,1);

  }

  }

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: C51 MDK RealView

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

关键字: keil5 编译 C51

Intel公司1980年推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 80C5...

关键字: C51 KEIL 编程

c上标3下标5怎么算用计算机,c上标3下标5怎么算

关键字: C51 KEIL

笔者称这个收音机为三个硬币收音机是因为其使用了三个硬币作为锚点,连接收音机各个部件,这将使制作过程变得极为简单。在这个收音机中使用了一个特殊的10晶体管集成电路,使最后做出的收音机效果非常出色。如果你以前从来没有玩过焊接...

关键字: 收音机

▼点击下方名片,关注公众号▼大家好,很高兴和各位一起分享我的第16篇原创文章,喜欢和支持我的工程师,一定记得给我点赞、收藏、分享。加微信[xyzn3333]与作者沟通交流,免费获取更多单片机与嵌入式的海量电子资料。很多初...

关键字: 51单片机 C51

大家好,我是记得诚。我们称这个收音机为三个硬币收音机是因为我们使用了三个硬币作为锚点,连接收音机各个部件,这将使我们的制作过程变得极为简单。在这个收音机中我们使用了一个特殊的10晶体管集成电路,使最后做出的收音机效果非常...

关键字: 收音机

常看见初学者要求使用_at_,这是一种谬误,把C当作ASM看待了。在C中变量的定位是编译器的事情,初学者只要定义变量和变量的作 用域,编译器就把一个固定地址给这个变量。

关键字: C51 单片机 误区 注意事项

简介:编程首要是要考虑程序的可行性,然后是可读性、可移植性、健壮性以及可测试性。这是总则。但是很多人忽略了可读性、可移植性和健壮性(可调试的方法可能歌不相同),这是不对的。

关键字: C51 编程规范 文件配置

随着城市的发展,一些老事物和记忆也慢慢开始淡出人们视线。今天,小编就整理一些正在消失的事物,看看有没有勾起你的回忆。

关键字: 电视 收音机 万能充

嵌入式教程

6897 篇文章

关注

发布文章

编辑精选

技术子站

关闭