单片机4m晶振_单片机8m晶振改25m晶振,程序修改 - CSDN
  • 本文为单片机12m晶振延时10ms程序,希望对你的学习有所帮助。
  • 为什么51单片机晶振一般使用11.0592?...如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用STC90C516 晶振12M

     

     

     

     

     

     

     

    为什么51单片机的晶振一般使用11.0592?
     
    用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用
    STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。
    展开全文
  • 12M晶振,振荡频率明显高于11.0592M的,按理说12MHz的晶振可以提高单片机的性能,那么我们为什么不用12M的呢?这个问题与单片机的串口波特率有关。 51单片机的串口工作方式有4种,方式0、方式2的波特率是固定的,...
            在设计51系列的单片机系统时,一般选用11.0592MHz的晶振而不选用12MHz的晶振,为什么?12M的晶振,振荡频率明显高于11.0592M的,按理说12MHz的晶振可以提高单片机的性能,那么我们为什么不用12M的呢?这个问题与单片机的串口波特率有关。


            51单片机的串口工作方式有4种,方式0、方式2的波特率是固定的,只与单片机的系统晶振频率有关。方式1、方式3波特率是可变的,不止与系统晶振频率有关,还与定时器T1有关(为什么是T1呢?因为51单片机的波特率发生器只能由定时器T1或定时器T2产生,由于我们使用的是STC98C52单片机,是标准51架构的单片机没有T2模块。)


            对于串口通信来讲最常用的是方式1,以下以串口的模式1来分析。由串口发送原理知,串口发送一次,实际上要发,1位起始位,8位数据位,1位结束位。由于使用模式1没有第9位数据位,所以,串口发送一次,一共要发10位数据,有一点要注意,在串口发送数据时,两次发送之间是没有累计误差的。


    串口工作在方式1下的波特率计算公式为:
    Baud = ((2^SMOD)/32)*(T1定时器溢出率)
    其中SMOD为寄存器PCON的最高位,当SMOD = 0时,串口通信方式1、2、3波特率正常;当SMOD = 1时,串口通信方式1、2、3波特率加倍。

    我们这里以不加倍,即SMOD = 0为例。


    还有一个问题,由于串口方式1要用到T1定时器,而T1定时器也有4种工作方式,那么用哪一种工作方式呢?
    方式0,兼容8048单片机的13位定时器,现在很少用到了,不予考虑;方式3,禁用定时器1,自然也不行;方式1、2都可以使用,那么用哪个更好呢?答案是用方式2,因为如果使用方式1,在中断中手动装载初值的方法来求溢出率的话,由于在进入中断、装值、出中断这个过程中,很容易产生时间上的微小误差,当多次操作时微小误差不断累积,终会产生错误。而方式2,由于当定时器计满溢出后单片机自动为其装载初值,并且无需进入中断服务程序进行任何处理,这样定时器溢出的速率就会相对更稳定。
    综上所述,我们这里使用串口模式1、定时器模式2、SMOD = 0,由此查阅数据手册,得到以下计算公式:
    Baud = Fosc/(256 - REDLOAD)/32/12
    Fosc = 晶振频率
    RELOAD = 自动重装载值
    上述公式可以改写为
    Baud = Fosc/(256 - RELOAD)/2/16/12

    有几点注意一下,由图知:



            51单片机串口工作在方式1,上时,给串口使用的时钟频率要先除2,再除16,为什么要除2呢?因为实际上对于单片机的串口及外部的通信模块来说,单片机的晶振频率即使在12分频后,依然太快,所以先除2,降低串口模块所使用的的时钟频率。为什么要除16呢?因为在串口通信中为了保证所接收的数据的正确性,先对每位信号采集16次,再取其中的7、8、9次,如果有两次是高电平,就认定这一位是1,如果有2位是低电平,就认定这一位是0,所以,公式中频率要除16,。至于为什么要除12是因为公式中的频率Fosc是晶振频率,但是单片机所使用的的频率是经过了12分频的。所以对单片机而言一个机器周期等于12个时钟周期,为了理解上诉公式,有以下知识点需了解:

    1个时钟周期  =1/晶振周期 = 1/Fosc

    1个机器周期 =  12*(1/Fosc)

    定时器T1的计数值每经过一个机器周期加1,即每经过12*(1/Fosc)秒,TL1加1,当TL1等于256就溢出,TH1将值重新赋给TL1,TL1开始重新计数。

    如此我们设经过Y个机器周期TL1溢出,则:

    Y*(12/Fosc) = (1/Baud)/2/16

    Y =Fosc/Baud/32/12

    由于使用T1的模式2,所以,设自动重装载值为RELOAD,则:

    RELOAD= 256 – Y

         = 256- (Fosc/Baud/32/12)

    Baud =Fosc/(256 - RELOAD)/32/12

    由高中物理知识知,误差等于实际值减理论值,再除理论值,再乘以100%,所以误差计算公式为:

    Error= ((Baud – Baud0)/Baud0 )*100%

    Baud0= 标准波特率

    Baud =实际波特率

     

    综上所述,可以得到以下公式:

    RELAOD= 256 – INF(Fosc/Baud0/32/12   +  0.5)

    Baud =Fosc/(256 - RELOAD)/32/12

    Error= (Baud – Baud0)/Baud0  * 100%

     

     

    RELOAD= 自动重装载值

    Baud0= 标准波特率

    Baud =实际波特率

    Fosc =晶振频率

    Error = 偏差

    INF()表示取整运算(RELOAD只能为整数),即去掉小数,0.5可以达到四舍五入的目的。

    当Baud0 =9600时,使用12MHz晶振:

    RELOAD= 256 – INF(Fosc/Baud0/32/12  +  0.5)

         = 256 - 3

         = 253

    Buad =Fosc/(256 - RELOAD)/32/12

       = 12 * 10^6/3/32/12

       = 10416.67

    Error= (Buad – Buad0)/Buad0 * 100%

        =8.51%

    当Baud0 =9600时,使用11.059200MHz晶振:

    RELOAD= 256 – INF(Fosc/Baud0/32/12    +  0.5)

                 = 253

    Buad =Fosc/(256 -RELOAD)/32/12

              = 9600

    Error = 0


     

            由上图知,理论上,要使采集的数为正确的,则第8位必须正确,则允许发送一字节累加误差不能超过50%,单个的位误差不能超过50/10*100% = 5%,由此可知在9600的波特率下,使用12MHz的晶振时,单个位超过5%,必定会出现传错的位。

    实际上,单位误差控制在2%以内可以比较可靠的通信,超过5%串口通信就不可靠了,附上常用波特率使用12MHz晶振和11.0592MHz晶振的误差表:





            由表知,使用12MHz的晶振在2400波特率下还是可以忍受的,但是超过2400后通信变得极不可靠。


    注:
            关于通信波特率为什么要用4800、9600、19200等类似的数,有一种说法是,根据电、传输介质等的物理特性给串口设备的要求:
            为了保证有效通讯,根据电、传输介质等的物理特性结合串口设备的使用要求,确定RS232最大传输速率只能是115200,然后逐级二分得到57600、28800、19200。。。。为适应这些速率设计的相应的晶振频率。
    另一种说法是,这是由电信线路特性决定的:
    电话线路的带通是300—3KHz,当时HAYES先搞得modem,所以用的2400Hz信号,对应波特率是2400,由于基本频率确定了,以后采用的提高通信速率的方法都是2400基础上倍频的,所以形成了9600、19200。。。。
    不管哪种说法都是先有波特率在有晶振频率的,也就是,波特率是前人在试验下得出的最佳的通信速率,我们使用的时候直接用现有的通信速率就行,但是要注意单片机使用的晶振频率,使用时会不会使串口产生误差,如果误差太大就会产生通信错误。


    2018/4/1 青岛理工大学琴岛学院计算机工程系 -- 离远,本文为原创,转载请注明出处。


    参考文献:
    《手把手教你学51单片机(C语言版)》清华大学出版社,宋雪松、李冬明、崔长胜编著
    《51单片机C语言教程——入门、提高、开发、拓展全攻略》电子工业出版社,郭天祥编著
    STC89C52的数据手册
    参考网络资料:


    https://wenku.baidu.com/view/c1ca295684868762cbaed597.html
    http://blog.sina.com.cn/s/blog_6202cb4101011udd.html
    http://bbs.21ic.com/icview-207428-1-1.html
















    展开全文
  • 晶振在电气上可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率为串联谐振,较高的频率为并联谐振。由于晶体自身的特性致使这两个频率的距离...
    晶振在电气上可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率为串联谐振,较高的频率为并联谐振。由于晶体自身的特性致使这两个频率的距离相当的接近,在这个极窄的频率范围内,晶振等效为一个电感,所以只要晶振的两端并联上合适的电容它就会组成并联谐振电路。这个并联谐振电路加到一个负反馈电路中就可以构成正弦波振荡电路,由于晶振等效为电感的频率范围很窄,所以即使其他元件的参数变化很大,这个振荡器的频率也不会有很大的变化。晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称的谐振频率。一般的晶振振荡电路都是在一个反相放大器(注意是放大器不是反相器)的两端接入晶振,再有两个电容分别接到晶振的两端,每个电容的另一端再接到地,这两个电容串联的容量值就应该等于负载电容,请注意一般IC的引脚都有等效输入电容,这个不能忽略。一般的晶振的负载电容为15p或12.5p,如果再考虑元件引脚的等效输入电容,则两个22p的电容构成晶振的振荡电路就是比较好的选择。
    晶振是利用石英的特性制作的电器元件,主要作用是控制时间脉冲,达到定时的作用。单片机中有好多不是只能接8M的吧,我没用过430的,我用的是51系列的,可以接不通频率的晶振的。
    展开全文
  • system_stm32f4xx.c这个文件里面有晶振使用的配置,一般情况下,跑一个单片机需要做系统晶振初始化,以STM32为例,主循环需要先配置SystemInit(); SystemInit();里面也可以选外部晶振或者内部晶振 搜索USE_HSE_...

    STM32F4外部晶振配置

    system_stm32f4xx.c这个文件里面有晶振使用的配置,一般情况下,跑一个单片机需要做系统晶振初始化,以STM32为例,主循环需要先配置SystemInit();
    SystemInit();里面也可以选外部晶振或者内部晶振
    在这里插入图片描述
    搜索USE_HSE_BYPASS,如果有定义则使用的外部晶振,没有定义则使用的内部晶振,目前我是屏蔽的。
    而使用外部晶振的话,晶振大小在哪里改呢
    在这里插入图片描述
    如图改PLL_M,目前我用的是25M.

    展开全文
  • 我们知道,F103默认的外部晶振是8M,系统时钟频率是72M,但实际项目中,多数情况下可能会采用16M,25M晶振等等,如果不注意,很容易就超频,导致单片机无法正常运转,此处以16M晶振为例,说明一下时钟频率的修改。...
  • 标准的51单片机晶振是1.2M-12M,一般由于一个机器周期是12个时钟周期,所以先12M时,一个机器周期是1US,好计算,而且速度相对是最高的(当然现在也有更高频率的单片机)。 11.0592M是因为在进行通信时,12M频率进行...
  • 在初学51单片机的时候,总是伴随很多有关于晶振的问题,其实晶振就是如同人的心脏,是血液的脉搏,把单片机晶振问题搞明白了,51单片机的其他问题迎刃而解…… 有关51单片机有关晶振的问题一并总结出来,希望对学...
  • 参考网址: https://www.ggdoc.com/MTEuMDU5MueahDFtc_W7tuaXtuWHveaVsA2/MDJjYjVmNDI1MWU3OWI4OTY5MDIyNjlk0/4.html
  • 51单片机12M和11.0592M晶振定时器初值TL0和TH0的计算详细步骤
  • 在这个例程里面,默认用到的是8M的外部晶振,现在就有一个问题,如果... 修改的地方之一:stm32f4xx_conf.h里面的HSE_VALUE,系统默认采用外部8M晶振,所以 #define HSE_VALUE ((uint32_t)8000000) ,现把它修改为 
  • 51单片机精确延时程序(晶振12MHz,一个机器周期1us.) 几个精确延时程序:在精确延时的计算当中,最容易让人忽略的是计算循环外的那部分延时, 在对时间要求不高的场合,这部分对程序不会造成影响. 一. 500ms延时子...
  • 外部从12M晶振换8M晶振,如果还想是72MHZ时钟,只需要改三个地方: 首先:stm32f10x.h和system_gd32f10x.c文件可以通过下图找到   1、stm32f10x.h中,将#define HSE_VALUE ((uint32_t)12000000)改...
  • STM32系列的单片机,从L0到L4,从F1到F4系列,标准库和HAL库默认使用的外部晶振统一为8M。但是在实际应用中可能由于某些特殊情况,会使用其他频率的外部晶振,比如12M、16M、24M等等。 比如,目前小编在参与一款毫米...
  • 12M晶振使用9600波特率与电脑通

    千次阅读 2018-01-04 23:04:25
    单片机讯12M晶振使用9600波特率与电脑通 浏览:261 | 更新:2016-12-03 17:47 想要使用9600的波特率与电脑通讯,却发现单片机上的晶振为12Mhz,真的无法实现了么? 工具/原料 ...
  • static void system_clock_108m_hxtal(void) { /*忽略*/ /* PLL = HXTAL /2 * 27 = 108 MHz */ RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF4 | RCU_CFG0_PLLDV); RCU_CFG1 &= ~...
  • 单片机晶振不起振的可能原因

    千次阅读 2015-07-03 15:50:07
     ... 遇到单片机晶振不起振是常见现象,那么引起晶振不起振的原因有哪些呢? (1) PCB板布线错误;...(4) 负载电容或匹配电容与晶振不匹配或者电容质量有问题; (5) PCB板受潮,导致阻抗失配而
  • 51单片机1ms延时代码

    2020-07-30 23:32:33
    51单片机1ms延时的代码,适用于12M晶振的。
1 2 3 4 5 ... 20
收藏数 4,302
精华内容 1,720
关键字:

单片机4m晶振