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

📄 system.c

📁 c8051f040上CAN总线的应用
💻 C
📖 第 1 页 / 共 2 页
字号:
/***************************系统时钟初始化********************************/
void SYSCLK_Init (void)
{
	int i;                              // delay counter
   	char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
   	SFRPAGE = CONFIG_PAGE;
   	OSCXCN = 0x77;                      // start external oscillator with 22.1184MHz crystal
   	                                    // start system clock 11.592MHZ;
   	for (i=0; i< 256; i++ );            // XTLVLD blanking interval (>1ms)
   	while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
   	CLKSEL = 0x01;                      // select external oscillator as SYSCLK
   	OSCICN = 0x88;                      // source and enable missing clock
   	                                    // detector
   	SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
 }


// ************************端口初始化******************************//
void PORT_Init (void)
{
   	char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
   	SFRPAGE = CONFIG_PAGE;              // set SFR page
   	XBR0     = 0x04;                    // Enable UART0(TX0--P0.0 ;RX0--P0.1)
   	XBR3     = 0x80;                    // Set CAN TX pin to push-pull
   	XBR2     = 0x44;                    // Enable crossbar and weak pull-up
   	                                    // Enable UART1(TX1--P0.2 ;RX1--P0.3)
   	P0MDOUT |= 0x05;                    // Set TX0、TX1 pin to push-pull
   	P1MDOUT |= 0xFF;                    // Set P1 pin to push-pull
   	P2MDOUT |= 0x80;                    // Set P2.7 pin to push-pull
   	P4MDOUT |= 0xFF;                    // Set P4 pin to push-pull
   	P5MDOUT |= 0xFF;                    // Set P5 pin to push-pull
   	P6MDOUT |= 0xFF;                    // Set P6 pin to push-pull
   	P7MDOUT |= 0xFF;                    // Set P7 pin to push-pull
   	SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}

/**********************串口0初始化*******************************/
// 用定时器2,4作波特率发生器,数据格式为1位起始位、8位数据位、1位停止位
void UART0_Init (void)
{
	char SFRPAGE_SAVE = SFRPAGE;
     SFRPAGE = UART0_PAGE;
	SCON0 = 0x50;                   		//设定串口0工作在方式1,(即8位数据位、1位停止位、波特率可变)
	SSTA0 = 0x0D;                   		//定时器2的溢出率作接收波特率的时钟源,定时器4的溢出率作发送波特率的时钟源
	
	SFRPAGE = TMR2_PAGE;           
	TMR2CN  = 0x00;                 		// Stop Timer2; Clear TF2;
     TMR2CF  = 0x08;                    	// Sysclk is the source of  timer2 ;                                   // use SYSCLK as timebase
     RCAP2  = -(22118400/10400/16); 		// Init reload values
     TMR2    = RCAP2;                    	// set to reload immediately
     TMR2CN |= 0x04;                     	// start Timer2
	    
	SFRPAGE = TMR4_PAGE;                	// set SFR page
	TMR4CN  = 0x00;                     	// Stop Timer4; Clear TF4;
     TMR4CF  = 0x08;                     	// Sysclk is the source of  timer2 ;                                   // use SYSCLK as timebase
     RCAP4  = -(22118400/10400/16);       	// Init reload values
     TMR4    = RCAP4;                    	// set to reload immediately
     TMR4CN |= 0x04;                     	// start Timer4
	
	   //ES0=1;                            		// Enable UART0 interrupt.
     EA=1;							// Enalbe all interrupt
     TI0=0;							
     RI0=0;							
     REN0=1;     
	SFRPAGE=SFRPAGE_SAVE;
}


/***************************************************************
IN:
OUT:
COMMENT:串口1初始化,用定时器1作波特率发生器,数据格式为1位起始位
	   8位数据位、1位停止位
***************************************************************/
void UART1_Init (void)
{
   	char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
   	SFRPAGE = UART1_PAGE;               // set SFR page
   	SCON1 = 0x50;                       // SCON1: mode 1, 8-bit UART, enable RX
   	SFRPAGE = TIMER01_PAGE;             
   	TMOD = 0x20;                        // Timer1:mode 2, 8-bit auto.
   	TH1 = -(22118400/57600/2);            // set Timer1 reload value for baudrate
   	TL1 = TH1;
   	TL1 = 0xFF;                         // Set to reload immediately
   	TR1 = 1;                            // start Timer1
   	CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   	EIE2 |= 0x40;                       // Enable UART1 interrupt.
   	EA=1;   
   	TI1=0;
   	RI1=0;
   	REN1=1;                          
   	SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
}


/****************************************************************
IN:
OUT:
COMMENT:设定定时器3的定时时间为1ms.
*****************************************************************/
void Timer3_Init (void)
{
   char SFRPAGE_SAVE = SFRPAGE;        // 保存当前SFR页
   SFRPAGE = TMR3_PAGE;                // set SFR page
   TMR3CN = 0x00;                      // Stop Timer3; Clear TF3;
   TMR3CF = 0x00;                      // 使用 SYSCLK/12 做Timer3的时钟源
   RCAP3 = -(22118400/1000/12);          // Timer3 装载值
   TMR3 = RCAP3;
   EIE2 |= 0x01;                       // Enable Timer 3 interrupts
   TR3 = 1;                            // Start Timer 3        
   //TR3=0;                        
   SFRPAGE = SFRPAGE_SAVE;             // Restore SFRPAGE
}


/****************************************************************
IN:
OUT:
COMMENT:部分变量初始化函数
*****************************************************************/
void Variable_Init(void)
{
    	unsigned short i;                     // 初始化时,串口1只允许接收
    	Timer3_OverTimes=0;	                  // 初始化时,上行桢发送的数据类型设为正常返回的上行桢   
    	for(i=0;i<1000;i++)
    	CarComputerSendData[i]=CarComputerSendData1[i];
    	for(i=0;i<255;i++)
    	Comm0RecData[i]=0;
    	for(i=0;i<255;i++)
    	Comm0SendData[i]=0;
    	Comm1RecPtr=0;
    	Comm1SendPtr=0;                 //串口0接收、发送指针
    	Comm1RecLength=0;
    	Comm1SendLength=0;        
    	MultiDtcFlag=0;
}

/*****************************************************************
IN:
OUT:
COMMENT:通道,通讯协议设置程序
******************************************************************/    
void PortSet(void)
{
	char SFRPAGE_SAVE = SFRPAGE;
	SFRPAGE= CONFIG_PAGE;              // set SFR page
	P4&=~0x01;		           //选择通道4 CTL1=0 设置发      
	P5=0x3A;                           //设置收,发                                            
	//P4&=0XF7			   //选择通道5
	//P5=0X22  		
	SFRPAGE=SFRPAGE_SAVE;
}   


/***************************************************
IN:输入延时时间值X
OUT:
COMMENT:延时时间=X*1MS
****************************************************/
/*void DelayTime(unsigned short int delay)
{
	unsigned short int i=0;
	unsigned short int j=0;
	for(j=0;j<delay;j++)
	{
			while(i!=1350)
			{
				i++;
			}			
			i=0;			
	}
}*/


/***************************************************
IN:NONE
OUT:返回收到的一个字节
COMMENT:接受一字节
****************************************************/
/*unsigned char RecByte(void)
{
	unsigned char i=0;
	EA=0;
	RI0=0;
	while(RI0==0)
	{}
	RI0=0;
	i=SBUF0;
	EA=1;
	return i;	
}*/

/***************************************************
IN:输入一字节
OUT:NONE
COMMENT:发送一字节
****************************************************/
/*void SendByte(unsigned char senddata)
{	
	EA=0;
	TI0=0;
	SBUF0=senddata;
	while(TI0==0)
	{}
	TI0=0;	
	EA=1;
}*/


/***************************************************
IN:NONE
OUT:Save5bps
COMMENT:把解码器按5BPS发送的数据保存到Save5bps
****************************************************/
/*unsigned char Check5bps(void)
{
	unsigned char Save5bps;
	Save5bps=0x00;
	while(RXD0==1)
	{}
	DelayTime(200);
	DelayTime(100);
	if(RXD0==1)
	{
		Save5bps |=0x01;
	}
	DelayTime(200);
	if(RXD0==1)
	{
		Save5bps |=0x02;
	}
	DelayTime(200);
	if(RXD0==1)
	{
		Save5bps |=0x04;
	}
	DelayTime(200);
	if(RXD0==1)
	{
		Save5bps |=0x08;
	}
	DelayTime(200);
	if(RXD0==1)

⌨️ 快捷键说明

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