RDA5807m+IIC收音机51单片机C程序文档格式.docx
- 文档编号:17946949
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:20
- 大小:321.32KB
RDA5807m+IIC收音机51单片机C程序文档格式.docx
《RDA5807m+IIC收音机51单片机C程序文档格式.docx》由会员分享,可在线阅读,更多相关《RDA5807m+IIC收音机51单片机C程序文档格式.docx(20页珍藏版)》请在冰豆网上搜索。
sbitRS=P1^0;
sbitEN=P2^5;
ucharcodea[]="
FM:
."
;
ucharcodeb[]="
Vol:
RSSI:
"
ucharcodeshu[]="
0123456789"
ucharnum;
voiddelayms(uintx)//延迟程序
{
uinti,j;
for(i=x;
i>
0;
i--)
for(j=113;
j>
j--);
}
/***********************************************矩阵键盘程序********************************************************************/
ucharScanKey()//矩阵键盘扫描返回值是当前按键数值如没按下则返回值为零
{
uintx,y;
for(x=0;
x<
4;
x++)
{
uchartemp,gaowei;
P3=hang[x];
//分行置零
temp=P3&
0xf0;
if(temp!
=0xf0)
delayms(10);
if(temp!
{
gaowei=P3/16;
//判断是第几列的按键按下,将数据装入高四位
switch(gaowei)
{
case0xe:
y=0;
break;
case0xd:
y=1;
case0xb:
y=2;
case0x7:
y=3;
}
while(temp!
temp=P3&
}
returnxian[x][y];
}
return0;
/*******************************************************LCD1602程序************************************************************************/
voidwrite_com(unsignedcharcom)
RS=0;
P0=com;
delayms(5);
EN=1;
EN=0;
voidwrite_data(unsignedchardate)
RS=1;
P0=date;
voidinit_1602()
{
P0=0xc0;
RW=0;
write_com(0x38);
//é
è
?
16*2?
ê
£?
5*7μ?
ó
8?
y?
Y?
ú
write_com(0x0c);
a?
2ê
1a±
write_com(0x06);
//D′ò
×
·
oó
μ?
1
write_com(0x01);
//?
á
Yá
voidDisplayFrq(floatFrq)//显示频率
uintF;
F=Frq*10;
write_com(0x80+3);
write_data(shu[F/1000]);
delayms
(1);
write_data(shu[F/100%10]);
write_data(shu[F/10%10]);
write_com(0x80+7);
write_data(shu[F%10]);
voidDisplayVol(uintVol)//显示音量
write_com(0x80+0x40+4);
write_data(shu[Vol/10]);
write_data(shu[Vol%10]);
voidDisplay_mute()//显示静音
write_data('
x'
);
voidDisplay_RSSI(uintRSSI)//显示信号强度
write_com(0x80+0x40+14);
write_data(shu[RSSI/10]);
write_data(shu[RSSI%10]);
/*----------------------------------------IIC通信程序---------------------------------------------------*/
voidIIC_delayms()//用于IIC延时
_nop_();
_nop_();
voidOpenIIC()//IIC启动信号
SDA=1;
SCL=1;
IIC_delayms();
SDA=0;
SCL=0;
voidCloseIIC()//IIC停止信号
ucharIIC_Wait_Ack(void)//IIC发送字节后等待从机发送响应信
ucharucErrTime=0;
while(SDA==1)
ucErrTime++;
if(ucErrTime>
250)
CloseIIC();
return1;
}
voidIIC_Ack(void)//发送应答信号
//0±
í
|′e
voidIIC_NAck(void)//IIC非应答信号
}
voidIICsendByte(uchartxd)//IIC·
写一个字节
uchart;
for(t=0;
t<
8;
t++)
{
if(((txd&
0x80)>
>
7)==1)
SDA=1;
else
SDA=0;
txd<
<
=1;
IIC_delayms();
SCL=1;
SCL=0;
}
}
ucharIICReadByte(unsignedcharack)//IIC读一个字节
unsignedchari,receive=0;
//51单片机讲引脚置高可设为输入引脚
for(i=0;
i<
i++)
{
receive<
if(SDA==1)receive++;
}
if(!
ack)
IIC_NAck();
else
IIC_Ack();
returnreceive;
uintReadReg(ucharregAddr)//芯片读寄存器
uintbuf;
OpenIIC();
IICsendByte(RDA_WRITE);
//发送芯片地址方向为写
IIC_Wait_Ack();
IICsendByte(regAddr);
//发送寄存器地址
IICsendByte(RDA_READ);
//发送芯片地址方向为读
buf=IICReadByte
(1);
buf=buf<
buf=buf|IICReadByte(0);
CloseIIC();
returnbuf;
voidWriteReg(ucharregAddr,uintval)//芯片写寄存器
IICsendByte(val>
8);
IICsendByte(val&
0XFF);
voidVol_Set(ucharvol)//音量设置0~15
uinttemp=0;
temp=ReadReg(RDA_R05);
temp&
=0xfff0;
WriteReg(0x05,vol|temp);
voidMute_Set(ucharmute)//静音设置1为静音0为不静音
temp=ReadReg(0X02);
if(!
mute)temp|=1<
14;
elsetemp&
=~(1<
14);
WriteReg(0X02,temp);
voidBass_Set(ucharbass)//频带设置
if(bass)temp|=1<
12;
12);
ucharRssi_Get(void)//信号强度获取0~63
temp=ReadReg(0X0B);
temp=(temp>
9)&
0x7f;
returntemp;
voidSeekth_Set(uintrssi)//自动搜台信号阈值强度0~15默认为8数值越低搜到的台越多
uinttemp;
rssi=rssi&
0xf;
temp=ReadReg(0X05);
=~(0xf<
temp|=rssi<
WriteReg(0X05,temp);
voidSeek_direction(uchardirection)//搜台方向1向上搜索0向下搜索
temp=ReadReg(RDA_R02);
9);
if(direction==1)
temp|=1<
9;
//if(direction==0)
//temp|=0<
voidFreq_Set(uintfreq)//频率设置单位是:
10KHz6500~10800
ucharspc=0,band=0;
uintfbtm,chan;
temp=ReadReg(0X03);
=0X001F;
band=(temp>
2)&
0x03;
spc=temp&
if(spc==0)spc=10;
elseif(spc==1)spc=20;
elsespc=5;
if(band==0)fbtm=8700;
elseif(band==1||band==2)fbtm=7600;
else
fbtm=ReadReg(0X53);
fbtm*=10;
if(freq<
fbtm)return;
chan=(freq-fbtm)/spc;
chan&
=0X3FF;
temp|=chan<
6;
temp|=1<
WriteReg(RDA_R03,temp);
delayms(20);
//while((ReadReg(0X0B)&
(1<
7))==0);
unsignedintseek_channel(void)//半自动搜台
unsignedlongtemp;
temp|=(1<
WriteReg(RDA_R02,temp);
//SEEK位置一使能自动搜台
while((ReadReg(RDA_R0A)&
14))==0)//等待STC位置一表示搜索完成
delayms(10);
±
10ms
temp=((ReadReg(RDA_R0A)&
0x3FF)*100000+87000000)/10000;
//获取当前频率
//返回搜到电台频率单位是:
10Khz
voidFM_enable(ucharflag)//1使能芯片0禁用芯片
if(flag==1)
temp|=1;
if(flag==0)
temp&
=~0x1;
WriteReg(RDA_R02,temp);
voidRDA_Init(void)//RDA3?
ˉ
WriteReg(RDA_R02,0x0002);
//软复位
delayms(30);
WriteReg(RDA_R02,0xd081);
§
32.768Khz?
ò
é
÷
?
μí
á
¢ì
ù
SKMODE=1÷
μê
1
WriteReg(RDA_R03,0x0000);
a87MHz£?
2100Khz?
μ′?
a87M~108M
WriteReg(RDA_R04,0x0040);
WriteReg(RDA_R05,0X8882);
//ò
avol=2÷
a8
FM_enable
(1);
Dé
Seekth_Set(8);
//自动搜台信号阈值强度0~15默认为8数值越低搜到的台越多
voiddisplay_1602()
write_com(0x80);
for(num=0;
num<
34;
num++)
write_data(a[num]);
delayms(5);
write_com(0x80+0x40);
write_data(b[num]);
voidmain()
unsignedcharKey_num=0,Vol=1,RSSI=0,mute=1;
unsignedintRXFreq=8830,time=0;
unsignedintDiantai[40]={8830};
charNum=0,station=1;
unsignedinttest=7896;
unsignedinttemp=10;
init_1602();
display_1602();
RDA_Init();
//RDA5807初始化
Freq_Set(8830);
//频率设置
Vol_Set
(2);
DisplayFrq(88.3);
DisplayVol
(2);
//显示音量
while
(1)
time++;
if(time>
1000)
Display_RSSI(Rssi_Get());
//显示信号强度
Key_num=ScanKey();
switch(Key_num)
case1:
{if(RXFreq==8800)RXFreq=8800;
//频率减
elseRXFreq-=10;
Freq_Set(RXFreq);
DisplayFrq(RXFreq/100.0);
while(0!
=ScanKey());
//按键释放
break;
}
case2:
{if(RXFreq==10800)RXFreq=10800;
//频率加
elseRXFreq+=10;
//按键释放
case5:
{//声音减
if(Vol==0)
Vol=0;
else
Vol-=1;
Vol_Set(Vol);
DisplayVol(Vol);
//显示音量
//按键释放
case6:
{if(Vol==15)Vol=15;
//声音加
elseVol+=1;
case7:
{if(mute==1)//静音
{
Mute_Set
(1);
Display_mute();
//显示静音
while(0!
mute=0;
}
if(mute==0)
{
Mute_Set(0);
DisplayVol(Vol);
//取消静音显示音量
mute=1;
}
case9:
{//电台减但是必须先按9进行电台搜索
//按键释放
Seek_direction(0);
//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- RDA5807m IIC 收音机 51 单片机 程序