单片机RS485多机通讯系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;