[DemoCode下载] 单片机驱动收音机模块程序

[复制链接]
1155|4
 楼主| 500days 发表于 2016-3-27 20:49 | 显示全部楼层 |阅读模式
  1. radio.h文件如下:
  2. #ifndef _RADIO_H_
  3. #define _RADIO_H_


  4. uint8 radio_read[5];//定义2个五字节数组保存写入控制寄存器及读取数据的内存空间
  5. uint8 radio_write[5]={0x00,0x00,0xd0,0x17,0x00};
  6. //uint16 pll;//14位PLL的值保存于一个字
  7. static unsigned long frequency; //电台频率保存变量

  8. /*-------------------------------------------------------------------------------------------------------------------
  9. 写寄存器1
  10. msb                            lsb
  11. MUTE   SM    PLL13   PLL12   PLL11   PLL10   PLL09   PLL08
  12. 1:静音   1:搜索模式  PLL13->PLL8
  13. 0:正常   0:非搜索  预置或搜索电台的频率值高6位
  14. --------------------------------------------------------------------------------------------------------------------*/
  15. /*--------------------------------------------------------------------------------------------------------------------
  16. 写寄存器2
  17. msb                            lsb
  18. PLL7   PLL6   PLL5   PLL4   PLL3   PLL2   PLL1   PLL0
  19. PLL7->PLL0
  20. 预置或搜索电台频率的低8位
  21. --------------------------------------------------------------------------------------------------------------------*/
  22. /*--------------------------------------------------------------------------------------------------------------------
  23. 写寄存器3
  24. msb                            lsb
  25. SUD    SSL1   SSL0   HLSI   MS    ML    MR    SWP1
  26. 1:向上搜台  0    0:不搜索  1:本振高出电台 1:单声道  1:左声道静音 1:右声道静音 可编程输出口设置
  27. 0:向下搜台  0    1:ADC为5停止  225KHz  0:立体声  0:右声道正常 0:右声道正常 1:SWPOR1高
  28.     1    0:ADC为7停止 0:本振低于电台             0:SWPOR1低
  29.     1    1:ADC为10停止  225KHz
  30. --------------------------------------------------------------------------------------------------------------------*/
  31. /*--------------------------------------------------------------------------------------------------------------------
  32. 写寄存器4
  33. msb                            lsb
  34. SWP2   STBY   BL    XTAL   SMUTE   HHC    SNC    SI
  35. 可编程输出口 1:待机   1:76~91MHz  1:晶振32768Hz 1:软件静音开 1:高电平切割开 1:立体声消噪开
  36. 1:SWPOR2高  0:正常   0:87.5~108MHz 0:13MHz   0:软件静音关 0:高电平切割关 0:立体声消噪关
  37. 0:SWPOR2低
  38. --------------------------------------------------------------------------------------------------------------------*/
  39. /*--------------------------------------------------------------------------------------------------------------------
  40. 写寄存器5
  41. msb                            lsb
  42. PLLREF   DTC    -    -    -    -    -    -
  43.     1:去重时间75uS
  44.     0:去重时间50uS
  45. --------------------------------------------------------------------------------------------------------------------*/
  46. /*---------------------------------------------------------
  47. 函数功能:电台频率到PLL的转换
  48. 调用形式:Convert_PLL();
  49. 参数:
  50. 返回值:
  51. 修改时间:
  52. 备注:HLSI为1,采用高本振状态、XTAL=1,32.768KHz、PLLREF=0
  53. ---------------------------------------------------------*/
  54. void Convert_PLL(void)
  55. {
  56. uint16 pll;
  57. uint8 pll1,pll2;//高低位pll值暂存变量
  58. pll=((frequency+225000)*4)/32768;// 单位均为Hz
  59. pll1=pll/256;
  60. pll2=pll%256;
  61. radio_write[0]=pll1;
  62. radio_write[1]=pll2;
  63. }

  64. /*---------------------------------------------------------
  65. 函数功能:初始化RADIO模块
  66. 调用形式:Radio_Init();
  67. 参数:
  68. 返回值:
  69. 修改时间:
  70. 备注:转换PLL值、写控制字
  71. ---------------------------------------------------------*/
  72. void Radio_Init(void)
  73. {
  74. //frequency=93400000;//初始电台频率93.4MHz
  75. //radio_write[0]=0x00;
  76. //radio_write[1]=0x00;
  77. //radio_write[2]=0xf0;
  78. radio_write[3]=0x40;
  79. //radio_write[4]=0x00;
  80. //Convert_PLL();
  81. frequency=93400000;
  82. SendString(RADIO_ADDRESS,radio_write,5);
  83. }


 楼主| 500days 发表于 2016-3-27 20:50 | 显示全部楼层
  1. /*--------------------------------------------------------------------------------------------------------------------
  2. 读寄存器1
  3. msb                            lsb
  4. RF    BLF    PLL13   PLL12   PLL11   PLL10   PLL9   PLL8
  5. 1:发现电台  1:波段到头  PLL13->PLL8
  6.   or搜索到头 0:波段未到头 搜索或预置电台频率高6位
  7. 0:未发现电台
  8. --------------------------------------------------------------------------------------------------------------------*/
  9. /*--------------------------------------------------------------------------------------------------------------------
  10. 读寄存器2
  11. msb                            lsb
  12. PLL7   PLL6   PLL5   PLL4   PLL3   PLL2   PLL1   PLL0
  13. PLL7->PLL0
  14. 搜索或预置电台频率低8位
  15. --------------------------------------------------------------------------------------------------------------------*/
  16. /*--------------------------------------------------------------------------------------------------------------------
  17. 读寄存器3
  18. msb                            lsb
  19. STERE0   IF6    IF5    IF4    IF3    IF2    IF1    IF0
  20. 1:立体声  IF6->IF0
  21. 0:单声道  中频IF计数器结果
  22. --------------------------------------------------------------------------------------------------------------------*/
  23. /*--------------------------------------------------------------------------------------------------------------------
  24. 读寄存器4
  25. msb                            lsb
  26. LEV3   LEV2   LEV1   LEV0   CI3    CI2    CI1    CI0
  27. LEV3->LEV0              CI3->CI0
  28. ADC输出电平              芯片识别(均为0)
  29. --------------------------------------------------------------------------------------------------------------------*/
  30. /*--------------------------------------------------------------------------------------------------------------------
  31. 读寄存器5
  32. 均为保留位
  33. --------------------------------------------------------------------------------------------------------------------*/
  34. void Convert_Frequency()
  35. {
  36. frequency=radio_read[0]&0x3f;
  37. frequency<<=8;
  38. frequency|=radio_read[1];
  39. frequency=frequency*8192-225000;
  40. }

  41. void Radio_Ing(void)
  42. {
  43. static bit k=0;
  44. bit i=0;
  45. uint8 n=0;
  46. uint16 j;
  47. if(!k)
  48. {
  49. k=1;
  50. radio_write[3]=0x17;
  51. }

  52. Convert_PLL();
  53. SendString(RADIO_ADDRESS,radio_write,5);

  54. Display_8x16(0,0,frequency%100000000/10000000);
  55. Display_8x16(8,0,frequency%10000000/1000000);
  56. Display_8x16(16,0,10);
  57. Display_8x16(24,0,frequency%1000000/100000);

  58. /*ReceiveString(RADIO_ADDRESS,radio_read,5);
  59. Display_8x16(0,0,(radio_read[3]&0x80)>>7);
  60. Display_8x16(8,0,(radio_read[3]&0x40)>>6);
  61. Display_8x16(16,0,(radio_read[3]&0x20)>>5);
  62. Display_8x16(24,0,(radio_read[3]&0x10)>>4);*/
  63. for(j=0;j<500;j++)
  64. Display();

  65. while(1)
  66. {
  67. if(ir_value==0x16||ir_value==0x0c||ir_value==0x18||ir_value==0x5e||ir_value==0x08||ir_value==0x1c||ir_value==0x5a||ir_value==0x42||ir_value==0x52||ir_value==0x4a)
  68. {
  69. while(1)
  70. {
  71. if(!i)
  72. {
  73. i=1;
  74. ClearBuf();
  75. //Display_8x16(16,0,10);
  76. }
  77. //if(n==4) frequency*=10;
  78. if(ir_value==0x16)
  79. {ir_value=0xff;Display_8x16(8*n,0,0);if(!n)frequency=0;n++;}
  80. else if(ir_value==0x0c)
  81.   {ir_value=0xff;Display_8x16(8*n,0,1);if(!n)frequency=100000000;else if(n==1)frequency+=10000000;else if(n==2) frequency+=1000000;else if(n==3)frequency+=100000;n++;}
  82. else if(ir_value==0x18)
  83.   {ir_value=0xff;Display_8x16(8*n,0,2);if(!n)frequency=2*100000000;else if(n==1)frequency+=2*10000000;else if(n==2) frequency+=2*1000000;else if(n==3)frequency+=2*100000;n++;}
  84. else if(ir_value==0x5e)
  85.   {ir_value=0xff;Display_8x16(8*n,0,3);if(!n)frequency=3*100000000;else if(n==1)frequency+=3*10000000;else if(n==2) frequency+=3*1000000;else if(n==3)frequency+=3*100000;n++;}
  86. else if(ir_value==0x08)
  87.   {ir_value=0xff;Display_8x16(8*n,0,4);if(!n)frequency=4*100000000;else if(n==1)frequency+=4*10000000;else if(n==2) frequency+=4*1000000;else if(n==3)frequency+=4*100000;n++;}
  88. else if(ir_value==0x1c)
  89.   {ir_value=0xff;Display_8x16(8*n,0,5);if(!n)frequency=5*100000000;else if(n==1)frequency+=5*10000000;else if(n==2) frequency+=5*1000000;else if(n==3)frequency+=5*100000;n++;}
  90. else if(ir_value==0x5a)
  91.   {ir_value=0xff;Display_8x16(8*n,0,6);if(!n)frequency=6*100000000;else if(n==1)frequency+=6*10000000;else if(n==2) frequency+=6*1000000;else if(n==3)frequency+=6*100000;n++;}
  92. else if(ir_value==0x42)
  93.   {ir_value=0xff;Display_8x16(8*n,0,7);if(!n)frequency=7*100000000;else if(n==1)frequency+=7*10000000;else if(n==2) frequency+=7*1000000;else if(n==3)frequency+=7*100000;n++;}
  94. else if(ir_value==0x52)
  95.   {ir_value=0xff;Display_8x16(8*n,0,8);if(!n)frequency=8*100000000;else if(n==1)frequency+=8*10000000;else if(n==2) frequency+=8*1000000;else if(n==3)frequency+=8*100000;n++;}
  96. else if(ir_value==0x4a)
  97.   {ir_value=0xff;Display_8x16(8*n,0,9);if(!n)frequency=9*100000000;else if(n==1)frequency+=9*10000000;else if(n==2) frequency+=9*1000000;else if(n==3)frequency+=9*100000;n++;}
  98. else if(ir_value==0x43)
  99.   {ir_value=0xff;Convert_PLL();SendString(RADIO_ADDRESS,radio_write,5);n=0;i=0;break;}
  100. //if(n==2)
  101. //n++;
  102. for(j=0;j<100;j++)
  103. Display();
  104. }
  105. }

  106. else if(ir_value==0x15)
  107. {
  108. ir_value=0xff;//清除
  109. frequency=frequency+100000;
  110. Convert_PLL();
  111. SendString(RADIO_ADDRESS,radio_write,5);
  112. break;
  113. }

  114. else if(ir_value==0x07)
  115.   {
  116.   ir_value=0xff;
  117.   frequency=frequency-100000;
  118.   Convert_PLL();
  119.   SendString(RADIO_ADDRESS,radio_write,5);
  120.   break;
  121.   }
  122. else if(ir_value==0x44||ir_value==0x40)//自动搜台
  123.   {
  124.    while(1)
  125.    {
  126.    
  127.    if(ir_value==0x40)//向上自动搜台
  128.    {frequency+=100000;if(frequency>108000000)frequency=78000000;}
  129.    else {frequency-=100000;if(frequency<78000000)frequency=108000000;}
  130.    Convert_PLL();
  131.    SendString(RADIO_ADDRESS,radio_write,5);
  132.    
  133.    if(frequency>108000000||frequency<78000000)break;
  134.    
  135.    ReceiveString(RADIO_ADDRESS,radio_read,5);
  136.    Convert_Frequency();
  137.    
  138.    if(((radio_read[2]&0x7f<0x3E)&(radio_read[2]&0x7f>0x31)|(radio_read[3]>>4)>5|(radio_read[0]&0x80)))
  139.    break;
  140.    else if(ir_value==0x43){break;}
  141.    
  142.    Display_8x16(0,0,frequency%100000000/10000000);
  143.    Display_8x16(8,0,frequency%10000000/1000000);
  144.    Display_8x16(16,0,10);
  145.    Display_8x16(24,0,frequency%1000000/100000);
  146.    Display();
  147.    }
  148.   ir_value=0xff;
  149.   break;
  150.   }
  151. else if(ir_value==0x46)//待机or正常
  152.   {
  153.   if(radio_write[3]&0x40)
  154.   radio_write[3]&=0xbf;
  155.   else radio_write[3]|=0x40;
  156.   ir_value=0xff;
  157.   //i=0;
  158.   break;
  159.   }
  160. else if(ir_value==0x43||matrix.S==FIRST)
  161.   {
  162.   ir_value=0xff;
  163. // i=0;
  164.   k=0;
  165.   //Radio_Init();不待机即可后台运行
  166.   matrix.S=FIRST;
  167.   break;
  168.   }
  169. }
  170. }

  171. void Radio_Key(void)
  172. {
  173. if(!KEY_ENTER)
  174. {
  175. DelayMs(SCAN_DELAY);
  176.   if(!KEY_ENTER)
  177.   {
  178.   while(!KEY_ENTER)
  179.   ;
  180.   matrix.S=FIRST;
  181.   }
  182. }
  183. }

  184. /*
  185. void Radio_Read1()
  186. {
  187. ReceiveString(0xc0,radio_read,5);
  188. Convert_Frequency();

  189. if(radio_read[0]&0x80)
  190. temp[6]=duanma[1];
  191. else temp[6]=duanma[0];


  192. if(radio_read[0]&0x40)
  193. {
  194. temp[7]=duanma[1];
  195. }
  196. else temp[7]=duanma[0];


  197. temp[0]=duanma[frequency/100];
  198. temp[1]=duanma[frequency%100/10];
  199. temp[2]=duanma[frequency%10];

  200. }
  201. */

  202. #endif


2013搬运工 发表于 2016-3-28 08:49 | 显示全部楼层
用的什么收音IC?
liuyimao485812 发表于 2016-3-28 08:55 | 显示全部楼层
型号是什么?
bitofnoone 发表于 2016-3-28 20:46 | 显示全部楼层
是用外置方式供电吧,收音机是接收设备,应该不会耗费太多的电
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

120

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部