方案是一个FM收音机,包含完整的原理图和源代码,拿回家马上就可以动手去做。该收音机基于STC89C52RC(STC89C52RC数据手册)单片机和TEA5767芯片设计,同时使用飞利浦的TDA1308音频功放IC,可以使用耳机收听,也可以接功放收听,音质不错,在实验室可以接受到十几个清晰的电台。主板也是一个很好的51单片机学习板,单片机的所有IO口已经在电路板上引出,方便实验。
单片机源程序如下:
- #include <reg51.h>
- #include <string.h>
- #include <math.h>
- #include <uart.h>
- #include <i2c.h>
- #define max_freq 108000
- #define min_freq 87500
- sbit KEY1=P3^2;
- sbit KEY2=P3^3;
- unsigned char radio_write_data[5]={0x29,0xc2,0x20,0x11,0x00}; //要写入TEA5767的数据
- //unsigned char radio_write_data[5]={0x2a,0xb6,0x40,0x11,0x40}; //要写入TEA5767的数据
- unsigned char radio_read_data[5]; //TEA5767读出的状态
- unsigned int default_pll=0x301d; //0x29f9; //默认存台的pll,95.8MHz
- //unsigned int max_pll=0x339b; //108MHz时的pll,
- //unsigned int min_pll=9000; //70MHz时的pll
- unsigned long frequency;
- unsigned int pll;
- /*void delay(unsigned int time)
- {
- while(time--);
- }*/
- void delay1ms (unsigned int b)//1ms
- {
- for(b;b>0;b--)
- {unsigned int i;
- for(i=0;i<300;i++)
- {;}
- }
- }
- 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();
- }
- //由频率计算PLL
- void get_pll(void)
- {
- unsigned char hlsi;
- // unsigned int twpll=0;
- hlsi=radio_write_data[2]&0x10; //HLSI位
- 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
- }
- //读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();
- }
- //手动设置频率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考虑TEA5767用于搜台的相关位:SM,SUD
- void search(bit mode)
- {
- radio_read();
- if(mode)
- {
- frequency+=10;
- if(frequency>max_freq)
- frequency=min_freq;
- }
- else
- {
- frequency-=10;
- if(frequency<min_freq)
- 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)) //搜台成功标志
- {
- delay(1000);
- radio_read();
- //disp_freq(9,1);
- PutNum(frequency);
- }
- } */
- void main()
- {
- UART_Init();//串口初始化
- UART_Send_Str("调频收音机\n");
- radio_write();
- while(1)
- {
- if(KEY1==0)
- {
- delay1ms(15); //延时15ms
- if(KEY1==0)
- while(KEY1==0);//等待按键释放
- search(1);
- radio_read();
- UART_Send_Str("目前频率\n");
- UART_Put_Num(frequency);
- UART_Send_Str("\n");
- }
- if(KEY2==0)
- {
- delay1ms(15); //延时15ms
- if(KEY2==0)
- while(KEY2==0);//等待按键释放
- search(0);
- radio_read();
- UART_Send_Str("目前频率\n");
- UART_Put_Num(frequency);
- UART_Send_Str("\n");
- }
- }
- }
复制代码
源代码.rar
(34.54 KB)
FM收音机电路原理图.PDF
(43.65 KB)
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|