但是,在这里博主还是存在一些疑问,为什么不是其他数呢?或者说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的倍数,除数由计算公式得出)
涉及的波特率计算公式有:
实例:
#include
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);
}
}
}