專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

我用洞洞板做的TEA5767數(shù)字調(diào)頻立體聲收音機(jī)

作者:huqin   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2014年03月01日   【字體:



//本程序使用數(shù)碼管顯示頻率,晶振是用12M,已通過測試, 已用萬能板做好成品,
//在我的QQ空間里有萬能板做的照片,高清的照片可以進(jìn)QQ相冊看,本人空間未加密。
//為了方便電子愛好者自制,本程序?qū)⑺械亩丝谶M(jìn)行了宏定義,方便初學(xué)者自行修改,并且加了很多注釋
// 陳永飛 先生寫于2011年2月19號,QQ:49204743,郵箱:baiyni888@163.com.
//地址:江蘇省南京市鼓樓區(qū)虎踞路180號蘇寧電器售后服務(wù)中心草場門網(wǎng)點(diǎn)
//本收音機(jī)的頻率調(diào)節(jié)是用計(jì)算的方法,將顯示的頻率算好后寫到TEA5767芯片里面實(shí)現(xiàn)調(diào)節(jié)的
//使用MCS-51單片機(jī)進(jìn)行控制,兩個(gè)按鍵實(shí)現(xiàn)自加或自減頻率,加了連續(xù)加減功能!
//使用的是在淘寶上買的4.5元/片的簡化版的TEA5767模塊,在南京收到了十個(gè)電臺

#include <reg51.h>
#include <string.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int

/////////////////////////////////////////////////////////////////////////////////////////////////////這
uchar code tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,}; //數(shù)碼管段碼表  /////些
sbit led1=P2^4; //頻率顯示的數(shù)碼管位選端口 100兆,P2.4端口     /////是
sbit led2=P2^5; //頻率顯示的數(shù)碼管位選端口  10兆,P2.5端口     /////端
sbit led3=P2^6; //頻率顯示的數(shù)碼管位選端口   1兆,P2.6端口     /////口
sbit led4=P2^7; //頻率顯示的數(shù)碼管位選端口 0.1兆,P2.7端口     /////,       
sbit SDA=P3^0; //接在TEA5767的數(shù)據(jù)端口        /////可
sbit SCL=P3^1; //接在TEA5767的時(shí)鐘端口        /////以
sbit KEY1=P1^0;  //頻率增加按鍵端口       /////自
sbit KEY2=P1^1;  //頻率減小按鍵端口       /////行
#define duan P0 //頻率顯示的數(shù)碼管段選P0端口       /////修
/////////////////////////////////////////////////////////////////////////////////////////////////////改

//unsigned char radio_write_data[5]={0x33,0x8e,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),107.9M江蘇旅游臺
//unsigned char radio_write_data[5]={0x32,0x8e,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),105.8M 南京音樂臺
//unsigned char radio_write_data[5]={0x31,0xd7,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),104.3M南京體育臺
//unsigned char radio_write_data[5]={0x30,0x9a,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),101.7M南京經(jīng)濟(jì)臺城市調(diào)頻
unsigned char radio_write_data[5]={0x30,0x50,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),101.1M江蘇交通廣播網(wǎng)
//unsigned char radio_write_data[5]={0x2f,0xa5,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),99.7M江蘇金色調(diào)頻
//unsigned char radio_write_data[5]={0x2c,0xc9,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),97.5M江蘇文藝臺
//unsigned char radio_write_data[5]={0x2c,0xc9,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),93.7M江蘇經(jīng)濟(jì)臺居家廣播
//unsigned char radio_write_data[5]={0x2b,0xb0,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),91.4M江蘇廣播
//unsigned char radio_write_data[5]={0x2a,0xe1,0x70,0x16,0x80};        //要寫入TEA5767的數(shù)據(jù),89.7M江蘇音樂臺


unsigned long frequency=101100; //開機(jī)初始化的電臺頻率為101.1MHz
unsigned int pll;  //計(jì)算頻率合成時(shí)用的變量

 

 

void Delayus(unsigned char x)
{
 for(;x>0;x--);
}

void iic_start()
{
 SDA=1;
 Delayus(4);
 SCL=1;
 Delayus(4);
 SDA=0;
 Delayus(4);
 SCL=0;
 Delayus(4);
}

void iic_stop()
{
 SCL=0;
 Delayus(4);
 SDA=0;
 Delayus(4);
 SCL=1;
 Delayus(4);
 SDA=1;
 Delayus(4);
}

void iic_ack()
{
 SDA=0;
 Delayus(4);
 SCL=1;
 Delayus(4);
 SCL=0;
 Delayus(4);
 SDA=1;
 Delayus(4);
}


bit iic_testack()
{
 bit ErrorBit;
 SDA=1;
 Delayus(4);
 SCL=1;
 Delayus(4);
 ErrorBit=SDA;
 Delayus(4);
 SCL=0;
 return ErrorBit;
}

void iic_write8bit(unsigned char input)
{
 unsigned char temp;
 for(temp=8;temp>0;temp--)
 {
  SDA=(bit)(input&0x80);
  Delayus(4);
  SCL=1;
  Delayus(4);
  SCL=0;
  Delayus(4);
  input=input<<1;
 }
}


void delays (unsigned char b) //按鍵消抖用的延時(shí)程序
{
  unsigned char i;
  for(b;b>0;b--)
  for(i=0;i<250;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();  
}


 //將顯示的頻率算好后寫到TEA5767芯片里面實(shí)現(xiàn)調(diào)節(jié),不用考慮TEA5767用于搜臺的相關(guān)位:SM,SUD
void search()
{      
    pll=(unsigned int)((float)((frequency+225))/(float)8.192);    //計(jì)算合成頻率數(shù)據(jù),頻率單位:k
    radio_write_data[0]=pll/256; //將算好的頻率高位數(shù)據(jù)寫入TEA5767
    radio_write_data[1]=pll%256; //將算好的頻率低位數(shù)據(jù)寫入TEA5767
    radio_write_data[2]=0x70;  //這是TEA5767開立體聲,關(guān)靜音
    radio_write_data[3]=0x16;  //中國制式,采用32768晶振,軟靜音關(guān),立體聲消噪聲開
    radio_write_data[4]=0x80;  //6.5M鎖相環(huán)開,去加重時(shí)間75US
    radio_write();
}


void delay()
{
 uchar k;
 for(k=0;k<100;k++);
}

void desplay(uint aa)
{
 duan=tab[aa/1000]|0x80;  //關(guān)這位數(shù)碼管的小數(shù)點(diǎn)
 led1=0;
 delay();
 led1=1;

 duan=tab[aa%1000/100]|0x80;  //關(guān)這位數(shù)碼管的小數(shù)點(diǎn)
 led2=0;
 delay();
 led2=1;

 duan=tab[aa%100/10]&0x7f; //點(diǎn)亮這位數(shù)碼管的小數(shù)點(diǎn)
 led3=0;
 delay();
 led3=1;

 duan=tab[aa%10]|0x80;  //關(guān)這位數(shù)碼管的小數(shù)點(diǎn)
 led4=0;
 delay();
 led4=1;
}

 


void main()
{
 radio_write();  //寫入初始化電臺頻率
 while(1)
 {
   if(!KEY1)  //手動(dòng)設(shè)置頻率,+0.1MHz;
   {
     delays(250); //延時(shí)消抖
     frequency+=100;
          if(frequency>108500) //頻率如果大于108.5MHz
          frequency=87500; //頻率設(shè)定為87.5MHz
   search();
 desplay(frequency/100);  //調(diào)用顯示
   }

    if(!KEY2)   //手動(dòng)設(shè)置頻率,-0.1MHz;
    {
       delays(250); //延時(shí)消抖
       frequency-=100;
        if(frequency<87500) //頻率如果小于87.5MHz
        frequency=108500; //頻率設(shè)定為108.5MHz
 search();
 desplay(frequency/100);  //調(diào)用顯示
    }
 desplay(frequency/100);  //調(diào)用顯示
 }
}

關(guān)閉窗口

相關(guān)文章