|
單片機(jī)FM收音機(jī)的實(shí)物圖:
1348580626250.jpg (14.29 KB, 下載次數(shù): 101)
下載附件
2017-3-3 02:54 上傳
1348580660078.jpg (16.2 KB, 下載次數(shù): 114)
下載附件
2017-3-3 02:54 上傳
1348580674091.jpg (11.75 KB, 下載次數(shù): 121)
下載附件
2017-3-3 02:54 上傳
單片機(jī)FM收音機(jī)的pcb圖:
PCB.png (147.93 KB, 下載次數(shù): 105)
下載附件
2017-3-3 02:54 上傳
PCB2.png (22.04 KB, 下載次數(shù): 110)
下載附件
2017-3-3 02:54 上傳
單片機(jī)FM收音機(jī)的原理圖:
原理圖.png (64.9 KB, 下載次數(shù): 129)
下載附件
2017-3-3 02:54 上傳
源程序:
- /*****************************************************************
- FM收音機(jī)
- 作者:Anyrain
- 版本:1.0
- 說明:
-
- K1--- 向上搜索電臺(tái) K2--- 向下搜索電臺(tái)
- K3--- 音量加 K4--- 音量減
-
- *****************************************************************/
- #include <reg52.h>
- #include <intrins.h>
- #include"delay.h"
- #include "12864.h"
- #include "i2c.h"
- #include"ds1302.h"
- sbit K1 = P3^0;
- sbit K2 = P3^2;
- sbit K3 = P3^1;
- sbit K4 = P3^3;
- unsigned long frequency;
- unsigned char key,timekey,fmkey,mimiflag=0;
- unsigned int count,num;
- // RDA5807 寄存器初始值設(shè)定
- unsigned char RDA_reg_data[8] =
- {
- 0xd0,0x00, // 02H 1 1 0 1 XX 0 0
- // 正常操作無靜音 立體聲 重低音 下搜索 停止搜索
- // 0 000 XX 0 0
- // 自動(dòng)搜臺(tái) 32.768 軟件不復(fù)位 上電不使能
- 0x00,0x10, // 03H 0000000000 CHAN[9:0]
- // Frequency=Spacing(KHz)*CHAN+BAND
- // 0 0 10 00 SPACE
- // 調(diào)諧關(guān) 76-108MHz 100KHz
- 0x44,0x40, // 04H X 0 X0 0 X000
- // disable Seek/Tune Interrupt 去加重75us
- // 1 00 00 00
- // I2C使能 GPIO3高阻 GPIO2高阻 GPIO1高阻
- 0x88,0xA8, // 05H 1 0010000
- // reg0CH讀產(chǎn)生中斷 seek threshold
- // 10 00 1000 VOLUME
- // LANP 1.8mA 音量
- };
- /**************************************************************
- *********************連續(xù)寫寄存器子函數(shù)************************/
- void RDA5807_write_reg(void)
- {
- unsigned char i;
- I2C_start(); // 收音模塊寫入操作
- I2C_write_byte(0x20); // 寄存器連續(xù)寫操作
- for(i=0; i<8; i++)
- {
- I2C_write_byte(RDA_reg_data[i]);
- }
- I2C_stop();
- }
- /**********************************************************
- *******************連續(xù)讀寄存器子函數(shù)*********************/
- void RDA5807_read_reg(unsigned char *reg_buf)
- {
- I2C_start(); // 收音模塊讀取操作
- I2C_write_byte(0x21); // 寄存器連續(xù)讀操作
- reg_buf[0] = I2C_read_byte(I2C_ACK);
- reg_buf[1] = I2C_read_byte(I2C_ACK);
- reg_buf[2] = I2C_read_byte(I2C_ACK);
- reg_buf[3] = I2C_read_byte(I2C_NACK);
- I2C_stop();
- }
- /**********************************************************
- ******************模塊上電初始化子函數(shù)********************/
- void RDA5807_power(void)
- {
- delayms(50); // 發(fā)送軟件復(fù)位指令,軟件復(fù)位
- RDA_reg_data[0] = 0x00;
- RDA_reg_data[1] = 0x02;
- RDA5807_write_reg(); //寫指令
- delayms(10);
- RDA_reg_data[0] = 0xd2; // 收音模塊默認(rèn)參數(shù),上電使能
- RDA_reg_data[1] = 0x01;
- RDA5807_write_reg(); //寫指令
- }
- /**********************************************************
- ******************FM信號(hào)顯示子函數(shù)********************
- void NowSignal()
- {
- unsigned char sin;
- unsigned char reg_data1[4] = {0x00, 0x00, 0x00, 0x00}; //接收寄存初始化
- RDA5807_read_reg(reg_data1);
- delayms(20);
- sin=(reg_data1[2]>>1)&0x7f;
- WriteCommand(0x80);
- if(sin<16)
- ShowChar(0x0,1);
- else if(sin<32)
- ShowChar(0x0,2);
- else if(sin<48)
- ShowChar(0x0,3);
- else
- ShowChar(0x0,4);
- }
- **********************************************************
- ********************收音模塊自動(dòng)尋臺(tái)子函數(shù)****************/
- void RDA5807_FM_seek(void)
- {
- unsigned int chan;
- unsigned char reg_data[4] = {0x00, 0x00, 0x00, 0x00}; //接收寄存初始化
- RDA_reg_data[3] &=~(1 << 4) ; //調(diào)諧禁用
- RDA_reg_data[0] |= (1 << 0); //SEEK位置1 內(nèi)部自動(dòng)尋臺(tái)使能
- RDA5807_write_reg();
- while(0 == (reg_data[0]&0x40)) // 讀寄存器直到SF 標(biāo)志置0,自動(dòng)搜臺(tái)結(jié)束
- {
- delayms(35);
- RDA5807_read_reg(reg_data); // 讀取內(nèi)部狀態(tài)
- }
- // 獲取當(dāng)前工作頻點(diǎn)
- chan = reg_data[0] & 0x03; //READCHAN[9:8]
- chan = reg_data[1] | (chan << 8); //READCHAN[9:0]
- chan = chan << 6; //READCHAN[15:6]
-
- // 保存當(dāng)前工作頻點(diǎn)
- RDA_reg_data[2] = (chan >> 8) & 0xff; //chan高八位送03H[15:8]
- RDA_reg_data[3] = (chan & 0xff); //低位送03H[7:6]
- }
- /**********************************************************
- *********************頻率顯示子函數(shù)************************/
- void show_frequency(void)
- {
- unsigned int display[5];
- unsigned int temp,i;
- temp = (RDA_reg_data[2]*256)+(RDA_reg_data[3]&0xc0); //xxxx xxxx oo00 0000
- temp = temp>>6; //0000 00xx xxxx xxoo
- frequency = (unsigned long)(100*temp+87000)/100; //M/10
-
- display[0] = (frequency)/1000 ; //百M(fèi)最高位
- display[1] = (frequency%1000)/100; //十M位
- display[2] = (frequency%100)/10; //個(gè)M位
- display[3] = 10; //小數(shù)點(diǎn)'.'
- display[4] = (frequency%10); //ABC.X
- if(display[0] == 0)
- {
- display[0] = display[1];
- display[1] = display[2];
- display[2] = display[3];
- display[3] = display[4];
- display[4] = 18; //' '空格
- }
- for(i=0;i<5;i++)
- Displayen(1,6,24+8*i,display[i]) ; //頻率顯示
- }
- /**********************************************************
- *********************音量顯示子函數(shù)***********************/
- void show_volume()
- {
- unsigned char temp,display0[2],i;
- temp = RDA_reg_data[7] & 0x0f; //取音量值min0-max15
- display0[0] = temp/10;
- display0[1] = temp%10;
- if(display0[0] == 0) //如果高位為0
- {
- display0[0] = display0[1]; //低位顯存內(nèi)容進(jìn)入高位顯存
- display0[1] = 18; //低位不顯示
- }
-
- for(i=0;i<2;i++)
- Displayen(2,6,48+8*i,display0[i]) ; //音量值顯示
- }
- /**********************************************************
- *********************按鍵掃描子函數(shù)***********************/
- void scan()
- {
- unsigned char keyx; //用來保存短按的值
- P3=0xff;
- if(!K1)
- {
- delayms(20);
- while(!K1)
- {
- TR0=1; //啟動(dòng)定時(shí)器
- if(!timekey)
- {
- if(!fmkey)
- keyx=1; //進(jìn)入1狀態(tài)
- }
- else keyx=5;
- while(!K1); //長按時(shí)間未到,頻道增加
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關(guān)中斷 count清零
- count=0;
- }
- else //長按則進(jìn)入設(shè)置
- {
- key=4; //進(jìn)入4狀態(tài)
- timekey=~timekey; //timekey=1,設(shè)置時(shí)間。0正常時(shí)鐘
- count=0;
- TR0=0; //停止定時(shí)器
- }
-
- }
- if(!K2)
- {
- delayms(20);
- while(!K2)
- {
- TR0=1; //啟動(dòng)定時(shí)器
- if(!fmkey) //短按處理
- {
- if(timekey)
- keyx=6; //進(jìn)入6狀態(tài) 設(shè)置+
- else
- keyx=2; //進(jìn)入2狀態(tài) 音量加
- }
- else
- {
- if(timekey)
- keyx=6; //進(jìn)入6狀態(tài) 設(shè)置+
- }
-
- while(!K2); //長按時(shí)間未到
-
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關(guān)中斷 count清零
- count=0;
- }
- else //長按則進(jìn)入fm設(shè)置
- {
- key=8;
- fmkey=~fmkey; //fmkey=1關(guān)FM,0開FM
- count=0;
- TR0=0; //停止定時(shí)器
- }
-
-
- }
- if(K3 == 0)
- {
- delayms(20);
- while(K3 == 0)
- { TR0=1;
- if(!fmkey)
- {
- if(timekey)
- keyx=7; //進(jìn)入7狀態(tài) 設(shè)置-
- else
- keyx=3; //進(jìn)入3狀態(tài) 音量減
- }
- else
- {
- if(timekey)
- keyx=7; //進(jìn)入7狀態(tài) 設(shè)置-
- }
- while(K3 == 0);
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關(guān)中斷 count清零
- count=0;
- }
- else //長按則背光點(diǎn)亮
- {
- mimiflag=~mimiflag;
- count=0;
- TR0=0; //停止定時(shí)器
-
- }
- }
-
- if(!K4)
- {
- delayms(20);
- while(!K4)
- {
- TR0=1; //啟動(dòng)定時(shí)器
- keyx=5;
- while(!K4); //長按時(shí)間未到,頻道增加
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關(guān)中斷 count清零
- count=0;
- }
- else //長按則進(jìn)入設(shè)置
- {
- key=4; //進(jìn)入4狀態(tài)
- timekey=~timekey; //timekey=1,設(shè)置時(shí)間, timekey=0正常時(shí)鐘.
- count=0;
- TR0=0; //停止定時(shí)器
- }
-
- }
- }
- /**********************************************************
- ************************主函數(shù)***************************/
- void main(void)
- {
- unsigned char i,j,flag,onedone,flash=15; //閃爍標(biāo)志的位置
- TMOD=0X11; //設(shè)置定時(shí)器0、1為工作方式1
- TH0=0xb1; //延時(shí)50ms
- TL0=0Xe0;
- EA=1; //開總中斷
- ET0=1; //開定時(shí)中斷
- ET1=1;
- TR1=1;
- InitLCD(); //lcd初始化
- initdisplay();
- Init_DS1302(); //將1302初始化
- Displaytime(); //初始化顯示時(shí)間
- RDA5807_power(); //收音機(jī)模塊上電
- show_frequency(); //顯示收音機(jī)頻率
- show_volume(); //顯示聲音
- while(1)
- {
- scan();
復(fù)制代碼
0.png (80.29 KB, 下載次數(shù): 119)
下載附件
2017-3-3 02:56 上傳
完整源程序下載:
單片機(jī)FM收音機(jī)資料.rar
(359.18 KB, 下載次數(shù): 358)
2017-3-3 02:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|