51单片机,波特率和定时器方式一12M和11.0592M晶振初值问题

时间:2022-06-25 23:33:17

波特率:

原帖地址:http://zhidao.baidu.com/question/337645738.html  和其他网友答案。

标准的51单片机晶振是1.2M-12M,一般由于一个机器周期是12个时钟周期,所以先12M时,一个机器周期是1US,好计算,而且速度相对是最高的(当然现在也有更高频率的单片机)。
11.0592M是因为在进行通信时,12M频率进行串行通信不容易实现标准的波特率,比如9600,4800,而11.0592M计算时正好可以得到,因此在有通信接口的单片机中,一般选11.0592M
计算一下就知道了。如我们要得到9600 的波特率,晶振为11.0592M 和12M,定时器1 为模式2,SMOD 设为1,分别看看那所要求的TH1 为何值。代入公式:  
11.0592M 9600=(2÷32)×((11.0592M/12)/(256-TH1)) TH1=250  
 12M 9600=(2÷32)×((12M/12)/(256-TH1)) TH1≈249.49 
上面的计算可以看出使用12M 晶体的时候计算出来的TH1 不为整数,而TH1 的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600 波特率。当然一定的误差是可以在使用中被接受的,就算使用11.0592M 的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
分割符********************************************************
定时器:
一、晶振是12MHZ的比较简单:
振荡周期:1/12us
机器周期:1us
定时器T0,工作方式一
定时1ms就是1000;TH0=(65536-1000)/256;     TL0=(65536-1000)%256 
定时50ms就是50000,TH0=(65536-50000)/256;   TL0=(65536-50000)%256 ;循环溢出20次就是1s;
二、晶振是11.0592MHZ
振荡周期1/11.0592
机器周期12/11.0592 ≈1.085 us
921600个机器周期时间 =921600*12/11059200=1s=1000ms
赋初值0x1000=(4096)D      TH0=10;TL0=00 循环溢出15次是1s;           15*(65536-4096)*12/11.0592 =1s
10ms 准确定时9216个机器周期9216*12/11059200=10ms   TH0= (65536-9216)/256;    TL0=(65536-9216)%
20ms  准确定时18432个机器周期TH0= (65536-18432)/256;    TL0=(65536-18432)%
50ms准确定时5*9216=46080个机器周期5*9216*12/11059200=50ms ;    TH0= (65536-46080)/256;    TL0=(65536-65536)%
1ms误差较大TH0= (65536-921)/256;    TL0=(65536-921)%256

这是12T单片机的情况,不过现在基本都是1T芯片,主要还是想以此借鉴一下,思考1T的赋值问题。