请选择 进入手机版 | 继续访问电脑版

930电子网

 找回密码
 立即注册
快捷导航
搜索
艾克姆科技推出最新产品STM32F103ZET6开发板
查看: 579|回复: 2

STC8A外部晶振这样启动

[复制链接]

3

主题

11

帖子

906

积分

高级会员

Rank: 4

积分
906
发表于 2020-5-26 08:10:40 | 显示全部楼层 |阅读模式
没事试了一下STC8A外部晶振这样启动

以前用STC15系列,使用外部晶振时在软件上选一下就可以,如果外部晶振没有焊,单片机默认是内部时钟运行的,现在STC8A单片机软件上没有选项,需要在代码中启动外部晶振,官方的例程是死等晶振稳定,如果晶振没有焊,就卡住了,试了一下将死等改成等一段保守时间,如果晶振没有稳定启动,就默认用内部时钟工作。考虑到有些情况用晶振可以更稳定,但用内部时钟也能满足的情况下,这样启动,即使晶振损坏也能像STC15一样正常工作,

  1. //这个是拷贝STC-ISP里的范例程序。

  2. //我使用时都是与或操作。
  3. P_SW2 |= 0x80;     //bit7=1
  4. //操作代码略
  5. P_SW2 &= ~0x80;  //bit7=0

  6. //而在中断中,则是:
  7. u8 i;
  8. i = P_SW2;
  9. P_SW2 |= 0x80;     //bit7=1
  10. //操作代码略
  11. P_SW2 &= ~0x80;  //bit7=0
  12. P_SW2 = i;




  13.   P_SW2 |= 0x80;
  14.   XOSCCR = 0xc0;                              //启动外部晶振
  15.   for(j=0;j<65535;j++)                        //官方例程是while (!(XOSCCR & 1));
  16.    {
  17.           if ((XOSCCR & 1))                     //判断时钟稳定位
  18.           {
  19.                 CKDIV = 0x00;                   //时钟不分频
  20.                    CKSEL = 0x01;                   //选择外部晶振
  21.                    break;
  22.           }
  23.    }
  24. P_SW2 &= ~0x80;

复制代码
  1. //========================================================================
  2. //请参考STC-ISP里的范例程序里的STC8系列的“选择系统时钟源”,我拷贝到这里。


  3. #include "reg51.h"
  4. #include "intrins.h"

  5. #define CKSEL           (*(unsigned char volatile xdata *)0xfe00)
  6. #define CKDIV           (*(unsigned char volatile xdata *)0xfe01)
  7. #define IRC24MCR        (*(unsigned char volatile xdata *)0xfe02)
  8. #define XOSCCR          (*(unsigned char volatile xdata *)0xfe03)
  9. #define IRC32KCR        (*(unsigned char volatile xdata *)0xfe04)

  10. sfr     P_SW2       =   0xba;

  11. void main()
  12. {
  13.     P_SW2 = 0x80;
  14.     CKSEL = 0x00;                               //选择内部IRC ( 默认 )
  15.     P_SW2 = 0x00;

  16.     /*
  17.     P_SW2 = 0x80;
  18.     XOSCCR = 0xc0;                              //启动外部晶振  B7 ENXOSC   B6 XITYPE
  19.     while (!(XOSCCR & 1));                      //等待时钟稳定
  20.     CKDIV = 0x00;                               //时钟不分频
  21.     CKSEL = 0x01;                               //选择外部晶振
  22.     P_SW2 = 0x00;
  23.     */

  24.     /*
  25.     P_SW2 = 0x80;
  26.     IRC32KCR = 0x80;                            //启动内部32K IRC
  27.     while (!(IRC32KCR & 1));                    //等待时钟稳定
  28.     CKDIV = 0x00;                               //时钟不分频
  29.     CKSEL = 0x03;                               //选择内部32K
  30.     P_SW2 = 0x00;
  31.     */
  32.     while (1);
  33. }

复制代码



回复

使用道具 举报

100

主题

285

帖子

6938

积分

版主

Rank: 7Rank: 7Rank: 7

积分
6938
发表于 2020-5-26 10:14:06 | 显示全部楼层
赞,谢谢分享,该贴必须精华!!!
回复 支持 反对

使用道具 举报

0

主题

5

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 昨天 10:55 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2

GMT+8, 2020-7-11 19:22 , Processed in 0.153095 second(s), 23 queries .

Powered by 930电子网 X3.2

© 2013-2023 930ebbs

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