//本程序使用數碼管顯示頻率,晶振是用12M,已通過測試, 已用萬能板做好成品,
//在我的QQ空間里有萬能板做的照片,高清的照片可以進QQ相冊看,本人空間未加密。
//為了方便電子愛好者自制,本程序將所有的端口進行了宏定義,方便初學者自行修改,并且加了很多注釋
// 陳永飛 先生寫于2011年2月19號,QQ:49204743,郵箱:baiyni888@163.com.
//地址:江蘇省南京市鼓樓區虎踞路180號蘇寧電器售后服務中心草場門網點
//本收音機的頻率調節是用計算的方法,將顯示的頻率算好后寫到TEA5767芯片里面實現調節的
//使用MCS-51單片機進行控制,兩個按鍵實現自加或自減頻率,加了連續加減功能!
//使用的是在淘寶上買的4.5元/片的簡化版的TEA5767模塊,在南京收到了十個電臺
#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,}; //數碼管段碼表 /////些
sbit led1=P2^4; //頻率顯示的數碼管位選端口 100兆,P2.4端口 /////是
sbit led2=P2^5; //頻率顯示的數碼管位選端口 10兆,P2.5端口 /////端
sbit led3=P2^6; //頻率顯示的數碼管位選端口 1兆,P2.6端口 /////口
sbit led4=P2^7; //頻率顯示的數碼管位選端口 0.1兆,P2.7端口 /////,
sbit SDA=P3^0; //接在TEA5767的數據端口 /////可
sbit SCL=P3^1; //接在TEA5767的時鐘端口 /////以
sbit KEY1=P1^0; //頻率增加按鍵端口 /////自
sbit KEY2=P1^1; //頻率減小按鍵端口 /////行
#define duan P0 //頻率顯示的數碼管段選P0端口 /////修
/////////////////////////////////////////////////////////////////////////////////////////////////////改
//unsigned char radio_write_data[5]={0x33,0x8e,0x70,0x16,0x80}; //要寫入TEA5767的數據,107.9M江蘇旅游臺
//unsigned char radio_write_data[5]={0x32,0x8e,0x70,0x16,0x80}; //要寫入TEA5767的數據,105.8M 南京音樂臺
//unsigned char radio_write_data[5]={0x31,0xd7,0x70,0x16,0x80}; //要寫入TEA5767的數據,104.3M南京體育臺
//unsigned char radio_write_data[5]={0x30,0x9a,0x70,0x16,0x80}; //要寫入TEA5767的數據,101.7M南京經濟臺城市調頻
unsigned char radio_write_data[5]={0x30,0x50,0x70,0x16,0x80}; //要寫入TEA5767的數據,101.1M江蘇交通廣播網
//unsigned char radio_write_data[5]={0x2f,0xa5,0x70,0x16,0x80}; //要寫入TEA5767的數據,99.7M江蘇金色調頻
//unsigned char radio_write_data[5]={0x2c,0xc9,0x70,0x16,0x80}; //要寫入TEA5767的數據,97.5M江蘇文藝臺
//unsigned char radio_write_data[5]={0x2c,0xc9,0x70,0x16,0x80}; //要寫入TEA5767的數據,93.7M江蘇經濟臺居家廣播
//unsigned char radio_write_data[5]={0x2b,0xb0,0x70,0x16,0x80}; //要寫入TEA5767的數據,91.4M江蘇廣播
//unsigned char radio_write_data[5]={0x2a,0xe1,0x70,0x16,0x80}; //要寫入TEA5767的數據,89.7M江蘇音樂臺
unsigned long frequency=101100; //開機初始化的電臺頻率為101.1MHz
unsigned int pll; //計算頻率合成時用的變量
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) //按鍵消抖用的延時程序
{
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芯片里面實現調節,不用考慮TEA5767用于搜臺的相關位:SM,SUD
void search()
{
pll=(unsigned int)((float)((frequency+225))/(float)8.192); //計算合成頻率數據,頻率單位:k
radio_write_data[0]=pll/256; //將算好的頻率高位數據寫入TEA5767
radio_write_data[1]=pll%256; //將算好的頻率低位數據寫入TEA5767
radio_write_data[2]=0x70; //這是TEA5767開立體聲,關靜音
radio_write_data[3]=0x16; //中國制式,采用32768晶振,軟靜音關,立體聲消噪聲開
radio_write_data[4]=0x80; //6.5M鎖相環開,去加重時間75US
radio_write();
}
void delay()
{
uchar k;
for(k=0;k<100;k++);
}
void desplay(uint aa)
{
duan=tab[aa/1000]|0x80; //關這位數碼管的小數點
led1=0;
delay();
led1=1;
duan=tab[aa%1000/100]|0x80; //關這位數碼管的小數點
led2=0;
delay();
led2=1;
duan=tab[aa%100/10]&0x7f; //點亮這位數碼管的小數點
led3=0;
delay();
led3=1;
duan=tab[aa%10]|0x80; //關這位數碼管的小數點
led4=0;
delay();
led4=1;
}
void main()
{
radio_write(); //寫入初始化電臺頻率
while(1)
{
if(!KEY1) //手動設置頻率,+0.1MHz;
{
delays(250); //延時消抖
frequency+=100;
if(frequency>108500) //頻率如果大于108.5MHz
frequency=87500; //頻率設定為87.5MHz
search();
desplay(frequency/100); //調用顯示
}
if(!KEY2) //手動設置頻率,-0.1MHz;
{
delays(250); //延時消抖
frequency-=100;
if(frequency<87500) //頻率如果小于87.5MHz
frequency=108500; //頻率設定為108.5MHz
search();
desplay(frequency/100); //調用顯示
}
desplay(frequency/100); //調用顯示
}
}