RDA5807m+IIC收音機51單片機C程序文件_第1頁
RDA5807m+IIC收音機51單片機C程序文件_第2頁
RDA5807m+IIC收音機51單片機C程序文件_第3頁
RDA5807m+IIC收音機51單片機C程序文件_第4頁
RDA5807m+IIC收音機51單片機C程序文件_第5頁
已閱讀5頁,還剩8頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

/RDA5807m驅動程序+IIC程序/******************************************************************************************介紹:RD5807M收音機程序供電3.3v主控使用51單片機顯示使用LCD1602**作者:胖子**時間:2016-1-5**地點:XX電子科技大學*****************************************************************************************/#include<reg51.h>#include<string.h>#include<intrins.h>#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_R00 0X00//讀出16個位的ID=0X5800#defineRDA_R02 0X02//DHIZ[15],DMUTE[14]靜音,MONO[13]聲道,BASS[12]重低音,SEEKUP[9],SEEK[8],SKMODE[7],CLK_MODE[6:4]時鐘源選擇,SOFTRESET[1]軟復位,ENABLE[0]電源使能#defineRDA_R03 0X03//CHAN[15:6],TUNE[4],BAND[3:2],SPACE[1:0]設置頻率帶寬步長#defineRDA_R04 0X04//STCIEN[14],DE[11],I2Senable[6],#defineRDA_R05 0X05//INT_MODE[15],SEEKTH[14:8]<設定自動搜索信號強度閥值>,LNA_PORT_SEL[7:6]=0b10,LNA_ICSEL_BIT[5:4],VOLUME[3:0]音量;#defineRDA_R0A 0X0A//STC[14]seekcompleteSF[13]seekfailreadchan[9:0]當前頻道#defineRDA_R0B 0X0B//RSSI[15:9],FMTRUE[8]當前頻道是一個節(jié)目臺#defineRDA_READ0X23//讀RDA5807#defineRDA_WRITE 0X22//寫RDA5807//IO操作函數(shù)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<> //矩陣鍵盤掃描返回值是當前按鍵數(shù)值如沒按下則返回值為零{ 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;//判斷是第幾列的按鍵按下,將數(shù)據(jù)裝入高四位 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_com<unsignedcharcom>{RS=0;P0=com;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_com<0x38>;//éè??16*2??ê?£?5*7μ??ó£?8??êy?Y?úwrite_com<0x0c>;//éè???a??ê?£?2???ê?1a±êwrite_com<0x06>;//D′ò???×?·?oóμ??·?????ó1write_com<0x01>;//??ê???á?£?êy?Y??????á?}voidDisplayFrq<floatFrq> //顯示頻率{ uintF; F=Frq*10; write_com<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_com<0x80+7>; write_data<shu[F%10]>; delayms<1>;}voidDisplayVol<uintVol> //顯示音量{ write_com<0x80+0x40+4>; write_data<shu[Vol/10]>; delayms<1>; write_data<shu[Vol%10]>; delayms<1>;}voidDisplay_mute<> //顯示靜音{ write_com<0x80+0x40+4>; write_data<'x'>; delayms<1>; write_data<'x'>; delayms<1>;}voidDisplay_RSSI<uintRSSI> //顯示信號強度{ write_com<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發(fā)送字節(jié)后等待從機發(fā)送響應信{ 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> //發(fā)送應答信號{ SCL=0; SDA=0; //0±íê?ó|′e IIC_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·寫一個字節(jié){uchart;SCL=0;for<t=0;t<8;t++>{ if<<<txd&0x80>>>7>==1> SDA=1; else SDA=0;txd<<=1; IIC_delayms<>; SCL=1; IIC_delayms<>; SCL=0; IIC_delayms<>;} } ucharIICReadByte<unsignedcharack>//IIC讀一個字節(jié){ 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>; //發(fā)送芯片地址方向為寫 IIC_Wait_Ack<>; IICsendByte<regAddr>; //發(fā)送寄存器地址 IIC_Wait_Ack<>; OpenIIC<>; IICsendByte<RDA_READ>; //發(fā)送芯片地址方向為讀 IIC_Wait_Ack<>; buf=IICReadByte<1>; buf=buf<<8; buf=buf|IICReadByte<0>; CloseIIC<>; returnbuf;}voidWriteReg<ucharregAddr,uintval>//芯片寫寄存器{ OpenIIC<>; IICsendByte<RDA_WRITE>; //發(fā)送芯片地址方向為寫 IIC_Wait_Ack<>; IICsendByte<regAddr>; //發(fā)送寄存器地址 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數(shù)值越低搜到的臺越多{ 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<freq<fbtm>return; chan=<freq-fbtm>/spc; chan&=0X3FF; temp|=chan<<6; temp|=1<<4; WriteReg<RDA_R03,temp>; delayms<20>; // while<<ReadReg<0X0B>&<1<<7>>==0>;}unsignedintseek_channel<void>//半自動搜臺{ unsignedlongtemp; temp=ReadReg<RDA_R02>; temp|=<1<<8>; WriteReg<RDA_R02,temp>; //SEEK位置一使能自動搜臺 while<<ReadReg<RDA_R0A>&<1<<14>>==0>//等待STC位置一表示搜索完成 { delayms<10>;//?óê±10ms } temp=<<ReadReg<RDA_R0A>&0x3FF>*100000+87000000>/10000;//獲取當前頻率 returntemp;//返回搜到電臺頻率單位是:10Khz }voidFM_enable<ucharflag> //1使能芯片0禁用芯片{ uinttemp; temp=ReadReg<RDA_R02>; 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£?2???100Khz?μ′??a87M~108M WriteReg<RDA_R04,0x0040>;//?ù±????? WriteReg<RDA_R05,0X8882>;//ò?á?éè???avol=2???÷·§?μ?a8 FM_enable<1>;//??D???é?μ? Seekth_Set<8>; //自動搜臺信號閾值強度 0~15默認為8數(shù)值越低搜到的臺越多}voiddisplay_1602<>{ write_com<0x80>; for<num=0;num<34;num++> { write_data<a[num]>; delayms<5>; } write_com<0x80+0x40>; for<num=0;num<34;num++> { write_data<b[num]>; delayms<5>; }}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; Freq_Set<RXFreq>; DisplayFrq<RXFreq/100.0>; while<0!=ScanKey<>>; //按鍵釋放 break; } case5:{ //聲音減 if<Vol==0> Vol=0; else Vol-=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;// }// case

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論