📄 serial811.c
字号:
/* 完成的功能是:采用PC机和单片机握手方式,首先,PC机向单片机发送要访问的节点ID号,单片机接收后返回接收到的ID号,若PC机接
收到的ID号和发的一致,则接着发送后面的功能信息和数据信息。否则返回"FF",PC机重发节点ID号,直到双方取的联系。单片机把接收
到的ID号、功能信息和数据信息放在Readata[4]中,当接收完一次数据(共3帧),单片机就发送自己收到的数据。简单的说,就是通过
口助手和单片机实现数据的自发自收*/
#include<reg52.h>
#define uchar unsigned char
#define LEN 3
uchar idata Readata[3];
//uchar idata Wridata[4];
bit read_flag;
uchar count,ID_flag;
//void Back(uchar tem);
//uchar Receive();
void Send();
//void delay(uchar count);
void Initserial();// 串口初始化程序
void Initserial() // 串口初始化程序
{
TMOD=0X20;//定时器T1定义为模式2
TL1=0XFD;//置初值波特率为9600b/s
TH1=0XFD;
PCON=0X00;//SMOD=0
TR1=1;//启T1计数
SCON=0X50;//设置串行口控制字,方式1,允许接收
IE|= 0x90; //开中断
}
void Send()
{ uchar j;
for(j=0;j<LEN;j++)
{SBUF=Readata[j];
while(TI!=1);TI=0;//等待发送完
}
}
void serial () interrupt 4 using 3 ////串口接收中断函数
{ uchar ch;
if(RI)
{ RI =0;
ch=SBUF;
if(ID_flag==0)
switch(ch)//向PC机回送节点号
{
case 0xD1:SBUF=0xd1;while(TI!=1);TI=0;ID_flag=1;Readata[0]=ch;break;
case 0xD2:SBUF=0xd2;while(TI!=1);TI=0;ID_flag=1;Readata[0]=ch;break;
case 0xD3:SBUF=0xd3;while(TI!=1);TI=0;ID_flag=1;Readata[0]=ch;break;
case 0xD4:SBUF=0xd4;while(TI!=1);TI=0;ID_flag=1;Readata[0]=ch;break;
default:SBUF=0xff;while(TI!=1);TI=0;ID_flag=0;break;
} //完成对PC机的地址回送,以确认单片机收到的是正确信息
else { count++;
Readata[count]=ch;//单片机接收数据
if(count==LEN-1) {read_flag=1;ID_flag=0;count=0;}
}
}
}
void main()
{
uchar i;
for(i=0;i<10;i++);
Initserial();// 串口初始化程序
while(1)
{ if(read_flag) //如果取数标志已置位,就将读到的数从串口发出
{ read_flag=0; //取数标志清0
Send();
}
}
}
/*
uchar Receive()
{
uchar addr,i,flag;
uchar D1,D2,D3,D4,FF;
flag=0;
while(1)
{
while(RI!=1);RI=0;//等待PC机的联络信号
addr=SBUF;
if(flag==0)
{ switch(addr)//向PC机回送节点号
{
case 0xD1:Back(D1),flag=1;break;
case 0xD2:Back(D2),flag=1;break;
case 0xD3:Back(D3),flag=1;break;
case 0xD4:Back(D4),flag=1;break;
default:Back(FF),flag=0;break;
} //完成对PC机的地址回送,以确认单片机收到的是正确信息
}
else { while(RI!=1);
RI=0;
while(1)
{
for(i=0;i<=2;i++)//单片机接收数据
{ while(RI!=0);RI=0;
Readata[i]=SBUF;
}
}
}
}
return (0);
}*/
/*void delay(uchar count)//延时count*2ms
{
uchar i,j;
for(i=0;i<count;i++)
for(j=0;j<250;j++)
{;}
}//一个for语句延时8us
*/
/*返回函数的功能是:CAN0节点向PC机回送标志,从而PC机在确认后能够发送数据*/
/*void Back(uchar tem)
{
SBUF=tem;
while(TI!=1);//等待发送完
TI=0;
}*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -