1. 程式人生 > >分析微控制器晶振大多為11.0592的原因

分析微控制器晶振大多為11.0592的原因

微控制器晶振大多為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);
		}
	}
}

4.測試結果

注: 1.結果一:左邊的是SMOD為0,右邊的是SMOD為1; 2.個數的含義是:在初值為0-255之間時,可以整除的個數; 3.當整除的個數大於15時,才會輸出結果。


5.結果分析

我們最後一組輸出的是,在SMOD等於0或1時,整除的個數最多的一個頻率,我們發現居然不是11059200,而是9216000。 進一步分析11059200頻率較大,在可獲得在計算過程中能夠整除的波特率的種類數差別不大的情況下,我們選頻率較大的11059200。 另外,我們發現還有一個數相對來說比11059200好,這個數是11520000,如果計算一下這個晶振頻率可以獲得的波特率有哪些的時候,會發現可獲得的波特率也很好(結果二中),為什麼沒有選用這個晶振對應的波特率為國際上標準波特率,原因可能有其他,但是從這裡的分析可以看出選用11.0592M的晶振的好處。