找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9985|回复: 0
打印 上一主题 下一主题
收起左侧

单片机fm收音机模块TEA5767模块电路图与程序

[复制链接]
跳转到指定楼层
楼主
TEA5767模块电路图与程序


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "uart.h"
  6. #include "I2C.h"

  7. sbit s1=P3^4;                    //手动减小键
  8. sbit s2=P3^5;                    //手动增加键
  9. sbit s3=P3^6;                    //自动减小键
  10. sbit s4=P3^7;                    //自动增加键

  11. #define max_freq 108000
  12. #define min_freq 87500

  13. unsigned int max_pll=0x339b;           //108MHz时的pll,
  14. unsigned int min_pll=0x299d;           //87.5MHz时的pll.

  15. unsigned char radio_write_data[5]={0x2a,0xb6,0x40,0x11,0x40};        //要写入TEA5767的数据
  16. unsigned char radio_read_data[5];        //TEA5767读出的状态

  17. unsigned long frequency;
  18. unsigned int pll;

  19. void delay_ms(unsigned int i)           //us延时函数
  20. {
  21.   unsigned int j,k;
  22.   for(j=i;j>0;j--)
  23.     for(k=125;k>0;k--);
  24. }       

  25. void radio_write(void)
  26. {
  27.     unsigned char i;
  28.     iic_start();
  29.     iic_write8bit(0xc0);        //TEA5767写地址
  30.     if(!iic_testack())
  31.     {
  32.         for(i=0;i<5;i++)
  33.         {
  34.             iic_write8bit(radio_write_data[i]);
  35.             iic_ack();
  36.         }
  37.     }
  38.     iic_stop();   
  39. }

  40. //由频率计算PLL
  41. void get_pll(void)
  42. {
  43.     unsigned char hlsi;
  44.     unsigned int twpll=0;
  45.     hlsi=radio_write_data[2]&0x10;
  46.     if (hlsi)
  47.         pll=(unsigned int)((float)((frequency+225)*4)/(float)32.768);    //频率单位:k
  48.     else
  49.         pll=(unsigned int)((float)((frequency-225)*4)/(float)32.768);    //频率单位:k
  50. }


  51. //由PLL计算频率
  52. void get_frequency(void)
  53. {
  54.     unsigned char hlsi;
  55.     unsigned int npll=0;
  56.     npll=pll;
  57.     hlsi=radio_write_data[2]&0x10;
  58.     if (hlsi)
  59.         frequency=(unsigned long)((float)(npll)*(float)8.192-225);    //频率单位:KHz
  60.     else
  61.         frequency=(unsigned long)((float)(npll)*(float)8.192+225);    //频率单位:KHz
  62. }

  63. //读TEA5767状态,并转换成频率
  64. void radio_read(void)
  65. {
  66.     unsigned char i;
  67.     unsigned char temp_l,temp_h;
  68.     pll=0;
  69.     iic_start();
  70.     iic_write8bit(0xc1);        //TEA5767读地址
  71.     if(!iic_testack())
  72.     {
  73.         for(i=0;i<5;i++)
  74.         {
  75.             radio_read_data[i]=iic_read8bit();
  76.             iic_ack();
  77.         }
  78.     }
  79.     iic_stop();
  80.     temp_l=radio_read_data[1];
  81.     temp_h=radio_read_data[0];
  82.     temp_h&=0x3f;
  83.     pll=temp_h*256+temp_l;
  84.     get_frequency();
  85. }



  86. //手动设置频率,mode=1,+0.01MHz; mode=0:-0.01MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
  87. void search(bit mode)
  88. {
  89.     radio_read();        
  90.     if(mode)
  91.     {
  92.         frequency+=10;
  93.         if(frequency>max_freq)
  94.             frequency=min_freq;
  95.     }
  96.     else
  97.     {
  98.         frequency-=10;
  99.         if(frequency<min_freq)
  100.             frequency=max_freq;
  101.     }         
  102.     get_pll();
  103.     radio_write_data[0]=pll/256;
  104.     radio_write_data[1]=pll%256;
  105.     radio_write_data[2]=0x41;
  106.     radio_write_data[3]=0x11;
  107.     radio_write_data[4]=0x40;
  108.     radio_write();
  109. }

  110. //自动搜台,mode=1,频率增加搜台; mode=0:频率减小搜台,不过这个好像不能循环搜台
  111. void auto_search(bit mode)
  112. {
  113.     radio_read();        
  114.     if(mode)
  115.     {
  116.         radio_write_data[2]=0xb1;
  117.         frequency+=20;
  118.         if(frequency>max_freq)
  119.             frequency=min_freq;
  120.     }
  121.     else
  122.     {
  123.                 radio_write_data[2]=0x41;
  124.         frequency-=20;
  125.         if(frequency<min_freq)
  126.             frequency=max_freq;
  127.     }         
  128.     get_pll();

  129.     radio_write_data[0]=pll/256+0x40;      //加0x40是将SM置为1 为自动搜索模式
  130.     radio_write_data[1]=pll%256;   
  131.     radio_write_data[3]=0x11;              //SSL1和SSL0控制搜索停止条件            
  132.     radio_write_data[4]=0x40;
  133.     radio_write();
  134.     radio_read();
  135.     while(!(radio_read_data[0]&0x80))     //搜台成功标志
  136.     {
  137.         radio_read();
  138.     }   
  139. }


  140. void main()
  141. {
  142. P3=0xff;
  143. UART_Init();
  144. comm("http://shop35585928.taobao.com \r\n\0");
  145. comm("TEA5767 FM \r\n\0");

  146. radio_write();

  147. while(1)
  148. {


  149.   if(s1==0)
  150.   {delay_ms(1);
  151.    if(s1==0)
  152.    {
  153.      while(s1==0);
  154.      search(0);  send_fre(frequency);
  155.    }
  156.   }

  157.   if(s2==0)
  158.   {delay_ms(1);
  159.    if(s2==0)
  160. ……………………

  161. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
原理图.rar (24.6 KB, 下载次数: 124)
程序.rar (33.49 KB, 下载次数: 123)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表