EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2007/11/25 23:34:14

3

标签: 无标签

FM调频收音机模块

使用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[i] = 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
    }

系统分类: 单片机   |   用户分类: MSP430单片机   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

阅读(3293)  |  评论(6)  |  收藏(0)  |  举报  

投一票您将和博主都有获奖机会!

最新评论

  • 梦想

    2008/5/17 22:43:05

    魏老师您好:我正在调试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 是不是控制字节写错了? 请魏老师指教,谢谢!

  • lucky

    2008/4/17 11:13:10

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

  • lixin

    2008/3/29 17:50:42

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

  • 雪山飞龙

    2008/1/10 9:15:58

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

  • MCU430

    2007/12/9 22:28:39

    哈哈

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

  • NetTonny

    2007/12/6 23:20:13

    博主的这块板上的空的ic应该是AT24CXX,只有这款ic适合出现在这。