C8051F040的RS485收发程序

合集下载

C8051F系列单片机串口通讯程序-推荐下载

C8051F系列单片机串口通讯程序-推荐下载

C8051F系列单片机串口通讯程序采用C8051F020单片机//串口编程--接收PC发过来的字符串,回发字符串.发送期间中断控制LED灯闪烁//采用外部晶振22.1184MHz 使用定时器1,方式2产生波特率,SMOD = 0或者1 //定时器初值X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384)/#include <C8051F020.h>sfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器#define uchar unsigned char#define uint unsigned int//----------------------------------------------------------------------//参数设置区//----------------------------------------------------------------------#define BAUDRATE 4800 //波特率bps#define CLKOUT 22118400 //外部晶振,修改也要修改OSCXCN#define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1 #define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值#define MAX_LEN 10 //每次接收/发送字符串的长度//---------------------------------------------------------------------//全局变量//---------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮'0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idata trdata[MAX_LEN]; //要接收/发送的字符串//----------------------------------------------------------------------//子函数声明//----------------------------------------------------------------------void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序//----------------------------------------------------------------------//主函数//----------------------------------------------------------------------void main(void){WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(CLKOUT/12/10); //定时器初始化EA = 1; //开全局中断while(1){if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdata,MAX_LEN); //发送字符串}}}//----------------------------------------------------------------------//子函数具体实现//----------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111 for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 }//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交*开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口0100,0000}//串口初始化void UART0_Init(void){SCON0 = 0x50; //选择串口方式1,波特率可变SCON0=0101,0000TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bpsTL1 = (int)TXVAL;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1 TI0 = 1; //声明TX0就绪,可以发送TR0 = 1;}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0{TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1{uchar rxch;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdata[readCounts] = rxch; //存入数组,供发送readCounts++;}}//-------------------------------------------------------------//程序结束。

RS485通信原理图及程序实例详解

RS485通信原理图及程序实例详解

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 内部的物理结构,采⽤的是平衡驱动器和差分接收器的组合,抗⼲扰能⼒也⼤⼤增加。

传输距离最远可以达到 1200 ⽶左右,但是它的传输速率和传输距离是成反⽐的,只有在 100Kb/s 以下的传输速度,才能达到最⼤的通信距离,如果需要传输更远距离可以使⽤中继。

可以在总线上进⾏联⽹实现多机通信,总线上允许挂多个收发器,从现有的 RS485芯⽚来看,有可以挂 32、64、128、256 等不同个设备的驱动器。

RS485 的接⼝⾮常简单,与 RS232 所使⽤的 MAX232 是类似的,只需要⼀个 RS485转换器,就可以直接与单⽚机的 UART 串⼝连接起来,并且使⽤完全相同的异步串⾏通信协议。

基于C8051F060单片机的CAN_RS_485转换器的设计与实现

基于C8051F060单片机的CAN_RS_485转换器的设计与实现

CAN 总 线 ;同 样 ,若 转 换 器 通 过
CAN 通 信 接 口 模 块 从 CAN 总
线接收到数据帧后,通过数据转
换模块判断数据帧的信息,将其
图 2 主程序流程图
《工业控制计算机》2009 年 22 卷第 9 期
57
转换为符合 RS-485 协议的数据帧, 然后通过 RS-485 通信接 口模块发送到 RS-485 总线。 CAN / RS-485 转换器的主程序流 程图如图 2 所示。
RS-485 通信接口模块实现 RS-485 总线通信, 包括 RS- 485 总线数据帧的接收和发送。 数据帧的接收和发送均可采用中 断查询的方法完成。 SBUF1 寄存器每次只接收或发送一个字节。 当软件向 SBUF1 寄存器写入一个字节时开始数据发送。 UART1 中断被允许后,每次发送完成(SCON1 中的 TI1 位被置 '1')或接 收到数据字节(SCON1 中的 RI1 位被置 '1')时将产生中断。 中
参考文献 [1]王 东 ,等.利 用 ZigBee 技 术 构 建 无 线 传 感 器 网 络 [J].重 庆 大 学 学 报
(自 然 科 学 版 ),2006 (8) [2]Chipcon AS SmartRF CC2430 Preliminary Datasheet(rev1.01),
2005.9.15 [3]802.15.4,2003 IEEE Standard for Information Technology-Part
以 下 主 要 讨 论 初 始 化 模 块 、CAN 通 信 接 口 模 块 和 RS-485 通信接口模块。 2.1 初始化模块
初 始 化 模 块 主 要 包 括 C8051F060 初 始 化 ,UART1 初 始 化 和 SJA1000 初 始 化 。 C8051F060 初 始 化 主 要 完 成 主 控 器 C8051F060 的端口配置和系统时钟设置。 需要注意的是要通过 C8051F060 初始化使 UART1 的 TX 和 RX 连到两个端口引脚。

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串口自动收发控制及指示电路的制作方法RS485串口是一种常用的通信协议,常用于远距离通信和多节点通信。

为了实现对RS485串口的自动收发控制及指示,可以设计一个电路来实现。

下面将介绍一种制作RS485串口自动收发控制及指示电路的方法。

首先,我们需要准备以下材料和工具:1. RS485模块2. Arduino开发板3. MAX485芯片4.逻辑门电路芯片5. LED灯6.电阻、电容等相关元件7.连接线、焊锡工具等制作步骤如下:1.首先,我们将RS485模块和Arduino开发板连接起来。

将RS485模块的A、B线分别连接到Arduino开发板的串口引脚,如A线连接到TX引脚,B线连接到RX引脚。

同时,还需要将RS485模块的GND引脚和Arduino开发板的GND引脚连接起来,以确保电路的接地。

2.接下来,我们需要添加MAX485芯片。

将MAX485芯片的VCC和GND引脚连接到电源上,确保其正常工作。

然后,将MAX485芯片的A、B线分别连接到RS485模块的A、B线上。

此时,RS485模块的A、B线通过MAX485芯片和Arduino开发板相连接。

3.然后,我们需要添加逻辑门电路芯片。

逻辑门电路芯片的作用是控制RS485模块的发送和接收功能。

我们将逻辑门电路芯片的引脚与Arduino开发板的引脚相连接。

具体连接方式可以根据所使用的逻辑门电路芯片而定,通常需要将逻辑门电路芯片的控制引脚连接到Arduino开发板的某个数字引脚上,以实现对RS485模块的控制。

4.接下来,我们需要添加LED灯来指示RS485模块的发送和接收状态。

我们将LED灯的阳极(长脚)连接到逻辑门电路芯片的输出引脚上,将LED灯的阴极(短脚)连接到电源的负极上,以实现对LED 灯的控制和指示。

5.最后,我们需要添加一些电阻、电容等相关元件来保护电路和改善信号质量。

具体的元件数值和连接方式可以根据实际需求而定,在这里不作详细介绍。

C8051F040开发系统板使用说明书

C8051F040开发系统板使用说明书

第一章 C8051F040开发系统板简介1.1 开发系统的组成Cygnal C8051F040单片机开发系统主要由Cygnal 片上系统单片机开发工具、C8051F040片上系统单片机和系统试验板三部分组成,应用该系统可进行片上系统单片机较典型应用的试验,请参见以下介绍。

1.2 Cygnal C8051F单片机开发工具简介开发工具概述Cygnal 的开发工具实质上就是计算机IDE 调试环境软件及计算机RS-232到C8051F单片机JTAG 口的协议转换器(EC2-N1)的组合。

Cygnal C8051F系列全部的单片机片内均设计有调试电路该调试电路通过边界扫描方式获得单片机片内信息,通过10线的JTAG接口与开发工具连接以便于进行对单片机在片编程调试。

该开发系统板中的核心部分是Cygnal C8051F040单片机。

适配器(EC2-N1)一端与计算机相连,另一端与C8051F单片机的JTAG口相连,应用Cygnal 供应的IDE调试环境就可以进行非侵入式、全速的在系统编程(ISP)和调试。

Cygnal 开发工具支持视察和修改存储器和寄存器支持断点、视察点、堆栈指示器、单步、运行和停止吩咐。

调试时不须要额外的目标RAM、程序存储器、定时器或通信通道,并且全部的模拟和数字外设都正常工作。

开发工具主要技术指标●支持的目标系统:全部C8051Fxxx 系列单片机;●系统时钟:最大可达25MHz;●通过RS232接口与PC机连接;●支持汇编语言和C51源代码级调试;●第三方工具支持Keil C。

IDE 软件运行环境要求PC机能够运行开发工具软件并能与串行适配器通信。

对PC机有如下系统要求:●Windows 95/98/Me/NT/2000/XP 操作系统;●32MB RAM;●40MB 自由硬盘空间;●空闲的COM 口。

开发工具与PC 机硬件连接硬件连接及软件安装:●将JTAG 扁平电缆与串行示配器EC2 连接●将JTAG 扁平电缆的另一端与目标系统连接●将RS232 串行电缆的一端与EC2 连接●连接RS232 串行电缆的另一端到PC●给目标系统上电●插入CD 并运行SETUP.EXE 将IDE 软件安装到您的PC 机●在PC 机的起先菜单的程序项中选择Cygnal IDE 点击Cygnal 图标运行IDE软件。

C8051F040的RS485收发程序

C8051F040的RS485收发程序

//交叉开关配置使能,UART0配置在P0.0-P0.1
P0MDOUT = 0Xff;
}
/*系统时钟初始化
-----------------------------------------------------------*/
void os_init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
void time1_init()
{
SFRPAGE = TIMER01_PAGE;
TCON
= 0X40;
//TR1=1 定时器允许
TMOD
= 0x20;
//T1M1=1 T1M0=0 定时器工作在方式
CKCON = 0x10;
TH1
= 0xb8;
//装初值,波特率为
TL1
= 0xb8;
TR1=1;
i=0; for(i=0;i<50000;i++)
for(j=0;j<10;j++); }
SFRPAGE = UART0_PAGE;
gate = 0;
}
}
/*端口初始化-------------------------------------*/ void port_init() {
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04; XBR1 = 0x00; XBR2 = 0xd main()
{
WDTCN = 0x07;
//看门狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
os_init();
port_init();
uart0_init();

C8051F系列单片机串口通讯程序

C8051F系列单片机串口通讯程序

C8051F系列单片机串口通讯程序C8051F系列单片机串口通讯程序采用C8051F020单片机//串口编程--接收PC发过来的字符串,回发字符串.发送期间中断控制LED灯闪烁//采用外部晶振22.1184MHz 使用定时器1,方式2产生波特率,SMOD = 0或者 1 //定时器初值X=256-SYSCLK*(SMOD+1)/(BAUDRATE*384)/#includesfr16 TMR3RL = 0x92; //定时器3重装载寄存器sfr16 TMR3 = 0x94; //定时器3计数器#define uchar unsigned char#define uint unsigned int//----------------------------------------------------------------------//参数设置区//----------------------------------------------------------------------#define BAUDRATE 4800 //波特率bps#define CLKOUT 22118400 //外部晶振,修改也要修改OSCXCN #define SMODVAL 0 //SMOD的值,修改请也修改PCONVAL#define PCONVAL 0x00 //PCON的值,=0x00时SMOD0=0; =0x80时SMOD0=1 #define TXVAL (256-CLKOUT*(SMODVAL+1)/BAUDRATE/384) //定时器初值#define MAX_LEN 10 //每次接收/发送字符串的长度//---------------------------------------------------------------------//全局变量//---------------------------------------------------------------------sbit LED = P1^6; //LED '1'亮'0'灭bit readFlag = 0; //读标志uchar readCounts = 0; //已经读取的字符个数,与MAX_LEN比较uchar idata trdata[MAX_LEN]; //要接收/发送的字符串//----------------------------------------------------------------------//子函数声明//---------------------------------------------------------------------- void SYSCLK_Init(void); //系统时钟初始化void PORT_Init(void); //端口初始化void UART0_Init(void); //串口UART0初始化void Send_Char(uchar ch); //发送单个字符void Send_String(uchar * str, uint len); //发送一个字符串void UART0_ISR(); //串口中断服务程序,接收字符void Timer3_Init(uint counts); //定时器3初始化void Timer3_ISR(void); //定时器3中断服务程序//---------------------------------------------------------------------- //主函数//---------------------------------------------------------------------- void main(void){WDTCN = 0xde; //禁止看门狗WDTCN = 0xad;SYSCLK_Init(); //时钟初始化PORT_Init(); //端口初始化UART0_Init(); //串口初始化Timer3_Init(CLKOUT/12/10); //定时器初始化EA = 1; //开全局中断while(1){if(readFlag) //已经读取{readFlag = 0; //清零Send_String(trdata,MAX_LEN); //发送字符串}}}//----------------------------------------------------------------------//子函数具体实现//----------------------------------------------------------------------//系统时钟初始化void SYSCLK_Init(void){uint i;OSCXCN = 0x67; //采用外部晶振22.1184MHz,不分频. 选型OSCXCN=0110,0111 for(i=0;i<256;i++); //等待>1mswhile(!(OSCXCN&0x80)); //查询直到XTLVLD=1,晶振稳定OSCICN = 0x88; //切换到外部振荡器,允许时钟失效监测器. OSCICN=1000,1000 }//端口初始化void PORT_Init(void){XBR0 = 0x04; //允许UART0,RX,TX连到2个端口引脚. XBR0=0000,0100XBR1 = 0x00;XBR2 = 0x40; //交*开关使能P0MDOUT |= 0x03; //P0.0为推拉方式输出,即TX0,RX0所在的端口0000,0011P1MDOUT |=0x40; //P1.6为推拉方式输出,即LED所在的端口0100,0000}//串口初始化void UART0_Init(void){SCON0 = 0x50; //选择串口方式1,波特率可变SCON0=0101,0000TMOD = 0x20; //选择T1,方式2,自动再装入8位计数器TH1 = (int)TXVAL; //T1初值,根据波特率,时钟等计算. 0xF4, bps=4800bpsTL1 = (int)TXVAL;ES0 = 1; //UART0中断开启TR1 = 1; //启动定时器T1PCON |= PCONVAL; //PCON=0x00,SMOD = 0 ; PCON=0x80,SMOD=1 TI0 = 1; //声明TX0就绪,可以发送TR0 = 1;}//定时器初始化void Timer3_Init(uint counts){TMR3CN = 0x00; //禁止定时器T3,清TF3,采用SYSCLK/12为时基TMR3RL = -counts; //初始化重装载值TMR3 = 0xffff; //设置为立即重装载EIE2 |= 0x01; //T3中断开启TMR3CN |= 0x04; //启动T3}//发送单个字符void Send_Char(uchar ch){SBUF0 = ch; //送入缓冲区while(TI0 == 0); //等待发送完毕TI0 = 0; //软件清零}//发送字符串,调用Send_Char() len字符串长度void Send_String(uchar * str,uint len){uint k = 0;do{Send_Char(*(str + k));k++;} while(k < len);}//定时器3中断服务程序void Timer3_ISR(void) interrupt 14 using 0 {TMR3CN &= ~(0x80); //清TF3LED = ~LED;}//UART0中断服务程序. 接收字符void UART0_ISR(void) interrupt 4 using 1 {uchar rxch;if(RI0) //中断标志RI0=1 数据完整接收{RI0 = 0; //软件清零rxch = SBUF0; //读缓冲if(readCounts>=MAX_LEN){readCounts = 0;readFlag = 1;}trdata[readCounts] = rxch; //存入数组,供发送readCounts++;}}//------------------------------------------------------------- //程序结束。

基于C8051F340的RS485自适应多机通信和监测系统设计

基于C8051F340的RS485自适应多机通信和监测系统设计

基于C8051F340的RS485自适应多机通信和监测系统设计摘要:基于工厂车间机械电气设备监控的需要,设计了一种基于C8051F340单片机的设备状态监测和RS485自适应多机通信系统,实现了本地现场设备运行状态的监测和各监测点的RS485组网通信,构成主从分布式系统,并且主机可自动识别总线上从机的地址和个数,具有多机通信的自适应性;通过与主机相连的GSM手机通信模块还能够实现手机对各监测点的远程实时监控,构成了一个完整的远程监控和自动监测系统。

关键词:设备监测;RS485总线;自适应;多机通信Design of RS485 adaptive Multi-computer Communication and Remote Monitoring System Based on C8051F340Xu LiutongXinxiang Huaxin Electric power group share company 453000Abstract: Based on the monitoring needs of mechanical and electrical equipments in the factory machine shop, designed a equipment state monitoring and RS485 adaptive multi-computer communication system based on C8051F340 MCU, achieved the status monitoring of the local field devices and RS485 group networking and communication of various monitoring points, constituted a master-slave distributed system, and the host can automatically identify the address and the number of the slave on the bus, having self-adaption of multi-computer communication.It can also implement remote the real-time monitoring for each monitoring-station via the GSM mobile phone communication module connected to the host, constituted a complete remote monitoring and automatic monitoring system.Keywords: Equipment Monitoring; RS485 BUS; Adaptive; Multi-machine Communication0引言在现代化的工厂中,众多机械电气设备的运行状态需要实时监控并能够进行有序管理,以保证其安全稳定运行。

C8051F020单片机的RS485串行通信设计

C8051F020单片机的RS485串行通信设计

C8051F020单片机的RS485串行通信设计关键字:单片机串行通信RS485l 引言随着计算机技术和测控技术的不断发展,在以单片机为核心的数据采集系统中,需要实现单片机和计算机之间的数据交换,并以此来发挥单片机和计算机各自的长处,提升整个系统的性能价格比。

在计算机网络和工业控制系统中,经常需要采用串行通信来实现远程数据传输。

目前,有多种接口标准可用于串行通信,包括RS232、RS422、RS485等。

RS232是最早的串行接口标准,在短距离、较低波特率串行通信中得到了广泛应用。

但是,RS232通信存在着传输速度慢、传输距离短、信号容易受到干扰等不足,其应用局限性已日益突出。

而RS485通信采用差分方式来消除噪声,即信号在发送前会分解为正负2条线路,当到达接收端时将信号相减,使噪声相互抵消,还原成原来的信号,这种方式对共模干扰抑制能力较强,已广泛应用于工业控制等领域。

要实现单片机与计算机之间的RS485通信,一般可以采用2种方法:一种方法是在单片机与计算机两端分别采用RS232与RS485电平转换装置;另一种方法是采用RS485通信卡,并将其插在计算机主板上。

采用前一种方法的优点是硬件装置安装简便,软件编程相对简单;缺点是通信速率被限制在20 kb/s以内。

第二种方法的优点是通信距离较远,速率较高,可达10 Mb/s;缺点是需要安装通讯卡和驱动程序,并进行必要的设置。

本文采用第二种方法。

2 总体架构在某型电子设备研制中,选用美国Cygnal公司生产的一种soc型8位单片机C8051F020,对测控系统进行数据采集。

该单片机是C8051F系列的F02X子系列,其性价比在工业控制领域具有较强的竞争力。

它是完全集成的混合信号系统级芯片,具有与8051指令集完全兼容的CIP一51内核,对于熟悉51单片机的技术人员来说,在硬件设计及软件编程上大大提高了开发效率。

测控计算机采用研华的IPC-610工控机,并选用PCL一846B通信卡进行RS485串行数据通信,该通信卡包含4通道,每个通道可以对32个节点进行通信。

C8051f040 can 通信程序

C8051f040 can 通信程序

CAN0DATL = 0xFF;
// Set direction to WRITE all IF registers to Msg Obj
for( n=1;n<33;n++ ){
CAN0ADR = IF2CMDRQST; // Write blank (reset) IF registers to each msg obj
// system clock is 22.1 MHz / 2 = 11.05 MHz
for( n=0;n<255;n++ );
// delay about 1ms
while( (OSCXCN&0x80)==0 ); // wait for oscillator to stabilize
CLKSEL |= 0x01;
// interrupt Register
#define IF1CMDRQST
0x08
// IF1 Command Rest Register
#define IF1CMDMSK
0x09
// IF1 Command Mask Register
#define IF1MSK1
0x0A
// IF1 Mask1 Register
0x29
// IF2 Data B1 Register
#define IF2DATB2
0x2A
// IF2 Data B2 Register
#define MESSAGE_SIZE #define CANTX_ID #define CANRX_ID
8 0x04 0x03
// Size of each CAN message,Range 1‐8 消息长度 // Transmitted by RAM object 1 of IF1 发送单元号 // Received from RAM object 2 of IF2 接收单元号

C51很简洁易懂的RS458串口通信接收发送程序

C51很简洁易懂的RS458串口通信接收发送程序
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
#include <REG52.H>
#include <stdio.h>
sbit RS485E=P3^7; //定义485的使能脚
bit SendFlag;
unsigned int ReData,SenData;
/**************************************
延时程序
**************************************/
SBUF=SenData;//发送数据
delay(50);
}
else
{
RS485E=0;//接收状态
}
}
}பைடு நூலகம்
/****************************************************
串口中断程序
******************************************************/
SendFlag = 1;
}
}
PCON|= 0x80;
//TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无(11.0592)
TH1 = 0xF3;// //baud*2 /*波特率4800、数据位8、停止位1。效验位无(12M)

C51很简洁易懂的RS458串口通信接收发送程序

C51很简洁易懂的RS458串口通信接收发送程序
void delay(unsigned char i)
{
unsigned char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
void main (void) {
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
SendFlag = 1;
}
}
/*******************************************************************************
*标题: RS485串口通信试验(接受与发送) *
**
* 1.通过本例程了解串口的基本原理及使用,理解并掌握对串口进行初始化*
**
* 2.请使用串口调试助手(Baud 4800、数据位8、停止位1、效验位无)做为上位机(发送)数据和(接受)数据,
void ser_int (void) interrupt 4 usin
TI = 0;
SendFlag = 0;
}
if(RI == 1) //RI接受中断标志
{
RI = 0;//清除RI接受中断标志
ReData = SBUF; //SUBF接受/发送缓冲器
SenData=ReData;
*请在字符串输入框中输入字符和数字(HEX),按发送按钮。观看接受窗显示情况.也可以用自动循环发送。
*
* 3.试验RS485需要用RS232转485的转换头。RS485的A对应串口头的9针B对应4针.接法大家可以参考原理图。
**
*请学员认真消化本例程,学会用C语言操作串口和485的实现*

rs485协议的编程方法

rs485协议的编程方法

rs485协议的编程方法1.什么是r s485协议?r s485协议是一种常用的串行通信协议,用于在多个设备之间进行数据传输。

它具有高速传输、长距离通信和多节点连接的特点,广泛应用于工业自动化领域。

本文将介绍如何使用rs485协议进行编程。

2.硬件准备在使用r s485协议进行编程之前,需要进行一些硬件准备工作。

主要包括:R S485转U A R T模块-:用于将r s485信号转换为与M CU或计算机通信的UA RT信号。

M C U或计算机-:用于与rs485转UA R T模块进行数据交互。

外设设备-:如传感器、执行器等,通过r s485协议与M CU或计算机进行通信。

3.软件编程3.1选择编程语言在进行r s485协议的编程时,可以选择多种编程语言,如C语言、P y th on等。

根据实际需求和项目环境选择合适的编程语言。

3.2使用串口库使用rs485协议进行通信时,需要通过串口与外设设备进行数据交互。

因此,需要在编程中使用相应的串口库来实现串口的打开、配置和读写操作。

3.3配置串口参数在使用r s485协议进行通信之前,需要对串口进行正确的配置。

主要包括波特率、数据位、停止位和校验位等参数的设置。

这些参数应与外设设备的参数相匹配,否则通信将无法正常进行。

3.4发送和接收数据使用rs485协议进行通信时,需要明确发送和接收数据的格式。

根据外设设备的通信协议,编写相应的数据发送和接收函数。

在发送数据时,需要将数据按照协议格式进行打包;在接收数据时,需要根据协议格式解析接收到的数据。

3.5错误处理在r s485通信中,可能会出现各种错误情况,如传输错误、超时等。

在编程过程中,需要预先考虑这些错误情况,并编写相应的错误处理代码,保证程序的稳定性和可靠性。

4.实例演示以下是一个使用C语言编写的简单示例,演示了如何使用r s485协议进行通信:#i nc lu de<s td io.h>#i nc lu de<s td in t.h>#i nc lu de<s td li b.h>#i nc lu de<u ni st d.h>#i nc lu de<f cn tl.h>#i nc lu de<t er mi os.h>#d ef in eR S485_D EVI C E"/d ev/t ty US B0"v o id in it_r s485(in t fd){s t ru ct te rm io st io;t c ge ta tt r(fd,&tio);t i o.c_cf la g|=C REA D|C LO CA L;t i o.c_cf la g&=~CSI Z E;t i o.c_cf la g|=C S8;t i o.c_cf la g&=~PAR E NB;t i o.c_cf la g&=~CST O PB;t i o.c_cc[V MI N]=0;t i o.c_cc[V TI ME]=10;t c se ta tt r(fd,T CSA N OW,&ti o);}i n tm ai n(){i n tf d=op en(R S485_D EV IC E,O_RD WR|O_N OC TT Y);i f(f d==-1){p e rr or("op en");e x it(1);}i n it_r s485(f d);u n si gn ed ch ar da ta[]={0x01,0x02,0x03};w r it e(fd,d at a,siz e of(d at a));u n si gn ed ch ar bu f[10];s s iz e_tn=r ea d(fd,b uf,s iz eo f(bu f));i f(n>0){//解析接收到的数据f o r(in ti=0;i<n;i++){p r in tf("%02x",buf[i]);}p r in tf("\n");}c l os e(fd);r e tu rn0;}5.总结本文介绍了使用r s485协议进行编程的方法。

485通讯从机接收程序(带帧校验)

485通讯从机接收程序(带帧校验)

//从机程序//01数据帧//02命令帧//03功能帧 01 确认 02 否认#include<avr/io.h>#include<avr/interrupt.h>#include<inttypes.h>#include<util/delay.h>#include <avr/pgmspace.h>#include<string.h>#define myaddr 0x01 //定义本机地址#define rx_485(); asm("cbi 0x13,2"); //portd.2清零改为接收状态#define tx_485(); asm("sbi 0x13,2"); //portd.2置位改为发送状态volatile struct conn{unsigned char buf[70];unsigned char data[64];unsigned char srcadd;//源地址unsigned char aimadd;//目的地址unsigned char tp;//帧类型int num;int tmp;unsigned char ver; //验证码;unsigned char err; //错误码; 01:帧校验错}tx,rx;volatile unsigned char com; //命令const unsigned char flash_str[] PROGMEM = "0123456789";ISR(USART_RXC_vect){rx.buf[rx.tmp]=UDR;/*testif(rx.tmp==0 && rx.buf[rx.tmp]=='t'){totx();tx.num=16;strcpy(tx.buf,"can i help you");tx.buf[15]=0x0D;UCSRB|=(1<<UDRIE);//发送帧};*/if(rx.tmp==0 && rx.buf[rx.tmp]!=myaddr) //地址不对直接返回{//禁止接收0.15秒。

RS-485总线收发实验

RS-485总线收发实验

RS-485总线收发实验在本章节,我们将介绍RS-485总线的使用。

本实验一共需要两块神舟IV号STM32开发板,一块作为RS485的发送端,另一块作为RS485的接收端,接收总线上的数据。

本节分为如下几个部分:1 RS-485总线实验的意义与作用2实验原理3软件设计4硬件设计5下载与验证6实验现象意义与作用前面两个例程,我们分别讲解了串口printf实验和串口中断收发实验,对RS232串口原理及其应用有了一定的了解,但是由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:(1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。

(2)传输速率较低,在异步传输时,波特率为20Kbps。

(3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。

(4)传输距离有限,最大传输距离标准值为50英尺,实际上也只能用在50米左右。

针对RS232接口的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:(1)RS-485的电气特性:逻辑"1"以两线间的电压差为+(2—6)V表示;逻辑"0"以两线间的电压差为-(2—6)V表示。

接口信号电平比RS-232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。

(2)RS-485的数据最高传输速率为10Mbps(实际取决于RS485接口芯片和电路)。

(3)RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。

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

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

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

C8051F040的UART程序1

C8051F040的UART程序1

// Set internal oscillator to run
// at its slowest frequency
CLKSEL = 0x00;
// Select the internal osc. as // the SYSTEMCLOCK source
// Initialize external crystal oscillator to use 22.1184 MHz crystal
#define UART_BUFFERSIZE 64 unsigned char UART_Buffer[UART_BUFFERSIZE]; unsigned char UART_Buffer_Size = 0; unsigned char UART_Input_First = 0; unsigned char UART_Output_First = 0; unsigned char TX_Ready =1; static char Byte;
//-----------------------------------------------------------------------------
// OSCILLATOR_Init
//-----------------------------------------------------------------------------
// Copyright 2006 Silicon Laboratories, Inc.
//
//
// Program Description:
//
// This program demonstrates how to configure the C8051F040 to write to and read

rs485发送函数

rs485发送函数

rs485发送函数RS485是一种串行通信协议,常用于工业控制领域。

在RS485通信中,发送函数是实现数据传输的重要组成部分。

本文将介绍RS485发送函数的工作原理、使用方法以及一些注意事项。

一、RS485发送函数的工作原理RS485是一种差分信号通信协议,可以实现多个设备之间的通信。

在RS485通信中,发送函数的作用是将待发送的数据转换为符合RS485通信协议的电信号,并通过RS485总线发送出去。

RS485总线上可以连接多个设备,每个设备都有一个唯一的地址。

发送函数首先需要指定要发送的设备地址,然后将待发送的数据传输到RS485总线上。

发送函数会对数据进行校验,确保数据的完整性和正确性。

最后,发送函数会将数据转换为差分信号,并通过RS485总线发送给目标设备。

二、RS485发送函数的使用方法1. 设置通信参数:在使用RS485发送函数之前,需要先设置通信参数。

通信参数包括波特率、数据位、停止位等。

这些参数需要和目标设备保持一致,才能保证通信的正确进行。

2. 编写发送函数:发送函数是编程语言中的一个函数,用于将数据发送到RS485总线上。

发送函数需要包含发送的设备地址和待发送的数据。

具体的发送函数的实现方式会根据所使用的编程语言和RS485通信库的不同而有所差异。

3. 调用发送函数:在程序的适当位置调用发送函数,将需要发送的数据传递给发送函数。

发送函数会将数据发送到RS485总线上,并等待目标设备的响应。

4. 处理发送结果:发送函数通常会返回一个发送结果,用于判断发送是否成功。

根据发送结果,可以进行相应的处理,如重新发送数据、记录日志等。

三、RS485发送函数的注意事项1. 设备地址:在使用RS485发送函数时,需要注意设备地址的设置。

每个设备都有一个唯一的地址,发送函数需要指定目标设备的地址才能正确发送数据。

2. 数据长度:RS485发送函数通常有一个最大数据长度的限制。

超过这个长度的数据可能无法发送成功,需要进行分包处理。

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

void main()
{
WDTCN = 0x07;
//看门狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
os_init();
port_init();
uart0_init();
time1_init();
interrput_init();
transmit_RS485(); while(1) {
i=0; for(i=0;i<50000;i++)
for(j=0;j<10;j++); }
SFRPAGE = UART0_PAGE;
gate = 0;
}
}
/*端口初始化-------------------------------------*/ void port_init() {
SFRPAGE = CONFIG_PAGE;
XBR0 = 0x04; XBR1 = 0x00; XBR2 = 0x40; XBR3 = 0x00;
#include "c8051F040.h" #define uchar unsigned char #define uint unsigned int
void port_init(); void os_init(); void uart0_init(); void time1_init(); void interrput_init(); void transmit_RS485(); void delay();
void interrput_uart0() interrupt 4
{
SFRPAGE = UART0_PAGE;
if(TI0 == 1)
{
TI0 = 0;
}
if(RI0 == 1)
{
RI0 = 0;
g = SBUF0;
}
}
/*RS485发送数据程序---------------------------------------*/
sbit gate = P0^2; uchar g; uchar xx[15]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xaa,0xbb,0xcc,0xdd ,0xee,0xff};
/*主函数-----------------------------------------------------*/
}
/*中断程序初始化--------------------------------------*/
void interrput_init()
{
EA = 1;
//允许所有中断
ES0 = 1;
//允许uart0中断
}
/*uart0中断服务程序---------------------------------------*/
//交叉开关配置使能,UART0配置在P0.0-P0.1
P0MDOUT = 0Xff;
}
/*系统时钟初始化
-----------------------------------------------------------*/
void os_init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE;
}
/*串口初始化,选择UART0--------------------------------------*/
void uart0_init()
{
SFRPAGE = UART0_PAGE;
SCON0 = 0x50;
SCON0 &= 0xFC;
//清中断标志
SSTA0 = 0x00;
}
/*定时器初始化,作为UART0的波特率发生器------------------------*/
void time1_init()
{
SFRPAGE = TIMER01_PAGE;
TCON
= 0X40;
//TR1=1 定时器允许
TMOD
= 0x20;
//T1M1=1 T1M0=0 定时器工作在方式
CKCON = 0x10;
TH1
= 0xb8;
//装初值,波特率为
TL1
= 0xb8;
TR1=1;
OSCXCN = 0x67;
//外部.1184M晶振
for (i = 0; i < 3000; i++);
//等待外部晶振稳

while ((OSCXCN & 0x80) == 0);
CLKSEL = 0x01;
//系统时钟不分频
OSCICN = 0x00;
// 将内部晶振关闭,
也可不关闭,不关闭时MCU耗能高
void transmit_RS485()
{
uchar i;
ห้องสมุดไป่ตู้
gate = 1;
for(i=0;i<15;i++)
{
SBUF0 = xx[i];
delay();
}
}
/*延时程序---------------------------------------*/
void delay()
{
uint i,j;
相关文档
最新文档