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

📄 lin_send.c

📁 基于51单片机的LIN主节点的设计
💻 C
字号:
 
 
 sbit SLNP = P1^3; //定义控制睡眠模式的引脚

 l_u8 BreakReceived=0;
 l_u8 USART_DataReceived=0;
 l_u8 WaitReceived=0;
 l_u8 DataTemp;
//extern l_u8 PID = 0xF0;

void	l_sys_init(void) //系51单片机统初始化函数
{
 	l_u8 i;
	init_LCD(); //初始化液晶显示
   clear_LCD();//清屏
	//INT1	引脚的配置
	PX1=0; //优先级置0
	IT1=1;	 //下降沿触发
	//T0定时/计数器配置
	TMOD=TMOD|0X01;	//设置T0为16位定时器	,工作在方式1模式
	PT0=0X01;//优先级置1,表示优先级最高
	//T1定时/计数器配置	   :
	TMOD=TMOD|0X20;	//设置T1为8位之装载定时器,工作在方式2模式
	TH1=0xFA;	 //设置T1的值,使波特率为4800Baud

	//COM
	PCON=0X00;
	//********TJA1020模式设置*******
	//TJA1020有4种模式 分别为睡眠模式,准备模式,普通斜率模式,低斜率模式
	TH0=-25000/256;//延时25ms  //将TH0设为0x9F
	TL0=-25000%256;		   //将TL0设为0x58
	TR0=1;//启动定时器0
	
	do
	{
		TXD=1;
		RXD=1;
		SLNP=0;	 //sbit SLNP=P1^3; 	 单片机和TJA1020收发器一上电进入睡眠模式
		i=200;
		while(i--);//延时
		SLNP=1;	   //把TJA1020模式设置成普通斜率模式
		i=200;
		while(i--);	//延时
   	}
	while(TXD==0&&TF0==0); 	  // 如果设置成功 则 TXD=1
	TR0=0;//关闭T0定时/计数器 定时	   

	if(TF0==1)//超过25ms返回 表示设置模式失败	    
	{	
		TF0=0;
		//return(1);
	}
	TF0=0;

	
	EA=1;//开总中断标志 
}

void l_send_break(void)	 //发送同步间隔函数  
{	
	PCON=0x00;//SMODE置0
	TH1=0xF4;//将波特率设为正常数据传输速率的一般,为了保证发同步间隔时保持至少13个显示电平(低电平) 
	TL1=TH1;	
	TR1=1;
	SCON=0X40;//方式1,不允许接受
	SBUF=0X80;	//二进制为1000 0000,先发低位,再发高位,这里发送同步间隔场,		   
				 //同步间隔场要求先显形电平(低电平),后隐性电平(高电平)			  
	while(TI==0);
	TI=0;
	BreakReceived=1;

    

	TR1=1;
	SCON=0X50;//串口模式工作在方式1,许接受数据 

}

 
void delay(l_u16 tm)  //延时函数	 
{
	while(tm--);
} 


void l_send_bytes (l_u8 bytes)//发送字节 用来发同步场 
{
	PCON=0x00;//SMODE置0	
	TL1=TH1=0xFA;   //设置T1的值,使波特率为4800Baud
	TR1=1; 
	SCON=0X50;//串口模式工作在方式1 允许接收数据 
	SBUF=bytes;//将数据放到SBUF上准备发送 	
	while(TI==0);
	TI=0;
	USART_DataReceived=1;
	TR1=0;

	
}


l_u8 checksum8(l_u8 *chk8,l_u8 num)	//求校验和,即数据场所有字节的和的反码		 
{									//*chk8是要加的字节,num是字节个数)
    l_u8 temp=0;//存放所有字节的和 
	for( ;num>0;num--)
	{
		temp=temp+*chk8;
		  chk8++;
	}		   //求到所有字节的和   
	return(0xff-temp);//求字节何的反码并返回	     
}


	void l_send_data(l_u8 * temp,l_u8 num) //发送数据场和校验和,*temp是存放数据的数组,num数据的个数 
{
    l_u8 l_chksum,m;//l_chksumw是发送字节的个数 ,m是用来暂时存放校验和的 
	
	TL1=TH1;//TH1=FA,波特率为4800Baud
	SCON=0X50;
	TR1=1;

	for(l_chksum=0;l_chksum<num;l_chksum++)	//连续发送8个数据,并显示发送的数据 
	{
		SBUF=*temp;
		while(TI==0);
		TI=0;
		USART_DataReceived=1;
		if(l_chksum==4) gotoxy(2,0); //发送完4个后 显示换行	   
		display_LCD_number(*temp);	//显示发送的数据    
        display_LCD_string(" ");  //每发一个数据用一个空格隔开 
		temp++;					 
	}
	temp=temp-num;//再指向首地址
	m=checksum8(temp,num);	//求这个8个数据的校验和 
	SBUF=m; // 发送校验和  
	while(TI==0);
	TI=0;
	USART_DataReceived=1;

	display_LCD_string(" <S>");

	USART_DataReceived=1;
	}

  static void RevHeader(void) interrupt 4 	//接收串口中断函数			 
{ 
 ES=0;//关串口中断	   
 if(RI==1)//如果RI=1,表示接收完毕	   
 { RI=0;
   DataTemp=SBUF;//将SBUF的数据放到DateTemp里 为存到receive_data[n]里作准备			  
   WaitReceived=1; 
  
 }
 ES=1;//开串口中断	  
 return;   //中断返回	    
}  




⌨️ 快捷键说明

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