|
單片機FM收音機的實物圖:
1348580626250.jpg (14.29 KB, 下載次數: 101)
下載附件
2017-3-3 02:54 上傳
1348580660078.jpg (16.2 KB, 下載次數: 114)
下載附件
2017-3-3 02:54 上傳
1348580674091.jpg (11.75 KB, 下載次數: 121)
下載附件
2017-3-3 02:54 上傳
單片機FM收音機的pcb圖:
PCB.png (147.93 KB, 下載次數: 105)
下載附件
2017-3-3 02:54 上傳
PCB2.png (22.04 KB, 下載次數: 110)
下載附件
2017-3-3 02:54 上傳
單片機FM收音機的原理圖:
原理圖.png (64.9 KB, 下載次數: 129)
下載附件
2017-3-3 02:54 上傳
源程序:
- /*****************************************************************
- FM收音機
- 作者:Anyrain
- 版本:1.0
- 說明:
-
- K1--- 向上搜索電臺 K2--- 向下搜索電臺
- 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 寄存器初始值設定
- unsigned char RDA_reg_data[8] =
- {
- 0xd0,0x00, // 02H 1 1 0 1 XX 0 0
- // 正常操作無靜音 立體聲 重低音 下搜索 停止搜索
- // 0 000 XX 0 0
- // 自動搜臺 32.768 軟件不復位 上電不使能
- 0x00,0x10, // 03H 0000000000 CHAN[9:0]
- // Frequency=Spacing(KHz)*CHAN+BAND
- // 0 0 10 00 SPACE
- // 調諧關 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讀產生中斷 seek threshold
- // 10 00 1000 VOLUME
- // LANP 1.8mA 音量
- };
- /**************************************************************
- *********************連續寫寄存器子函數************************/
- void RDA5807_write_reg(void)
- {
- unsigned char i;
- I2C_start(); // 收音模塊寫入操作
- I2C_write_byte(0x20); // 寄存器連續寫操作
- for(i=0; i<8; i++)
- {
- I2C_write_byte(RDA_reg_data[i]);
- }
- I2C_stop();
- }
- /**********************************************************
- *******************連續讀寄存器子函數*********************/
- void RDA5807_read_reg(unsigned char *reg_buf)
- {
- I2C_start(); // 收音模塊讀取操作
- I2C_write_byte(0x21); // 寄存器連續讀操作
- 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();
- }
- /**********************************************************
- ******************模塊上電初始化子函數********************/
- void RDA5807_power(void)
- {
- delayms(50); // 發送軟件復位指令,軟件復位
- RDA_reg_data[0] = 0x00;
- RDA_reg_data[1] = 0x02;
- RDA5807_write_reg(); //寫指令
- delayms(10);
- RDA_reg_data[0] = 0xd2; // 收音模塊默認參數,上電使能
- RDA_reg_data[1] = 0x01;
- RDA5807_write_reg(); //寫指令
- }
- /**********************************************************
- ******************FM信號顯示子函數********************
- 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);
- }
- **********************************************************
- ********************收音模塊自動尋臺子函數****************/
- void RDA5807_FM_seek(void)
- {
- unsigned int chan;
- unsigned char reg_data[4] = {0x00, 0x00, 0x00, 0x00}; //接收寄存初始化
- RDA_reg_data[3] &=~(1 << 4) ; //調諧禁用
- RDA_reg_data[0] |= (1 << 0); //SEEK位置1 內部自動尋臺使能
- RDA5807_write_reg();
- while(0 == (reg_data[0]&0x40)) // 讀寄存器直到SF 標志置0,自動搜臺結束
- {
- delayms(35);
- RDA5807_read_reg(reg_data); // 讀取內部狀態
- }
- // 獲取當前工作頻點
- chan = reg_data[0] & 0x03; //READCHAN[9:8]
- chan = reg_data[1] | (chan << 8); //READCHAN[9:0]
- chan = chan << 6; //READCHAN[15:6]
-
- // 保存當前工作頻點
- RDA_reg_data[2] = (chan >> 8) & 0xff; //chan高八位送03H[15:8]
- RDA_reg_data[3] = (chan & 0xff); //低位送03H[7:6]
- }
- /**********************************************************
- *********************頻率顯示子函數************************/
- 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最高位
- display[1] = (frequency%1000)/100; //十M位
- display[2] = (frequency%100)/10; //個M位
- display[3] = 10; //小數點'.'
- 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]) ; //頻率顯示
- }
- /**********************************************************
- *********************音量顯示子函數***********************/
- 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]; //低位顯存內容進入高位顯存
- display0[1] = 18; //低位不顯示
- }
-
- for(i=0;i<2;i++)
- Displayen(2,6,48+8*i,display0[i]) ; //音量值顯示
- }
- /**********************************************************
- *********************按鍵掃描子函數***********************/
- void scan()
- {
- unsigned char keyx; //用來保存短按的值
- P3=0xff;
- if(!K1)
- {
- delayms(20);
- while(!K1)
- {
- TR0=1; //啟動定時器
- if(!timekey)
- {
- if(!fmkey)
- keyx=1; //進入1狀態
- }
- else keyx=5;
- while(!K1); //長按時間未到,頻道增加
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關中斷 count清零
- count=0;
- }
- else //長按則進入設置
- {
- key=4; //進入4狀態
- timekey=~timekey; //timekey=1,設置時間。0正常時鐘
- count=0;
- TR0=0; //停止定時器
- }
-
- }
- if(!K2)
- {
- delayms(20);
- while(!K2)
- {
- TR0=1; //啟動定時器
- if(!fmkey) //短按處理
- {
- if(timekey)
- keyx=6; //進入6狀態 設置+
- else
- keyx=2; //進入2狀態 音量加
- }
- else
- {
- if(timekey)
- keyx=6; //進入6狀態 設置+
- }
-
- while(!K2); //長按時間未到
-
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關中斷 count清零
- count=0;
- }
- else //長按則進入fm設置
- {
- key=8;
- fmkey=~fmkey; //fmkey=1關FM,0開FM
- count=0;
- TR0=0; //停止定時器
- }
-
-
- }
- if(K3 == 0)
- {
- delayms(20);
- while(K3 == 0)
- { TR0=1;
- if(!fmkey)
- {
- if(timekey)
- keyx=7; //進入7狀態 設置-
- else
- keyx=3; //進入3狀態 音量減
- }
- else
- {
- if(timekey)
- keyx=7; //進入7狀態 設置-
- }
- while(K3 == 0);
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關中斷 count清零
- count=0;
- }
- else //長按則背光點亮
- {
- mimiflag=~mimiflag;
- count=0;
- TR0=0; //停止定時器
-
- }
- }
-
- if(!K4)
- {
- delayms(20);
- while(!K4)
- {
- TR0=1; //啟動定時器
- keyx=5;
- while(!K4); //長按時間未到,頻道增加
- }
- if(count<15)
- {
- key=keyx;
- TR0=0; //關中斷 count清零
- count=0;
- }
- else //長按則進入設置
- {
- key=4; //進入4狀態
- timekey=~timekey; //timekey=1,設置時間, timekey=0正常時鐘.
- count=0;
- TR0=0; //停止定時器
- }
-
- }
- }
- /**********************************************************
- ************************主函數***************************/
- void main(void)
- {
- unsigned char i,j,flag,onedone,flash=15; //閃爍標志的位置
- TMOD=0X11; //設置定時器0、1為工作方式1
- TH0=0xb1; //延時50ms
- TL0=0Xe0;
- EA=1; //開總中斷
- ET0=1; //開定時中斷
- ET1=1;
- TR1=1;
- InitLCD(); //lcd初始化
- initdisplay();
- Init_DS1302(); //將1302初始化
- Displaytime(); //初始化顯示時間
- RDA5807_power(); //收音機模塊上電
- show_frequency(); //顯示收音機頻率
- show_volume(); //顯示聲音
- while(1)
- {
- scan();
復制代碼
0.png (80.29 KB, 下載次數: 119)
下載附件
2017-3-3 02:56 上傳
完整源程序下載:
單片機FM收音機資料.rar
(359.18 KB, 下載次數: 358)
2017-3-3 02:57 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|