📄 pt_gprs.c
字号:
#include <reg52.h>
//===============================================================
#define uchar unsigned char
#define uint unsigned int
//
//sbit get_led=P0^1; //接收指示灯
//sbit send_led=P0^2; //发送指示灯
//sbit over_led=P0^3; //结束指示灯
//sbit er_led1=P0^4; //错误指示灯
//sbit er_led2=P0^5; //错误指示灯
//sbit er_led3=P0^6; //错误指示灯
//sbit er_led4=P0^7; //错误指示灯
//================================================================
sbit AdrIn0 = P1^3; //子串口0、1、2接收地址
sbit AdrIn1 = P1^4;
sbit AdrOut0 = P0^6; //子串口0、1、2发送地址
sbit AdrOut1 = P0^7;
sbit TTL_485 = P1^0; //485控制
//================================================================
# define OLEN 16 //发送缓冲区大小
uchar idata outbuf[OLEN]; //发送缓冲区
uchar idata *outlast=outbuf; //最后由中断传输出去的字节位置
uchar idata *putlast=outbuf; //最后放入发送缓冲区的字节位置
# define ILEN 6 //接收缓冲区大小
uchar idata inbuf1[ILEN]; //接收缓冲区1
uchar idata inbuf2[ILEN]; //接收缓冲区2
uchar idata *inlast1=inbuf1; //最后由中断进入接收缓冲区1的字节位置
uchar idata *inlast2=inbuf2; //最后由中断进入接收缓冲区2的字节位置
uchar idata AT_BUFF[20]; //指令接收缓存
uchar idata *inline=AT_BUFF; //接收缓存的指针
uchar idata TIsign; //中断向母串口发零以使母子串口波特率协调
uchar idata data_number1; //接收的数据个数
uchar idata data_number2; //接收的数据个数
uint idata T0_10ms_count; //定时器溢出计数
bit bdata outbufsign; //输出缓冲区非空标志 有=1
bit bdata inbufful1; //输入缓冲区1满标志 满=1
bit bdata inbufful2; //输入缓冲区2满标志 满=1
bit bdata OI; //子串口0、1选择标志量
bit bdata data_over1; //一路数据接收完毕
bit bdata data_over2; //二路数据接收完毕
//====================================================
void DelayUs(uint delay_Nus) //延时N us
{
while(delay_Nus)
delay_Nus--;
}
//=====================================================
//串口中断
//=====================================================
serial() interrupt 4
{
if(TI)
{
TI=0;
if(outbufsign) //缓冲区满标志
{
if(TIsign==0) //TIsign为零发数据
{
if(OI==0) //如果发给串口0 .........PT...........
{
TTL_485=0;
AdrOut0=0; //置串口0地址
AdrOut1=0;
// TTL_485=0; //........................pt......................
SBUF=*outlast; //未发送完继续发送
outlast++; //最后传出去的字节位置加一
}
else
{
AdrOut0=1; //置串口1地址
AdrOut1=0;
SBUF=*outlast; //未发送完继续发送
outlast++; //最后传出去的字节位置加一
}
TIsign=3; //置发零个数标志量为三
}
else //否则发零
{
AdrOut0=1; //置母串口地址
AdrOut1=1;
SBUF=0; //发零
TIsign--;
}
if(outlast==outbuf+OLEN) outlast=outbuf; //地址到顶部回到底部
if((putlast==outlast)&&TIsign==0)
{
DelayUs(0x60); //延时25us .........................................................
TTL_485=1; //...................pt..................................
outbufsign=0; //数据发送完置发送缓冲区空标志
}
}
}
if(RI)
{
RI=0;
if(AdrIn0==0) //串口0接到数据 从PT获取
{
data_number1++; //个数加一
if(data_number1>=1&&data_number1<=3) //截取需要的数字串
{
*inlast1=SBUF; //放入数据
inlast1++; //最后放入的位置加一
}
if(inlast1==inbuf1+ILEN) //地址到顶部回到底部
{
inlast1=inbuf1;
inbufful1=1; //接收缓冲区满置满标志
}
if(data_number1==3)
{
inlast1=inbuf1; //...............................................
data_over1=1; //下位机接收结束
}
}
else //串口1接到数据 从PC获取
{
data_number2++; //个数加一
if(data_number2>=1&&data_number2<=6) //截取需要的数字串
{
*inlast2=SBUF; //放入数据
inlast2++; //最后放入的位置加一
}
if(inlast2==inbuf2+ILEN) //地址到顶部回到底部
{
inlast2=inbuf2;
inbufful2=1; //接收缓冲区满置满标志
}
if(data_number2==6) //上位机接收结束
{
inlast2=inbuf2; //................................................
data_over2=1;
}
}
}
}
//=====================================================
//放一串数据到发送缓冲区
//=====================================================
putbytes(unsigned char *outplace,unsigned char j)
{
int i;
for(i=0;i<j;i++)
{
*putlast=*outplace; //放字节进入缓冲区
putlast++; //入指针加一
outplace++; //字符串指针加一
if(putlast==outbuf+OLEN)putlast=outbuf; //指针到了顶部换到底部
}
if(!outbufsign){outbufsign=1;TI=1;} //缓冲区开始为空,置为“有”标志,启动发送
}
//..................................................
//定时器T0中断
//..................................................
void timer0_ISR(void)interrupt 1
{
T0_10ms_count++; //溢出次数加一
TL0=0x00;
TH0=0xB8; //置初值
}
//..................................................
void getDatas() //数据接收函数
{
uchar data_over=0;
T0_10ms_count=0;
// get_led=0; //开接收指示灯
RI=0; //置接收位清零
do{
while(!RI)
{
if(T0_10ms_count==3000) //超过30秒,亮错误指示灯
{
// er_led1=0; //初始化错误指示灯关
// er_led2=0;
// er_led3=0;
// er_led4=0;
data_over=1; //结束数据接收
break; //跳出
// while(1){}; //............................
}
};
RI=0;
*inline=SBUF;
if(*inline==0x0A&&*(inline-1)==0x0D) //接收结束条件判断 指令
{
if(*(inline-2)=='K'||*(inline-2)=='R'||*(inline-2)=='T')
{
if(*(inline-3)=='O'||*(inline-3)=='C'||*(inline-3)=='E')
data_over=1;
}
}
inline++;
//数据判断
}while(data_over!=1); //数据已接完
inline=AT_BUFF; //接收指针回缓存首址
DelayUs(0x09C4); //延时10ms 115200byte/s 70us/byte,可延时150个字节
// get_led=1; //关接收指示灯
}
//..................................................
//向串口发送一个字节的数据
//.................................................
void sendData(uchar c)
{
uchar i;
AdrOut0=1; //置串口1地址
AdrOut1=0;
SBUF=c;
while(!TI);
TI=0;
AdrOut0=1; //置母串口地址
AdrOut1=1;
for(i=0;i<3;i++)
{
SBUF=0; //发零
while(!TI);
TI=0;
}
}
//....................................................
//向串口发送一串数据
//....................................................
void sendDatas(uchar *outline)
{
int i;
// send_led=0; //开发送指示灯
DelayUs(0x04E2); //延时5ms
for(i=0;*outline!=0;i++)
{
sendData(*outline);
outline++;
}
// send_led=1; //关发送指示灯
}
//......................................................
//十六进制字符串转化为十六进制 "B0"=>0xB0
//......................................................
void ASCII_OXXX(uchar *changeline)
{
uchar i=0;
while(i<6)
{
switch(*changeline)
{
case '0':
if(i%2==0) //字符高位转化为十进制
*changeline=0*16;
if(i%2!=0) //字符低位转化为十进制
{
if(i==1)
*(changeline-1)=*(changeline-1)+0; //高低位相加,存放与某一位置,本例中六字符十六进制字符串转化为三字符十六进制
if(i==3)
*(changeline-2)=*(changeline-1)+0;
if(i==5)
*(changeline-3)=*(changeline-1)+0;
}
break;
case '1':
if(i%2==0)
*changeline=1*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+1;
if(i==3)
*(changeline-2)=*(changeline-1)+1;
if(i==5)
*(changeline-3)=*(changeline-1)+1;
}
break;
case '2':
if(i%2==0)
*changeline=2*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+2;
if(i==3)
*(changeline-2)=*(changeline-1)+2;
if(i==5)
*(changeline-3)=*(changeline-1)+2;
}
break;
case '3':
if(i%2==0)
*changeline=3*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+3;
if(i==3)
*(changeline-2)=*(changeline-1)+3;
if(i==5)
*(changeline-3)=*(changeline-1)+3;
}
break;
case '4':
if(i%2==0)
*changeline=4*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+4;
if(i==3)
*(changeline-2)=*(changeline-1)+4;
if(i==5)
*(changeline-3)=*(changeline-1)+4;
}
break;
case '5':
if(i%2==0)
*changeline=5*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+5;
if(i==3)
*(changeline-2)=*(changeline-1)+5;
if(i==5)
*(changeline-3)=*(changeline-1)+5;
}
break;
case '6':
if(i%2==0)
*changeline=6*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+6;
if(i==3)
*(changeline-2)=*(changeline-1)+6;
if(i==5)
*(changeline-3)=*(changeline-1)+6;
}
break;
case '7':
if(i%2==0)
*changeline=7*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+7;
if(i==3)
*(changeline-2)=*(changeline-1)+7;
if(i==5)
*(changeline-3)=*(changeline-1)+7;
}
break;
case '8':
if(i%2==0)
*changeline=8*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+8;
if(i==3)
*(changeline-2)=*(changeline-1)+8;
if(i==5)
*(changeline-3)=*(changeline-1)+8;
}
break;
case '9':
if(i%2==0)
*changeline=9*16;
if(i%2!=0)
{
if(i==1)
*(changeline-1)=*(changeline-1)+9;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -