使用C8051F时晶振不起振,请有经验的朋友赐教。

2020-01-27 11:18发布

本帖最后由 javasy 于 2012-5-22 07:32 编辑

我使用的是062,在切换外部时钟时程序一直停在了检查外部晶振处(下面程序加下划线一句),换过晶振、片子、电容等,用示波器看晶振脚上确定没起振。
哪位朋友遇到过这种情况,请指点一下,谢谢!
程序如下:

#include <c8051f060.h>
/************************************/

#define Crystal_Clock 12000000
/************************************/

void SYSCLK_Init (void);
void SYSCLK_ExtOsc_Init (void);         
/************************************/

//----------------------------------------/
//  内部时钟设置
void SYSCLK_Init (void)
{
  OSCICN = 0x83;                     
  RSTSRC = 0x04;                           // Enable missing clock detector
}

//----------------------------------------/
// 外部时钟初始化
void SYSCLK_ExtOsc_Init (void)
{
  unsigned int  i;

  #if (Crystal_Clock <= 32000)
    #define XFCN 0   
  #elif (Crystal_Clock <= 84000)
    #define XFCN 1
  #elif (Crystal_Clock <= 225000)
    #define XFCN 2
  #elif (Crystal_Clock <= 590000)
    #define XFCN 3
  #elif (Crystal_Clock <= 1500000)
    #define XFCN 4
  #elif (Crystal_Clock <= 4000000)
    #define XFCN 5
  #elif (Crystal_Clock <= 10000000)
    #define XFCN 6
  #elif (Crystal_Clock <= 30000000)
    #define XFCN 7
  #else
    #error "Defined Crystal Frequency outside allowable range!"
    #define XFCN 0
  #endif

  OSCXCN = 0x60;                     
  OSCXCN |= XFCN;
  for (i = 13000; i > 0; i--);           // 24.5MHz, 1ms=24500 SYSCLKs DJNZ=2 SYSCLKs
   while (!(OSCXCN & 0x80));  
  CLKSEL = 0x01;                       // 禁止内部振荡器;

  return;
}


/*****************************************/
//   主 程 序
void main (void)
{
  WDTCN = 0xDE;                            // Disable watchdog timer
  WDTCN = 0xAD;
  SYSCLK_Init();
  SYSCLK_ExtOsc_Init ();
  while(1);
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。