標題: 我的FM 收音機,51單片機+TEA5767+12864+DS1302+DS18B20+PT2257+TDA2822M [打印本頁]

作者: l5151    時間: 2013-6-19 16:53
標題: 我的FM 收音機,51單片機+TEA5767+12864+DS1302+DS18B20+PT2257+TDA2822M
使用半年多,運行穩(wěn)定。現(xiàn)在基本每天下班都會開一個小時。分享給 51hei論壇的朋友們.
第一次獨立做一個東西,打樣了兩次。元器件也是優(yōu)先選擇當時現(xiàn)有的,所以還有很多可以繼續(xù)改進的地方。
里面很多東西都是參考了51hei論壇上的資料,相當于做了一次整理。在此表示感謝~

大體描述下:
1、TEA5767模塊,沒有采用網(wǎng)絡(luò)流傳的收臺方法,我是直接按PLL步進的方式手動收臺,估計是最精準的方式了。沒有加入自動收臺功能。
2、12864點陣屏,ST7920控制,使用了自定義字符(天線、攝氏度)。按鍵開啟背光,10秒無動作自動關(guān)閉。
3、DS1302/DS18B20,網(wǎng)絡(luò)流傳的控制程序。
4、PT2257調(diào)音,I2C控制,多級音量控制。
5、TDA2822M,雙聲道模式,但是只用了一個揚聲器(1W)。可外接功放(不通過調(diào)音器,降噪)
6、按鍵,采用中斷掃描的方式,4鍵,長按短按區(qū)分。
7、電臺存儲15個,斷電自動記憶上次使用的頻道。使用內(nèi)部EEPOM。
8、電源使用DC12V變壓器,內(nèi)部組合為7808和78M05。
9、控制器:STC12C5608AD


(原文件名:正面.jpg)


(原文件名:使用中.jpg)


(原文件名:后面.jpg)


(原文件名:右側(cè).jpg)


(原文件名:左側(cè).jpg)


(原文件名:PCB.jpg)


(原文件名:TDA2822M和DS1302.jpg)


(原文件名:TEA5767模塊.jpg)


(原文件名:按鍵和開關(guān).jpg)


(原文件名:7808和78M05.jpg)


(原文件名:程序截圖.jpg)

程序按模塊化寫法,命名、注釋等自認為還算規(guī)范,請用Keil u4打開。程序如下:
點擊此處下載 程序.rar (153.81 KB, 下載次數(shù): 3234)

原理圖是ORCAD畫的,這邊上傳PDF格式。PCB是PADS版本,沒多大_參考價值,這邊就不上傳了。
點擊此處下載 原理圖.pdf (74.04 KB, 下載次數(shù): 2365)

新手作品,還有很多地方可以繼續(xù)改進,比如:
1、利用畫圖功能,做個性化的UI。
2、加入按鍵的無線遙控。
3、報時、鬧鈴、公歷農(nóng)歷轉(zhuǎn)換。
4、外接功放音量可調(diào)。

作者: admin    時間: 2013-6-23 04:08
通過閱讀作者的 main.c 文件,發(fā)現(xiàn)作者的代碼風格很好,很值得我們學習.
#include "STC12C5620AD.H"
#include "RT12864M.H"
#include "delay.h"
#include "DS1302.H"
#include "DS18B20.H"
#include "System_Init.H"
#include "Time_Handle.H"
#include "Temperature_Handle.H"
#include "Radio.H"
#include "Key_Handle.H"
#include "Key_Scan.H"
#include "LCD_Display.H"
#include "Channel_Handle.H"
#include "Volume_Handle.H"
/********************** 聲明外部變量**************************/
extern uchar Volume;					//Volume_Handle.c
extern uchar Radio_Index;			  	 //From Channel_Handle.c
extern uint PLL;  						//From Radio.c
/**********************  定義變量 ***************************/
bit Flag_40ms;		  					//40ms定時標志位
uchar data Work_Mode=0;      			//定義系統(tǒng)狀態(tài)
uchar data Display_Time[9]={0x20,0x30,0x30,0x3a,0x30,0x30,0x3a,0x30,0x30};           //時間顯示緩存        格式  12:12:12
uchar data Display_Date[11]={0x20,0x32,0x30,0x31,0x31,0x2f,0x30,0x30,0x2f,0x30,0x30};//日期顯示緩存        格式  2011/04/07
uchar data Display_Day[3]={'M','O','N'};										     //星期顯示緩存        格式  MON,TUE,WED
uchar data Display_Temperature[5]={0x20,0x30,0x30,0x20,0x20};                        //時間顯示緩存        格式	 -23
uchar data Display_Channel[5]={0x20,0x43,0x48,0x30,0x30};                    	 	 //頻道號顯示緩存      格式	 CH07
uchar data Display_FM[9]={0x30,0x30,0x30,0x2e,0x30,0x20,0x4d,0x48,0x7a};	 		//收音頻率顯示緩存	   格式  101.71MHz			  
/********************** Timer0 Interrupt **************************/
void Timer0_Serves() interrupt 1 using 0
{
	TH0 = 0xff;		    //設(shè)定定時器重裝值
	TL0 = 0xd8;		    
	Flag_40ms=1;
}
/********** Main Function *************/
void main(void)
{
	BEEP_DRV=0;		    	   			//關(guān)閉蜂鳴器
	LCD_BLK=0;				   		  	//關(guān)閉LCD背光
	System_Init();						//初始化MCU
	LCD_Init();							//初始化RT12864M
	//DS1302_Init();					//初始化 DS1302(完全掉電后進行參數(shù)更新)
	TEA5767_Init();					  	//初始化TEA5767,寫入預置參數(shù)
	Radio_Index=EEPROM_Get_Index();  	//獲取上一次斷電存儲的電臺序號
	PLL=EEPROM_Get_PLL(Radio_Index);	//獲取當前序號PLL
	TEA5767_Update_PLL();				//更新PLL
	Volume_Init();						//初始化聲音
	while(1)
		{
			Time_Handle();
			Temperature_Handle();				  	//獲取溫度信息
			Key_Handle();
			TEA5767_Display_Frequency();
			LCD_Display();		           			//顯示刷新
		}
}

作者: 黑仔    時間: 2013-6-23 10:37
這個是高人作品,51hei論壇有你更精彩
作者: 小藝    時間: 2013-6-24 11:22
想請教一下樓主,我見你的一段程序?qū)懙煤芎?在液晶顯示字符時都沒有用得上字符轉(zhuǎn)換軟件來做,請問程序的原理是什么呢?
void LCD_Display(void)
{
        switch (Work_Mode)
                {
                        case 0:
                                LCD_Display_String(0,2,"調(diào)頻收音");                                 //當前狀態(tài)
                                

“LCD_Display_String(0,2,"調(diào)頻收音");”在程序上直接打中文,液晶就能顯示出來的?因為我查過你的程序,都沒有用字符軟件轉(zhuǎn)換出相關(guān)的字符串……是不是用帶字庫的屏,都能學你哪樣寫程序的?
作者: T29    時間: 2013-6-28 16:09
謝謝樓主。!此貼必火。。!
作者: yizanduandian    時間: 2013-6-29 21:39
回復 小藝
想請教一下樓主,我見你的一段程序?qū)懙煤芎?在液晶顯示字符時都沒有用得上字符轉(zhuǎn)換軟件來做,請問程序的原理是什么呢?
void lcd_display(void)
{
switch (work_mode)
{
case 0:
lcd_display_string(0,2,"調(diào)頻收音");  //當前狀態(tài)
“l(fā)cd_display_string(0,2,"調(diào)頻收音");”在程序上直接打中文,液晶就能顯示出來的?因為我查過你的程序,都沒有用字符軟件轉(zhuǎn)換出相關(guān)的字符串……是不是用帶字庫的屏,都能學你哪樣寫程序的?
-----------------------------------------------------------------------

用的是ST7920 帶中文字庫的屏,所以,沒有字符轉(zhuǎn)換。
作者: 左左右右    時間: 2013-7-2 16:34
您好,昨天我也用TEA5767模塊做了一個收音機。現(xiàn)在是靈敏度很低,接幾米的線當天線,在室內(nèi)一個臺都收不到(用手機的收音機在室內(nèi)可以收到電臺),以為是沒調(diào)好,但是跑上樓頂卻能收到臺了(這樣就排除了軟件問題吧)。  對這個問題可以給點思路嗎?  謝謝。  

另,可以發(fā)一份到我郵箱嗎。3543-0042 @qq.com

期待您的回復。
作者: 陳令順    時間: 2013-7-4 21:25
樓主有沒有試過TDA2822M的BTL接法?我照著手冊上的電路接了一個,輸入電阻改成了1K,音源是VS1003B,中間加了一外10uF的無極性電容,供電用的是5V的線性電源,怎么調(diào)都有問題,雜音很大,芯片發(fā)燙。。。。。。。
作者: 陳令順    時間: 2013-7-4 21:31
另外問下 怎么我編譯不成功,還有就是樓主可以上傳PCB文件嗎,我想用熱轉(zhuǎn)印法制塊板子玩玩
作者: zhengguang    時間: 2013-7-4 23:42
很好的程序編寫方式啊,學習了,樓主的程序功底看起來真不錯;
剛剛那個6樓的,12864帶字庫,就可以直接用字符串表示了,直接顯
作者: l5151    時間: 2013-7-7 18:05
陳令順 發(fā)表于 2013-7-4 21:31
另外問下 怎么我編譯不成功,還有就是樓主可以上傳PCB文件嗎,我想用熱轉(zhuǎn)印法制塊板子玩玩

請問有什么編譯錯誤?請用Keil c51 v4,導入STC器件,用官方提供的STC12C5620AD頭文件,還有注意下包含路徑。

PCB是雙層的,熱轉(zhuǎn)印不好做。要的話,我可以送你個樣板。

打樣了10塊,現(xiàn)在還剩下8塊,要的可以拿去,出個郵費就好。qq短信給我
作者: l5151    時間: 2013-7-7 18:09
左左右右 發(fā)表于 2013-7-2 16:34
您好,昨天我也用TEA5767模塊做了一個收音機,F(xiàn)在是靈敏度很低,接幾米的線當天線,在室內(nèi)一個臺都收不到 ...

附件可直接下載 51hei論壇好像沒有限制的啊,另外我已經(jīng)發(fā)送到你的郵箱了.
作者: 51hei_kmee    時間: 2013-7-9 16:55
太強大了!
作者: longlong899    時間: 2013-7-16 17:16
現(xiàn)在好東西起來越多了,支持一個,要繼續(xù)加油哇
作者: wuhaisheng258    時間: 2013-7-17 11:09
高人作品
作者: liangqin1573    時間: 2013-7-19 00:45
很好很強大
作者: zxgpy    時間: 2013-7-21 10:33
好東東,多謝。。。。。。。。
作者: guoqing24    時間: 2013-7-21 21:39
一定 要學習一下!
作者: ydsf16    時間: 2013-7-21 23:11
真是牛人啊

作者: qw789    時間: 2013-7-22 18:39
謝謝分享
作者: jacksonwang    時間: 2013-7-23 15:12
好貼,必須頂。
作者: liaows    時間: 2013-7-23 16:41
謝謝LZ的共享,很好的學習材料,謝謝!
作者: 揚帆遠航    時間: 2013-8-3 15:39
強大,
作者: 揚帆遠航    時間: 2013-8-4 14:29
好資料
作者: 啵~~    時間: 2013-8-5 10:28
謝謝樓主分享啊
作者: 何必919    時間: 2013-8-6 18:29
相當給力,感謝你的共享!
作者: wwxaimql    時間: 2013-8-9 16:33
很給力啊!
作者: aimei    時間: 2013-8-9 22:05
發(fā)現(xiàn)沒 幣了
作者: 少林寺大神父    時間: 2013-8-10 21:38
高人作品 趕快下載 看看學習一下 玩了好幾天的收音機 終于找到點能用的資料了
作者: ggsimida    時間: 2013-8-16 20:03
牛叉   樓主
作者: qw789    時間: 2013-8-18 10:20
我手頭有一塊TEA5767,但沒有STC12C5620AD,可惜!
作者: wuyutian51hei    時間: 2013-8-25 21:54
寫得很不錯!值得學習!
作者: 為愛努力    時間: 2013-9-6 14:40
初學者,打算自己也模仿做一個,希望能成功,
作者: jinchouxing    時間: 2013-10-3 21:11
好東東
作者: huyin    時間: 2013-10-4 21:32
不錯,很好
作者: 淡漠的記憶    時間: 2013-10-6 11:00
看看,資料怎樣
作者: 淡漠的記憶    時間: 2013-10-6 11:02
資料很好,謝謝了
作者: ★箛獨№牛弟    時間: 2013-10-13 17:43
謝謝作者,很好的資料,你的編程方式值得學習!

作者: 13620819446    時間: 2013-10-13 22:07
#在這里快速回復#真是不錯的資料
作者: 475345347    時間: 2013-10-18 23:18
學習學習啊

作者: 再見青春    時間: 2013-10-24 11:03
謝謝作者,很好的資料,你的編程方式值得學習!
作者: pony    時間: 2013-10-29 11:14
樓主V5
作者: 帆船    時間: 2013-10-30 17:10
代碼真是太牛逼了
作者: lf2k168    時間: 2013-10-30 17:44
{:soso_e179:}{:soso_e183:}
作者: hgr2004    時間: 2013-11-1 18:42
這個設(shè)計好。不錯。要仿造一個。
作者: 電工世界    時間: 2013-11-2 00:49
高手如云呀 {:soso_e179:}
作者: niuren    時間: 2013-11-2 01:32
51hei論壇真心不錯啊
作者: zhouzhou78    時間: 2013-11-3 19:26
好東西,學習!
作者: m182892    時間: 2013-11-6 10:35
貼子非常好,樓主高手。
作者: 氯化鈉    時間: 2013-11-15 15:59
跪謝樓主;看了下;真是好東西;對我這樣的新手學的東西太多了;再次感謝!
作者: sdmlxdli    時間: 2013-11-16 13:40
很好啊,謝謝分享。
作者: 饅頭    時間: 2013-11-16 14:33
初學者來學習的
作者: 饅頭    時間: 2013-11-16 14:42
樓主您好,我想做一個基于AT89S52單片機的無線多路溫度采集系統(tǒng)設(shè)計,您那有資料給參考嗎?有的話麻煩發(fā)個到我郵箱 534095514@qq.com  萬分感謝啊。
作者: dyun1988    時間: 2013-11-20 20:52
很好很強大
作者: zj1987510    時間: 2013-11-24 10:12
樓主太偉大了,感謝你的分享,最近也在用匯編寫PE153+5807做的收音機,給了很大的幫助,贊一個
作者: m182892    時間: 2013-11-24 11:03
參考你的資料,我也想做一個玩玩。
作者: zhangzhiyi_923    時間: 2013-11-25 00:03
樓主給一個orcad 的原理圖唄
作者: speachkone    時間: 2013-11-28 14:18
不知道能不能用C51 普通的仿一個
作者: chenppo    時間: 2013-11-29 14:43
謝謝分享。。。
作者: 守護月亮的吳剛    時間: 2013-11-30 11:18
我去。沒有M幣了………………
作者: 728528678    時間: 2013-11-30 19:20
牛人。!
作者: shenhuagen    時間: 2013-12-6 23:05
學習。。。編程思路很清晰!
作者: lijieping    時間: 2013-12-7 10:36
值得 學習!真是不錯的資料
作者: lsmilep    時間: 2013-12-11 14:42
經(jīng)帖,必火~!
作者: 謝謝伱の詤訁    時間: 2013-12-11 22:34
學習中
作者: m182892    時間: 2013-12-12 14:41
下載了,謝謝分享。
作者: xd_silly    時間: 2013-12-14 17:06
不錯不錯~樓主加油
作者: 被看穿了么    時間: 2013-12-14 23:24
分廠牛逼
作者: 被看穿了么    時間: 2013-12-15 11:02
很有成就感吧
作者: 用戶2111158    時間: 2013-12-15 19:54
學會了我也搞一個
作者: 周文    時間: 2014-1-17 17:41
肯分享才是最流的
作者: csx140118    時間: 2014-1-18 21:28
路過,下了…………
作者: wapaja    時間: 2014-1-24 22:27
能教我怎么做嗎?

作者: daizhi1970    時間: 2014-2-1 20:57
O(∩_∩)O謝謝
作者: yhu168    時間: 2014-2-9 20:26
大感謝了!
作者: dyun1988    時間: 2014-2-11 21:38
謝謝樓主分享啊
作者: wapaja    時間: 2014-2-11 21:41
好帖子要頂起來的。
作者: zhangxiaoljs    時間: 2014-2-13 23:03
謝謝學習了。。。。。。。。
作者: yamglang    時間: 2014-2-21 01:24

謝謝樓主!。〈速N必火!。!
作者: yhu168    時間: 2014-2-27 23:25
好極了!多謝了
作者: dinodine    時間: 2014-3-4 17:13
還需要錢?我沒錢啊
作者: mc0011    時間: 2014-3-5 11:07
好厲害啊,頂
作者: maker    時間: 2014-3-5 21:23
剛開始學習51,想自己搞個收音機,謝謝!
作者: 風速太一    時間: 2014-3-7 23:24
學習一下。!
作者: yhu168    時間: 2014-3-8 10:29
不錯!挺好的多謝了!這網(wǎng)站真好
作者: lyMarvin    時間: 2014-3-12 13:07
非常漂亮,謝謝分享!
作者: s3209305    時間: 2014-3-14 21:58
樓主威武!
作者: mlf    時間: 2014-3-22 13:52
樓主pcb板賣嗎?我想訪制一個。我的qq號是1970118036
作者: RainsL    時間: 2014-3-22 19:44
樓主強悍
作者: fushengge    時間: 2014-3-23 22:19
感謝樓主分享!
作者: k499138416    時間: 2014-3-25 09:44
謝謝樓主分享
作者: haieeq    時間: 2014-3-26 16:05
需要啊
作者: haieeq    時間: 2014-3-26 16:06
很需要啊
作者: yhu168    時間: 2014-3-26 16:35
我也要一個pcb板,郵箱13247510078@163.com
作者: rsbook    時間: 2014-4-2 15:43
正在做TEA5767,參考一下,謝謝!
作者: syairkiller    時間: 2014-4-2 20:38
高人
作者: liguohong    時間: 2014-4-4 13:32
留個記號,后面再來學學
作者: 馬澤強    時間: 2014-4-16 15:07
樓主做的東西太好了。
作者: mugeda    時間: 2014-4-17 22:18
很好,學習學習
作者: 書包魚。    時間: 2014-4-19 19:56
樓主可否幫我看下這個定時器延時問題出現(xiàn)在哪里#include<REG52.h>
#include<stdio.h>
#include<intrins.h>
sbit stratButton=P0^0;
sbit pauseButton=P0^1;
sbit resetButton=P0^2;
sbit exitButton=P0^3;
bit int0_Mark;
unsigned char HEXtoBCD(unsigned char hex)
{return((hex/10)*16+(hex%10));}
void main(void)
{unsigned char uc10ms=0,uc1s=0,uc60s=0;
TMOD=0x01;
IE=0x82;
while(1)
{exitButton=1;
uc10ms=0,uc1s=0,uc60s=0;
P1=HEXtoBCD(uc10ms);
P2=HEXtoBCD(uc1s);
P3=HEXtoBCD(uc60s);
while(stratButton);
while(!stratButton);
while(exitButton);
{int0_Mark=1;
TH0=0xdc; TL0=00;
TR0=1;
EA=1;
while(int0_Mark)
EA=0;
TR0=0;
uc10ms++;
if(uc10ms==100)
{uc10ms=0;uc1s++;}
P1=HEXtoBCD(uc10ms);
if(uc10ms==100)
{uc10ms=0;uc1s++;}
P1=HEXtoBCD(uc10ms);
if(uc1s==60)
{uc1s=0;uc60s++;}
P2=HEXtoBCD(uc1s);
if(uc60s==60)
uc60s=0;
P3=HEXtoBCD(uc60s);
if(!pauseButton)
{while(!pauseButton);
while(pauseButton)
{if(!resetButton)
{uc10ms=0,uc1s=0,uc60s=0;
P1=HEXtoBCD(uc10ms);
P2=HEXtoBCD(uc1s);
P3=HEXtoBCD(uc60s);
}
if(exitButton==0)
{exitButton=0;
break;
}
}
while(!pauseButton);
}
if(!resetButton)
{uc10ms=0,uc1s=0,uc60s=0;
P1=HEXtoBCD(uc10ms);
P2=HEXtoBCD(uc1s);
P3=HEXtoBCD(uc60s);
}
}
}
}
void timer0(void) interrupt 1
{EA=0;
int0_Mark=0;
TR0=0;
TH0=0xdc;TL0=00;
TR0=1;
EA=1;
  }




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1