RDA5807m+IIC收音机51单片机C程序上课讲义Word格式.docx
《RDA5807m+IIC收音机51单片机C程序上课讲义Word格式.docx》由会员分享,可在线阅读,更多相关《RDA5807m+IIC收音机51单片机C程序上课讲义Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
![RDA5807m+IIC收音机51单片机C程序上课讲义Word格式.docx](https://file1.bdocx.com/fileroot1/2022-10/19/cba90aa7-3ac9-4d28-9c97-3d27bb769ae3/cba90aa7-3ac9-4d28-9c97-3d27bb769ae31.gif)
//矩阵键盘扫描使用
//RDA的寄存器地址
#defineRDA_R000X00//读出16个位的ID=0X5800
#defineRDA_R020X02//DHIZ[15],DMUTE[14]静音,MONO[13]声道,BASS[12]重低音,SEEKUP[9],SEEK[8],SKMODE[7],CLK_MODE[6:
4]时钟源选择,SOFTRESET[1]软复位,ENABLE[0]电源使能
#defineRDA_R030X03//CHAN[15:
6],TUNE[4],BAND[3:
2],SPACE[1:
0]设置频率带宽步长
#defineRDA_R040X04//STCIEN[14],DE[11],I2Senable[6],
#defineRDA_R050X05//INT_MODE[15],SEEKTH[14:
8](设定自动搜索信号强度阀值),LNA_PORT_SEL[7:
6]=0b10,LNA_ICSEL_BIT[5:
4],VOLUME[3:
0]音量;
#defineRDA_R0A0X0A//STC[14]seekcompleteSF[13]seekfailreadchan[9:
0]当前频道
#defineRDA_R0B0X0B//RSSI[15:
9],FMTRUE[8]当前频道是一个节目台
#defineRDA_READ0X23//读RDA5807
#defineRDA_WRITE0X22//写RDA5807
//IO操作函数
sbitSDA=P2^1;
sbitSCL=P2^0;
sbitRW=P1^1;
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);
//?
á
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(ucharre