📄 lin_send.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 + -