//232通信和485通信综合程序 小罗 2011.5.25
//485的RE用89C52单片机的P1.3口控制
#include <reg52.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define val 30 //字符串的长度
sbit RS485Enable = P1^3; //485的控制端RE,IO口根据硬件电路进行选择 0: REC, 1:SEND
unsigned char flag,i;
uchar code table[]="I get ";
unsigned int buf[val];
void init()
{
TMOD=0x20;//定时器T1使用工作方式2
TH1=0xfd;//T1定时器装初值(高位)
TL1=0xfd;//T1定时器装初值(低位)
TR1=1;//开始计时
SCON=0x50;//9600波特率,允许接收
EA=1;//开总中断
ES=1;//开串口中断
}
void ser() interrupt 4 //中断接收函数
{
RI=0;
while(buf[val]!="\0") //判断是否为最后一个字符
{
for(i=0;i<val;i++)
buf[val]=SBUF;//把数据存在寄存器里
}
flag=1;//设置接收标识符
}
void main()
{
uint io_type;
printf("please input a io_type(1 for 232,2 for 485):\n");
scanf("%d",&io_type);
init();
switch(io_type)
{
case 1:
printf("Communication mode for 232");
while(1)
{
if(flag==1)//是否有中断,
{
ES=0;//关UART中断
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
while(buf[val]!="\0")
{
for(i=0;i<val;i++)
SBUF=buf[val];//发送数据
}
while(!TI);
TI=0;
ES=1;
flag=0;
}
}
break;
case 2:
printf("Communication mode for 485");
RS485Enable=0;//485允许接收
while(1)
{
if(flag==1)//是否有中断,
{
ES=0;//关UART中断
RS485Enable=1; //发送数据模式
for(i=0;i<6;i++)
{
SBUF=table[i];
while(!TI);
TI=0;
}
while(buf[val]!="\0")
{
for(i=0;i<val;i++)
SBUF=buf[val];//发送数据
}
while(!TI);
TI=0;
ES=1;
RS485Enable=0;//数据发送之后将控制端切换到接收模式
flag=0;
}
}
break;
default:
break;
}
}
(本文引自www.mcujl.com/article.asp?conID=599)