使用SP3767与LM4811做了一个收音机模块
博主在自己的430F449开发板上做成了此收音机,很是欣喜。
已经实现的功能:(充分利用开发板的键盘与显示资源)
四个按键分别是:电台的选择、加、减、音量与频率微调选择
液晶显示对应的音量与频率。
如果朋友有兴趣的话还可以实现:
利用开发板上的连接在ADC引脚上的电位器实现旋钮的加与减;
利用开发板上的8只发光二极管实现音量的实时显示。
大家能猜猜模块上的空缺IC是什么器件?
博主自己编写的代码: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
}
用户1191610 2010-12-16 18:40
用户102041 2008-5-17 22:43
用户29705 2008-4-17 11:13
用户10977 2008-3-29 17:50
用户61871 2008-1-10 09:15
用户454600 2007-12-9 22:28
哈哈
完全正确,目的在于,如果你使用片内没有可掉电还保存数据的单片机时,这个可以用来保存电台数据哦