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

📄 deng.c

📁 这是我前一段开发CAN总线通讯时编写的CAN测试程序
💻 C
字号:
 #include<reg52.h>


sfr			   CKCON=0xb6;		   //定义时钟控制寄存器
sfr			   IPH=0xb7;           //中断器优先级高位
sbit SHANGDIAN_ID1= P1^3;//
sbit STATE_ID2= P1^4;//
sbit STATE_ID3= P1^5;//
sbit STATE_ID4= P1^6;//

unsigned char TIME_counter=0;
unsigned char TIME_counter1=0;
unsigned char TIME_counter2=0;

unsigned char pointer=0;       //串口接受首地址
unsigned char xdata Rev_COM_data[12];		  //串口通讯接受存储单元

bit Com_Begin_bz=0;   //串口数据开始接受


/*串口发送子程序*/
void Comout(unsigned char OutData)
{  //EA=0;
   SBUF = OutData; //输出字符
   while(!TI); //空语句判断字符是否发完
   TI = 0; //清TI
   //EA=1;
}

 main( )
   {
    CKCON=0x04;
	IP=1;
	IPH=1;
	TMOD=0x21;	  //   定时器T0为方式1,T1为方式2
 	TH0=0x00;
 	TL0=0x00;	  //定时器0设置,暂时先开开,可能用不上
	TR0=1;
	ET0=1;
	TH1=0x00;
 	TL1=0x00;	  //定时器1设置,暂时先开开,可能用不上
	TR1=1;
	ET1=1;
	RCLK=1;
	TCLK=1;        //定时器2用作波特率发生器   T2CON中的值
	RCAP2H=0xff;
	RCAP2L=0xB8;   //初步设定波特率为9600
	RCAP2L=0xDC;   //初步设定波特率为19200

	//RCAP2H=0x77;
	//RCAP2L=0x77;   //初步设定波特率为9600
	SCON=0x50;     //串口方式为模式1,无校验,定时器2产生波特率 
	TR2=1;        //开定时器2
	//ET2=1;		  //使能定时器2
	IT0=1;       //		负边缘触发
	EX0=1;         //外部中断使能 
	ES=1;          //使能串口  
	EA=1;
	
	while (1)
        {
		  if(pointer>=1&&(Rev_COM_data[0]==0xB5)&&(Rev_COM_data[1]==0xA5))
		      {
			    
			    pointer=0;
			    Com_Begin_bz=0;
			   //if(TIME_counter2>=100)
			    //{
				//  TIME_counter2=0;
				  Comout(0xB5);  			  //是正常通讯信号,回数据
				  Comout(0xA5);
				  Rev_COM_data[0]=0;
				  Rev_COM_data[1]=0;
			//	} 
			   }


         } 
      
    }

	void Timer0() interrupt 1 using 1
{
    TH0 = 0X99;
    
  TL0 = 0x99;
    TIME_counter++;
	if(TIME_counter>=254)
	{
	   TIME_counter=0;
	   STATE_ID3=!STATE_ID3;
	 }
}
void Timer1() interrupt 3 using 2
  {
  TH1 = 0X00;
    
  TL1 = 0x00;
    TIME_counter1++;
	TIME_counter2++;
	if(TIME_counter1>=254)
	{
	   TIME_counter1=0;
	   STATE_ID4=!STATE_ID4;
	 }
  
    }

//void Timer2( ) interrupt 5 using 1
//       {
//	    RCAP2H=0x00;
//	   RCAP2L=0x00;   //初步设定波特率为9600
//	   STATE_ID4=!STATE_ID4;
//	   TF2=0;
//	    }


void CAN(void) interrupt 0	using 0
{
 SHANGDIAN_ID1=!SHANGDIAN_ID1; 
   
}


/*串口中断接收程序此程序中需要处理即对过来的数据进行软件滤波及信息分析*/
  void ComInINT(void) interrupt 4 using 3
{	 
       if(RI)
        {unsigned char astring;
          RI = 0; //RI清零
		 // ES=0;
           astring= SBUF;
		   STATE_ID2=!STATE_ID2;
		   if(astring==0xb5)
		     {Rev_COM_data[pointer++]=astring;
			  Com_Begin_bz=1;
//			  txsjjs=10;              //根据定时周期长短来定义初值
			  }
			else
			  {	if(Com_Begin_bz==1)
			      {	
				   Rev_COM_data[pointer++]=astring;
				   }
			   } 
		  if(pointer>=12)
		    {pointer=0;
			 Com_Begin_bz=0;
			 }
		// ES=1;			 	 
        }
}


⌨️ 快捷键说明

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