youlenm
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
阅读:1819回复:7

[求助]请教LC72131+LA1787关于中频计数器的问题

楼主#
更多 发布于:2006-12-11 19:57
我用的是LC72131+LA1787做的自动搜台收音机其他所有功能都实现了,能手动控制按键搜台了但是最后一步,因为我是用三线控制的!不知道怎么,我自动搜台的时候能听见搜台搜到的声音,但是不能准确的在有台的地方停下来!我利用中频计数器来判断读出的频率的中频是否与10.7MHZ中频相等来判断是否是准确的台!但是现在的问题是:不知道为什么,我加了这个判断语句和计算中频的公式(根据资料算出的公式)进去后,没反映!我用示波器看了DO,DI,IFIN的波形图,在自动搜台的时候,DO,DI,IFIN都变为高电平!~~请问该怎么实现啊?小弟卡在这个地方快1个星期了~~希望各位大大帮助下!谢谢~~~QQ173251203~~论坛我在线等待回答,谢谢
youlenm
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
1楼#
发布于:2006-12-11 20:00
<pre>U8 readx()<br/>{<br/>  U8 i,j,k=0;<br/>  <br/>   for (i=0;i<8;i++)   //移动8位<br/>    {<br/>     SCL=0;                //时钟位为低电平<br/>  Delay(20);  // 延时20us<br/>  SCL=1;               //时钟位为高电平<br/>  Delay(20);      //延时20us<br/>      if (DO==1)         //<br/>    j=1;         //   当DO为1时   j为1<br/>      else j=0;           //     为0时为0<br/>      k=(k<<1)|j;       //左移k或上j<br/>   SCL=0;           //   时钟为低电平<br/>      }                 //<br/>    return(k);            //返回k值<br/>}</pre><pre>这个是我的读数程序~!</pre><pre>  case 0x9: //K9</pre><pre>   for(;fm_freq<1080;fm_freq++)</pre><pre>         {<br/>   CalculateFreq(fm_freq);<br/>                     SetDisplay();<br/>  <br/>   write_data[2]=0x3a|0x02;<br/>  // <br/>   write_mode_1();<br/>   write_data2[0]=0xa3&0x20;<br/>      <br/>         write_mode_2();<br/>  <br/>   Delay(50000);<br/> // write_data2[0]=0xa3;<br/>      <br/> //        write_mode_2();<br/>   <br/>   read_mode();      //读出频率值<br/>   //   freq=(read_data[0]&0x0f)*256*256+read_data[1]*256+read_data[2];<br/>  // freq/=32;<br/>  // m_dis[0] = dis_code[0x0f];<br/>  // m_dis[1] = dis_code[(freq% 10000)/1000];<br/>  // m_dis[2] = dis_code[(freq% 1000)/100];<br/>  // m_dis[3] = dis_code[(freq% 100)/10];<br/>  // m_dis[4] = dis_code[(freq% 10)];<br/>  // m_dis[3] += DP;<br/>//  freq/=32;<br/>//   blue=1;<br/>               // SetDisplay();<br/>  // if (freq>10600&&freq<10800)<br/>  //  {<br/>  //  fm_freq=900;<br/>  //  CalculateFreq(fm_freq);<br/>  //        SetDisplay();<br/>  //     return;<br/>  //  }<br/> <br/> //  }<br/>  //fm_freq=894;<br/>    }<br/>    break; </pre><pre>这个是自动搜台,利用中频计数器判断的程序</pre>
jifengwei123
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
2楼#
发布于:2006-12-11 21:08
[求助]兄弟,我也是在做这个,不过我是第一次做,现在还未有思路,你能不能给点提示啊,讲一下思路啊.
[求助]兄弟,我也是在做这个,不过我是第一次做,现在还未有思路,你能不能给点提示啊,讲一下思路啊.
jifengwei123
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
3楼#
发布于:2006-12-11 22:19
// work mode type define: #define MODE_IN1 0x82 #define MODE_IN2 0x92 #define MODE_OUT 0xa2 #define CTE_ON 0x040000 #define IOC1 0x000001 #define IOC2 0x000002 #define IO1 0x000004 #define IO2 0x000008 #define BO1_ON 0x000010 #define BO2_ON 0x000020 #define BO3_ON 0x000040 #define BO4_ON 0x000080 #define DO_MODE_UNLOCK 0x000008 #define DO_MODE_END_UC 0x000400 #define DO_MODE_MASK ~0x000e00 ////// // ---------------------------------------- // DEVIDER mode type define // ---------------------------------------- #define AM_DV_MODE 0x000000 // 16 BIT #define SW_DV_MODE 0x010000 // 20 #define FM_DV_MODE 0x020000 // 20 BIT SWALLOW #define AM_DV_REF_9KHz 0x900000 // 9 KHZ #define AM_DV_REF_10KHz 0x800000 // 10 KHZ #define SW_DV_REF 0xa00000 // 5 KHZ #define FM_DV_REF 0x300000 // 25 KHZ #define PLL_OFF_REF 0xe00000 // PLL inhibit and OSC stop. // ---------------------------------------- // IF Count // ---------------------------------------- #define GATE_TIME 32 #define GATE_TIME_32MS 0x020000 // #define GATE_TIME_4MS 0x000000 #define GATE_TIME_8MS 0x010000 #define IFS 0x100000 #define AM_IF_CNT 450*GATE_TIME // 450KH; #define AM_IF_CNT_MIN AM_IF_CNT - AM_IF_CNT*0.01 #define AM_IF_CNT_MAX AM_IF_CNT + AM_IF_CNT*0.01 #define SW_IF_CNT 450*GATE_TIME // 450KH; #define SW_IF_CNT_MIN SW_IF_CNT - SW_IF_CNT*0.01 #define SW_IF_CNT_MAX SW_IF_CNT + SW_IF_CNT*0.01 #define FM_IF_CNT 10700*GATE_TIME // 10.7 MH; #define FM_IF_CNT_MIN FM_IF_CNT - FM_IF_CNT*0.01 #define FM_IF_CNT_MAX FM_IF_CNT + FM_IF_CNT*0.01 // ---------------------------------------- // Frequence Reference // ---------------------------------------- #define AM_FREF_9KHz 9 // 9khz #define AM_FREF_10KHz 10 // 10khz #define SW_FREF 5 // 5khz #define FM_FREF (25*2) // Fref=25*2 khz // Frequence Range #define AM_MIN_9KHz 522 // KHZ #define AM_MAX_9KHz 1611 // KHZ #define AM_MIN_10KHz 530 // KHZ #define AM_MAX_10KHz 1610 // KHZ #define SW_MIN 1700 // KHZ #define SW_MAX 25000 // KHZ #define FM_MIN 8700 // 10KHZ #define FM_MAX 10800 // 10KHZ // Frequence Counter Range #define AM_CNT_MIN_9KHz ((AM_MIN_9KHz + 450)/9) #define AM_CNT_MAX_9KHz ((AM_MAX_9KHz + 450)/9) #define AM_CNT_MIN_10KHz ((AM_MIN_10KHz + 450)/10) #define AM_CNT_MAX_10KHz ((AM_MAX_10KHz + 450)/10) #define SW_CNT_MIN ((SW_MIN + 450)/SW_FREF) #define SW_CNT_MAX ((SW_MAX + 450)/SW_FREF) #define FM_CNT_MIN ((FM_MIN + 1070)/((FM_FREF *100)/1000)) #define FM_CNT_MAX ((FM_MAX + 1070)/((FM_FREF *100)/1000)) // ---------------------------------------- // Search Step // ---------------------------------------- #define AM_CNT_STEP 1 // F_step=1*5khz #define SW_CNT_STEP 1 // F_step=1*5khz #define FM_CNT_STEP_100KHz 2 // F_step=2*50khz when Fref=25khz #define FM_CNT_STEP_50KHz 1 // F_step=50khz when Fref=25khz
youlenm
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
4楼#
发布于:2006-12-11 23:55
现在自己找到点错!为什么我用示波器测试DO,DI,IFIN端口的时候,自动搜台中他们都是由低电平变到高电平,那为什么我显示的全部是00000,我读不到中频数,请问下读不到中频数有些什么原因造成的
youlenm
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
5楼#
发布于:2006-12-11 23:57
<p>读数子程序</p><p>U8 readx()<br/>{<br/>  U8 i,j,k=0;<br/>  <br/>   for (i=0;i<8;i++)   //移动8位<br/>    {<br/>     SCL=0;                //时钟位为低电平<br/>  Delay(20);  // 延时20us<br/> <br/>      if (DO==1)         //<br/>    j=1;         //   当DO为1时   j为1<br/>      else j=0;           //     为0时为0<br/>      k=(k<<1)|j;       //左移k或上j<br/>       SCL=1;               //时钟位为高电平<br/>  Delay(20);      //延时20us<br/>   SCL=0;           //   时钟为低电平<br/>  <br/>      }                 //<br/>    return(k);            //返回k值<br/>}</p><p></p><p></p><p>/*对按键处理子程序*/<br/>void ProcessKey(BYTE key)<br/>{<br/>U16 i,cf;</p><p> if((band & 0x01) == FM_BAND)cf = fm_freq;<br/> else cf = am_freq;<br/>    blue=0;<br/>   SetDisplay();<br/>  switch(key)<br/>  {</p><p>  case 0x9: //K9</p><p>   for(;fm_freq<1080;fm_freq++)</p><p>         {<br/>   CalculateFreq(fm_freq);<br/>                   //  SetDisplay();<br/>  <br/>   write_data[2]=0x3a|0x02;<br/>   <br/>   write_mode_1();<br/>  // write_data2[0]=0xa3&0x20;<br/>      <br/>  //    write_mode_2();<br/>  <br/>  // Delay(50000);<br/>   Delay(50000);<br/> // write_data2[0]=0xa3;<br/>      <br/>    //    write_mode_2();<br/>   <br/>   read_mode();      //读出频率值<br/>      freq=(read_data[0]&0x0f)*256*256+read_data[1]*256+read_data[2];<br/>  <br/>         freq/=32;<br/>   m_dis[0] = dis_code[(freq% 100000)/10000];<br/>   m_dis[1] = dis_code[(freq% 10000)/1000];<br/>   m_dis[2] = dis_code[(freq% 1000)/100];<br/>   m_dis[3] = dis_code[(freq% 100)/10];<br/>   m_dis[4] = dis_code[(freq% 10)];<br/>   m_dis[3] += DP;<br/>//  freq/=32;<br/>//   blue=1;<br/>               // SetDisplay();<br/>  // if (freq>10600&&freq<10800)<br/>  //  {<br/>  //  fm_freq=900;<br/>  //  CalculateFreq(fm_freq);<br/>  //        SetDisplay();<br/>  //     return;<br/>  //  }<br/> <br/> //  }<br/>  //fm_freq=894;<br/>   }<br/>  //  }<br/>    break;     </p><p></p><p></p><p>请帮忙看看什么地方错了,谢谢</p>
youlenm
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
6楼#
发布于:2006-12-11 23:58
其中K9我是用来控制自动搜台的功能键
youlenm
二等列兵
二等列兵
  • 金钱87RMB
  • 威望0点
  • 贡献值0点
  • CAV币0点
7楼#
发布于:2006-12-12 01:27
<p>哈哈!终于完成了~~能实现自动搜台,手动搜台!LED数码管正确显示了!哇哈哈哈哈~~原来是我自己把低4位送数搞错了</p><p>write_data[2]=0x3a|0x02;<br/>   <br/>   write_mode_1();这里应该是:</p><p>   write_data[2]=0x3a|0x04;<br/>  write_mode_1(); </p>
游客

返回顶部