单片机RS485多机通讯系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二、自制RS232-485转换器

电路图:

RS232-485转换器主要包括了电源、232电平转换、485电路三部分。本电路的232电平转换电路采用了NIH232或者也可以直接使用MAX232集成电路,485电路采用了MAX485集成电路。为了使用方便,电源部分设计成无源方式,整个电路的供电直接从PC机的RS232接口中的DTR(4脚)和RTS(7脚)窃取。PC串口每根线可以提供大约9mA的电流,因此两根线提供的电流足够供给这个电路使用了。经实验,本电路只使用其中一条线也能够正常工作。使用本电路需注意PC程序必须使串口的DTR和RTS输出高电平,经过D3稳压后得到VCC,经过实际测试,VCC电压大约在4.7V左右。因此,电路中要说D3起的作用是稳压还不如说是限压功能。

MAX485是通过两个引脚RE(2脚)和DE(3脚)来控制数据的输入和输出。当RE为低电平时,MAX485数据输入有效;当DE为高电平时,MAX485数据输出有效。在半双工使用中,通常可以将这两个脚直接相连,然后由PC或者单片机输出的高低电平就可以让MAX485在接收和发送状态之间转换了。由于本电路DTR和RTS都用于了电路供电,因此使用TX线和HIN232的另外一个通道及Q1来控制MAX485的状态切换。平时NIH232的9脚输出高电平,经Q1倒相后,使MAX485的RE和DE为低电平而处于数据接收状态。当PC机发送数据时,NIH232的9脚输出低电平,经Q1倒相后,使MAX485的RE和DE为高电平而处于数据发送状态。

单片机RS485多机通讯技术广泛应用于工业生产与日常生活,本文简单介绍基于RS485的单片机多机通讯的电路构成和程序的写作,仅供初学者入门了解。功能实现:主机检测5个从机的地址,按顺序显示出来,

一、硬件电路:

由一个C51单片机、MAX485、排阻、发光二极管组成,震荡电路略。

P1口为地址码输入口,下图所示,P1=0x01,即从机地址码为:001。

二、主从机程序

/*********************主机程序**************************/ #include

#define uint unsigned int

#define uchar unsigned char

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,

0x6d,0x7d,0x07,0x7f,0x6f};

sbit t0 = P3^4;

sbit LED1 = P2^0;

sbit LED2 = P2^1;

/***********延时函数**************************/

void delay(uint x)

{

uchar i;

while(x--)

{ for(i=0;i<110;i++); }

}

/***********串口初始化函数**************************/ void init_UART()

{

SCON = 0xd0; //工作方式3

TMOD = 0x20;

PCON = 0x00;

TH1 = 0xfd;

TL1 = 0xfd;

TR1 = 1;

}

/*****************主函数************************/

void main()

{

uchar ADDR=0x01,num=0,tmp; //ADDR地址码,num地址个数

init_UART(); //串口初始

P1=0x3f; //初始时显示0

while(1)

{

tmp=ADDR+1;

while(tmp!=ADDR)

{

/*********发送从机地址**********/

TI=0;

TB8=1; //发送地址帧

t0=1; //发送使能

delay(20);

SBUF=ADDR;

while(!TI);

TI=0;

delay(20);

/*********接受从机地址**********/

t0=0; //接受使能

delay(20);

while(!RI);

tmp=SBUF;

RI=0;

delay(20);

}

P1=table[tmp%10]; //运算、显示地址码

delay(2000);

num++; //地址个数加1

ADDR++; //地址码加1

if(num==5)

{

num=0;

ADDR=0x01; //设置为开始地址 }

}

}

/******************从机程序 *********************/

#include

#define uint unsigned int

#define uchar unsigned char

sbit t0 = P3^4;

sbit LED= P3^2;

/**********延时函数***********************/

void delay(uint x)

{

uchar i;

while(x--)

{

for(i=0;i<110;i++);

}

}

/**********串口初始化函数***********************/

void init_UART()

{

SCON = 0xd0; //工作方式3

TMOD = 0x20;

TH1 = 0xfd;

TL1 = 0xfd;

PCON = 0x00;

TR1= 1;

}

/**************主函数***********************/

void main()

{

uchar tmp,ADDR;

init_UART(); //串口初始化

LED=0;

ADDR=~P1; //读取P1口值,作为本机地址码

while(1)

{

SM2=1; //只接收地址帧

/***如果接收到的地址帧不是本机地址,则继续等待***/

tmp=ADDR+1;

t0=0; //接受使能

while(tmp!=ADDR)

{

while(!RI);

tmp=SBUF;

RI=0;

LED=1; //程序仿真时便有观察程序执行到此布 }

delay(20);

/**发送本机地址作为应答信号,准备接收数据**/

t0=1; //发送使能

delay(20);

TI=0;

TB8=0; //主机不检测该位

SBUF=ADDR;

相关文档
最新文档