一、晶振与定时器
1、晶振频率
单片机开发板在成型之时,已经确定了相应的晶振频率,51单片机最常用的有11.0592MNz、12MHz。
2、时钟周期
时钟周期=晶振频率的倒数,晶振频率的值即为时钟频率的值。
3、机器周期
在计算机中,通常将一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、写操作等,每一项工作称为一个基本操作,完成一个基本操作所需要的时间称为机器周期(注:单片机中“计数器”完成+1这个过程也为一个机器周期)。一般情况下,一个机器周期由若干个时钟周期组成,一般由12个时钟周期组成。
4、定时器初值计算
定时器被启动后,就会在预设的初值基础上+1,当计满时重新归0。51单片机的定时器寄存器为16位,如果采用的晶振频率为12MHz,则根据上面1、2、3所讲可知机器周期为12*(1/12MHz)=1us。由此我们可以得知,此51单片机的定时寄存器实现+1这个操作过程需要花费1us时间,如果此16位寄存器从0开始计数,则计到此寄存器下次为0需要2的16次方(65535)个数,所以定时器一次最多计时65536us.
如果需要的定时时间小于65536us,那么就需要给定时器寄存器预设一个初值N,N=(65535-要计时的时间)。
此外定时器寄存器分为高八位THn和低八位TLn(n代表定时器0、1、2…)将高八位THn装入N/256进行取模运算,低八位TLn装入N%256取余。
TH0=(65535-T)/256
TL0=(65535-T)%256
二、51单片机串口波特率计算
1、方式0的波特率,固定为晶振频率的1/12.
2、方式二的波特率,取决于PCON寄存器的SMOD位。(PCON除最高位SMOD外,其他位均为虚设)
计算方法如下,SMOD=0时,波特率为晶振频率的1/64;SMOD=1时,波特率为晶振频率的1/32.
3、方式1和方式3的波特率,均有定时器溢出率决定。
公式计算如下:
三、不准确的晶振频率造成的影响
1、为什么51单片机晶振为11.0592MHz?
首先介绍一下,单片机根据振荡输入端每N个周期作为一个机器周期分为1T、4T、6T、12T单片机,51单片机为12T单片机。那么当波特率为9600时,分频系数需要用时钟频率最小单位区分,即晶振频率/机器周期包含多少个时钟周期12MHz的51单片机就需要用1M去分,而1M/9600=104.167,不为整数倍,会导致数据传输的两端因为时钟误差,导致数据传输错误。而采用11.0592MHz即可解决,11.0592/12/9600=96,为整数。
2、为什么单片机不设置为1000的整倍数?
(1)为了保证有效通讯,根据电、传输介质等的物理特性结合串口设备使用要求,确定RS232最大传输速率只能是115200,然后逐级二分得到57600,28800,19200,9600…为适应这些速率,设计相应的晶振频率。
(2)电话线路带通是300Hz~3KHz,用了2400Hz信号,对应波特率2400,由于基本频率确定了,以后采用的提高通讯速率的方法都是在2400基础上倍频,进而形成了9600、19200。
3、对串口通信影响
如果设置的波特率为9600,那么理想的通信速度也是9600,但是不准确的晶振会导致定时器溢出误差,进而导致波特率误差,使得通信失败。
出现此类情况,可以在不更换晶振的情况下采取两种方案进行处理,降低误差,就可以进行通信
(1)改变SMOD位状态,置0或置1。
(2)尝试使用其他波特率。
4、对pwmLED调光影响
LED调光分为模拟调光和数字调光,分别采用改变电阻值和PWM控制正向电流导通时间的方式。其中数字调光又称为PWM调光。
PWM调光,通过PWM波开启和关闭LED来改变正向电流的导通时间,以达到亮度调节的效果。当频率超过100Hz即周期0.01s,人眼看到的就是平均亮度,而不是LED在闪烁。而亮度的调节反馈到人眼是一个累计的过程,即亮的时间越长,人眼感觉LED越亮。
虽然不准确的晶振频率会使单片机有不同的机器周期,但是我们在定时器计数时,可以针对相应的晶振频率计算出相应机器周期,设计定时器初值时,设置为机器周期整数倍,进而避免误差的产生。
5、对舵机影响
与led调光不同的是,采用脉冲波对舵机进行控制时,转动角度有具体的脉冲宽度要求,因此定时器的初值固定,在这种情况下,不能根据相应晶振对应的机器周期,对脉冲宽度进行微调。那么不合适的晶振必然会导致定时器的溢出误差,进而使脉冲波受到影响,使舵机转动角度出现偏差。