分析微控制器晶振大多為11.0592的原因
阿新 • • 發佈:2019-02-13
微控制器晶振大多為11.0592的原因:
1.這裡有郭天祥老師的解釋:
2.分析:
但是,在這裡博主還是存在一些疑問,為什麼不是其他數呢?或者說11.0592M這個數則麼產生的?
我們假定0-12_000_000之間有一個數滿足以下條件的時候,這個數比較適合晶振的頻率:
1.當初值在0-255的情況下,這個數能夠整除較多的數(整除的數越多,便可獲得能夠整除的波特率的種類越 多);
2.而且這個數應該較大,晶振頻率越快,波特率越大,傳輸的速度越快;
3.在SOMD加倍和不加倍的情況下,這個數都能夠整除較多的數。
因此,我們選出在SOMD加倍和不加倍的兩種情況下,都可以整除較多數的頻率(將兩種情況的加在一起)。
注:
1.這裡我們分析填充初值的範圍為0-255,(因為大多數的串列埠波特率設定使用定時器由硬體自動重灌初值的方式二)。
2.這裡我們示範分析定時器方式一的。
3.這裡晶振的頻率測試範圍為0-12000000。
4.當SMOD為0時,除數 32*1200,當SMOD為1時,除數 16*1200。(這裡考慮到波特率一般是100的倍數,除數由計算公式得出)
涉及的波特率計算公式有:
例項:
3.測試程式碼
#include<stdio.h> void main() { int x=0,i=0,num=0,num1=0,num2=0,pp=0,p=0,p1=0,p2=0; const int n1=32*1200; const int n2=16*1200; int jg1=0,jg2=0; printf("結果一:\n個數 頻率 個數 頻率\n"); while(x<=12000000) { x++; if((x%n1)==0) { p=x/n1; while(i<=256) { i++; if((p%i)==0) num1++; } i=0; } if((x%n2)==0) { p=x/n2; while(i<=256) { i++; if((p%i)==0) num2++; } i=0; } if((num1>15)&&(num2>15)) printf("%d,%d %d,%d\n",num1,x,num2,x); //在SMOD為0時,輸出大於15個的;在SMOD為1時,輸出大於15個的 if(num>(num1+num2)) num=num; else {num=(num1+num2);pp=x;} num1=0; num2=0; } printf("輸出整除最多的那個頻率:%d,%d\n",num,pp); //輸出整除最多的那個數 printf("結果二:\n當晶振為11520000:\n"); x=0; printf("初值 SMOD=0 SMOD=1\n"); while(x<=254) { x++; p1=(1*115200)/(32*12); p2=(2*115200)/(32*12); pp=(256-x); if(((p1%pp)==0)&&((p2%pp)==0)) { printf("%d ",x); jg1=(11520000*1/32/12)/(256-x); jg2=(11520000*2/32/12)/(256-x); printf("%d %d\n",jg1,jg2); } } }