⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c51_bdr.c

📁 AT89C5131的接口驱动
💻 C
字号:
#include <stdio.h>
#include <math.h>
#include <string.h>

#define MAX_FOSC_X2	25000001

int crystal []={  32768,
		1000000,
		1834200,
		2000000,
		2457600,
		3000000,
		3276800,
		3579545,
		3686400,
		4000000,
		4194304,
		4433619,
		4915200,
		5000000,
		6000000,
		7372800,
		8000000,
	       10000000,
	       11059200,
	       12000000,
	       14318100,
	       14745600,
	       16000000,
	       18432000,
	       19660800,
	       20000000,
	       22118400,
	       24000000,
	       24000140,
	       25000000,
	       30875000,
	       32000000,
	       40000000,
	       60000000,
	       	      0 };

int baudrate[]={  110,
		  300,
		 1200,
		 2400,
		 4800,
		 9600,
		19200,
		28800,
		38400,
		57600,
	       115200,
	       230400,
	       460800,
	       921600,
	      1843200,
	            0 };

unsigned int	fosc;

int bdr (int prescaler, int max, int val)
{
return (val>=max || val<0 || !prescaler)?0:(fosc/prescaler/(max-val));
}

int val (int prescaler, int max, int bdr)
{
return (!prescaler || !bdr)?-1:(max-fosc/prescaler/bdr);
}

int main (void)
{
int		i,ii,j,n;
int		std_timer8,true_baudrate_std_timer8,smod1_timer8,true_baudrate_smod1_timer8;
int		std_timer16,true_baudrate_std_timer16;
int		this_baudrate;
char		use_smod1_timer8,use_std_timer8,use_x2_mode;
char		use_std_timer16;
char		sz0[256];
char		sz1[256];
char		sz2[256];
char		sz_temp[10];

int		bdr0,bdr1,bdr2,val0,val1,val2,delta0,delta1,delta2,type0,type1,type2;
char		bdr_supported;

printf("// <== Using generator script/bdr.c c5131-usb-cdc-1_0_1 $Id: c51_bdr.c,v 1.7 2003/08/19 11:51:23 apache Exp $\r\n\
// BRG-0 refers to standard Atmel Internal Baudrate Generator peripheral (if available)\r\n\
// BRG-1 refers to standard C51 Timer 1 peripheral used as Baudrate Generator\r\n\
// BRG-2 refers to standard C52 Timer 2 peripheral used as Baudrate Generator (if available)\r\n\
\r\n#ifndef FOSC\r\n#error You must define FOSC in config.h\r\n");
for (ii=0;crystal[ii];ii++)
for (i=0;i<=ii;i++)
  {
  if (!(i==ii  || (i<ii && crystal[i]*2>crystal[(ii?(ii-1):0)] && crystal[i]*2<crystal[ii]))) continue;
    fosc=crystal[i];
    if (i!=ii) fosc*=2;
  printf("#elif   FOSC     ==         %6u // Fosc = %6u.%03u kHz\r\n",fosc/1000,fosc/1000,fosc%1000);
  for (j=0,n=0,sz0[0]=0,sz1[0]=0,sz2[0]=0;this_baudrate=baudrate[j];j++)
    {
    bdr_supported=0;

    use_x2_mode=0;
    fosc=crystal[i];
    if (i!=ii) fosc*=2;
    LABEL_X2_MODE_0:
    val0=val(384,256,this_baudrate);
    bdr0=bdr(384,256,val0);
    delta0=abs(this_baudrate-bdr0);
    type0=0;

    if (delta0>abs(this_baudrate-bdr(384,256,val0-1)))
      { // Round pb
      val0--;
      bdr0=bdr(384,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (delta0>abs(this_baudrate-bdr(192,256,val(192,256,this_baudrate))))
      { // Better value
      type0=1;
      val0=val(192,256,this_baudrate);
      bdr0=bdr(192,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (delta0>abs(this_baudrate-bdr(192,256,val(192,256,this_baudrate)-1)))
      { // Round pb
      type0=1;
      val0=val(192,256,this_baudrate)-1;
      bdr0=bdr(192,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (delta0>abs(this_baudrate-bdr(64,256,val(64,256,this_baudrate))))
      { // Better value
      type0=2;
      val0=val(64,256,this_baudrate);
      bdr0=bdr(64,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (delta0>abs(this_baudrate-bdr(64,256,val(64,256,this_baudrate)-1)))
      { // Round pb
      type0=2;
      val0=val(64,256,this_baudrate)-1;
      bdr0=bdr(64,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (delta0>abs(this_baudrate-bdr(32,256,val(32,256,this_baudrate))))
      { // Better value
      type0=3;
      val0=val(32,256,this_baudrate);
      bdr0=bdr(32,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (delta0>abs(this_baudrate-bdr(32,256,val(32,256,this_baudrate)-1)))
      { // Round pb
      type0=3;
      val0=val(32,256,this_baudrate)-1;
      bdr0=bdr(32,256,val0);
      delta0=abs(this_baudrate-bdr0);
      }

    if (!use_x2_mode && fosc<MAX_FOSC_X2 && abs(this_baudrate-bdr0)*100/this_baudrate>5)
      {
      use_x2_mode=1;
      fosc*=2;
      goto LABEL_X2_MODE_0;
      }

    if (abs(this_baudrate-bdr0)*100/this_baudrate<=5)
      {
      if (!bdr_supported)
        {
	if (n++) printf("  #elif"); else printf("  #if  "); // #if or #elif ?
	printf(" BAUDRATE ==         %6u // %6u bps Serial Speed\r\n",this_baudrate,this_baudrate);
	}
      if (use_x2_mode) strcat(sz0,"*");
      sprintf(sz_temp,"%u ",this_baudrate);
      strcat(sz0,sz_temp);
                       printf("    #define BRG0_INIT          %3u // %6u bps (delta=%u.%02u%%)\r\n",val0,bdr0,delta0*100/this_baudrate,delta0*10000/this_baudrate%100);
      if (type0&1)     printf("    #define BRG0_REQUIRE_SMOD1\r\n");
      if (type0&2)     printf("    #define BRG0_REQUIRE_SPD\r\n");
      if (use_x2_mode) printf("    #define BRG0_REQUIRE_X2_MODE\r\n");
      bdr_supported=1;
      }
    use_x2_mode=0;
    fosc=crystal[i];
    if (i!=ii) fosc*=2;
    LABEL_X2_MODE_1:

    val1=val(384,256,this_baudrate);
    bdr1=bdr(384,256,val1);
    delta1=abs(this_baudrate-bdr1);
    type1=0;

    if (delta1>abs(this_baudrate-bdr(384,256,val1-1)))
      { // Round pb
      val1--;
      bdr1=bdr(384,256,val1);
      delta1=abs(this_baudrate-bdr1);
      }

    if (delta1>abs(this_baudrate-bdr(192,256,val(192,256,this_baudrate))))
      { // Better value
      type1=1;
      val1=val(192,256,this_baudrate);
      bdr1=bdr(192,256,val1);
      delta1=abs(this_baudrate-bdr1);
      }

    if (delta1>abs(this_baudrate-bdr(192,256,val(192,256,this_baudrate)-1)))
      { // Round pb
      type1=1;
      val1=val(192,256,this_baudrate)-1;
      bdr1=bdr(192,256,val1);
      delta1=abs(this_baudrate-bdr1);
      }

    if (!use_x2_mode && fosc<MAX_FOSC_X2 && abs(this_baudrate-bdr1)*100/this_baudrate>5)
      {
      use_x2_mode=1;
      fosc*=2;
      goto LABEL_X2_MODE_1;
      }

    if (abs(this_baudrate-bdr1)*100/this_baudrate<=5)
      {
      if (!bdr_supported)
        {
	if (n++) printf("  #elif"); else printf("  #if  "); // #if or #elif ?
	printf(" BAUDRATE ==         %6u // %6u bps Serial Speed\r\n",this_baudrate,this_baudrate);
	}
      if (use_x2_mode) strcat(sz1,"*");
      sprintf(sz_temp,"%u ",this_baudrate);
      strcat(sz1,sz_temp);
                       printf("    #define BRG1_INIT          %3u // %6u bps (delta=%u.%02u%%)\r\n",val1,bdr1,delta1*100/this_baudrate,delta1*10000/this_baudrate%100);
      if (type1==1)    printf("    #define BRG1_REQUIRE_SMOD1\r\n");
      if (use_x2_mode) printf("    #define BRG1_REQUIRE_X2_MODE\r\n");
      bdr_supported=1;
      }
    use_x2_mode=0;
    fosc=crystal[i];
    if (i!=ii) fosc*=2;
    LABEL_X2_MODE_2:

    val2=val(32,65536,this_baudrate);
    bdr2=bdr(32,65536,val2);
    delta2=abs(this_baudrate-bdr2);
    type2=0;

    if (delta2>abs(this_baudrate-bdr(32,65536,val2-1)))
      { // Round pb
      val2--;
      bdr2=bdr(32,65536,val2);
      delta2=abs(this_baudrate-bdr2);
      }

    if (!use_x2_mode && fosc<MAX_FOSC_X2 && abs(this_baudrate-bdr2)*100/this_baudrate>5)
      {
      use_x2_mode=1;
      fosc*=2;
      goto LABEL_X2_MODE_2;
      }

    if (abs(this_baudrate-bdr2)*100/this_baudrate<=5)
      {
      if (!bdr_supported)
        {
	if (n++) printf("  #elif"); else printf("  #if  "); // #if or #elif ?
	printf(" BAUDRATE ==         %6u // %6u bps Serial Speed\r\n",this_baudrate,this_baudrate);
	}
      if (use_x2_mode) strcat(sz2,"*");
      sprintf(sz_temp,"%u ",this_baudrate);
      strcat(sz2,sz_temp);
                       printf("    #define BRG2_INIT        %5u // %6u bps (delta=%u.%02u%%)\r\n",val2,bdr2,delta2*100/this_baudrate,delta2*10000/this_baudrate%100);
      if (use_x2_mode) printf("    #define BRG2_REQUIRE_X2_MODE\r\n");
      bdr_supported=1;
      }
    }
  printf ("  #else\r\n    #error Only these baudrates are available (*=x2 mode only):\r\n    #error BRG-0 %s\r\n    #error BRG-1 %s\r\n    #error BRG-2 %s\r\n  #endif\r\n",sz0,sz1,sz2);
  }
printf("#endif\r\n// ==> End of generator $Id: c51_bdr.c,v 1.7 2003/08/19 11:51:23 apache Exp $\r\n");
return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -