华邦单片机双串口RS485通信中断实现程序

发布时间:2024-11-06

华邦单片机双串口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; }

}

}

华邦单片机双串口RS485通信中断实现程序.doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:7 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:29元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219