圣源电子制作

 找回密码
 立即注册
查看: 16235|回复: 4
打印 上一主题 下一主题

ATMEGA8单片机控制的TEA5767高性能FM收音机-制作DIY

[复制链接]
跳转到指定楼层
#
发表于 2011-10-15 21:59:08 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
转载自互联网!!!
原理图





程序
  1. // WINAVR    GCC
  2. // ATmega8     
  3. // clock: internal 1Mhz

  4. #include <avr/io.h>
  5. #include <avr/interrupt.h>
  6. #include <avr/signal.h>
  7. #include <avr/delay.h>
  8. #include <avr/eeprom.h>
  9. #include "3310LCD_function.c"

  10. #define uchar uint8_t
  11. #define uint  uint16_t

  12. #define SLA_W 0b11000000
  13. #define SLA_R 0b11000001

  14. uchar senddata[5] ;
  15. uchar readdata[5] ;
  16. uchar search = 0;
  17. uchar search_up = 0;

  18. //-------------------------------
  19. // 延时
  20. void delay_ms(uint ms)
  21. {
  22.         uint i;
  23.         for(i=0;i<ms;i++)
  24.                 _delay_loop_2(250);
  25. }

  26. void set5767(void)
  27. {
  28.         uchar i = 0;
  29.         
  30.         TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL
  31.         while (!(TWCR & (1<<TWINT)));           // WAIT FOR START SIG
  32.         //if ((TWSR & 0xF8) != START)  ERROR();
  33.         
  34.         TWDR = SLA_W;                            // send address
  35.         TWCR = (1<<TWINT) | (1<<TWEN);
  36.         while (!(TWCR & (1<<TWINT)));
  37.         //if ((TWSR & 0xF8) !=MT_SLA_ACK) ERROR();
  38.         
  39.         for ( i = 0; i < 5; i++ )
  40.         {
  41.                 TWDR = senddata[i];
  42.                 TWCR = (1<<TWINT) | (1<<TWEN);      // send data
  43.                 while (!(TWCR & (1<<TWINT)));
  44.         //        if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();
  45.         }
  46.         
  47.         TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL
  48.         
  49.         //LCD_write_english_string(60,3,"sOK");
  50. }


  51. void read5767(void)
  52. {
  53.         uchar i = 0;
  54.         
  55.         TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // SEND START SIGNAL
  56.         while (!(TWCR & (1<<TWINT)));           // WAIT FOR START SIG
  57.         //if ((TWSR & 0xF8) != START)  ERROR();
  58.         
  59.         TWDR = SLA_R;                            // send address
  60.         TWCR = (1<<TWINT) | (1<<TWEN);
  61.         while (!(TWCR & (1<<TWINT)));
  62.         //if ((TWSR & 0xF8) !=MT_SLA_ACK) ERROR();
  63.         //TWCR = (1<<TWINT) | (1<<TWEN);
  64.         
  65.         for ( i = 0; i < 5; i++ )
  66.         {
  67.                 TWCR = (1<<TWINT) | (1<<TWEN);      // read data
  68.                 while (!(TWCR & (1<<TWINT)));
  69.                 readdata[i] = TWDR ;
  70.                
  71.                
  72.         //        if ((TWSR & 0xF8) != MT_DATA_ACK) ERROR();
  73.         }
  74.         
  75.         TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); //SEND STOP SIGNAL

  76.         //LCD_write_english_string(10,3,"rOK");
  77. }

  78. void show_frequency(void)               
  79. {
  80.         uint32_t nPLL =0;                            //Dec
  81.         uint32_t frequency = 0;                //Khz
  82.         uchar display_bit[5];
  83.         
  84.         uchar tbTmp1=readdata[1];
  85.         uchar tbTmp2=readdata[0];
  86.         tbTmp2&=0x3f;

  87.         nPLL=tbTmp2*256+tbTmp1;
  88.          
  89.         // calculate searched station frequency  
  90.     if(senddata[2]&0x10)
  91.                 frequency =(unsigned long)(nPLL*82/10-225);
  92.     else
  93.                 frequency =(unsigned long)(nPLL*82/10+225);
  94.                
  95.         display_bit[0] = frequency / 100000 ;
  96.         if ( display_bit[0] == 0 ) display_bit[0] = 0x20;
  97.         else display_bit[0] += 0x30;
  98.         
  99.         display_bit[1] = (frequency / 10000)%10 +0x30;
  100.         display_bit[2] = (frequency / 1000)%10 +0x30;
  101.         display_bit[3] = (frequency / 100)%10 +0x30;
  102.         display_bit[4] = (frequency / 10)%10 +0x30;
  103.         LCD_write_english_string(0,2," " );
  104.          LCD_write_char(display_bit[0]);
  105.          LCD_write_char(display_bit[1]);
  106.          LCD_write_char(display_bit[2]);
  107.          LCD_write_english_string(25,2,"." );
  108.          LCD_write_char(display_bit[3]);
  109.          LCD_write_char(display_bit[4]);
  110.         LCD_write_english_string(43,2," MHz" );
  111.    
  112. }
  113. void show_rx_power(void)
  114. {
  115.         uchar temp;
  116.         
  117.         temp = (readdata[3]>>4);
  118.         
  119.         LCD_write_english_string(60,0," ");
  120.         
  121.         LCD_write_char((temp/10)%10 + 0x30 );
  122.         LCD_write_char(temp%10 + 0x30 );
  123. }

  124. void init(void)
  125. {
  126.         DDRB = 0XFF;
  127.         PORTB = 0XFF;
  128.         
  129.         DDRD = 0B11100000;
  130.         PORTD = 0XFF;
  131.         
  132.         DDRC = 0B00000000;
  133.         PORTC = 0Xff;      //  IO init
  134.         
  135.         delay_nms(100);
  136.         //TWI
  137.         TWBR = 12;
  138.         TWCR = (1<<TWEN); //SEND STOP SIGNAL
  139.         
  140.          
  141.     OSCCAL=0x9d;                        // 8M系统内部时钟校准   
  142.     //设置MCU的I/O口
  143.     DDRB |= LCD_RST | LCD_DC | LCD_CE | SPI_MOSI | SPI_CLK;
  144.    
  145.         SPSR |= (1<<SPI2X);                 // 设置SPI时钟倍速
  146.     SPCR |= (1<<SPE)|(1<<MSTR);                // 使能SPI接口,主机模式,4M时钟

  147.     LCD_init(); //初始化液晶  

  148. }


  149. //////////////////////////////////////////////////////////////////
  150. int main(void)
  151. {
  152.         init();
  153.         
  154.         senddata[0] = 0b01101111;  //load 100MHz pll
  155.         senddata[1] = 0b10010011;  // away's low side injection
  156.         senddata[2] = 0b00100000;
  157.         senddata[3] = 0b10010000;                                                                  
  158.         senddata[4] = 0b00000000;
  159.         readdata[0] = senddata[0];
  160.         readdata[1] = senddata[1];
  161.         
  162.         LCD_write_english_string(0,0,"FM STEREO" );        
  163.         //LCD_write_english_string(0,5,"  stereo" );
  164.         LCD_write_english_string(0,2,"  99.1Mhz" );
  165.         show_frequency();
  166.         LCD_write_inverse_string(0,5,"  UP  ");
  167.         LCD_write_inverse_string(48,5," DOWN ");
  168.         
  169.         while(1)
  170.         {
  171.         
  172.                 if ( bit_is_clear( PIND,3))
  173.                 {
  174.                         delay_nms(20);
  175.                         if ( bit_is_clear( PIND,3))
  176.                         {
  177.                                 loop_until_bit_is_set(PIND, 3);
  178.                                 LCD_write_english_string(0,4,"KEY1 press" );
  179.                                 senddata[2] &= 0x7f;   // set search down
  180.                                 set5767();
  181.                                 LCD_write_english_string(0,4,"searching down" );
  182.                                 
  183.                                 search_up = 0;
  184.                                 search = 1;
  185.                         }
  186.                 }
  187.                
  188.                 if ( bit_is_clear( PIND,2))
  189.                 {
  190.                         delay_nms(20);
  191.                         if ( bit_is_clear( PIND,2))
  192.                         {
  193.                                 
  194.                                 loop_until_bit_is_set(PIND, 2);
  195.                                 LCD_write_english_string(0,4,"KEY2 press" );
  196.                                 
  197.                                 senddata[2] |= 0x80;   // set search up
  198.                                 set5767();
  199.                                 LCD_write_english_string(0,4,"searching up  ");
  200.                                 
  201.                                 search_up = 1;
  202.                                 search = 1;
  203.                                 
  204.                         }
  205.                 }
  206.                
  207.                
  208.                 if ( search )
  209.                 {
  210.                         read5767();
  211.                         
  212.                         if ( readdata[0] & 0x40 )  //reach band end
  213.                         {
  214.                                 if ( search_up )
  215.                                 {
  216.                                         senddata[0] = 0b01101001;    // load 88Mhz pll
  217.                                         senddata[1] = 0b11011010;
  218.                                         set5767();
  219.                                 }
  220.                                 else                  
  221.                                 {
  222.                                         senddata[0] = 0b01110011;    // load 108Mhz pll
  223.                                         senddata[1] = 0b01100100;
  224.                                         set5767();
  225.                                 }
  226.                         }
  227.                         
  228.                         
  229.                         
  230.                         if ( readdata[0] & 0x80)   //has been found a station
  231.                         {
  232.                                 show_frequency();
  233.                                 show_rx_power();
  234.                                 senddata[0] = ((readdata[0] & 0x3f) |0x40);
  235.                                 senddata[1] = readdata[1];  //record the pll
  236.                                 
  237.                                 search = 0;
  238.                         }
  239.                         
  240.                 }
  241.                
  242.         }
  243. }
复制代码




原理图.pdf (20.15 KB, 下载次数: 125)




程序.rar

8.5 KB, 下载次数: 113

回复

使用道具 举报

地板
发表于 2014-10-1 12:33:05 | 只看该作者
谢谢 这是我需要的
回复 支持 反对

使用道具 举报

板凳
发表于 2013-2-3 16:20:37 | 只看该作者
唉~~~还是不明白你这个东西,有视屏看吗???
回复 支持 反对

使用道具 举报

沙发
 楼主| 发表于 2012-6-22 15:07:10 | 只看该作者
wlsy008 发表于 2012-6-22 08:01
楼主熔丝怎么设置的呀

  默认设置 就可以了  1MHZ 内部晶振
回复 支持 反对

使用道具 举报

楼主
发表于 2012-6-22 08:01:54 | 只看该作者
楼主熔丝怎么设置的呀
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|联系我们|闽公网安备 35012102000020号|闽ICP备11020110号-1|圣源电子

GMT+8, 2024-11-23 18:16 , Processed in 0.047413 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表