久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 25016|回復: 13
打印 上一主題 下一主題
收起左側

51單片機+TEA5767+數碼管的FM收音機制作 電路圖+程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:72705 發表于 2015-1-24 15:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
現在網上很多網友都在做和TEA5767有關的東東,今天找到個MP4的尸體,屏碎了,打開一看剛好有能用的TEA5767,驗證了一下這個東西的實用性,用手上剛好有的51單片機開發板和lm386,為這個集成模塊搭建了一個測試平臺,下面是試驗圖片,如果在西安的朋友,肯定知道我手的那個電臺了,哈哈!
圖片一:


這個圖可以看到整體結構了,其實硬件電路很簡單,看看pdf文檔完全可以搭建出來,單片機實驗板是以前開發的商品。
圖片二:


這一部分是主要部分了,中間上面那個就是拆下來的TEA5767,它右邊是LM386,做功率放大的,下面的揚聲器是從一個筆記本里邊拆下來的(太敗家了,衰。。
        下面的程序可以直接運行了,絕對沒問題的,這個也是參考了幾個網站的程序,做了些修改,可以手動自動調臺了,手動調臺有問題,算法好像不對,但是出來的頻率問題不大,自動搜索的結果是正確的,我要提醒大家一點,自動搜臺的效果和接受強度,也就是天線,有很大的關系,我的天線是一截不到15mm的軟導線,good  luck!
  1. /***************************************************************************************************
  2. TEA5767采用I2C接口控制,單片機用AT89S52.晶振11.0592Mhz。采用四位LED顯示。
  3. TEA5767采用I2C接口控制.TEA5767讀寫數據都是5個字節,其中PLL參數14位. Fosc =11.0592Mhz.
  4. ****************************************************************************************************/
  5. #include "regx52.h"
  6. #include "intrins.h"
  7. /***********************************************************************************/
  8. #define max_freq 108000     //108Mhz
  9. #define min_freq 87500        //87.5Mhz
  10. #define max_pll 0x339b       //108MHz時的pll.
  11. #define min_pll 0x299d        //87.5MHz時的pll.
  12. #define Add_Freq    1
  13. #define Dec_Freq    0
  14. #define REFERENCE_FREQ    32.768
  15. #define ATIIcxxDriverAddressW 0xC0
  16. #define ATIIcxxDriverAddressR 0xC1
  17. #define _Nop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_()    /*定義空指令*/
  18. #define     LED     P0
  19. void Initialization(void);
  20. void Get_Pll(void);
  21. void Get_Frequency(void);
  22. void Search(unsigned char mode);
  23. void Auto_Search(unsigned char mode);
  24. unsigned char GetKey();
  25. void Delay(unsigned char Time);
  26. void Led_Display(unsigned long i);
  27. void DelayD(unsigned char Time);
  28. unsigned char GetKey();
  29. void Delay(unsigned char Time);
  30. void ATIICxx_PWrite(unsigned char *McuAddress,unsigned char count);
  31. void ATIICxx_PRead(unsigned char *McuAddress,unsigned char count);
  32. void I2C_Send_Byte(unsigned char sendbyte);
  33. unsigned char I2C_Receive_Byte(void);
  34. void I2C_Start(void);
  35. void I2C_Stop(void);
  36. void I2C_Ack(void);
  37. void I2C_Noack(void);

  38. /*********************************************************************/
  39. /* IIC讀寫程序芯片型號*/
  40. sbit I2C_SCK=P3^0; /*實時時鐘時鐘線引腳 */
  41. sbit I2C_SDA=P3^1; /*實時時鐘數據線引腳 */
  42. sbit k1=P1^7;
  43. sbit k2=P1^6;
  44. sbit k3=P1^5;
  45. sbit k4=P1^4;
  46. /*********************************************************************/
  47. /************************************************************************/
  48. sbit ge=P2^3;
  49. sbit shi=P2^2;
  50. sbit bai=P2^1;
  51. sbit qan=P2^0;
  52. unsigned char tab[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽
  53.                          //0,    1,   2   3    4    5    6    7    8    9
  54. /************************************************************************/
  55. unsigned char radio_write_data[5]={0x2d,0x56,0x20,0x11,0x00}; //初始化寫入TEA5767的數據(FM89.8Mhz)
  56. unsigned char radio_read_data[5];                    
  57. unsigned int Pll_Data;
  58. unsigned long Frequency_Data;
  59. /***********************************************************************************/
  60. void Initialization(void)
  61. {
  62.     TMOD = 0x11;
  63.     TH0 = 0x5d;
  64.     TL0 = 0x3d;
  65.     TR0 = 0;    //25ms
  66.     TH1 = 0x5d;
  67.     TL1 = 0x3d;
  68.     TR1 = 0;    //25ms
  69.     T2CON = 0x30;
  70.     T2MOD = 0x00;
  71.     RCAP2H = 0xFE;
  72.     TH2 = RCAP2H;
  73.     RCAP2L = 0xFB;
  74.     TL2 = RCAP2L;
  75.     TR2 = 0;    //2400bps
  76.     PCON = 0x00;
  77.     SCON = 0xD0;
  78.     IP = 0x14;
  79.     EX0 = 1;
  80.     IT0 = 1;
  81.     ET0 = 1;
  82.     EX1 = 1;
  83.     IT1 = 1;
  84.     ES = 0;
  85.     EA = 0;
  86. }

  87. /***********************************************************************************/
  88. //讀TEA5767狀態,并轉換成頻率
  89. void Radio_Read(void)
  90. {
  91.     unsigned char temp_l,temp_h;
  92.     Pll_Data = 0;

  93.     ATIICxx_PRead(&radio_read_data[0],5);
  94.    
  95.     temp_l = radio_read_data[1];
  96.     temp_h = radio_read_data[0];
  97.     temp_h &= 0x3f;
  98.     Pll_Data = temp_h*256+temp_l;
  99.     Get_Frequency();
  100. }

  101. /***********************************************************************************/
  102. //由PLL計算頻率
  103. void Get_Frequency(void)
  104. {
  105.     unsigned char hlsi;
  106.     unsigned int npll = 0;
  107.    
  108.     npll = Pll_Data;
  109.     hlsi = radio_read_data[2]&0x10;
  110.     if (hlsi)
  111.         Frequency_Data = (unsigned long)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25-225);    //頻率單位:KHz
  112.     else
  113.         Frequency_Data = (unsigned long)((float)(npll)*(float)REFERENCE_FREQ*(float)0.25+225);    //頻率單位:KHz
  114. }

  115. /***********************************************************************************/
  116. //由頻率計算PLL
  117. void Get_Pll(void)
  118. {
  119.     unsigned char hlsi;

  120.     hlsi = radio_read_data[2]&0x10;
  121.     if (hlsi)
  122.         Pll_Data = (unsigned int)((float)((Frequency_Data+225)*4)/(float)REFERENCE_FREQ);    //頻率單位:k
  123.     else
  124.         Pll_Data = (unsigned int)((float)((Frequency_Data-225)*4)/(float)REFERENCE_FREQ);    //頻率單位:k
  125. }

  126. /***********************************************************************************/
  127. //手動設置頻率,mode=1,+0.1MHz; mode="0:-0".1MHz ,不用考慮TEA5767用于搜臺的相關位:SM,SUD
  128. void Search(unsigned char mode)
  129. {
  130.     Radio_Read();
  131.            
  132.     if(mode)
  133.     {
  134.         Frequency_Data += 100;
  135.         if(Frequency_Data > max_freq)
  136.             Frequency_Data = min_freq;
  137.     }
  138.     else
  139.     {
  140.         Frequency_Data -= 100;
  141.         if(Frequency_Data < min_freq)
  142.             Frequency_Data = max_freq;
  143.     }
  144.             
  145.     Get_Pll();
  146.     radio_write_data[0] = Pll_Data/256;
  147.     radio_write_data[1] = Pll_Data%256;
  148.     radio_write_data[2] = 0x41;
  149.     radio_write_data[3] = 0x11;
  150.     radio_write_data[4] = 0x40;
  151.     ATIICxx_PWrite(&radio_write_data[0],5);
  152. }

  153. /***********************************************************************************/
  154. //自動搜臺,mode=1,頻率增加搜臺; mode="0:頻率減小搜臺".
  155. void Auto_Search(unsigned char mode)
  156. {
  157.     Radio_Read();
  158.     Get_Pll();
  159.     if(mode)
  160.     {
  161.         radio_write_data[2] = 0xb1;
  162.         if(Pll_Data > max_pll)
  163.         {
  164.             Pll_Data = min_pll;
  165.         }
  166.     }
  167.     else
  168.     {
  169.         radio_write_data[2] = 0x41;
  170.         if(Pll_Data < min_pll)
  171.         {
  172.             Pll_Data = max_pll;
  173.         }
  174.     }
  175.          
  176.     radio_write_data[0] = Pll_Data/256+0x40;
  177.     radio_write_data[1] = Pll_Data%256;   
  178.     radio_write_data[3] = 0x11;
  179.     radio_write_data[4] = 0x40;
  180.     ATIICxx_PWrite(&radio_write_data[0],5);
  181.     Radio_Read();
  182.     while(!(radio_read_data[0]&0x80))     //RF電臺就緒標志
  183.     {
  184.         Radio_Read();
  185.     }   
  186. }

  187. /***********************************************************************************/
  188. void main(void)
  189. {
  190. //0x2d,0x56,0x20,0x11,0x00
  191.     unsigned long temp;
  192.     Initialization();
  193.     radio_write_data[0] =0x2A;
  194.     radio_write_data[1] =0xB6;
  195.     radio_write_data[2] =0x41;
  196.     radio_write_data[3] =0x11;
  197.     radio_write_data[4] =0x40;
  198.     ATIICxx_PWrite(&radio_write_data[0],5);//初始化TEA5767(89.8Mhz)
  199.     Frequency_Data = 89800;

  200.     while(1)
  201.     { temp= Frequency_Data;
  202.     Led_Display(Frequency_Data);

  203. if( k1 == 0)
  204.    { DelayD(2);
  205.       while(k1 == 0);//等待鍵松開
  206.       Search(Add_Freq);
  207.    }
  208. if( k2 == 0)
  209.    { DelayD(2);
  210.       while(k2 == 0);//等待鍵松開
  211.     Search(Dec_Freq);
  212.    }
  213. if( k3 == 0)
  214.    { DelayD(2);
  215.       while(k3 == 0);//等待鍵松開
  216.     Auto_Search(Add_Freq);
  217.    }
  218. if( k4 == 0)
  219.    { DelayD(2);
  220.       while(k4 == 0);//等待鍵松開
  221.     Auto_Search(Dec_Freq);
  222.    }

  223.     }
  224. }

  225. /*********************************************************************/
  226. struct bytedata_2
  227. {
  228. unsigned char ByteH;
  229. unsigned char ByteL;
  230. };

  231. union int2byte
  232. {
  233. unsigned int IntData;
  234. struct bytedata_2 ByteData;
  235. };
  236. /*********************************************************************/
  237. //啟動I2C總線,退出時SCL為低
  238. void I2C_Start(void)
  239. {
  240. I2C_SDA=1;    /*發送起始條件的數據信號*/
  241. _Nop();
  242. I2C_SCK=1;
  243. _Nop();_Nop();_Nop();_Nop();_Nop();/*起始條件建立時間大于4.7us,延時*/
  244. I2C_SDA=0;    /*發送起始信號*/
  245. _Nop();_Nop();_Nop();_Nop();_Nop();     /* 起始條件鎖定時間大于4μs*/
  246. I2C_SCK=0;    /*鉗住I2C總線,準備發送或接收數據 */
  247. _Nop();_Nop();_Nop();_Nop();_Nop();/*起始條件建立時間大于4.7us,延時*/
  248. }
  249. //*停止I2C總線
  250. void I2C_Stop(void)
  251. {
  252. I2C_SCK=0;
  253. I2C_SDA=0;   /*發送結束條件的數據信號*/
  254. _Nop();           /*發送結束條件的時鐘信號*/
  255. I2C_SCK=1;   /*結束條件建立時間大于4μs*/
  256. _Nop();_Nop();_Nop();_Nop();_Nop();
  257. I2C_SDA=1;   /*發送I2C總線結束信號*/
  258. }
  259. //MCU等待應答位(返回0表示應答)
  260. bit I2C_WaitAck(void)
  261. {
  262. unsigned char ucErrTime = 200;    //因故障接收方無ACK,超時值。

  263. I2C_SCK=0;
  264. I2C_SDA=1;
  265. _Nop();
  266. I2C_SCK=1;
  267. while(I2C_SDA)
  268. {
  269.        ucErrTime--;
  270.        if (ucErrTime == 0)
  271.        {
  272.           I2C_Stop();
  273.           return 0;
  274.         }
  275. }

  276. I2C_SCK=0;
  277. return 1;
  278. }
  279. //MCU應答信號
  280. void I2C_Ack(void)
  281. {
  282. I2C_SCK=0;
  283. I2C_SDA=0;
  284. _Nop();
  285. _Nop();
  286. _Nop();
  287. _Nop();
  288. _Nop();
  289. I2C_SCK=1;
  290. _Nop();
  291. _Nop();
  292. _Nop();
  293. _Nop();
  294. _Nop();
  295. I2C_SCK=0;
  296. }
  297. //MCU發送非應答信號
  298. void I2C_Noack(void)
  299. {
  300. I2C_SCK=0;
  301. I2C_SDA=1;
  302. _Nop();
  303. _Nop();
  304. I2C_SCK=1;
  305. _Nop();
  306. _Nop();
  307. I2C_SCK=0;
  308. }
  309. void I2C_Send_Byte(unsigned char sendbyte)
  310. {
  311. unsigned char i = 8;

  312. while( i-- )
  313. {
  314.    I2C_SCK = 0;
  315.    _Nop(); //_Nop();
  316.    if ( sendbyte &0x80 ) I2C_SDA =1;
  317.    else I2C_SDA =0;
  318.    _Nop(); //_Nop();
  319.    I2C_SCK = 1;
  320.    _Nop(); //_Nop();
  321.    sendbyte <<= 1;
  322. }

  323. I2C_WaitAck();
  324. }

  325. static unsigned char I2C_Receive_Byte(void)
  326. {
  327. unsigned char i = 8, data_buffer;

  328. I2C_SDA = 1;
  329. while ( i--)
  330. {
  331.    I2C_SCK =0;
  332.    _Nop();_Nop();
  333.    I2C_SCK =1;
  334.    _Nop();_Nop();
  335.    data_buffer <<= 1;

  336.    if ( I2C_SDA ) data_buffer++;
  337. }
  338. return (data_buffer);
  339. }

  340. void ATIICxx_PWrite(unsigned char *McuAddress,unsigned char count)
  341. {
  342. I2C_Start();
  343. I2C_Send_Byte( ATIIcxxDriverAddressW );
  344. while(count--)
  345. {
  346.    I2C_Send_Byte( *(unsigned char*)McuAddress );
  347.    ((unsigned char*)McuAddress)++;
  348. }
  349. I2C_Stop();
  350. }

  351. void ATIICxx_PRead(unsigned char *McuAddress,unsigned char count)
  352. {
  353. I2C_Start();
  354. I2C_Send_Byte( ATIIcxxDriverAddressR );
  355. while(count--)
  356. {
  357.    *McuAddress = I2C_Receive_Byte();
  358.    I2C_Ack();
  359.    McuAddress++;
  360. }

  361. I2C_Noack();
  362. I2C_Stop();
  363. }

  364. void DelayD(unsigned char Time)
  365. {
  366.         unsigned char i;
  367.       
  368.         while( --Time != 0)
  369.         {
  370.                 for(i = 0; i < 125; i++); //i 從0加到125,CPU大概就耗時1 毫秒 。
  371.         }
  372. }

  373. /************************************************************************/
  374. void Led_Display(unsigned long i)             //顯示函數
  375. {
  376. LED = tab[i/100000];
  377. qan = 0;
  378. bai = 1;
  379. shi = 1;
  380. ge = 1;
  381. DelayD(3);
  382. LED = tab[(i%100000)/10000];
  383. qan = 1;
  384. bai = 0;
  385. shi = 1;
  386. ge = 1;
  387. DelayD(3);
  388. LED = tab[((i%100000)%10000)/1000]&0x7f;
  389. qan = 1;
  390. bai = 1;
  391. shi = 0;
  392. ge = 1;
  393. DelayD(3);
  394. LED = tab[(((i%100000)%10000)%1000)/100];
  395. qan = 1;
  396. bai = 1;
  397. shi = 1;
  398. ge = 0;
  399. DelayD(3);
  400. }
復制代碼

希望大家可以繼續改進,讓這個東東的功能達到完善。

評分

參與人數 2黑幣 +6 收起 理由
zhangli019 + 1 贊一個!
madell + 5 贊一個!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:62214 發表于 2015-4-7 12:59 | 只看該作者
看看有作用么??
回復

使用道具 舉報

板凳
ID:91160 發表于 2015-9-27 15:02 | 只看該作者
樓主這個 ge shi bai qian 數碼管是怎么接的?
回復

使用道具 舉報

地板
ID:86796 發表于 2015-11-19 21:50 | 只看該作者
如何才能讓每次自動調頻到電臺的頻點時候,停止,然后滴滴兩聲
還能否加上諸如DOLBY降噪的程序呢?
音頻的降噪處理,立體聲如何解析?
如果廣播電臺播出的是5.1聲道的呢?
回復

使用道具 舉報

5#
ID:96320 發表于 2015-11-24 09:16 | 只看該作者
謝謝樓主,這回有的折騰啦,哈哈哈
回復

使用道具 舉報

6#
ID:97359 發表于 2015-11-27 15:30 | 只看該作者
膜拜!太有才了!西安音樂臺
回復

使用道具 舉報

7#
ID:72088 發表于 2016-9-25 16:39 | 只看該作者
wh369258we 發表于 2015-9-27 15:02
**** 作者被禁止或刪除 內容自動屏蔽 ****

sbit ge=P2^3;
sbit shi=P2^2;
sbit bai=P2^1;
sbit qan=P2^0;程序有說明的
回復

使用道具 舉報

8#
ID:156636 發表于 2016-12-21 19:38 | 只看該作者
你好,我想請問一下,是一定需要功率放大模塊(比如lm386)嗎?
回復

使用道具 舉報

9#
ID:35873 發表于 2017-4-25 00:28 | 只看該作者
樓主搞得不錯哇
回復

使用道具 舉報

10#
ID:272625 發表于 2018-1-7 23:08 | 只看該作者
感謝樓主,這是我需要的
回復

使用道具 舉報

11#
ID:272625 發表于 2018-1-7 23:15 | 只看該作者
樓主把圖紙也發上來,我也想試下
回復

使用道具 舉報

12#
ID:276348 發表于 2018-1-21 22:26 | 只看該作者
這個代碼就非常好的。
回復

使用道具 舉報

13#
ID:697604 發表于 2020-2-24 19:38 | 只看該作者
感謝分享啦,謝謝樓主
回復

使用道具 舉報

14#
ID:860602 發表于 2021-1-9 09:02 | 只看該作者

你好,我想請問一下,是一定需要功率放大模塊(比如lm386)嗎? 是的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费在线观看一区二区 | 国产男女猛烈无遮掩视频免费网站 | 波多野结衣精品 | 99一级毛片 | 亚洲三级av | 在线小视频 | 日韩欧美专区 | 性网站免费 | 久久精品国产一区二区电影 | 365夜爽爽欧美性午夜免费视频 | 午夜精品一区二区三区三上悠亚 | 亚洲午夜视频在线观看 | 日韩一二区 | 午夜网 | 日韩免费一二三区 | 夜夜夜夜夜夜曰天天天 | 欧美一区二区三区在线视频 | 成人免费视频网站在线看 | 国产精品自拍视频网站 | 亚洲性爰 | 久久久久国产精品一区二区 | 久久www免费人成看片高清 | 久久久久99 | 岛国在线免费观看 | 日韩精品一区二区三区视频播放 | 日韩在线观看视频一区 | 91九色porny首页最多播放 | 午夜tv免费观看 | 亚洲国产一区视频 | 久久久久国产 | 久久精品国产精品青草 | 日韩精品一区二区三区中文在线 | 偷拍自拍第一页 | 免费h在线 | 在线 丝袜 欧美 日韩 制服 | 亚洲国产一区二区三区在线观看 | 国产欧美在线视频 | 青青久草| 国产精品九九视频 | 超碰国产在线 | 久久精品国产一区 |