捣鼓TEA5767收音机Word格式.docx
- 文档编号:19560353
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:39
- 大小:3.96MB
捣鼓TEA5767收音机Word格式.docx
《捣鼓TEA5767收音机Word格式.docx》由会员分享,可在线阅读,更多相关《捣鼓TEA5767收音机Word格式.docx(39页珍藏版)》请在冰豆网上搜索。
组装时R2电阻0欧姆一定要焊上
10、参考程序和烧写文件
烧写文件:
该文件只允许会员下载登录|注册新用户
内部震荡8M
部分参考程序:
Tea5767.c
#include"
Tea5767.h"
TwiLib.h"
//初始化TEA5767
voidTEA5767_Init(ulongFreq,ucharMono)
{
//初始化
TWI_Init();
TEA5767_Adjust(Freq,Mono,TRUE);
}
//调整频率、声道
voidTEA5767_Adjust(ulongFreq,ucharMono,ucharMuteControl)
uchardata[5]={0};
ulongpll=TEA5767_GetPLLFromFreq(Freq);
data[0]=(uchar)(pll/256);
data[1]=(uchar)(pll%256);
data[2]=(Mono!
=0)?
0x09:
0x01;
data[3]=0x92;
if(MuteControl)
data[0]|=0x80;
TWI_MasterSendBytes(TEA5767_TWI_ADDR,5,data);
data[0]&
=0x7f;
DelayMs(500);
//信号强度
ucharTEA5767_GetLevel()
TWI_MasterRecvBytes(TEA5767_TWI_ADDR,5,data);
return(data[3]>
>
4);
//由频率计算PLL(频率单位为KHZ)
ulongTEA5767_GetPLLFromFreq(ulongFreq)
ulongpll=(ulong)(((Freq-225)*4000)/32768);
returnpll;
//由PLL计算频率(频率单位为KHZ)
ulongTEA5767_GetFreqFromPLL(ulongPll)
ulongFreq=(ulong)(((float)Pll)*((float)8.192)+225);
returnFreq;
Tea5767.h
#ifndef__TEA5767__H__INCLUDED__
#define__TEA5767__H__INCLUDED__
common.h"
//TEA5767的TWI地址
#defineTEA5767_TWI_ADDR0xC0//TEA5767基地址
//初始化TEA5767(频率单位为KHZ)
voidTEA5767_Init(ulongFreq,ucharMono);
voidTEA5767_Adjust(ulongFreq,ucharMono,ucharMuteControl);
ucharTEA5767_GetLevel();
ulongTEA5767_GetPLLFromFreq(ulongFreq);
ulongTEA5767_GetFreqFromPLL(ulongPll);
#endif//__TEA5767__H__INCLUDED__
FM62429.c
FM62429.h"
//初始化函数
voidFM62429_Init(ucharVolume)
FM62429_PORT_INIT();
FM62429_AdjustVolume(Volume);
//调整音量(0~84)
voidFM62429_AdjustVolume(ucharVolume)
uchari=0;
ushortVolData=0;
if(Volume>
0)
Volume=Volume+3;
VolData=(ushort)(Volume&
0x7C);
VolData|=(ushort)((Volume&
0x03)<
<
7);
//D9、D10均为1
VolData|=0x600;
FM62429_SDA_L();
FM62429_SCL_L();
for(i=0;
i<
10;
i++)
if(VolData&
0x01)
FM62429_SDA_H();
else
FM62429_SCL_H();
VolData>
=1;
NOP();
FM62429.h
#ifndef__FM62429_H_INCLUDED__
#define__FM62429_H_INCLUDED__
Common.h"
//端口定义
#defineFM62429_SDA_H()SET_BIT(PORTB,PB2)
#defineFM62429_SDA_L()CLR_BIT(PORTB,PB2)
#defineFM62429_SCL_H()SET_BIT(PORTB,PB5)
#defineFM62429_SCL_L()CLR_BIT(PORTB,PB5)
#defineFM62429_PORT_INIT()SET_BIT(DDRB,DDB2);
SET_BIT(DDRB,DDB5)
voidFM62429_Init(ucharVolume);
//调整音量(0-83)
voidFM62429_AdjustVolume(ucharVolume);
#endif//__FM62429_H_INCLUDED__
main.c
#include
LCD1602.h"
TWILib.h"
#defineOPER_MODE_RADIO0//正常收音机模式
#defineOPER_MODE_SET1//设置模式
//正确保存标志
#defineSAVE_MASK0x4B//'
K'
//设置模式
#defineSET_MODE_SEARCH1//搜索
#defineSET_MODE_SOUNDMODE2//立体声、单声道模式选中
#defineSET_MODE_MIN1
#defineSET_MODE_MAX2
//声音模式
#defineSOUND_MODE_STEREO1
#defineSOUND_MODE_MONO2
#defineSOUND_MODE_MIN1
#defineSOUND_MODE_MAX2
//音量
#defineVOLUME_MAX84
#defineVOLUME_MIN0
#defineCHANNEL_NUM10
#defineCHANNEL_MIN1
#defineCHANNEL_MAXCHANNEL_NUM
//搜索模式
#defineSTATE_SEARCH1
#defineSTATE_STORE2
//最小频率
#defineFREQ_MIN((ulong)87500)
#defineFREQ_MAX((ulong)120000)
//全局变量
ucharOperMode=OPER_MODE_RADIO;
//操作模式
ucharSetMode=SET_MODE_MIN;
//搜索频道
ucharSoundMode=SOUND_MODE_MIN;
//声音模式
BOOLDoingMenu=FALSE;
//是否处于选择菜单方式
ushortBlinkCounter=0;
//控制闪烁
ucharVolume=42;
//音量
ulongChannelFreq=96600;
//频道频率(单位为KHZ)
ulongChannelSearch=FREQ_MIN;
//搜索起始频率
ucharChannelIndex=0;
//当前播放的频道编号(1-10)
ucharChannelSaveIndex=CHANNEL_MIN;
ucharChannelState=STATE_SEARCH;
//开关健(PD7)
#definePOWER_ON()
#definePOWER_OFF()SET_BIT(DDRD,DDD7);
CLR_BIT(PORTD,PD7);
//闪烁控制变量的最大值
#defineBLINK_COUNTER_MAX10
//是否闪烁
#defineIS_BLINK()(BlinkCounter>
BLINK_COUNTER_MAX/2)
//======================================================================================================
//预先保持的10个频道
ulongEEMEMChannelConfig[CHANNEL_NUM+1]={0};
ulongChannelArray[CHANNEL_NUM+1]={0};
//读取预先保持的频道
voidReadChannelConfig()
ulongdata=0;
ucharmask=0,i=0;
//等待EEPROM空闲
eeprom_busy_wait();
//写入数据
eeprom_read_block(ChannelArray,ChannelConfig,4*(1+CHANNEL_NUM));
//解析第一个字节,构造第一个字节,从地位到高位分别是:
ChannelIndex,Volume,SoundMode,SAVEMASK
data=ChannelArray[0];
ChannelIndex=(uchar)(data&
0xFF);
data>
=8;
Volume=(uchar)(data&
SoundMode=(uchar)(data&
mask=(uchar)(data&
if((mask!
=SAVE_MASK)||
(ChannelIndex<
CHANNEL_MIN||ChannelIndex>
CHANNEL_MAX)||
(SoundMode<
SOUND_MODE_MIN||SoundMode>
SOUND_MODE_MAX)||
(Volume>
VOLUME_MAX))
ChannelIndex=0;
Volume=42;
SoundMode=SOUND_MODE_STEREO;
for(i=0;
CHANNEL_NUM+1;
i++)
ChannelArray[i]=0;
{
ChannelFreq=ChannelArray[ChannelIndex];
//写设置
voidWriteChannelConfig()
//构造第一个字节,构造第一个字节,从低位到高位分别是:
ChannelIndex,Volume,SoundMode,SaveMask
ulongdata=SAVE_MASK;
data<
=8;
data|=SoundMode;
data|=Volume;
data|=ChannelIndex;
ChannelArray[0]=data;
eeprom_write_block(ChannelArray,ChannelConfig,4*(1+CHANNEL_NUM));
//显示存储频道信息
voidDisplayFreqSave(ucharIndex)
ucharbuffer[17]={0};
//显示音量、声音模式
i<
16;
i++)buffer[i]='
'
;
buffer[0]='
S'
;
buffer[1]='
T'
buffer[2]='
O'
buffer[3]='
R'
buffer[4]='
E'
buffer[5]='
:
'
buffer[6]='
C'
buffer[7]='
H'
buffer[8]=(Index/10)+'
0'
buffer[9]=(Index%10)+'
LCD1602_Display_String(1,0,buffer);
//显示频率信息
voidDisplayFreqInfo(ulongFreq,ucharIndex)
uchari=0,j=0;
//显示频率
data=Freq/10;
if(Index<
=CHANNEL_MAX)
j=3;
buffer[0]=(Index/10)+'
buffer[1]=(Index%10)+'
j=2;
buffer[j+0]='
F'
buffer[j+1]='
M'
buffer[j+2]='
if(data>
9999)
data%=100000;
buffer[j+3]=(data/10000)+'
data%=10000;
buffer[j+4]=(data/1000)+'
data%=1000;
buffer[j+5]=(data/100)+'
data%=100;
buffer[j+6]='
.'
buffer[j+7]=(data/10)+'
data%=10;
buffer[j+8]=(data%10)+'
buffer[j+9]='
buffer[j+10]='
buffer[j+11]='
Z'
buffer[j+3]=(data/1000)+'
data%=1000;
buffer[j+4]=(data/100)+'
buffer[j+5]='
buffer[j+6]=(data/10)+'
buffer[j+7]=(data%10)+'
buffer[j+8]='
LCD1602_Display_String(2,0,buffer);
//=======================================================================
//按键处理
//按键S1-S5(PD2-PD7)
//是否为单个键按下
#defineIS_KEY_PRESSED(k)(((k)>
0)&
&
(((k)&
((k)-1))==0))
//#defineGET_KEY_CODE()((~PIND)&
0x1F)
#defineKEY_CODE(n)(((uchar)1)<
(n))
#defineKEY_S1KEY_CODE(0)
#defineKEY_S2KEY_CODE
(1)
#defineKEY_S3KEY_CODE
(2)
#defineKEY_S4KEY_CODE(3)
#defineKEY_S5KEY_CODE(4)
#defineKEY_S6KEY_CODE(5)
//读取按键
ucharGET_KEY_CODE()
ucharkeycode=PIND;
keycode>
=2;
keycode=~keycode;
keycode&
=0x3F;
//6个键
returnkeycode;
ucharGetKey()
ucharkey=0;
staticucharlastkey=0;
//记录上次的按键
//读取键盘
key=GET_KEY_CODE();
if(!
IS_KEY_PRESSED(key))
lastkey=0;
return0;
//确定是否新的键按下
if(lastkey==0)
lastkey=key;
//保存本次扫描结果
DelayMs(10);
//去抖处理
if(key==lastkey)
returnkey;
//设置函数
voidSetHandler()
//切换闪烁标志
BlinkCounter++;
if(BlinkCounter>
BLINK_COUNTER_MAX)
BlinkCounter=0;
//确定是否为选择菜单
if(DoingMenu)
key=GetKey();
if(key==KEY_S1)//设置键(确认)
DoingMenu=FALSE;
//结束菜单选择
if(SetMode==SET_MODE_SOUNDMODE)
SoundMode=SOUND_MODE_MIN;
ChannelState=STATE_SEARCH;
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 捣鼓 TEA5767 收音机