找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3582|回复: 1
打印 上一主题 下一主题
收起左侧

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. }
复制代码


评分

参与人数 1黑币 +60 收起 理由
admin + 60 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:76817 发表于 2018-3-6 21:22 | 只看该作者
太赞了,学习学习
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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