原创 FM调频收音机模块

2007-11-25 23:34 7208 10 16 分类: MCU/ 嵌入式

使用SP3767与LM4811做了一个收音机模块


博主在自己的430F449开发板上做成了此收音机,很是欣喜。


已经实现的功能:(充分利用开发板的键盘与显示资源)


四个按键分别是:电台的选择、加、减、音量与频率微调选择


液晶显示对应的音量与频率。


如果朋友有兴趣的话还可以实现:


利用开发板上的连接在ADC引脚上的电位器实现旋钮的加与减;


利用开发板上的8只发光二极管实现音量的实时显示。


大家能猜猜模块上的空缺IC是什么器件?


SP3767资料pdf        LM4811资料pdf  


 


点击看大图


 


点击看大图点击看大图


博主自己编写的代码:430程序


void main(void)
 {
  uchar i;
      WDTCTL = WDTPW + WDTHOLD; 
      FLL_CTL0 |=  XCAP18PF;   // DCO+ set so freq = xtal x D x N+1
    P2DIR &= ~0X0F ; //键盘
    P2IE  |= 0X0F ;
    P2IES  |= 0X0F ;
  P2IFG = 0 ;
  P1DIR = 0XFF ;
  P1OUT = 0XF0 ;
  radio_write();
  P3DIR |= BIT2+BIT3+BIT4 ;
  P3OUT = 0 ;
    LCDCTL = 0XFD;
    BTCTL =  BTFRFQ1;                      // STK LCD freq
    P5SEL =  0xFC;                         // Common and Rxx all selected


    for(i=0;i<20;i++)
     LCDMEM = 0 ;


    for(i=0;i<6;i++)
     asc_dis(i,i+'a');


    _BIS_SR(LPM3_bits + GIE);                 // Enter LPM3, enable interrupts
 
   while(1)
  {
  // radio_write_data[1] =  radio_write_data[1] + 5 ;
  // if(radio_write_data[1] >= 250 )
   // {
   //  radio_write_data[1] = 0 ;
   //  radio_write_data[0] ++ ;
   // }
   radio_write();
   radio_read();
   char x = radio_read_data[3] >> 4 ;
   x ++ ;
   P3OUT |= BIT3 ;
   P3OUT ^= BIT2 ;


   delay(10000);
   
  }
 }


void key_p20(void)
 {
  float aa ;
  uint ff = 0 ,i ;
  if(key_fun == 0 )
   {
    key_fun = 0xff ;
    asc_dis( 0, 'v');
    asc_dis( 1, 'o');
    asc_dis( 2, 'l');
    asc_dis( 3, 'u');
    asc_dis( 4, 'm');
    asc_dis( 5, 'e');
    ff = vol ;
    clrlcd();
    for(i=0;i<2;i++)
     {
      LCDMEM[2+i]= distab[ff%10];
      ff = ff / 10 ;
     }
   }
  else
   {
    key_fun = 0 ;
    asc_dis( 0, ' ');
    asc_dis( 1, 'f');
    asc_dis( 2, 'r');
    asc_dis( 3, 'e');
    asc_dis( 4, 'q');
    asc_dis( 5, ' ');
    clrlcd();
    ff = radio_write_data[0] ;
    ff = ff << 8 ;
    ff = ff + radio_write_data[1] ;
    aa = ff ;
    aa = aa * 8.192   ;
    aa = aa /10 ;
    ff = aa ;
    for(i=0;i<5;i++)
     {
      LCDMEM[1+i]= distab[ff%10];
      ff = ff / 10 ;
     }
    LCDMEM[3] = LCDMEM[3] + 0X10 ;
   }  
 }


void key_p21(void) //+
 {
  float aa ;
  uint ff;
  uchar i;
  if(key_fun == 0 )
   {
    if(radio_write_data[1] >= 254 )
     radio_write_data[0] ++ ;
    radio_write_data[1] = radio_write_data[1] +5 ;
    radio_write();
    ff = radio_write_data[0] ;
    ff = ff << 8 ;
    ff = ff + radio_write_data[1] ;
    aa = ff ;
    aa = aa * 8.192   ;
    aa = aa /10 ;
    ff = aa ;
    for(i=0;i<5;i++)
     {
      LCDMEM[1+i]= distab[ff%10];
      ff = ff / 10 ;
     }
    LCDMEM[3] = LCDMEM[3] + 0X10 ;
   }
  else
   {
    P3OUT |= BIT3 ;
    P3OUT &= ~BIT2 ;
    P3OUT |= BIT2 ;
    vol++ ;
    if(vol > 32 )
     vol = 32 ;
    ff = vol ;
    clrlcd();
    for(i=0;i<2;i++)
     {
      LCDMEM[2+i]= distab[ff%10];
      ff = ff / 10 ;
     }
   }  
 }


void key_p22(void) //-
 {
  float aa ;
  uint ff;
  uchar i;
  if(key_fun == 0 )
   {
    if(radio_write_data[1] <= 2 )
     radio_write_data[0] -- ;
    radio_write_data[1] = radio_write_data[1] -5 ;
    radio_write();
    ff = radio_write_data[0] ;
    ff = ff << 8 ;
    ff = ff + radio_write_data[1] ;
    aa = ff ;
    aa = aa * 8.192   ;
    aa = aa /10 ;
    ff = aa ;
    for(i=0;i<5;i++)
     {
      LCDMEM[1+i]= distab[ff%10];
      ff = ff / 10 ;
     }
    LCDMEM[3] = LCDMEM[3] + 0X10 ;
   }
  else
   {
    P3OUT &= ~BIT3 ;
    P3OUT &= ~BIT2 ;
    P3OUT |= BIT2 ;
    vol-- ;
    if(vol <1)
     vol = 1;
    ff = vol ;
    clrlcd();
    for(i=0;i<2;i++)
     {
      LCDMEM[2+i]= distab[ff%10];
      ff = ff / 10 ;
     }
   }  
 }


void key_p23(void)
 {
  float aa ;
  uint ff;
  uchar i;
  key_fun = 0 ;
  asc_dis( 0, ' ');
  asc_dis( 1, 'f');
  asc_dis( 2, 'r');
  asc_dis( 3, 'e');
  asc_dis( 4, 'q');
  asc_dis( 5, ' ');
  radio_write_data[0] = nj_data[ key_ch * 2 ] ;
  radio_write_data[1] = nj_data[ key_ch * 2 + 1 ] ;
  radio_write();
  ff = radio_write_data[0] ;
  ff = ff << 8 ;
  ff = ff + radio_write_data[1] ;
  aa = ff ;
  aa = aa * 8.192   ;
  aa = aa /10 ;
  ff = aa ;
  for(i=0;i<5;i++)
   {
    LCDMEM[1+i]= distab[ff%10];
    ff = ff / 10 ;
   }
  LCDMEM[3] = LCDMEM[3] + 0X10 ;
  
  key_ch ++ ;
  if(key_ch >= 8 )
   key_ch = 0 ;
 }


#pragma vector="PORT2"_VECTOR
__interrupt void port1_ISR (void)
    {
   if((P2IN & 0X0F) != 0X0F) 
    {
     delay(1000);
     if((P2IN & 0X0F) != 0X0F)
      {
       if((P2IFG&0X0F)==BIT0)
        key_p20();
       if((P2IFG&0X0F)==BIT1)
        key_p21();
       if((P2IFG&0X0F)==BIT2)
        key_p22();
       if((P2IFG&0X0F)==BIT3)
        key_p23();
      }
    }
        P2IFG = 0 ;                 // Clear flag
    }

文章评论6条评论)

登录后参与讨论

用户1191610 2010-12-16 18:40

從那裹可以購買接收FM校園廣播测试板 email : abcsz2005@163.com

用户102041 2008-5-17 22:43

魏老师您好:我正在调试sp3767,现在遇到两个问题,向您请教。 1.直接向3767写入PLL值时,有的电台很清楚,有的电台就很不清楚。会是什么原因。例如五个控制字节如下: 0x30,0x19,0x20,0x11,0x00 FM101.1 能听清楚 0x30,0xB8,0x20,0x11,0x00 FM102.4 不清楚(噪音) 0x32,0x57,0x20,0x11,0x00 FM105.8 能听清楚 0x2e,0xf4,0x20,0x11,0x00 FM98.7 不清楚(噪音) 2.写入搜台控制命令后,没反应,还是原来的台,没改变,控制字节是:0x70,0x19,0x20,0x11,0x00 是不是控制字节写错了? 请魏老师指教,谢谢!

用户29705 2008-4-17 11:13

魏老师您好:我是一个初学MSP430的学生,感觉入门是一件难事,但自从在网上看了您写的《南航MSP430选修课 试用教材》的电子版资料后,感觉受益很大,但感觉那份资料似乎不是一个完整版,若您允许及愿意帮助我学习的情况下,诚恳请求您在百忙之中能将其完整版及此收音机的详细资料发送我一份,我在此万分感激。谢谢您。 邮箱:lucky163@163.com

用户10977 2008-3-29 17:50

博主,能否把详细资料发一份给我,本人想DIY一个,谢谢!我的邮箱:14475512@163.com

用户61871 2008-1-10 09:15

我是MSP430的初学者,你的程序没有多么复杂的语法,但是没有注释,所以对你的逻辑了解得还是不太清楚!

用户454600 2007-12-9 22:28

哈哈

完全正确,目的在于,如果你使用片内没有可掉电还保存数据的单片机时,这个可以用来保存电台数据哦

相关推荐阅读
用户454600 2009-02-22 12:54
哈哈,高精度的测量情况,与大家交流,不动位数还是比较高的
使用24位ADC,一般都达不到24位,目前博主使用24位adc做测量,还算满意,做了一个测试的视频,不知道如何传上来,毕竟文件比较大,有27m字节。我的做法,使用CA100(日本横河公司的)作为信号输...
用户454600 2008-03-07 15:37
关于修订我的msp430书,同时我的430开发板全部降价
--------------------------------------------------------------------------------我是魏小龙谢谢广大网友以及430的支持者...
用户454600 2008-03-03 10:27
转贴:光电脉搏传感器的研制和噪声分析
        1 引 言   人体心室周期性的收缩和舒张导致主动脉的收缩和舒张, 使血流压力以波的形式从主动脉根部开始沿着整个动脉系统传播, 这种波称为脉搏波。脉搏波所呈现出的形态、强度、速率和节律...
用户454600 2007-11-27 10:40
用2013设计无线传感器
2013拥有16位ADC以及32倍可调放大器很适合做无线传感器照片为本人设计的无线传感器,2500实现无线,2013实现了:自身电池电压的测量、                         由于2...
用户454600 2007-08-04 17:26
版主留言版
在这里可以留下朋友的留言。谢谢您的支持。通过回复此帖留言。...
我要评论
6
10
关闭 站长推荐上一条 /2 下一条