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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务