首页 RDA5807m+IIC收音机51单片机C程序

RDA5807m+IIC收音机51单片机C程序

举报
开通vip

RDA5807m+IIC收音机51单片机C程序---.可修编.RDA5807m驱动程序+IIC程序/******************************************************************************************介绍:RD5807M收音机程序供电3.3v主控使用51单片机显示使用LCD1602**作者:胖子**时间:2016-1-5**地点:电子科技大学***********************************************************************...

RDA5807m+IIC收音机51单片机C程序
---.可修编.RDA5807m驱动程序+IIC程序/******************************************************************************************介绍:RD5807M收音机程序供电3.3v主控使用51单片机显示使用LCD1602**作者:胖子**时间:2016-1-5**地点:电子科技大学*****************************************************************************************/#include#include#include#defineucharunsignedchar#defineuintunsignedint#defineulintunsignedlongint#definelintlongintucharcodexian[4][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};ucharcodehang[]={0xfe,0xfd,0xfb,0xf7};//矩阵键盘扫描使用//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]seekpleteSF[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>0;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!=0xf0){gaowei=P3/16;//判断是第几列的按键按下,将数据装入高四位switch(gaowei){case0xe:y=0;break;case0xd:y=1;break;case0xb:y=2;break;case0x7:y=3;break;}while(temp!=0xf0){temp=P3&0xf0;}returnxian[x][y];}}}return0;}/*******************************************************LCD1602程序************************************************************************/voidwrite_(unsignedchar){RS=0;P0=;delayms(5);EN=1;delayms(5);EN=0;}voidwrite_data(unsignedchardate){RS=1;P0=date;delayms(5);EN=1;delayms(5);EN=0;}voidinit_1602(){P0=0xc0;RW=0;EN=0;write_(0x38);//éè??16*2??ê?£?5*7μ??ó£?8??êy?Y?úwrite_(0x0c);//éè???a??ê?£?2???ê?1a±êwrite_(0x06);//D′ò???×?·?oóμ??·?????ó1write_(0x01);//??ê???á?£?êy?Y??????á?}voidDisplayFrq(floatFrq)//显示频率{uintF;F=Frq*10;write_(0x80+3);write_data(shu[F/1000]);delayms(1);write_data(shu[F/100%10]);delayms(1);write_data(shu[F/10%10]);delayms(1);write_(0x80+7);write_data(shu[F%10]);delayms(1);}voidDisplayVol(uintVol)//显示音量{write_(0x80+0x40+4);write_data(shu[Vol/10]);delayms(1);write_data(shu[Vol%10]);delayms(1);}voidDisplay_mute()//显示静音{write_(0x80+0x40+4);write_data('x');delayms(1);write_data('x');delayms(1);}voidDisplay_RSSI(uintRSSI)//显示信号强度{write_(0x80+0x40+14);write_data(shu[RSSI/10]);delayms(1);write_data(shu[RSSI%10]);delayms(1);}/*----------------------------------------IIC通信程序---------------------------------------------------*/voidIIC_delayms()//用于IIC延时{_nop_();_nop_();_nop_();_nop_();}voidOpenIIC()//IIC启动信号{SDA=1;SCL=1;IIC_delayms();SDA=0;IIC_delayms();SCL=0;}voidCloseIIC()//IIC停止信号{SCL=0;SDA=0;IIC_delayms();SCL=1;SDA=1;IIC_delayms();}ucharIIC_Wait_Ack(void)//IIC发送字节后等待从机发送响应信{ucharucErrTime=0;SDA=1;IIC_delayms();SCL=1;IIC_delayms();while(SDA==1){ucErrTime++;if(ucErrTime>250){CloseIIC();return1;}}SCL=0;return0;}voidIIC_Ack(void)//发送应答信号{SCL=0;SDA=0;//0±íê?ó|′eIIC_delayms();SCL=1;IIC_delayms();SCL=0;}voidIIC_NAck(void)//IIC非应答信号{SCL=0;SDA=1;IIC_delayms();SCL=1;IIC_delayms();SCL=0;}voidIICsendByte(uchartxd)//IIC·写一个字节{uchart;SCL=0;for(t=0;t<8;t++){if(((txd&0x80)>>7)==1)SDA=1;elseSDA=0;txd<<=1;IIC_delayms();SCL=1;IIC_delayms();SCL=0;IIC_delayms();}}ucharIICReadByte(unsignedcharack)//IIC读一个字节{unsignedchari,receive=0;SDA=1;//51单片机讲引脚置高可设为输入引脚for(i=0;i<8;i++){SCL=0;IIC_delayms();SCL=1;receive<<=1;if(SDA==1)receive++;IIC_delayms();}if(!ack)IIC_NAck();elseIIC_Ack();returnreceive;}uintReadReg(ucharregAddr)//芯片读寄存器{uintbuf;OpenIIC();IICsendByte(RDA_WRITE);//发送芯片地址方向为写IIC_Wait_Ack();IICsendByte(regAddr);//发送寄存器地址IIC_Wait_Ack();OpenIIC();IICsendByte(RDA_READ);//发送芯片地址方向为读IIC_Wait_Ack();buf=IICReadByte(1);buf=buf<<8;buf=buf|IICReadByte(0);CloseIIC();returnbuf;}voidWriteReg(ucharregAddr,uintval)//芯片写寄存器{OpenIIC();IICsendByte(RDA_WRITE);//发送芯片地址方向为写IIC_Wait_Ack();IICsendByte(regAddr);//发送寄存器地址IIC_Wait_Ack();IICsendByte(val>>8);IIC_Wait_Ack();IICsendByte(val&0XFF);IIC_Wait_Ack();CloseIIC();}voidVol_Set(ucharvol)//音量设置0~15{uinttemp=0;temp=ReadReg(RDA_R05);temp&=0xfff0;WriteReg(0x05,vol|temp);}voidMute_Set(ucharmute)//静音设置1为静音0为不静音{uinttemp=0;temp=ReadReg(0X02);if(!mute)temp|=1<<14;elsetemp&=~(1<<14);WriteReg(0X02,temp);}voidBass_Set(ucharbass)//频带设置{uinttemp=0;temp=ReadReg(0X02);if(bass)temp|=1<<12;elsetemp&=~(1<<12);WriteReg(0X02,temp);}ucharRssi_Get(void)//信号强度获取0~63{uinttemp=0;temp=ReadReg(0X0B);temp=(temp>>9)&0x7f;returntemp;}voidSeekth_Set(uintrssi)//自动搜台信号阈值强度0~15默认为8数值越低搜到的台越多{uinttemp;rssi=rssi&0xf;temp=ReadReg(0X05);temp&=~(0xf<<8);temp|=rssi<<8;WriteReg(0X05,temp);}voidSeek_direction(uchardirection)//搜台方向1向上搜索0向下搜索{uinttemp;temp=ReadReg(RDA_R02);temp&=~(1<<9);if(direction==1)temp|=1<<9;//if(direction==0)//temp|=0<<9;WriteReg(0X05,temp);}voidFreq_Set(uintfreq)//频率设置单位是:10KHz6500~10800{uinttemp;ucharspc=0,band=0;uintfbtm,chan;temp=ReadReg(0X03);temp&=0X001F;band=(temp>>2)&0x03;spc=temp&0x03;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(freq1000)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;Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);while(0!=ScanKey());//按键释放break;}case5:{//声音减if(Vol==0)Vol=0;elseVol-=1;Vol_Set(Vol);DisplayVol(Vol);//显示音量while(0!=ScanKey());//按键释放break;}case6:{if(Vol==15)Vol=15;//声音加elseVol+=1;Vol_Set(Vol);DisplayVol(Vol);//显示音量while(0!=ScanKey());//按键释放break;}case7:{if(mute==1)//静音{Mute_Set(1);Display_mute();//显示静音while(0!=ScanKey());//按键释放mute=0;break;}if(mute==0){Mute_Set(0);DisplayVol(Vol);//取消静音显示音量mute=1;}while(0!=ScanKey());break;}case9:{//电台减但是必须先按9进行电台搜索while(0!=ScanKey());//按键释放Seek_direction(0);//向下搜索RXFreq=seek_channel();//搜索下一个频道Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);break;}case10:{//电台加但是必须先按11进行电台搜索while(0!=ScanKey());//按键释放Seek_direction(1);//向上搜索RXFreq=seek_channel();//搜索下一个频道Freq_Set(RXFreq);DisplayFrq(RXFreq/100.0);break;}default:break;}}}//case9:{//电台减但是必须先按11进行电台搜索//if(station==0)break;//if(Num>0)Num-=1;//elseNum=station-1;//Freq_Set(Diantai[Num]);//DisplayFrq(Diantai[Num]/100.0);//RXFreq=Diantai[Num];//Display_now(1);//显示当前电台号//while(0!=ScanKey());//按键释放//break;//}//case10:{if(station==0)break;//电台加但是必须先按11进行电台搜索//if(Num<(station-1))Num+=1;//elseNum=0;//Freq_Set(Diantai[Num]);//DisplayFrq(Diantai[Num]/100.0);//RXFreq=Diantai[Num];//Display_now(Num);//显示当前电台号//while(0!=ScanKey());//按键释放//break;//}////case11:{//自动搜台并且存储按9或者10可以上下变换电台。]//RXFreq=8800;//Freq_Set(RXFreq);//Num=0;//station=0;//while(0!=ScanKey());//按键释放//RXFreq=seek_channel();//搜索下一个频道//DisplayFrq(RXFreq/100.0);////while(1)//{//RXFreq=seek_channel();//DisplayFrq(RXFreq/100.0);//if((ReadReg(RDA_R0B)>>8)&0x1)//如果当前频率是频道则保存该频率//{//Diantai[Num]=RXFreq;//Num++;//Display_total(Num);//显示当前电台号//}//if((ReadReg(RDA_R0A)>>13)&0x1)//SF=1表示seekfailed则返会//{//station=Num;//Num=0;//Freq_Set(Diantai[Num]);//RXFreq=Diantai[Num];//Freq_Set(RXFreq);//break;//}//}//Display_total(station);//显示当前电台号//}
本文档为【RDA5807m+IIC收音机51单片机C程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥17.6 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
pyaiw
擅长施工管理及辅助设计,并对施工技术、质量与安全的深入研究
格式:doc
大小:367KB
软件:Word
页数:0
分类:教育学
上传时间:2021-06-05
浏览量:63