欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: iic-RAD5820-STC15單片機驅動程序 [打印本頁]

作者: wangydong    時間: 2016-10-24 20:23
標題: iic-RAD5820-STC15單片機驅動程序
關于RAD5820的C語言程序,iic協議

資料打包下載:
mic-rda20160823.rar (36.52 KB, 下載次數: 22)

主程序預覽:
  1. #define         MAIN_Fosc                24000000UL                 //24M
  2. #include        "STC15Fxxxx.H"
  3. #include <i2c.h>

  4. /*I2C interface
  5. sbit SCL = P1^5;
  6. sbit SDA = P1^6;*/

  7. //clk out     STC --> RDA  SUPORT 32.768KHz/12M/24M/13M/26M/19.2/38.4M
  8. sbit RCLK = P5^4;   //RST /SysClk0 /SS_3 /CMP+   RDA5820clk    12M

  9. //HID interface
  10. sbit VOICE = P2^3;  //HZ   1S/ TIME  3S
  11. sbit BACK = P0^4;  //BACK  1S/ VOL-  3S
  12. sbit NEXT = P5^2;  //NEXT  1S/ VOL+  3S


  13. /*i2c
  14. #define max_freq 108000
  15. #define min_freq 87500*/

  16. unsigned char RDA_rest[3]={0x02,0x00,0x02,};        //要寫入RDA5820的數據
  17. unsigned char radio_write_data[3]={0x02,0x00,0x02,};
  18. //unsigned char radio_write_data[5]={0x2a,0xb6,0x40,0x11,0x40};        //要寫入TEA5767的數據

  19. unsigned char radio_read_data[5];        //TEA5767讀出的狀態
  20. unsigned int default_pll=0x301d;         //0x29f9;        //默認存臺的pll,95.8MHz
  21. //unsigned int max_pll=0x339b;           //108MHz時的pll,
  22. //unsigned int min_pll=9000;             //70MHz時的pll
  23. unsigned long frequency;
  24. unsigned int pll;

  25. /*void delay(unsigned int time)
  26. {
  27. while(time--);
  28. }*/

  29. void delay1ms (unsigned int b)//1ms
  30. {
  31. for(b;b>0;b--)
  32. {unsigned int i;
  33.   for(i=0;i<300;i++)
  34.    {;}
  35. }
  36. }

  37. void radio_write(void)
  38. {
  39.     unsigned char i;
  40.     iic_start();
  41.     iic_write8bit(0x22);        //RDA5820寫地址
  42.     if(!iic_testack())
  43.     {
  44.         for(i=0;i<3;i++)
  45.         {
  46.             iic_write8bit(radio_write_data[i]);
  47.             iic_ack();
  48.         }
  49.     }
  50.     iic_stop();   
  51. }

  52. //由頻率計算PLL
  53. void get_pll(void)
  54. {
  55.     unsigned char hlsi;
  56.    // unsigned int twpll=0;
  57.     hlsi=radio_write_data[2]&0x10;  //HLSI位
  58.     if (hlsi)
  59.         pll=(unsigned int)((float)((frequency+225)*4)/(float)32.768);    //頻率單位:k
  60.     else
  61.         pll=(unsigned int)((float)((frequency-225)*4)/(float)32.768);    //頻率單位:k
  62. }


  63. //由PLL計算頻率
  64. void get_frequency(void)
  65. {
  66.     unsigned char hlsi;
  67.     unsigned int npll=0;
  68.     npll=pll;
  69.     hlsi=radio_write_data[2]&0x10;
  70.     if (hlsi)
  71.         frequency=(unsigned long)((float)(npll)*(float)8.192-225);    //頻率單位:KHz
  72.     else
  73.         frequency=(unsigned long)((float)(npll)*(float)8.192+225);    //頻率單位:KHz
  74. }

  75. //讀TEA5767狀態,并轉換成頻率
  76. void radio_read(void)
  77. {
  78.     unsigned char i;
  79.     unsigned char temp_l,temp_h;
  80.     pll=0;
  81.     iic_start();
  82.     iic_write8bit(0x23);        //RDA5820讀地址
  83.     if(!iic_testack())
  84.     {
  85.         for(i=0;i<5;i++)
  86.         {
  87.             radio_read_data[i]=iic_read8bit();
  88.             iic_ack();
  89.         }
  90.     }
  91.     iic_stop();
  92.     temp_l=radio_read_data[1];
  93.     temp_h=radio_read_data[0];
  94.     temp_h&=0x3f;
  95.     pll=temp_h*256+temp_l;
  96.     get_frequency();
  97. }


  98. /*
  99. //手動設置頻率,mode=1,+0.1MHz; mode=0:-0.1MHz ,不用考慮TEA5767用于搜臺的相關位:SM,SUD
  100. void search(bit mode)
  101. {
  102.     radio_read();        
  103.     if(mode)
  104.     {
  105.         frequency+=10;
  106.         if(frequency>max_freq)
  107.             frequency=min_freq;
  108.     }
  109.     else
  110.     {
  111.         frequency-=10;
  112.         if(frequency<min_freq)
  113.             frequency=max_freq;
  114.     }         
  115.     get_pll();
  116.     radio_write_data[0]=pll/256;
  117.     radio_write_data[1]=pll%256;
  118.     radio_write_data[2]=0x20;
  119.     radio_write_data[3]=0x11;
  120.     radio_write_data[4]=0x00;
  121.     radio_write();
  122. }*/

  123. //自動搜臺,mode=1,頻率增加搜臺; mode=0:頻率減小搜臺,不過這個好像不能循環搜臺
  124. void auto_search(bit mode)
  125. {
  126.     radio_read();
  127.     get_pll();
  128.     if(mode)
  129.         radio_write_data[2]=0xa0;
  130.     else
  131.         radio_write_data[2]=0x20;   
  132.     radio_write_data[0]=pll/256+0x40;
  133.     radio_write_data[1]=pll%256;   
  134.     radio_write_data[2]=0x20;    //...
  135.                 radio_write_data[3]=0x11;
  136.     radio_write_data[4]=0x00;
  137.     radio_write();
  138.     radio_read();
  139.     while(!(radio_read_data[0]&0x80))     //搜臺成功標志
  140.     {
  141.             delay1ms(1000);
  142.         radio_read();
  143.         //disp_freq(9,1);
  144.                
  145.     }   
  146. }

  147. void main()
  148. {
  149.         /*P0M1 = 0;        P0M0 = 0;       
  150.         P1M1 = 0;        P1M0 = 0;       
  151.         P2M1 = 0;        P2M0 = 0;       
  152.         P3M1 = 0;        P3M0 = 0;       
  153.         P4M1 = 0;        P4M0 = 0;       
  154.         P5M1 = 0;        P5M0 = 0;       
  155.         P6M1 = 0;        P6M0 = 0;       
  156.         P7M1 = 0;        P7M0 = 0;         */

  157. radio_write();
  158. while(1)
  159. {
  160.           if(NEXT==0)
  161.           {
  162.            delay1ms(15); //延時15ms
  163.            if(NEXT==0)
  164.      while(NEXT==0);//等待按鍵釋放
  165.            auto_search(1);
  166.            radio_read();
  167.      
  168.           }

  169.     if(BACK==0)
  170.     {
  171.      delay1ms(15); //延時15ms
  172.      if(BACK==0)
  173.      while(BACK==0);//等待按鍵釋放
  174.      auto_search(0);
  175.      radio_read();
  176.    
  177.     }

  178.         }
  179. }
復制代碼



作者: yinwengang123    時間: 2018-3-6 21:22
太贊了,學習學習




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