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

📄 test.c

📁 遥控灯系统
💻 C
字号:
#include  <stdio.h>
#include <../philips/reg51f.h>
#include " sja1000.h "

#define HIGH    1
#define LOW     0

unsigned char Count = 0;
unsigned char Count1= 0;		//慢闪
unsigned char FramID[4] ;   //帧头
unsigned char TXDData[8];	//发送的数据
unsigned char RXDData[8] ;	//接收的数据

unsigned char a[18]={0x55,0xaa,0x00,0x12,0x08,0x08,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0xff,0x00};
long  int  aa,bb;
long  int  chk;


sbit  mute=P2^5;			//消音
sbit  bell=P1^1;        //外接电铃
sbit  ha=P2^6;          //蜂鸣器


//串行输入信号控制脚
sbit DATp=P1^5;
sbit CLKp=P1^4;
sbit CTLp=P1^3;
unsigned char  bdata tData[2];           /* 数据暂存区 */

sbit   as1=tData[0]^0;					//按钮状态
sbit   as2=tData[0]^1;
sbit   as3=tData[0]^2;
sbit   as4=tData[0]^3;
sbit   as5=tData[0]^4;
sbit   as6=tData[0]^5;
sbit   as7=tData[0]^6;
sbit   as8=tData[0]^7;


sbit   ls1=tData[1]^7;				//灯的状态
sbit   ls2=tData[1]^6;
sbit   ls3=tData[1]^5;
sbit   ls4=tData[1]^4;
sbit   ls5=tData[1]^3;
sbit   ls6=tData[1]^2;
sbit   ls7=tData[1]^1;
sbit   ls8=tData[1]^0;




sbit   led1=P3^3;     //指示灯状态
sbit   led2=P3^4;
sbit   led3=P3^5;
sbit   led4=P2^0;
sbit   led5=P2^1;
sbit   led6=P2^2;
sbit   led7=P2^3;
sbit   led8=P2^4;

//若要改变发送顺序,则可以改变diss,astate,lstate的字节顺序
unsigned char  bdata  diss;     //消音状态位
sbit    dis1=diss^7;
sbit    dis2=diss^6;
sbit    dis3=diss^5;
sbit    dis4=diss^4;
sbit    dis5=diss^3;
sbit    dis6=diss^2;
sbit    dis7=diss^1;
sbit    dis8=diss^0;



unsigned char bdata astate;    //按钮延时判断状态位
sbit   ass1=astate^7;					
sbit   ass2=astate^6;
sbit   ass3=astate^5;
sbit   ass4=astate^4;
sbit   ass5=astate^3;
sbit   ass6=astate^2;
sbit   ass7=astate^1;
sbit   ass8=astate^0;

unsigned char bdata lstate;    //指示灯延时判断状态位
sbit   lss1=lstate^7;					
sbit   lss2=lstate^6;
sbit   lss3=lstate^5;
sbit   lss4=lstate^4;
sbit   lss5=lstate^3;
sbit   lss6=lstate^2;
sbit   lss7=lstate^1;
sbit   lss8=lstate^0;


unsigned char bdata DataIn;    /* 串行数据输入 */
sbit IN2 = DataIn^0;

bit  flash,flashs;

void InitSJA( void );		//SJA初始化
void SEND( void );			//发送函数
void InitSYS( void );		//系统初始化



void ReadData(void)     					//串行读数据
{
   unsigned char i,j;
   CLKp = HIGH;                        /* 时钟线置高 */ 
   DATp = HIGH;                        /* 数据线置高 */ 
   CTLp = HIGH;                        /* 采样数据   */ 
   CTLp = LOW;  
   CLKp = LOW;                         /* 时钟线置低 */   
   for(j=0;j<2;j++)
   {
      for(i=0;i<8;i++)
      {  DataIn = DataIn<<1;           /* 数据读入 一共8个  */     
         IN2 = DATp; 
         CLKp = HIGH;                  /* 时钟翻转          */       
         CLKp = LOW;                               
      }      
      tData[j] = DataIn;               /* 把数据存入暂存区  */ 
   }
}










void delay(unsigned int i)
{
     while(i--);    
}

//SJA1000初始化
void InitSJA( void )
{
	PX0 = PRIORITY_HIGH; /*设CAN 优先中断 */
	IT0 = INTLEVELACT; 	/*中断0 为电平激活 */
   EA = DISABLE; 			/*所有中断禁能 */
   SJAIntEn = DISABLE; /*来自SJA100 的外部中断禁能 */
	while((ModeControlReg & RM_RR_Bit)==ClrByte)
    {  
          /*其他位而不是复位模式/请求位没有改变 */
           ModeControlReg = ModeControlReg|RM_RR_Bit;
    }	 	 	 	  

    ClockDivideReg = CANMode_Bit|CLKOff_Bit;/*PeliCan,同时关闭时钟*/

	
	 /*定义验收代码和屏蔽 */
    AcceptCode0Reg = 0xaa;			
    AcceptCode1Reg = 0xaa;
    AcceptCode2Reg = 0xaa;
    AcceptCode3Reg = 0xaa;
    AccepMask0Reg  = 0x00;
    AccepMask1Reg  = 0x00;
    AccepMask2Reg  = 0x00;
    AccepMask3Reg  = 0x00;
 															
 	/*位频率250Kbit/s@16MHz 总线被采样一次 */
   BusTiming0Reg= 0x01;
   BusTiming1Reg= 0x1C;								 			 
   /*配置CAN 输出TX0 悬空TX1 推挽正常输出模式 */
   OutControlReg = Tx1Float|Tx0PshPull|NormalMode;

     do   /*等待直到RM_RR_Bit 清零 */
    {   
		  ModeControlReg = AFM_Bit; //进入工作模式,选择单个验收滤波器32位

     }while((ModeControlReg&RM_RR_Bit) != ClrByte);

    InterruptEnReg = RIE_Bit|BEIE_Bit|DOIE_Bit; /*SJA1000 的接收中断使能 */
                                              /*SJA1000 的错误中断使能 */
                                              /*SJA1000 的溢出中断使能 */
    
    SJAIntEn = ENABLE; /*SJA1000 的外部中断使能 */
    EA = ENABLE; /*所有中断使能 */
}

//数据发送
void SEND(void)
{	
if(StatusReg&TBS_Bit==TBS_Bit);   //发送缓冲区释放
  {
  		TxFramInFo = 	0x88;                 	/* 扩展帧 */																				
		TxBuffer1  = 	FramID[0];					//帧ID
		TxBuffer2  = 	FramID[1];
		TxBuffer3  = 	FramID[2];
		TxBuffer4  = 	FramID[3];
		TxBuffer5  = 	TXDData[0];					//发送的数据
		TxBuffer6  = 	TXDData[1];
		TxBuffer7  = 	TXDData[2];
		TxBuffer8  = 	TXDData[3];
		TxBuffer9  = 	TXDData[4];
		TxBuffer10 = 	TXDData[5];
		TxBuffer11 = 	TXDData[6];
		TxBuffer12 = 	TXDData[7];
		CommandReg = 	TR_Bit; 					/*置位发送请求位 */
 	}                 	
}




void   senddata(Uchar word)
{	    P=0;
       ACC=0;
  		 ACC=word;
		 TB8=!P;
		 SBUF=ACC;
		 while(TI==0);
		 TI=0;


}





void send_422(void)
{
	aa=0;
	bb=0;
   chk=0;
	a[12]=0xff-lstate;
	a[13]=0xff-astate;
	aa=a[0]+a[2]+a[4]+a[6]+a[8]+a[10]+a[12]+a[16];
	bb=a[1]+a[3]+a[5]+a[7]+a[9]+a[11]+a[13]+a[17];
   chk=(aa<<8)+bb;

	chk = (chk >> 16) + (chk & 0xffff);
	chk+=(chk>>16);
	a[15]=~chk;
	a[14]=~(chk>>8);


senddata(a[0]);
senddata(a[1]);
senddata(a[2]);
senddata(a[3]);
senddata(a[4]);
senddata(a[5]);
senddata(a[6]);
senddata(a[7]);
senddata(a[8]);
senddata(a[9]);
senddata(a[10]);
senddata(a[11]);
senddata(a[12]);
senddata(a[13]);
senddata(a[14]);
senddata(a[15]);
senddata(a[16]);
senddata(a[17]);

}	 
	













//系统初始化

void  InitSYS(void)
{       delay(1000);
    	TMOD=0x21;       		// 定时器1工作在模式2,自动再装入的8位计数器
	                     	// 定时器0工作在模式1,16位计数器
    	ET0=1;           		// 开定时器0中断
		TR0=1;           		// 启动定时器0
		EXTRAMCtrReg=EXTRAM;	/* 低地址(0~128) 使用外部RAM     */
   	EA=1;

SCON=0xD0;      //方式3

TH1=0xf7;
TR1=1;
TI=1;
 				
PCON|=0X80;






	
}	

 //定时器0中断程序
void Timer0_int( void ) interrupt 1          
{  static  unsigned char  c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,c13,c14,c15,c16,c17;    //计数用
   TR0=0;
	if( Count >= 7 )
	 { SEND();
		flash=!flash;    //快闪信号
		Count = 0;
	 } 
	 else Count++;

	if( Count1 >= 15 )
	 { 
		flashs=!flashs;	//慢闪信号
		Count1 = 0;
	 } 
	 else Count1++;


	if( Count == 7 )
send_422();






ReadData();
    if(as1)					//按钮1
	 	{	c1++;
	 		if(c1>4)
	 			{ass1=1;c1=0;}
	 	}
	 else
	 	{ass1=0;c1=0;dis1=0;}

  if(as2)					//按钮2
	 	{	c2++;
	 		if(c2>4)
	 			{ass2=1;c2=0;}
	 	}
	 else
	 	{ass2=0;c2=0;dis2=0;}

    if(as3)					//按钮3
	 	{	c3++;
	 		if(c3>4)
	 			{ass3=1;c3=0;}
	 	}
	 else
	 	{ass3=0;c3=0;dis3=0;}


    if(as4)					//按钮4
	 	{	c4++;
	 		if(c4>4)
	 			{ass4=1;c4=0;}
	 	}
	 else
	 	{ass4=0;c4=0;dis4=0;}

    if(as5)					//按钮5
	 	{	c5++;
	 		if(c5>4)
	 			{ass5=1;c5=0;}
	 	}
	 else
	 	{ass5=0;c5=0;dis5=0;}


    if(as6)					//按钮6
	 	{	c6++;
	 		if(c6>4)
	 			{ass6=1;c6=0;}
	 	}
	 else
	 	{ass6=0;c6=0;dis6=0;}



    if(as7)					//按钮7
	 	{	c7++;
	 		if(c7>4)
	 			{ass7=1;c7=0;}
	 	}
	 else
	 	{ass7=0;c7=0;dis7=0;}

    if(as8)					//按钮8
	 	{	c8++;
	 		if(c8>4)
	 			{ass8=1;c8=0;}
	 	}
	 else
	 	{ass8=0;c8=0;dis8=0;}


   if(ls1)					//指示灯1
	 	{	c9++;
	 		if(c9>4)
	 			{lss1=1;c9=0;}
	 	}
	 else
	 	{lss1=0;c9=0;}

  if(ls2)					//指示灯2
	 	{	c10++;
	 		if(c10>4)
	 			{lss2=1;c10=0;}
	 	}
	 else
	 	{lss2=0;c10=0;}

   if(ls3)					//指示灯3
	 	{	c11++;
	 		if(c11>4)
	 			{lss3=1;c11=0;}
	 	}
	 else
	 	{lss3=0;c11=0;}

   if(ls4)					//指示灯4
	 	{	c12++;
	 		if(c12>4)
	 			{lss4=1;c12=0;}
	 	}
	 else
	 	{lss4=0;c12=0;}

   if(ls5)					//指示灯5
	 	{	c13++;
	 		if(c13>4)
	 			{lss5=1;c13=0;}
	 	}
	 else
	 	{lss5=0;c13=0;}

   if(ls6)					//指示灯6
	 	{	c14++;
	 		if(c14>4)
	 			{lss6=1;c14=0;}
	 	}
	 else
	 	{lss6=0;c14=0;}

   if(ls7)					//指示灯7
	 	{	c15++;
	 		if(c15>4)
	 			{lss7=1;c15=0;}
	 	}
	 else
	 	{lss7=0;c15=0;}

   if(ls8)					//指示灯8
	 	{	c16++;
	 		if(c16>4)
	 			{lss8=1;c16=0;}
	 	}
	 else
	 	{lss8=0;c16=0;}


	if(!mute)
	{dis1=ass1;
	 dis2=ass2;
    dis3=ass3;
    dis4=ass4;
    dis5=ass5;
    dis6=ass6;
    dis7=ass7;
    dis8=ass8;

	}

if(astate!=(lstate|diss))   //蜂鸣器
{c17++;
  if(c17>2)
   {ha=flash;c17=3;bell=0;}
	}
else
{ha=1;bell=1;c17=0;}

   TR0=1;
   
}


/* CAN总线中断子程序 */
void CANInt(void) interrupt 0
{
    /*从SJA1000 读中断寄存器的内容并临时保存所有中断标志被清除在PeliCAN 模式里
    接收中断RI 被首先清除当给出释放缓冲器命令时*/
	
   ET0 = DISABLE;                                     /* 定时器0 中断禁能  */
   CANInterrupt = InterruptReg;
   CANState = StatusReg;

 if(BEI_BitVar )	
   	InitSJA();   


    /* 错误中断处理 */
    if(EI_BitVar == YES)                        
    { 
      if((ModeControlReg&RM_RR_Bit) != ClrByte)
      {  
          ModeControlReg = ClrByte;                  /* 进入工作模式          */
          InterruptEnReg = RIE_Bit|EIE_Bit|DOIE_Bit; /*SJA1000 的接收中断使能 */
                                                     /*SJA1000 的错误中断使能 */
																	  /*SJA1000 的溢出中断使能 */                                   
      }
    }

    /*检查接收中断和读一个或所有接收到的信息 */
    if(RI_BitVar == YES)                             /*检测到接收中断         */    
       { /*从SJA1000 得到接收缓冲器的内容并将它存入控制器的内部存储器*/
			RXDData[0]=RxBuffer5;
			RXDData[1]=RxBuffer6;
			RXDData[2]=RxBuffer7;
			RXDData[3]=RxBuffer8;
			RXDData[4]=RxBuffer9;
			RXDData[5]=RxBuffer10;
			RXDData[6]=RxBuffer11;
			RXDData[7]=RxBuffer12;      
         CommandReg = RRB_Bit;                     /* 释放接收缓冲器     	*/
        }                  
          
    if(DOI_BitVar == YES )                      	/* 检查数据是否溢出   	*/
        {
           CommandReg = CDO_Bit;                   /* 发清除数据溢出命令 	*/
        }
    
   		ET0 = ENABLE;                             /* 定时器0 中断使能 		*/
}







void main( void )
{	
  	InitSYS();
	InitSJA();
	while( 1 )
	{
			FramID[0] = 0x04;			//帧ID
			FramID[1] = 0xb1;
			FramID[2] = 0xc0;
         FramID[3] = 0x00;

			TXDData[0] = 0xff-lstate;		//发送的数据
			TXDData[1] = 0xff-astate;
			TXDData[2] = 0x00;
			TXDData[3] = 0x00;
			TXDData[4] = 0x00;
			TXDData[5] = 0x00;
			TXDData[6] = 0x00;
			TXDData[7] = 0x00;

 
  

led1=!ass1|(!lss1&((flash&!dis1)|(flashs&dis1)));
led2=!ass2|(!lss2&((flash&!dis2)|(flashs&dis2)));
led3=!ass3|(!lss3&((flash&!dis3)|(flashs&dis3)));
led4=!ass4|(!lss4&((flash&!dis4)|(flashs&dis4)));
led5=!ass5|(!lss5&((flash&!dis5)|(flashs&dis5)));
led6=!ass6|(!lss6&((flash&!dis6)|(flashs&dis6)));
led7=!ass7|(!lss7&((flash&!dis7)|(flashs&dis7)));
led8=!ass8|(!lss8&((flash&!dis8)|(flashs&dis8)));
	
		}

	}




⌨️ 快捷键说明

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