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

📄 can.c

📁 一个测试过的非常好用的CAN 的多级通讯的实例
💻 C
字号:
#include <reg51.h>                    // SFR declarations
#include <stdio.h>
#include <ABSACC.H>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit  MODE1LED     = P1^0;                         // LED: '1' = ON; '0' = OFF
sbit  MODE2LED     = P1^1;                         // LED: '1' = ON; '0' = OFF
sbit  MODE3LED     = P1^2;                         // LED: '1' = ON; '0' = OFF
sbit  clk     = P0^1;
sbit  date    = P0^0;
sbit  outclk     = P0^3;
sbit  outdate    = P0^2;
//sbit  kai     = P3^7; 
bdata uchar tt,qq;
sbit flag=tt^7;
sbit flag1=tt^0;
sbit flag2=qq^0;
void PORT_Init (void);
void UART0_Init  (void);
void delay40us(void) ;
void sent_date(uchar s_data);
uchar  code  ID[32]="adfaeasdfa";//{0,1,2,3,4,5,6,7,8,9};
//------------------------------------------------------------------------------------
// MAIN Routine
//------------------------------------------------------------------------------------
void main (void) 
{
   uchar s,m1,m2=0,m3=0x11,m4,m5,m6,m7;

   //uint c;
   //WDTCN = 0xde;                          //closed watchdog
   //WDTCN = 0xad;                          //closed watchdog
   //PORT_Init ();                          //初始化端口
   UART0_Init ();                           //初始化UART
   P1=0xFF;
   MODE1LED=0;
   P2=0x11;
   while(1)
   {
    if(RI==1)    //接受串口数据;
    {
	 m6=SBUF;
     
	 if(m6==0x11||m6==0xff||m6==0x0)
	 m3=m6;
     RI=0;
     }
    if(m3==0x11)  //正常模式;
    {

	P2=0x11;
	P1=0x06;
    }
    if(m3==0)    //放脚本模式;
	{
         P2=0x0f;
         P1=0x03;
         while(m6==0)
        {
         if(RI==1)
          {
	    m7=SBUF;
     
	    if(m7==0x11||m7==0xff||m7==0x0||m7==0xfe)
	      {
	       if(m7==0x11||m7==0xff||m7==0x0)
                 { 
                  m6=m7;
	          m3=m6;
                 }
               else
                 {
                    for(s=0;s<32;s++)
                     {
                       SBUF=ID[s];
                       while(TI==0);
                       TI=0;
                     }                      
                 }          
              }
            else
	     sent_date(m7);
            RI=0;
              }
	  }
       }
    if(m3==0xff) //录脚本模式
	{
          P2=0;
          P1=0x05;
       if(clk==0)
         {
	  if(date==0)
	   { m1=1;
	     while(m1==1)
		   {
		     if(clk==1)
			 m1=0;
		    }
	         for(s=0;s<8;s++) 
		   {
		     while(m1==0)
		      {
		        if(clk==0)
   			 {
			   m1=1;
                            flag=date;
			   if(flag==1)
                           m2=m2+1;

			  }
		    }
			while(m1==1)
		    {
		     if(clk==1)
			 m1=0;
		    } 
			if(s!=7)
			tt=tt>>1;  
		   }

               while(m1==0)
		   {
		     if(clk==0)
   			 {
			   m1=1;
              
			   if(date==1)
                            m2=m2+1;

			  }
		    }
                  while(m1==1)
		   {
		     if(clk==1)
			 m1=0;
		    }  
                  while(m1==0)
		   {
		     if(clk==0)
   			 {
			   m1=1;
			   m2=m2%2;
			  }
		    }
		 while(m1==1)
		   {
		     if(clk==1)
			 m1=0; 
		    } 
			m4=tt;
		   m5=tt;
		   
		 sent_date(m5);
		 SBUF=m4; 
	     
		} 
     }
  }

 }
}
void sent_date(uchar s_data)
{

   uchar num,num1=0,num2,num3=1,num4;
   
   
   qq=s_data;
   while(num3==1)
   {
     while(outclk==0);
     for(num2=0;num2<20;num2++);
     if(outclk==1&&outdate==1)
	 num3=0;
    }
   for(num2=0;num2<7;num2++);
   outdate=0;
   for(num2=0;num2<3;num2++);
   delay40us();
   outclk=1;
   for(num2=0;num2<7;num2++);
   for(num=0;num<8;num++)
   {
   outdate=flag2;
   if(flag2==1)
   num1=num1+1;
   for(num2=0;num2<3;num2++);
   delay40us();
   outclk=1;
   for(num2=0;num2<7;num2++);
   qq=qq>>1; 

   }
   num4=num1%2;
   if(num4==1)
   outdate=0;
   else
   outdate=1;
   for(num2=0;num2<3;num2++);
   delay40us();
   outclk=1;
   for(num2=0;num2<7;num2++);
   outdate=1;
   for(num2=0;num2<3;num2++);
   delay40us();
   outclk=1;
   for(num2=0;num2<7;num2++);
   //for(num2=0;num2<10000;num2++);
}
void delay40us(void)
{
   uchar i;
   outclk=0;
   for(i=0;i<9;i++);
}

/*void PORT_Init (void)
{
   uchar old_SFRPAGE;
   
   old_SFRPAGE = SFRPAGE;                 // Save old SFRPAGE
   SFRPAGE = CONFIG_PAGE;                 // Switch to configuration page
   XBR0    = 0x04;                        // enable spi
   XBR2    = 0x40;                        // Enable crossbar and weak pull-ups
   P0MDOUT |= 0xff;
   P1MDOUT |= 0xff;                       // enable P1.6 (LED) as push-pull output
   P2MDOUT |= 0xff;
   
   
   OSCXCN   = 0X67;
   for(tt=0;tt<200;tt++);
   tt=OSCXCN;
   while(flag==0)
   tt=OSCXCN;
   CLKSEL   = 0X01;
   OSCICN   = 0x40;

   SFRPAGE = old_SFRPAGE;                 // restore SFRPAGE
}*/
void UART0_Init (void)
{  
   TMOD=0x20;
   TL1=0xfd;
   TH1=0xfd;
   EA=1;
   ES=0;
   TR1=1;
   SCON=0x50;
}

⌨️ 快捷键说明

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