单片机RS-485通信源程序

合集下载

单片机485烧程序方法

单片机485烧程序方法

单片机485烧程序方法
1. 准备工作,首先,你需要准备一台支持单片机485烧录的编程器,以及单片机的开发板和对应的编程软件。

确保你有正确的单片机型号和对应的烧录工具。

2. 连接硬件,将编程器通过USB接口连接到计算机上,然后将编程器的接口与开发板上的对应接口相连。

确保连接的稳固性和正确性。

3. 打开编程软件,打开单片机的编程软件,一般来说,这些软件会提供一个界面,你可以在界面中选择单片机型号和相应的烧录方式。

4. 选择文件,在编程软件中选择你要烧录的程序文件,通常是一个.hex文件或者.bin文件。

5. 设置参数,根据你的需要,设置好烧录的参数,比如时钟频率、烧录方式等。

6. 烧录程序,点击软件界面上的烧录按钮,软件会开始向单片
机烧录程序。

在烧录过程中,要确保编程器和单片机的连接稳定,避免操作过程中的干扰。

7. 验证烧录,烧录完成后,一般软件会提示烧录成功。

此时可以进行一次验证,确认程序是否成功烧录到单片机中。

总的来说,单片机485烧程序方法需要准备好硬件设备、连接正确的硬件接口、选择正确的编程软件、设置好烧录参数,并且要确保烧录过程中的稳定性和正确性。

希望这些步骤能帮助到你。

单片机RS-485通信源程序

单片机RS-485通信源程序

单片机RS-485通信源程序附录一、主机源程序#include <reg52.H>unsigned char xdata table[5];unsigned char code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x05,0xc1,0x63,0x85,0x61,0x71,0xff}; sbit ctrl=P1^2;sbit DATA=P1^0;sbit CLK=P1^1;void show(unsigned char m)//LED显示子程序{unsigned char i,d;d=tab[m];for(i=0;i<8;i++){DATA=d&0x01;CLK=0;CLK=1;d=d>>1;}}void interrupt0(void) interrupt 0 using 0//串行中断程序{unsigned char cm0,cm1,sum0,sum1,i;lab:sum0=0;ctrl=1;//将MAX485设置为发送方式SBUF=0xFF;//发送数据申请while(TI!=1);ctrl=0; //将MAX485设置为接收方式TI=0;while(RI!=1);cm0=SBUF;//接收申请确认信号RI=0;if(cm0==0xff){i=0;ctrl=0;while(RI!=1);cm1=SBUF; //接收第一个数据RI=0;附录二、从机源程序#include <reg52.H>unsigned char xdata table[]={0,0,0,0};sbit replay=P1^0;sbit warn0=P1^1;sbit CTRL=P1^2;sbit DATA=P1^3;sbit CLK=P1^4;unsigned char code tab[]={0x03,0x9f,0x25,0x0d, //显示用的码表0x99,0x49,0x41,0x1f,0x01,0x09,0x05,0xc1,0x63,0x85,0x61,0x71,0xff};void delay(void) //键盘扫描延时10ms程序{unsigned char i,j;for(i=20;i>0;i--)for(j=248;j>0;j--);}void show(unsigned char m)//LED显示子程序{unsigned char i,d;d=tab[m];for(i=0;i<8;i++){DATA=d&0x01;CLK=0;CLK=1;d=d>>1;}}void ser(void) interrupt 4 using 0//串行中断程序{unsigned char cm,sum,i;sum=0;replay=1;warn0=1;cm=SBUF;RI=0;if(cm==0xf0)//判断是否为主机返回的确认信号{replay=0; //表示已正确发送完一组数据goto end;}elseif(cm!=0xff)//判断是否为主机的数据申请{warn0=0; //通信命令错误提示goto end;}else{CTRL=1; //置MAX485为发送方式SBUF=0xff;//发送申请确认信号while(TI!=1);TI=0;for(i=0;i<4;i++){SBUF=table[i]; //发送数据while(TI!=1);TI=0;sum=sum+table[i];//计算校验和}SBUF=sum; //发送校验和while(TI!=1);TI=0;SBUF=0xf0;//发送结束标志while(TI!=1);TI=0;}end: CTRL=0; //置MAX485为接收方式return;}void main(void){unsigned char key,X,Y,temp;SCON = 0x50; //串口方式1,允许接收TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1;TH1 = 0xFA; //11.0592MHz 9600 波特率TL1 = 0xFA;TR1 = 1; //启动定时器ES=1; //开串行中断EA=1; //开总中断CTRL=0; //置MAX485为接收方式replay=1;warn0=1;while(1) //键盘扫描{P2=0xff; //键盘初始化P2=0xf0;if (P2!=0xf0){delay(); //延时去抖if (P2!=0xf0){X=P2; //读键盘P2=0x0f;Y=P2;P2=X|Y;temp=P2;switch(temp){case 0xee:key=0;break;case 0xde:key=1;break;case 0xbe:key=2;break;case 0x7e:key=3;break;case 0xed:key=4;break;case 0xdd:key=5;break;case 0xbd:key=6;break;case 0x7d:key=7;break;case 0xeb:key=8;break;case 0xdb:key=9;break;case 0xbb:key=10;break;case 0x7b:key=11;break;case 0xe7:key=12;break;case 0xd7:key=13;break;case 0xb7:key=14;break;case 0x77:key=15;break;}for(X=0;X<4;X++) //存储最近读的按键码table[X]=table[X+1];table[3]=key;P2=0xf0;temp=P2;for(X=0;X<4;X++)show(table[X]);while(temp!=0xf0){P2=0xf0;temp=P2;}}}else key=16;}}附录三、电路原理图显示部分电路主要部分电路。

详解RS485通讯程序代码及技术介绍

详解RS485通讯程序代码及技术介绍
void UART_Puts(unsigned char *Str) { if(*Str) //字符串结束 {
} } //主函数 void main() { DDRD|=BIT(PD2); //PORTD|=BIT(PD2); USART_Init(); //UART_Puts("\r\n 你发送的字符串是:");//发送字符串 PORTD&=~BIT(PD2); DDRD|=BIT(PD2); while(1) { if(RX_Flag)
{
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('1');
//USART_Send(RX_Buffer);
RX_Flag=0;
PORTD&=~BIT(PD2);
PORTD|=BIT(PD2);
//UART_Puts();
USART_Send('2');
//USART_Send(RX_Buffer);
HART 网络:HART 是由现在的艾默生提出一个过度性总线标准,他主要是在 4~20 毫安电流信号上面叠加数字信号,物理层采用 BELL202 频移键控技术,以 实现部分智能仪表的功能,但此协议不是一个真正意义上开放的标准,要加入他 的基金会才能拿到协议,加入基金会要一部分的费用。技术主要被国外几家大公 司垄断,近两年国内也有公司再做,但还没有达到国外公司的水平。现在有很大 一部分的智能仪表都带有 HART 圆卡,都具备 HART 通讯功能。但从国内来看还没 有真正利用其这部分功能,最多只是利用手操器对其进行参数设定,没有发挥出 HART 智能仪表应有的功能,没有联网进行设备监控。从长远来看由于 HART 通信 速率低组网困难等原因,HART 仪表的采购量会程下滑趋势,但由于 HART 仪表已 经有十多年的历史现在在装数量非常的大,对于一些系统集成商来说还有很大的 可利用空间。

基于单片机温度控制系统RS485通信

基于单片机温度控制系统RS485通信
switch(x)
{
case 1:
address = 0x80 + y;
break;
case 2:
address = 0xc0 + y;
break;
default:
address = 0x80 + y;//若果输入的不是第1、2行的行的话,默认在第1行显示
break;
}
address = address - 1;
void LCD1602_char(unsigned char x,unsigned char y, char ddata);//单字符显示函数
void LCD1602_string(unsigned char x,unsigned char y, unsigned char *p);//字符串显示函数
/**************************主函数*****************************/
void main()
{
LCD_init();//1602初始化
KEY_Init();//按键初始化
Delay_xms(10);
while(1)
{
LCD1602_string(1,1,str1);
switch(x)
{
case 1:
address = 0x80 + y;
break;
case 2:
address = 0xc0 + y;
break;
default:
address = 0x80 + y;
break;
}
address = address - 1;
while(1)
{

485通信程序(51单片机)

485通信程序(51单片机)

485通信程序(51单片机)什么是485通信?RS-485是一种串行通信协议,它使用差分信号传输数据。

485通信支持了在两个或以上设备之间传输数据的需求,比如用于电子计算机、通信设备、工业自动化等等。

RS-485已广泛应用于数控机床、自动化设备控制等领域中。

单纯的485通信包含四种通信模式:点对点、总线形、多主机和简介式通信。

其中,点对点通信指的是一对一的通信方式;总线形通信指的是一对多的群通信方式,所有设备都在同一条总线上发送和接收数据;多主机通信指的是多台主机的通信方式,多个设备都可以同时发送数据;简介式通信是一种用于仅需要发送少量数据的情况的通信方式。

下面介绍一下485通信的部分基本知识1.485通信的传输距离远,一般可以达到1200米。

2.485通信具有较强的抗干扰能力。

3.485通信使用差分信号进行传输,信号稳定,传输速率也比较快。

4.485通信可以支持多个设备同时进行通信,但是在同一时间内只有一个设备可发送数据。

5.在采用485通信时,一定要注意通讯端口的设置,如波特率、数据位、停止位等。

程序实现原理该程序使用了51单片机作为主控制器实现了基本的485通信,具体实现如下:1.通信模式的设置在程序开始时,需要设置通信模式。

如果通信模式为点对点通信,则可以直接使用UART通信模块进行通信;如果是多点通信,则需要使用485通信芯片。

2.通讯端口的配置在进行485通讯时,需要进行通讯端口的配置,包括波特率、数据位、停止位等参数的设定。

在485通信模式下,只有一个设备可为主设备,其他设备均为被设备。

在发送数据时,主设备的TXD口要与外部总线的D+口相连,而D-口不连接,从设备的TXD口要与D-口相连,而D+口不连接。

在接收数据时,主设备的RXD口要与D+口相连,而D-口不连接,从设备的RXD口要与D-口相连,而D+口不连接。

3.数据的发送和接收在发送和接收数据时,需要采用特定的方式进行报文的封装和解析。

RS485通信示例程序

RS485通信示例程序

RS485通信示例程序看程序时请配合芯片资料一起看,公布源码不是为了抄袭,而是为了相互学习,如果有不对的地方还请指出来,谢谢!/*===================================================== ===程序说明:PC端通过RS232-RS485芯片转换后再经过一个RS485收发芯片MAX485连接单片机的RX和TX(RO-RX,DI-TX)的通信示例程序控制发送和接收的引脚为P2.7,使用时注意正确连接!作者:绘天地点:成都信息工程学院====================================================== ==*/#include <reg52.h>#include "com_communication.h"sbit SHRL=P2^7;/*高电平发送,低电平接收*/void main(){int c;UartInit();SHRL=0;/*保持为发送状态*/while(1){if ( RI ) //如果收到数据{RI = 0; //清除接收标志c = SBUF; //读取收到的数据SHRL=1;UartSendChar(c); //回送收到的数据SHRL=0;}}}所调用的头文件:#ifndef _com_H_#define _com_H_//定义波特率(取值1200、2400、4800、9600、19200等)#define BaudRate 19200L/*********************************************************************** ********函数:UartInit()功能:串行口初始化************************************************************************ *******/void UartInit(){SCON = 0x50; //串口方式1(8位UART),允许接收PCON |= 0x80; //波特率加倍TMOD &= 0x0F; //设置T1为8位自动重装定时器,用于产生波特率TMOD |= 0x20;TH1 = TL1 = 256 - (11059200L / 12) / (16 * BaudRate); //设置T1初值TR1 = 1; //启动T1}/*********************************************************************** ********函数:UartSendChar()功能:通过串行口发送单个字节参数:c是被发送的字节数据,取值0x00~0xFF************************************************************************ *******/void UartSendChar(char c){SBUF = c; //数据写入SBUF,同时启动硬件发送过程while ( !TI ); //等待发送完毕TI = 0; //清除发送标志}#endif。

51单片机串口485通讯程序

51单片机串口485通讯程序

/* 以下为单片机串口485通讯程序,从机程序(当然也适用于主机程序),主机发送可以先用串口帮手软件来调试,经过Keil uVision4实际测试,测试效果如结尾图片所示, 大部分来自网络,只是改了两个地方: len = sizeof(dbuf),if(i >=( __ERRLEN+1)) // 帧超长,错误,返回,就可以实现了,其中的原因自已体会吧*/#ifndef __485_C__#define __485_C__#include <reg51.h>#include <string.h>#include <stdio.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int/* 通信命令*/#define __ACTIVE_ 0x01 // 主机询问从机是否存在#define __GETDATA_ 0x02 // 主机发送读设备请求#define __OK_ 0x03 // 从机应答#define __STATUS_ 0x04 // 从机发送设备状态信息#define __MAXSIZE 0x08 // 缓冲区长度#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错//uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息uchar dbuf[__MAXSIZE];//={0,1,2,3,4,5,6,7}; // 该缓冲区用于保存设备状态信息uchar dev; // 该字节用于保存本机设备号sbit M_DE = P1^0; // 驱动器使能,1有效sbit M_RE = P1^1; // 接收器使能,0有效void get_status(); // 调用该函数获得设备状态信息,函数代码未给出void send_data(uchar type, uchar len, uchar *buf); // 发送数据帧bit recv_cmd(uchar *type); // 接收主机命令,主机请求仅包含命令信息void send_byte(uchar da); // 该函数发送一帧数据中的一个字节,由send_data()函数调用void main(){uchar type;uchar len;/* 系统初始化*/P1 = 0xff; // 读取本机设备号//dev = (P1>>2);dev = 0x01;TMOD = 0x20; // 定时器T1使用工作方式2TH1 = 250; // 设置初值TL1 = 250;TR1 = 1; // 开始计时PCON = 0x80; // SMOD = 1SCON = 0x50; // 工作方式1,波特率9600bps,允许接收ES = 0; // 关闭串口中断//IT0 = 0; // 外部中断0使用电平触发模式//EX0 = 1; // 开启外部中断0EA = 1; // 开启中断/* 主程序流程*/while(1) // 主循环{if(recv_cmd(&type) == 0) // 发生帧错误或帧地址与本机地址不符,丢弃当前帧后返回continue;switch(type){case __ACTIVE_: // 主机询问从机是否存在send_data(__OK_, 0, dbuf); // 发送应答信息,这里buf的内容并未用到break;case __GETDA TA_:// len = strlen(dbuf);//在C51中不能这个函数计算unsigned char型,这个函数只能计算char型len = sizeof(dbuf);// len =0x08;send_data(__STA TUS_, len, dbuf); // 发送设备状态信息break;default:break; // 命令类型错误,丢弃当前帧后返回}}}void READSTATUS() interrupt 0 using 1 // 产生外部中断0时表示设备状态发生改变,该函数使用寄存器组1{get_status(); // 获得设备状态信息,并将其存入dbuf指向的存储区,数据最后一字节置0表示数据结束}/* 该函数接收一帧数据并进行检测,无论该帧是否错误,函数均会返回* 函数参数type保存接收到的命令字* 当接收到数据帧错误或其地址位不为0时(非主机发送帧),函数返回0,反之返回1*/bit recv_cmd(uchar *type){bit db = 0; // 当接收到的上一个字节为0xdb时,该位置位bit c0 = 0; // 当接收到的上一个字节为0xc0时,该位置位uchar data_buf[__ERRLEN]; // 保存接收到的帧__ERRLEN=12;uchar tmp;uchar ecc = 0;uchar i;M_DE = 0; // 置发送禁止,接收允许M_RE = 0;/* 接收一帧数据*/i = 0;while(!c0) // 循环直至帧接收完毕{RI = 0;while(!RI);tmp = SBUF;RI = 0;if(db == 1) // 接收到的上一个字节为0xdb{switch(tmp){case 0xdd:data_buf[i] = 0xdb; // 0xdbdd表示0xdbecc = ecc^0xdb;db = 0;break;case 0xdc:data_buf[i] = 0xc0; // 0xdbdc表示0xc0ecc = ecc^0xc0;db = 0;break;default:return 0; // 帧错误,返回}i++;}switch(tmp) // 正常情况{case 0xc0: // 帧结束c0 = 1;break;case 0xdb: // 检测到转义字符db = 1;break;default: // 普通数据data_buf[i] = tmp; // 保存数据ecc = ecc^tmp; // 计算校验字节i++;}//if(i == __ERRLEN) // 帧超长,错误,返回if(i >=( __ERRLEN+1)) // 帧超长,错误,返回return 0;}/* 判断帧是否错误*/if(i<4) // 帧过短,错误,返回return 0;if(ecc != 0) // 校验错误,返回return 0;if(data_buf[0] != dev) // 非访问本机命令,错误,返回return 0;*type = data_buf[1]; // 获得命令字return 1; // 函数成功返回}/* 该函数发送一帧数据帧,参数type为命令字、len为数据长度、buf为要发送的数据内容*/void send_data(uchar type, uchar len, uchar *buf){uchar i;uchar ecc = 0; // 该字节用于保存校验字节M_DE = 1; // 置发送允许,接收禁止M_RE = 1;send_byte(dev); // 发送本机地址ecc = dev;send_byte(type); // 发送命令字ecc = ecc^type;send_byte(len); // 发送长度ecc = ecc^len;for(i=0; i<len; i++) // 发送数据{send_byte(*buf);ecc = ecc^(*buf);buf++;}send_byte(ecc); // 发送校验字节TI = 0; // 发送帧结束标志SBUF = 0xc0;while(!TI);TI = 0;}/* 该函数发送一个数据字节,若该字节为0xdb,则发送0xdbdd,若该字节为0xc0则,发送0xdbdc */void send_byte(uchar da){switch(da){case 0xdb: // 字节为0xdb,发送0xdbdd TI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdd;while(!TI)TI = 0;break;case 0xc0: // 字节为0xc0,发送0xdbdcTI = 0;SBUF = 0xdb;while(!TI);TI = 0;SBUF = 0xdc;while(!TI)TI = 0;break;default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endif/* 调试结果*/。

RS485实验指导书

RS485实验指导书

实验一实验板点对点通信【实验目的】1. 建立双机通信的概念2. 掌握单片机串行口通信的编程和调试方法。

3. 掌握异步串行通信的数据格式及数据协议设定。

【实验环境】PC机一台,keil开发环境一套,RS232通信线【实验重点及难点】串行口通信的程序的设计,以及硬件的连接数据通信的协议等。

【实验原理介绍】1.1 程序下载方式介绍1.1.1 RS232与上位机通信下载程序由于要从上位机中下载程序到单片机中,所以需要建立他们之间的通信线路。

本实验采用MAX232芯片,max232是一种把电脑的串行口rs232信号电平(-10 ,+10v)转换为单片机所用到的TTL信号点平(0 ,+5)的芯片,下面介绍一下max232引脚图,看下面的图。

图3.1 max232引脚图本实验中采用11、12、13、14号管脚作输入输出,其中13、14与DB9连接,11、12与单片机连接。

1.1.2 485通信485通信的过程如下:从DB9接收数据,经过max485芯片实现电平转换,然后max485芯片经过高速光耦与单片机通信,将数据送入单片机中进行处理;处理完成后将数据返回至max485,再经DB9输出。

如此就可实现两单片机之间的通信或单片机与上位机间的通信。

下面介绍一下max485芯片接线方法,如下图示:图2 max485接线图其中1、4为输入输出管脚,经光耦与单片机连接,2、3为使能端,6、7为与外部通信接口。

1.2 MCU功能介绍本实验中选择stc12c5a60s2系列单片机,其管脚图如下:图3 tc12c5a60s2单片机管脚图stc12c5a60s2系列单片机是单时钟的单片机,增强型8051内核,速度比普通8051快8~12倍,宽电压:5.5~3.5V,2.2~3.8V,低功耗设计:空闲模式,掉电模式,工作频率:0~35MHz.时钟:外部晶体或内部RC振荡器可选,在ISP下载编程用户程序时设置。

全双工异步串行口,兼容8051的串口。

基于RS-485的单片机通信系统设计

基于RS-485的单片机通信系统设计

专业课程设计任务书2013-2014 学年第 2 学期第 16 周- 19 周题目基于RS-485的单片机通信系统设计内容及要求1.利用RS485实现单片机的双向通讯;2.通过键盘实现从机的选择、发送数据的输入;3.主机显示发送的数据及从机编号。

4提高要求:通过键盘实现循环工作模式、指定从机这2种工作方式的切换。

进度安排16周:查找资料,进行系统硬件设计、软件方案设计;17周:硬件制作、软件的分模块调试;19周:系统联调;19周:设计结果验收,报告初稿的撰写。

学生姓名:11042104万娇 11042109赵佳慧指导时间:周一、周三、周五指导地点:E楼 610室任务下达2014年 6 月 3 日任务完成2014年 6月 27 日考核方式 1.评阅□ 2.答辩□ 3.实际操作□ 4.其它□指导教师张小林系(部)主任注:1、此表一组一表二份,课程设计小组组长一份;任课教师授课时自带一份备查。

2、课程设计结束后与“课程设计小结”、“学生成绩单”一并交院教务存档。

摘要串口通信是一种广泛应用于各个领域的通信方式,在远距离数据传输和控制系统中,可以根据RS-485协议实现远距离传输。

此次课设即利用MAX485芯片实现半双工串行通信的双向通信系统。

系统主要由主机控制模块、通信模块、数据输入模块、数据显示模块和模数转换模块五个部分组成,实现了利用RS-485实现单片机的双向通信,通过键盘实现从机的选择、发送数据,主机显示发送的数据及从机编号,通过键盘实现循环工作模式、指定从机这两种工作方式的切换。

此系统具有使用方便、操作简单、便于实现、成本低、可靠性高、可拓展性强、易于维护等特点,具有较广泛的应用前景。

关键字:单片机;RS-485总线;串行通信;数模转换目录前言 0第一章设计内容及要求 (1)1.1设计内容 (1)1.2设计要求 (1)第二章系统组成及工作原理 (2)2.1系统组成 (2)2.2 工作原理 (2)第三章硬件电路方案设计 (3)3.1 主机控制模块 (3)3.2 数据显示模块 (4)3.3 模数转换模块 (5)3.4 键盘输入模块 (6)3.5 通信模块 (7)3.5.1 RS485通信协议 (8)3.5.2 RS485通信格式 (8)3.6从机控制模块 (9)3.6.1 单片机最小系统 (9)3.6.2 显示模块 (10)第四章软件设计 (11)4.1 通信协议 (11)4.1.1 串行通信协议的比较——RS232 RS422 RS485 (11)4.1.2 通信过程 (13)4.2 主机程序 (13)4.2.1 主程序流程图 (13)4.2.2 矩阵键盘输入子程序 (14)4.2.3 数码管显示子程序 (15)4.2.4 传输模块子程序 (16)4.3 从机程序 (16)4.3.1从机总流程图 (16)4.3.2 接收并显示子程序 (17)第五章实验调试和测试结果与分析 (18)第六章结论 (19)第七章参考文献 (20)附录一电路图 (21)附录二程序代码 (22)前言单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统。

485通讯协议程序怎么写(51单片机的485通信程序案例)

485通讯协议程序怎么写(51单片机的485通信程序案例)

485通讯协议程序怎么写(51单片机的485通信程序案例)
RS-485总线接口是一种常用的串口,具有网络连接方便、抗干扰性能好、传输距离远等优点。

RS-485收发器采用平衡发送和差分接收,因此具有抑制共模干扰的能力,加上收发器具有高的灵敏度,能检测到低达200mv的电压,可靠通信的传输距离可达数千米。

使用RS-485总线组网,只需一对双绞线就可实现多系统联网构成分布式系统、设备简单、价格低廉、通信距离长。

51单片机的485通信程序
#ifndef __485_C__ #define __485_C__
#include 《reg51.h》
#include 《string.h》
#define unsigned char uchar
#define unsigned int uint
/* 通信命令*/
#define __ACTIVE_ 0x01 // 主机询问从机是否存在
#define __GETDATA_ 0x02 // 主机发送读设备请求
#define __OK_ 0x03 // 从机应答
#define __STATUS_ 0x04 // 从机发送设备状态信息
#define __MAXSIZE 0x08 // 缓冲区长度
#define __ERRLEN 12 // 任何通信帧长度超过12则表示出错
uchar dbuf[__MAXSIZE]; // 该缓冲区用于保存设备状态信息
uchar dev; // 该字节用于保存本机设备号
sbit M_DE = P1。

RS 485.C程序源代码

RS 485.C程序源代码

***********************RS485.c文件程序源代码*************************#include<reg52.h>#include<intrins.h>SbitRS485_DIR=P1^7;//RS485方向选择引脚bit&nbsp;flagOnceTxd&nbsp;=&nbsp;0;&nbsp;&nbsp;//单次发送完成标志,即发送完一个字节bit&nbsp;cmdArrived&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;//命令到达标志,即接收到上位机下发的命令unsigned&nbsp;char&nbsp;cntRxd&nbsp;=&nbsp;0;unsigned&nbsp;char&nbsp;pdata&nbsp;bufRxd[40];&nbsp;//串口接收缓冲区&nbsp;void&nbsp;ConfigUART(unsigned&nbsp;int&nbsp;baud)&nbsp;&nbsp;//串口配置函数,baud为波特率{&nbsp;&nbsp;&nbsp;&nbsp;RS485_DIR&nbsp;=&nbsp;0;&nbsp;//RS485设置为接收方向&nbsp;&nbsp;&nbsp;&nbsp;SCON&nbsp;=&nbsp;0x50;&nbsp;&nbsp;&nbsp;//配置串口为模式1&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;&amp;=&nbsp;0x0F;&nbsp;&nbsp;//清零T1的控制位&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;|=&nbsp;0x20;&nbsp;&nbsp;//配置T1为模式2&nbsp;&nbsp;&nbsp;&nbsp;TH1&nbsp;=&nbsp;256&nbsp;-&nbsp;(11059200/12/32)&nbsp;/&n bsp;baud;&nbsp;&nbsp;//计算T1重载值&nbsp;&nbsp;&nbsp;&nbsp;TL1&nbsp;=&nbsp;TH1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初值等于重载值&nbsp;&nbsp;&nbsp;&nbsp;ET1&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;//禁止T1中断&nbsp;&nbsp;&nbsp;&nbsp;ES&nbsp;&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;//使能串口中断&nbsp;&nbsp;&nbsp;&nbsp;TR1&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;//启动T1}unsigned&nbsp;char&nbsp;UartRead(unsigned&nbsp;char&nbsp;*buf,&nbsp;unsigned&nbsp;ch ar&nbsp;len)&nbsp;//串口数据读取函数,数据接收指针buf,读取数据长度len,返回值为实际读取到的数据长度{&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len&nbsp;&gt;&nbsp;cntRxd)&nbsp;//读取长度大于接收到的数据长度时,&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;cntRxd;&nbsp;//读取长度设置为实际接收到的数据长度&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;&nbsp;i&lt;len;&nbsp;i++)&nbsp;//拷贝接收到的数据&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf++;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;cntRxd&nbsp;=&nbsp;0;&nbsp;&nbsp;//清零接收计数器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;len;&nbsp;&nbsp;//返回实际读取长度}void&nbsp;DelayX10us(unsigned&nbsp;char&nbsp;t)&nbsp;&nbsp;//软件延时函数,延时时间(t*10)us{&nbsp;&nbsp;&nbsp;&nbsp;do&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;while&nbsp;(--t);}void&nbsp;UartWrite(unsigned&nbsp;char&nbsp;*buf,&nbsp;unsigned&nbsp;char&nbsp;len)&n bsp;//串口数据写入函数,即串口发送函数,待发送数据指针buf,数据长度len{&nbsp;&nbsp;&nbsp;&nbsp;RS485_DIR&nbsp;=&nbsp;1;&nbsp;&nbsp;//RS485设置为发送&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(len--)&nbsp;&nbsp;&nbsp;//发送数据&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flagOnceTxd&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SBUF&nbsp;=&nbsp;*buf;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!flagOnceTxd);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;DelayX10us(5);&nbsp;&nbsp;//等待最后的停止位完成,延时时间由波特率决定&nbsp;&nbsp;&nbsp;&nbsp;RS485_DIR&nbsp;=&nbsp;0;&nbsp;&nbsp;//RS485设置为接收}&nbsp;void&nbsp;UartDriver()&nbsp;//串口驱动函数,检测接收到的命令并执行相应动作{&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;len;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;buf[30];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cmdArrived)&nbsp;//有命令到达时,读取处理该命令&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;UartRead(buf,&nbsp; sizeof(buf)-2);&nbsp;//将接收到的命令读取到缓冲区中&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[len++]&nbsp;=&nbsp;'\r';&nbsp;&n bsp;&nbsp;//在接收到的数据帧后添加换车换行符后发回&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[len++]&nbsp;=&nbsp;'\n';&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UartWrite(buf,&nbsp;len);&nbsp;&nbsp;&nbsp;&nbsp;}}&nbsp;void&nbsp;UartRxMonitor(unsigned&nbsp;char&nbsp;ms)&nbsp;&nbsp;//串口接收监控函数{&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;cntbkp&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;idletmr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cntRxd&nbsp;&gt;&nbsp;0)&nbsp;&nbsp;//接收计数器大于零时,监控总线空闲时间&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cntbkp&nbsp;!=&nbsp;cntRxd) &nbsp;&nbsp;//接收计数器改变,即刚接收到数据时,清零空闲计时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbspnbsp;&nbsp;&nbsp;&nbsp;&nbsp;cntbk p&nbsp;=&nbsp;cntRxd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idletmr&n bsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(id letmr&nbsp;&lt;&nbsp;30)&nbsp;&nbsp;//接收计数器未改变,即总线空闲时,累积空闲时间&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;idletmr&nbsp;+=&nbsp;ms;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;if&nbsp;(idletmr&nbsp;&gt;=&nbsp;30)&nbsp;&nbsp;//空闲时间超过30ms 即认为一帧命令接收完毕&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmdArrived&nbsp;=&nbsp;1;&nbsp;//设置命令到达标志&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cntbkp&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;}}void&nbsp;InterruptUART()&nbsp;interrupt&nbsp;4&nbsp;&nbsp;//UART中断服务函数{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(RI)&nbsp;&nbsp;//接收到字节&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RI&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbs p;//手动清零接收中断标志位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cntRxd&nbsp;&lt;&nbsp;sizeof (bufRxd))&nbsp;//接收缓冲区尚未用完时,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bufRxd[cnt Rxd++]&nbsp;=&nbsp;SBUF;&nbsp;//保存接收字节,并递增计数器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(TI)&nbsp;&nbsp;//字节发送完毕&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TI&nbsp;=&nbsp;0;&nbsp;&nbs p;&nbsp;//手动清零发送中断标志位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flagOnceTxd&nbsp;=&nbsp;1;&nbsp;&n bsp;//设置单次发送完成标志&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}}***********************main.c文件程序源代码*************************#include&nbsp;&lt;reg52.h&gt;&nbsp;unsigned&nbsp;char&nbsp;T0RH&nbsp;=&nbsp;0;&nbsp;&nbsp;//T0重载值的高字节unsigned&nbsp;char&nbsp;T0RL&nbsp;=&nbsp;0;&nbsp;&nbsp;//T0重载值的低字节&nbsp;void&nbsp;ConfigTimer0(unsigned&nbsp;int&nbsp;ms);extern&nbsp;void&nbsp;ConfigUART(unsigned&nbsp;int&nbsp;baud);extern&nbsp;void&nbsp;UartRxMonitor(unsigned&nbsp;char&nbsp;ms);extern&nbsp;void&nbsp;UartDriver();&nbsp;void&nbsp;main&nbsp;(){&nbsp;&nbsp;&nbsp;&nbsp;EA&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;//开总中断&nbsp;&nbsp;&nbsp;&nbsp;ConfigTimer0(1);&nbsp;&nbsp;//配置T0定时1ms&nbsp;&nbsp;&nbsp;&nbsp;ConfigUART(9600);&nbsp;//配置波特率为9600&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UartDriver();&nbsp;&nbsp;&nbsp;&nbsp;}<P>}</P>&nbsp;void&nbsp;ConfigTimer0(unsigned&nbsp;int&nbsp;ms)&nbsp;&nbsp;//T0配置函数{&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;tmp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;11059200&nbsp;/&nbsp;12;&nbsp;&nbsp;&nbs p;&nbsp;&nbsp;&nbsp;//定时器计数频率&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;(tmp&nbsp;*&nbsp;ms)&nbsp;/&nbsp;1000;&n bsp;&nbsp;//计算所需的计数值&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;65536&nbsp;-&nbsp;tmp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//计算定时器重载值&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;tmp&nbsp;+&nbsp;34;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//修正中断响应延时造成的误差&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0RH&nbsp;=&nbsp;(unsigned&nbsp;char)(tmp&nbsp;&gt;&gt;&nb sp;8);&nbsp;&nbsp;//定时器重载值拆分为高低字节&nbsp;&nbsp;&nbsp;&nbsp;T0RL&nbsp;=&nbsp;(unsigned&nbsp;char)tmp;&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;&amp;=&nbsp;0xF0;&nbsp;&nbsp;&nbsp;//清零T0的控制位&nbsp;&nbsp;&nbsp;&nbsp;TMOD&nbsp;|=&nbsp;0x01;&nbsp;&nbsp;&nbsp;//配置T0为模式1&nbsp;&nbsp;&nbsp;&nbsp;TH0&nbsp;=&nbsp;T0RH;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//加载T0重载值&nbsp;&nbsp;&nbsp;&nbsp;TL0&nbsp;=&nbsp;T0RL;&nbsp;&nbsp;&nbsp;&nbsp;ET0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;//使能T0中断&nbsp;&nbsp;&nbsp;&nbsp;TR0&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;//启动T0}void&nbsp;InterruptTimer0()&nbsp;interrupt&nbsp;1&nbsp;&nbsp;//T0中断服务函数{&nbsp;&nbsp;&nbsp;&nbsp;TH0&nbsp;=&nbsp;T0RH;&nbsp;&nbsp;//定时器重新加载重载值&nbsp;&nbsp;&nbsp;&nbsp;TL0&nbsp;=&nbsp;T0RL;&nbsp;&nbsp;&nbsp;&nbsp;UartRxMonitor(1);&nbsp;&nbsp;//串口接收监控}。

485通信程序实例

485通信程序实例
sbit SD_7 = SData^7;
bdata uchar Repeater_Address _at_ 0x26; //中继器地址
sbit RA_0 = Repeater_Address^0;
sbit PaOData4 = PaOData^4;
sbit PaOData5 = PaOData^5;
sbit PaOData6 = PaOData^6;
sbit PaOData7 = PaOData^7;
s; //收到上位机对下位机的广播信号(时间、日期)
sbit Com1Data_Sent = Status2^5; //串口1已发送一字节
sbit tem_bit = Status2^6; //临时位变量
sbit Com1_Finished = Status2^7; //串口1数据已接收完毕
bdata uchar Status3 _at_ 0x22; //中继器状态标志
sbit Alarm_Over = Status3^0; //掉电时下位机侧传来的报警数据结束
sbit RA_7 = Repeater_Address^7;
bdata uchar Repeater_Status _at_ 0x27; //中继器状态标志位
sbit DHead_Arrived = Repeater_Status^0;
uchar data R_P_Data_Buf1 _at_ 0x33; //Com2读数据缓冲区指针1
uchar data W_P_Data_Buf2 _at_ 0x34; //并口写数据缓冲区指针2
uchar data R_P_Data_Buf2 _at_ 0x35; //并口读数据缓冲区指针2

RS-485单片机通讯模块产品使用手册

RS-485单片机通讯模块产品使用手册

400 个节点。
【小知识】
RS232,RS422,RS485 是电气标准,主要区别就是逻辑如何表示。 RS232 使用 12V,0,-12V 电压来表示逻辑,(-12V 表示逻辑 1,12V 表示逻辑
0),全双工,最少 3 条通信线(RX,TX,GND),因为使用绝对电压表示逻辑,由 于干扰,导线电阻等原因,通讯距离不远,低速时几十米也是可以的。
RS422,在 RS232 后推出,使用 TTL 差动电平表示逻辑,就是两根的电压 差表示逻辑,RS422 定义为全双工的,所以最少要 4 根通信线(一般额外地多一 根地线),一个驱动器可以驱动最多 10 个接收器(即接收器为 1/10 单位负载), 通讯距离与通讯速率有关系,一般距离短时可以使用高速率进行通信,速率低时 可以进行较远距离通信,一般可达数百上千米。
{
/*****************数据转换*****************************/
uint z,x,c,v;
z=date/1000;
//求千位
x=date%1000/100;
//求百位
c=date%100/10;
//求十位
v=date%10;
//求个位
P2=0XFF;
P0=seg7code[z];
RS485,在 RS422 后推出,绝大部分继承了 422,主要的差别ห้องสมุดไป่ตู้ RS485 可以 是半双工的,而且一个驱动器的驱动能力至少可以驱动 32 个接收器(即接收器 为 1/32 单位负载),当使用阻抗更高的接收器时可以驱动更多的接收器。所以现 在大多数全双工 485 驱动/接收器对都是标:RS422/485 的,因为全双工 RS485 的驱动/接收器对一定可以用在 RS422 网络。

51单片机实现RS485

51单片机实现RS485

default: // 普通数据则直接发送TI = 0;SBUF = da;while(!TI);TI = 0;}}#endifRS-232接口实现计算机和单片机通信程序作者:佚名来源:本站原创点击数:…更新时间:2008年07月10日【字体:大中小】//此程序通过RS-232接口来完成计算机和单片机通信(程序已用p1 8f458试验板上调试通过)//程序的调试可以用"串口调试助手V2.1"辅助完成,此程序可在htt p:// 下载//此程序首先发送测试数据55H,再通过中断实现数据的接收和发送#include "p18f458.h"void InterruptHandlerHigh(void);//初始化程序void initial(){SPBRG=0X19; //选择传输波特率为9600bpsTXSTA=0X04; //选择异步高速方式传输8位数据RCSTA=0X80; //允许同步串行口工作TRISC=0X80; //将RC7,RC6设置为输入,断绝与外接电路的连接 TXSTAbits.TXEN=1; //发送允许RCSTAbits.CREN=1; //接受数据允许PIE1bits.RCIE=1; //接收中断使能INTCON=0XC0; //总中断和外围中断允许}//高优先级中断向量#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void){_asmgoto InterruptHandlerHigh //跳到中断程_endasm}//高优先级中断服务程序#pragma code#pragma interrupt InterruptHandlerHighvoid InterruptHandlerHigh (){while(PIR1bits.RCIF==1) //若接收中断标志不为1,则为误操作,返回{TXREG=RCREG; //将接收到的数据放入发送寄存器,并启动发送 }}//主程序main(){initial(); //系统初始化TXREG=0X55; //发送数据55H进行测试for(;;);}------------------------------------------汇编语言版本的RS-232接口实现计算机和单片机通信程序------------;此程序通过RS-232接口来完成计算机和单片机通讯(程序以在p18 f458试验板上调通);本单片机程序由提供;此程序首先发送测试数据55H,再通过中断实现数据的接收和发送;程序的调试可以用"串口调试助手V2.1"辅助完成LIST P=18f458INCLUDE "P18f458.INC"ORG 0x00GOTO MAINORG 0x08GOTO INTSERVEORG 0X30;**************中断服务子程序***************INTSERVEBTFSS PIR1,RCIF ;接收中断标志为1?GOTO ERR_RE ;误操作,返回MOVF RCREG,0 ;否则,将接收到的数据通过W寄存器MOVWF TXREG ;放入发送寄存器,并启动发送ERR_RE NOPRETFIE;****************初始化程序***************INITIAL NOPMOVLW 0X19 ;选择传输波特率为9600bpsMOVWF SPBRGMOVLW 0X04 ;选择异步高速方式传输8位数据MOVWF TXSTAMOVLW 0X80 ;允许同步串行口工作MOVWF RCSTAMOVLW 0X80 ;将RC7,RC6设置为输入,断绝与外接电路的连接MOVWF TRISCBSF TXSTA,TXEN ;发送允许BSF RCSTA,CREN ;接受数据允许BSF PIE1,RCIE ;接收中断使能MOVLW 0XC0 ;总中断和外围中断允许MOVWF INTCONRETURN;**********************主程序********************* MAIN NOPCLRWDTCALL INITIALMOVLW 0X55 ;发送数据55H进行测试MOVWF TXREGLOOPGOTO LOOPEND两片51单片机互相通信的串行通信程序(一个发送程序,一个接收程序)2007-05-27 08:27;系统晶振是 11.0592 MHz;51单片机发送单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSP,#60HMOVSCON,#50H;串口方式 1MOVTMOD,#20H;T1 方式2MOVTL1,#0FDH;波特率 9600 的常数MOVTH1,#0FDHSETBTR1movr5,#00hWAIT:movp1,#0ffhmova ,p1movr5,alcalldelay ;读键盘,这里去抖动,还要加几句话mova ,p1nopCJNEA,5,WAIT ;是否有键输入MOVSBUF,a;串口输出键盘输入的值NOPSS: JBCTI,WAIT;是否发送完毕SJMPSSDELAY:;延时子程序PUSH;保存现场PUSH1MOV0,#06HDELAY1: MOV 1,#0HDJNZ1,$DJNZ0,DELAY1POP1;恢复现场POPRETEND;系统晶振是 11.0592 MHz;51单片机接收单片机程序;此程序用Proteus仿真通过;此程序在硬件上测试通过;2007-05-27;附有简化电路图;为了使初学者能看懂,程序与图尽可能的简单扼要;实验现象为,发送端的P1口的哪个键被接下,接收端的哪个灯对应着亮;如果把两个单片机的T和R通过无线模块(如基于MCP2120芯片的模块)来扩充,便可做成无线通信ORG0000HAJMPSTARTORG0040HSTART:MOVSCON,#50H;串口方式 1MOVTMOD,#20H;T1 方式 2MOVTL1,#0FDH;波特率 9600 的常数MOVTH1,#0FDHSETBTR1WAIT:JBCRI,DIS_REC;是否接收到数据sjmpwaitDIS_REC:MOVA,SBUF;读串口接收到的数据movp1,aSJMPwaitend51单片机串行口通信程序设计例子时间:2009-03-06 17:13来源:未知作者:牛牛点击: 768次串行口方式0应用编程 8051单片机串行口方式0为移位寄存器方式,外接一个串入并出的移位寄存器,就能扩展一个并行口。

stc15单片机写485通讯程序

stc15单片机写485通讯程序

stc15单片机写485通讯程序如何在STC15单片机上编写485通信程序引言:STC15单片机是一种常用的单片机芯片,具有低功耗、高性能等特点,在工业自动化领域得到了广泛应用。

其中,485通信是一种常用的通信方式,具有抗干扰能力强、传输距离远等优势。

本文将详细介绍如何在STC15单片机上编写485通信程序,帮助读者了解实际操作过程。

一、了解485通信协议在开始编写485通信程序之前,我们首先要了解485通信协议。

485通信协议是一种串口通信协议,它定义了通信设备之间的数据传输规则。

它使用两根线实现全双工的通信,其中A、B两线分别用于发送和接收数据。

在编写485通信程序时,我们需要掌握标准的485通信协议,包括帧结构、波特率、数据格式等内容。

二、准备开发环境在编写485通信程序之前,我们需要准备好相应的开发环境。

首先,我们需要一台电脑,并安装好STC15系列单片机的开发软件,例如Keil C51。

然后,我们需要准备一块STC15单片机开发板,以及一台支持485通信的外部设备,例如电机控制器、传感器等。

三、了解STC15单片机的485通信功能STC15单片机具有内置的硬件串口模块,可用于实现485通信功能。

我们需要了解STC15单片机的串口模块的工作原理和使用方法。

具体来说,我们需要了解串口的引脚定义、波特率设置、数据格式配置等内容。

四、编写485通信程序接下来,我们可以开始编写485通信程序了。

在Keil C51开发环境中,我们可以利用C语言来编写程序。

首先,我们需要定义相应的引脚,将STC15单片机的串口引脚与外部设备的485通信引脚连接起来。

然后,我们需要进行相应的配置,例如设置波特率、数据位数、停止位等。

最后,我们可以编写数据发送和接收的代码,实现数据的传输和处理。

在编写485通信程序时,需要注意以下几个关键点:1. 引脚定义:需要根据具体的开发板和外部设备,定义好STC15单片机的串口引脚。

单片机RS485通信接口、控制线、原理图及程序教学实例

单片机RS485通信接口、控制线、原理图及程序教学实例

单片机RS485通信接口、控制线、原理图及程序教学实例[前言]RS232 标准是诞生于RS485 之前的,但是RS232 有几处不足的地方:接口的信号电平值较高,达到十几V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。

传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。

接口使用信号线和GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。

传输距离有限,最多只能通信几十米。

通信的时候只能两点之间进行通信,不能够实现多机联网通信。

针对RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一。

RS232 标准是诞生于RS485 之前的,但是RS232 有几处不足的地方:接口的信号电平值较高,达到十几V,使用不当容易损坏接口芯片,电平标准也与TTL 电平不兼容。

传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。

接口使用信号线和GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。

传输距离有限,最多只能通信几十米。

通信的时候只能两点之间进行通信,不能够实现多机联网通信。

针对RS232 接口的不足,就不断出现了一些新的接口标准,RS485 就是其中之一,它具备以下的特点:采用差分信号。

我们在讲A/D 的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。

尤其当工业现场环境比较复杂,干扰比较多时,采用差分方式可以有效的提高通信可靠性。

RS485 采用两根通信线,通常用A 和B 或者D+和D-来表示。

逻辑1以两线之间的电压差为+(0.2~6)V 表示,逻辑0以两线间的电压差为-(0.2~6)V 来表示,是一种典型的差分通信。

RS485 通信速率快,最大传输速度可以达到10Mb/s 以上。

RS485 内部的物理结构,采用的是平衡驱动器和差分接收器的组合,抗干扰能力也大大增。

485双机通信案例原理与测试说明

485双机通信案例原理与测试说明

“485双机通信”功能实现说明1程序设计目标及程序运行效果说明程序设计目标:通过本例程理解RS485通信方式,实现双机通信。

程序运行效果:将两块带有485模块的51单片机通过485外接引脚A、B连接起来,单片机上电烧写程序后485模块的D/R引脚所对应的二极管均点亮,然后通过按键KEY3、KEY2控制数码管上的数值进行加减处理,两块单片机起始都默认为接收状态,最后按下KEY1发送键,将数据传送给另一块单片机,而此时接收方数码管上的数值发生相应的改变,与发送方数码管上的数值一致。

2程序相关电路及工作原理说明2.1 RS485通信原理RS232接口是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。

针对RS232的不足,于是不断出现了新的接口标准,RS485就是其中的一种。

RS485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS232接口在总线上只允许连接1个收发器,即单站能力。

而RS485接口在总线上是允许连接多达128个收发器。

即具有多站能力,这样用户可以利用单一的RS485接口方便地建立起设备网络。

RS485属于半双工通信,数据可以在一个信号载体的两个方向上传输,但是不能同时进行传输。

电平转换采用差分电路方式,A、B两线的电压差大于0.2认为是逻辑“1”,小于-0.2认为是逻辑“0”,方便与TTL电路连接。

使用RS485进行通信与RS232通信的逻辑是一致的,但RS485抗干扰性更强,传输距离更远。

RS485广泛运用在工业自动化控制、视频监控、门禁对讲以及楼宇报警等各个领域。

图1 485模块电路原理图MAX485芯片的功能是将TTL电平转换为RS485电平,引脚功能如下:(1)485 D/R输出、接收信号控制引脚:当该引脚为低电平时,485为接收态,MAX485通过485_RXD把来自总线的信号输出给单片机;当该引脚为高电平时,485为发送态,来自485_TXD的输出信号通过A、B引脚加载到总线上。

(完整word版)单片机与PC机RS-485串行通信设计

(完整word版)单片机与PC机RS-485串行通信设计

沈阳航空航天大学课程设计(论文)题目单片机与PC机RS-485的串行通信设计班级学号学生姓名指导教师目录0 前言 (1)1 总体方案设计 (1)2 硬件电路设计 (2)2.1 AT89C51单片机 (2)2.2 时钟电路 (3)2.3 按键复位电路 (4)2。

4 MAX485转换芯片 (4)2.5 PC机RS—485 通信的接口电路 (5)3 软件设计 (6)4 调试分析 (8)5 结论及进一步设想 (8)参考文献 (8)课设体会 (9)附录1 电路原理图 (10)附录2 程序清单 (11)单片机与PC机RS-485串行通讯设计摘要:本文提出了一种PC机与单片机进行串行通信的方案,该方案通过PC机的RS232串口、485总线实现与51单片机的串口通信,PC机送出的信号进行电平转换后送到485总线,单片机则接受MAX485芯片转换得到的信号,从而进行串行通信。

该系统的特点是电路设计简单可行、通信稳定、实用性强。

关键词:PC机;单片机;串口通信;MAX485芯片;0前言在计算机测控领域经常会采用一台PC 机与一个或多个单片机组成小型的测控网络,这种测控系统充分发挥了单片机功能强, 抗干扰性能好, 温度适应范围宽,面向控制的优点,同时又可以利用计算机弥补单片机在数据处理和交互性等方面的不足。

在测控系统中一般是以PC 机作为主控机,采用串行通讯定时扫描以单片机为核心的智能控制器(从机)以便采集数据或发送信号。

PC机的串口一般采用RS-232的总线标准,但由于RS—232接口标准发布较早,难免有不足之处,主要体现在以下四点:1、接口信号的电平值较高,已损坏接口电路芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接;2、传送速率较低,在异步传送时,波特率为20Kbps;3、接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱;4、传输距离有限,最大传输距离标准为50英尺,实际上也只能用在50m左右。

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

附录一、主机源程序
#include <reg52.H>
unsigned char xdata table[5];
unsigned char code tab[]={0x03,0x9f,0x25,0x0d,
0x99,0x49,0x41,0x1f,
0x01,0x09,0x05,0xc1,
0x63,0x85,0x61,0x71,0xff}; sbit ctrl=P1^2;
sbit DATA=P1^0;
sbit CLK=P1^1;
void show(unsigned char m)//LED显示子程序
{
unsigned char i,d;
d=tab[m];
for(i=0;i<8;i++)
{
DATA=d&0x01;
CLK=0;
CLK=1;
d=d>>1;
}
}
void interrupt0(void) interrupt 0 using 0//串行中断程序{
unsigned char cm0,cm1,sum0,sum1,i;
lab:
sum0=0;
ctrl=1;//将MAX485设置为发送方式
SBUF=0xFF;//发送数据申请
while(TI!=1);
ctrl=0; //将MAX485设置为接收方式
TI=0;
while(RI!=1);
cm0=SBUF;//接收申请确认信号
RI=0;
if(cm0==0xff)
{
i=0;
ctrl=0;
while(RI!=1);
cm1=SBUF; //接收第一个数据
RI=0;
while(cm1!=0xf0)
{
table[i]=cm1;
while(RI!=1);
cm1=SBUF;//接收后续的数据
RI=0;
i++;
}
for(i=0;i<4;i++)
sum0=sum0+table[i];//计算校验和
sum1=table[4];//获取收到的校验和
if(sum0==sum1)
{
ctrl=1;
SBUF=0xf0; //发送数据确认信号
while(TI!=1);
TI=0;
for(i=0;i<4;i++)
show(table[i]);
}
else goto lab;
}
else goto lab;
ctrl=1;//将MAX485设置为发送方式return ;
}
void main(void)
{
SCON = 0x50; //串口方式1,允许接收TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1;
TH1 = 0xFA; //11.0592MHz 9600 波特率TL1 = 0xFA;
TR1 = 1; //启动定时器
EX0=1; //开外部中断0
IT0=0;
EA=1; //开总中断
ctrl=1;//将MAX485设置为发送方式while(1); //等待中断
}
附录二、从机源程序
#include <reg52.H>
unsigned char xdata table[]={0,0,0,0};
sbit replay=P1^0;
sbit warn0=P1^1;
sbit CTRL=P1^2;
sbit DATA=P1^3;
sbit CLK=P1^4;
unsigned char code tab[]={0x03,0x9f,0x25,0x0d, //显示用的码表
0x99,0x49,0x41,0x1f,
0x01,0x09,0x05,0xc1,
0x63,0x85,0x61,0x71,0xff};
void delay(void) //键盘扫描延时10ms程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void show(unsigned char m)//LED显示子程序
{
unsigned char i,d;
d=tab[m];
for(i=0;i<8;i++)
{
DATA=d&0x01;
CLK=0;
CLK=1;
d=d>>1;
}
}
void ser(void) interrupt 4 using 0//串行中断程序
{
unsigned char cm,sum,i;
sum=0;
replay=1;
warn0=1;
cm=SBUF;
RI=0;
if(cm==0xf0)//判断是否为主机返回的确认信号
{
replay=0; //表示已正确发送完一组数据
goto end;
}
else
if(cm!=0xff)//判断是否为主机的数据申请
{
warn0=0; //通信命令错误提示
goto end;
}
else
{
CTRL=1; //置MAX485为发送方式
SBUF=0xff;//发送申请确认信号
while(TI!=1);
TI=0;
for(i=0;i<4;i++)
{
SBUF=table[i]; //发送数据
while(TI!=1);
TI=0;
sum=sum+table[i];//计算校验和
}
SBUF=sum; //发送校验和
while(TI!=1);
TI=0;
SBUF=0xf0;//发送结束标志
while(TI!=1);
TI=0;
}
end: CTRL=0; //置MAX485为接收方式return;
}
void main(void)
{
unsigned char key,X,Y,temp;
SCON = 0x50; //串口方式1,允许接收TMOD = 0x20; //定时器1 定时方式2 PCON=0x80; //设SMOD=1;
TH1 = 0xFA; //11.0592MHz 9600 波特率TL1 = 0xFA;
TR1 = 1; //启动定时器
ES=1; //开串行中断
EA=1; //开总中断
CTRL=0; //置MAX485为接收方式replay=1;
warn0=1;
while(1) //键盘扫描
{
P2=0xff; //键盘初始化
P2=0xf0;
if (P2!=0xf0)
{
delay(); //延时去抖
if (P2!=0xf0)
{
X=P2; //读键盘
P2=0x0f;
Y=P2;
P2=X|Y;
temp=P2;
switch(temp)
{
case 0xee:key=0;break;
case 0xde:key=1;break;
case 0xbe:key=2;break;
case 0x7e:key=3;break;
case 0xed:key=4;break;
case 0xdd:key=5;break;
case 0xbd:key=6;break;
case 0x7d:key=7;break;
case 0xeb:key=8;break;
case 0xdb:key=9;break;
case 0xbb:key=10;break;
case 0x7b:key=11;break;
case 0xe7:key=12;break;
case 0xd7:key=13;break;
case 0xb7:key=14;break;
case 0x77:key=15;break;
}
for(X=0;X<4;X++) //存储最近读的按键码
table[X]=table[X+1];
table[3]=key;
P2=0xf0;
temp=P2;
for(X=0;X<4;X++)
show(table[X]);
while(temp!=0xf0)
{P2=0xf0;temp=P2;}
}
}
else key=16;
}
}
附录三、电路原理图
显示部分电路
主要部分电路。

相关文档
最新文档