您好,欢迎来到年旅网。
搜索
您的当前位置:首页单片机RS485多机通讯系统

单片机RS485多机通讯系统

来源:年旅网
二、自制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;

}

delay(20); while(!TI); TI=0;

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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务