华邦单片机双串口RS485通信中断实现程序
华邦单片机双串口RS485通信
软件项目部 编稿者:程克辉
#include"W77E58.h"
#include<intrins.h>
#include <absacc.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
sbit c373ctrl2=P1^6;
sbit re=P1^1;
sbit re0=P3^5;
sbit dog=P3^3;
//char store[] _at_ 0x0011;
uchar store[25];
uchar comd0[9];
uchar date[18];
uchar senddate[28];
uchar code comd[]={0x4c,0x57,0x01,0x30,0x01,0x32,0x0d};
//uchar checkcode[]={0x08,0xaa,0xaa,0xaa,0xaa,0xaa,0x00,0x00}; int flag1,flag,flag2;
//int temp,ch;
uchar check;
uchar cont,f;
uchar g,h;
uchar k,i;
void delay(uint z)
{
uint x,m;
for(x=z;x>0;x--)
华邦单片机双串口RS485通信中断实现程序
for(m=110;m>0;m--);
}
void init()
{
// IP=0x10; //设定串口0优先级最高
}
void sendbyte0(char temp)
EA=1; ES=1;//开串口中断 ES1=1; TMOD=0x20;//定时计数器1,8位自动重装方式2 TH1=0xe8;//设计串口1的波特率为1200 TL1=0xe8; SCON1=0x50;//设计串口1为工作模式1,10位数据波特率可设 PCON=0x00;//波特率不倍增 TR1=1;//开定时计数器1 SCON=0x50; T2CON=0x30;//选择迫使定时器2做串口0的波特率发生器 RCAP2L=0xe0; RCAP2H=0xfe;//辞工作在捕捉模式,其自动装入TH2中,波特率为1200 TR2=1;//开定时计数器2 PMR=0x01; //程序访问片内1KSRAM P0=0xff; flag2=1; dog=0; f=0; i=0; k=0;
华邦单片机双串口RS485通信中断实现程序
{
re0=0;
SBUF=temp;
while(!TI);
TI=0;
}
void sendbyte(char ch)
{
re=0;
SBUF1=ch;
while(!TI_1);
TI_1=0;
}
uchar receivecheck1()
{
uint p;
uchar sum;
sum=0;
for(p=2;p<23;p++)
{
sum=sum+store[p];
}
return sum;
}
void codesend()
{
int n,e,m,x;
uchar temp;
华邦单片机双串口RS485通信中断实现程序
for(e=1;e<=5;e++)
senddate[e]=0xbb;
senddate[6]=P0;
senddate[7]=0x00;
senddate[8]=0x12;
senddate[0]=0x1b;
temp=senddate[1];
for(m=9;m<27;m++)
{
senddate[m]=date[n];
n++;
if(n==18)
n=0;
}
for(x=2;x<=26;x++)
{
temp=temp^senddate[x];
}
senddate[27]=temp;
}
uchar receivecheck()
{
uchar ch,j;
ch=comd0[1];
for(j=2;j<=7;j++)
{
ch=ch^comd0[j];
}
return ch;
华邦单片机双串口RS485通信中断实现程序
}
void main()
{
init();
c373ctrl2=0;
XBYTE[8005]=0;
while(1)
{
init();
if(flag2)
{
flag2=0;
/* for(g=0;g<7;g++)
{
sendbyte(comd[g]);
} */
TI_1=1;
}
if(flag==1)
{
flag=0;
f=0;
for(h=5;h<23;h++)
{
date[f]=store[h];
华邦单片机双串口RS485通信中断实现程序
f++;
if(f==18)
{
f=0;
flag2=1;
}
}
}
delay(1000);
if(flag1)
{
TI=1;
flag1=0;
}
dog=~dog;
delay(5);
dog=~dog;
delay(5);
// delay(900);
/* if(flag1)
{
codesend();
// ES=0;
flag1=0;
for(p=0;p<28;p++)
{
sendbyte0(senddate[p]);
}
// delay(200);
华邦单片机双串口RS485通信中断实现程序
}
REN_1=1; ES1=1; REN=1; ES=1; ES=1; // } */ }
void ext0(void) interrupt 4
{
uchar q; re0=1; PMR=0x01;//访问片内SRAM数据放到片外存储器 if(RI==1) { comd0[k]=SBUF; k++; RI=0; if(k==9) { k=0; check=receivecheck(); if((comd0[6]==P0)&&(comd0[8]==check)) { } REN=0; flag2=1; ES1=0; REN_1=0; flag1=1; //
华邦单片机双串口RS485通信中断实现程序
}
}
if(TI)
{
// flag1=0;
TI=0;
re0=0;
codesend();
for(q=0;q<28;q++)
{
sendbyte0(senddate[q]);
}
if(q==28)
{
q=0;
REN_1=1;
ES1=1;
REN=1;
TI=0;
re0=1;
}
}
}
void ext1() interrupt 7
{
uchar chcek1,g;
re=1;
华邦单片机双串口RS485通信中断实现程序
PMR=0x01;//访问片内SRAM数据放到片外存储器 if(RI_1)
{
// ES=0;
store[i]=SBUF1;
i++;
if(i==25)
{
i=0;
chcek1=receivecheck1();
if(chcek1==store[23])
{
flag=1;
// REN=1;
// ES=0;
// ES1=0;
// REN_1=0;
}
}
RI_1=0;
}
if(TI_1)
{
ES=0;
TI_1=0;
re=0;
for(g=0;g<7;g++)
{
sendbyte(comd[g]);
}
华邦单片机双串口RS485通信中断实现程序
if(g==7) {
re=1; g=0; ES=1; }
}
}