首页 51单片机的2个串口分别通信的方法

51单片机的2个串口分别通信的方法

举报
开通vip

51单片机的2个串口分别通信的方法51单片机的2个串口资源分别通信的方法当使用51单片机的2个串口资源进行通信时,比如用一个串口与PLC的串口使用RS485协议通信,一个串口通过蓝牙模块和另一个单片机无线通信时,该如何处理呢?传统的51单片机只有1个串口资源,只能采用分时复用的方法。STC的15系列增强版51单片机具有多个串口资源,本文将描述如何使用IAP15W4K58S单片机用一个串口资源与PLC的RS485有线通信,另一个串口资源与Arduino单片机通过蓝牙模块无线通信,该通讯连接过程中PLC作为主机,IAP15W4K58S作为中间机,Ard...

51单片机的2个串口分别通信的方法
51单片机的2个串口资源分别通信的方法当使用51单片机的2个串口资源进行通信时,比如用一个串口与PLC的串口使用RS485协议通信,一个串口通过蓝牙模块和另一个单片机无线通信时,该如何处理呢?传统的51单片机只有1个串口资源,只能采用分时复用的方法。STC的15系列增强版51单片机具有多个串口资源,本文将描述如何使用IAP15W4K58S单片机用一个串口资源与PLC的RS485有线通信,另一个串口资源与Arduino单片机通过蓝牙模块无线通信,该通讯连接过程中PLC作为主机,IAP15W4K58S作为中间机,Arduino单片机作为最低层级。工作过程是按下启动按键,PLC发信息给IAP15W4K58S单片机发高速脉冲控制步进电机驱动的机械臂运动取走货物,当货物取走后,IAP15W4K58S单片机通过蓝牙模块 通知 关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知 Arduino单片机控制的小车将新货物运送过来。连接结构示意图如下图所示。本例程使用的单片机型号为:IAP15W4K58S,该单片机有4个采用UART工作方式的全双工异步串行通信接口(分别为串口1、串口2、串口3和串口4),每个串行口由2个数据缓冲器、1个移位寄存器、1个串行控制寄存器和1个波特率发生器等组成。本项目使用串行口1和串行口2。串行口1的两个缓冲器共用寄存器SBUF(99H),串行口2的两个缓冲器共用寄存器S2BUF(9BH)。10位(1起始位,8位数据位,1停止位)可变波特率(9600)。串口1对应的硬件部分是TxD和RxD,串行口2对应硬件部分是TxD2和RxD2。串口1选择引脚P3.0(RxD)和P3.1(TxD),串口2选择引脚P1.0(RxD)和P1.1(TxD)。串口1既可以选择T1作为波特率发生器,也可以选择T2作为波特率发生器。本文串口1提供2个选择(T1和T2),串口2只能选择T2作波特率发生器。但是当串口1和串口2的波特率相同时,可以共用T2作为波特率发器,当T2工作在1T模式时,串行口1的波特率=SYSclk/(65536-[RL_TH2,RL_TL2])/4,SYSclk 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示系统时钟频率,[RL_TH2,RL_TL2]表示T2H,T2L的定时初值设置值。串口1相关的寄存器:T2H、T2L、AUXR、SCON、SBUF、PCON、IE、IP、AUXR1/P_SW1、CLK_DIV/PCON2。SCON=Ox5O;〃10位UART,串口1模式1,允许接收PCON&=0x3F;//不倍增AUXR1=0x01;〃设置使用T2作为波特率发送器AUXR&=~0x01;//设置使用T1作为波特率发送器AUXR&=〜(1<<4);//停止T2的运行AUXR&=〜(1«3);//设置T2为定时器AUXR1=(1<<2);//设置T2为1T模式,速度快AUXR1=(1<<4);//允许T2的运行AUXR1=(1<<6);//设置T1为1T模式,若AUXR&=〜(1<<6),则速度慢EA=1;//开总中断ES=1;//开串口中断P_SW1&=0x3F;//串口1选择P3.0(RxD)和P3.1(TxD)串口2相关的寄存器:S2CON、T2H、T2L、AUXR、S2BUF、IE、IE2IP2、P_SW2。S2CON&=〜(1<<7);//8位数据,1位起始位,1位停止位,无校验S2CON|=(1<<4);//允许接收T2H、T2L、AUXR的设置与串口1相同,此处不赘述。IP2优先级可不设置。若开启中断,则需要EA=1,然后IE2的第0位为1,IE2=0x01;P_SW2&=~0x01;//串口2选择引脚P1.0(RxD)和P1.1(TxD)。中断优先级没有设置,因此默认的查询顺序是先串口1中断,然后串口2的中断,这也符合我们项目的设计,因此不用额外设计优先级。〃工作频率为11.0592MHz,波特率9600//说明:下文程序参考了“宏晶科技”的例程。/**//**/#defineMAIN_Fosc11059200L//定义主时钟#include"STC15Fxxxx.H"#defineBaudrate19600UL#defineBaudrate29600UL//#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*功能说明**************双串口全双工中断方式收发通讯程序。通过PLC向MCU发送数据,MCU收到后通过串口把收到的数据原样发送./#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*#J*/#defineUART1_BUF_LENGTH5#defineUART2_BUF_LENGTH5u8TX1_Cnt;//发送计数u8RX1_Cnt;//接收计数u8TX2_Cnt;//发送计数u8RX2_Cnt;//接收计数bitB_TX1_Busy;//发送忙标志0不忙,1忙bitB_TX2_Busy;//发送忙标志u8idataRX1_Buffer[UART1_BUF_LENGTH];//接收缓冲u8idataRX2_Buffer[UART2_BUF_LENGTH];//接收缓冲voidUART1_config(u8brt);//选择波特率,2:使用Timer2做波特率,〃其它值:使用Timerl做波特率.voidUART2_config(u8brt);//选择波特率,2:使用Timer2做波特率,//其它值:无效.voidPrintString1(u8*puts);//发送数据voidPrintString2(u8*puts);//发送数据//========================================================//函数:voidmain(void)//描述:主函数。//========================================================voidmain(void){P0Ml=0;P0M0=0;//设置为准双向口PlMl=0;PlM0=0;//设置为准双向口P2Ml=0;P2M0=0;//设置为准双向口P3Ml=0;P3M0=0;//设置为准双向口P4Ml=0;P4M0=0;//设置为准双向口P5Ml=0;P5M0=0;//设置为准双向口P6Ml=0;P6M0=0;//设置为准双向口P7Ml=0;P7M0=0;//设置为准双向口UARTl_config(2);//选择波特率,2:使用Timer2做波特率,其它值://使用Timer1做波特率.UART2_config(2);//选择波特率,2:使用Timer2做波特率,其它值://无效.EA=l;//允许全局中断PrintStringl("UARTlTestPrgramme!\r\n");//SUARTl发送一个字符串PrintString2("UART2TestPrgramme!\r\n");//SUART2发送一个字符串while(l)if((TXl_Cnt!=RXl_Cnt)&&(!B_TXl_Busy))//收到数据,发送空闲{SBUF=RX1_Buffer[TX1_Cnt];B_TX1_Busy=1;if(++TX1_Cnt>=UART1_BUF_LENGTH)TX1_Cnt=0;if((TX2_Cnt!=RX2_Cnt)&&(!B_TX2_Busy)){//收到数据,发送空闲S2BUF=RX2_Buffer[TX2_Cnt];B_TX2_Busy=1;if(++TX2_Cnt>=UART2_BUF_LENGTH)TX2_Cnt=0;//========================================================//函数:voidPrintString1(u8*puts)//描述:串口1发送字符串函数。//参数:puts:字符串指针.//========================================================voidPrintString1(u8*puts){for(;*puts!=0;puts++)//遇到停止符0结束{SBUF=*puts;B_TX1_Busy=1;while(B_TX1_Busy);}//========================================================//函数:voidPrintString2(u8*puts)//描述:串口2发送字符串函数。//参数:puts:字符串指针.//========================================================voidPrintString2(u8*puts){for(;*puts!=0;puts++)//遇到停止符0结束S2BUF=*puts;B_TX2_Busy=1;while(B_TX2_Busy);}//========================================================//函数:SetTimer2Baudraye(u16dat)//描述:设置Timer2做波特率发生器。//参数:dat:Timer2的重装值.//========================================================voidSetTimer2Baudraye(u16dat){AUXR&=~(1<<4);//停止T2的运行AUXR&=〜(lvv3);〃设置T2为定时器AUXR1=(1<<2);〃设置T2为1T模式,速度快TH2=dat/256;//高8位赋初值TL2=dat%256;//低8位赋初值IE2&=〜0x01;//禁止中断AUXR1=(1<<4);〃允许T2的运行}////函数:voidUART1_config(u8brt)//描述:UART1初始化函数。//参数:brt:选择波特率,2:使用Timer2做波特率,其它值:使用Timerl做波特率.//voidUART1_config(u8brt)/***********波特率使用定时器2*****************/if(brt==2)AUXR|=0x01;//设置使用T2作为波特率发送器SetTimer2Baudraye(65536UL-(MAIN_Fosc/4)/Baudrate1);/***********波特率使用定时器1*****************/else{TR1=0;AUXR&=~0x01;//设置使用T1作为波特率发生器AUXR1=(lv<6);〃设置T1为IT模式,速度快TMOD&=〜(1vv6);//设置T1为定时器TMOD&=~0x30;//Tl方式选择;TH1=(u8)((65536UL-(MAIN_Fosc/4)/Baudrate1)/256);TL1=(u8)((65536UL-(MAIN_Fosc/4)/Baudrate1)%256);ET1=0;//禁止中断INT_CLKO&=〜0x02;//不输出时钟TR1=1;//开始定时}SCON|=0x50;//UART1模式,8位数据,可变波特率,//PS=1;//高优先级中断ES=1;//允许中断REN=1;//允许接收//P_SW1&=0x3f;P_SW1&=0x3F;〃串口1选择P3.0(RxD)和P3.1(TxD)B_TX1_Busy=0;TX1_Cnt=0;RX1_Cnt=0;////函数:voidUART2_config(u8brt)//描述:UART2初始化函数。//参数:brt:选择波特率,2:使用Timer2做波特率,其它值:无效.//========================================================voidUART2_config(u8brt)//选择波特率,2:使用Timer2做波特率,//其它值:无效.{if(brt==2){SetTimer2Baudraye(65536UL-(MAIN_Fosc/4)/Baudrate2);S2CON&=~(1<<7);//8位数据,1位起始位,1位停止位,无校验IE2|=0x01;//允许中断S2CON|=(1<<4);//允许接收P_SW2&=〜0x01;〃串口2选择引脚P1.0(RxD)和Pl.l(TxD)。B_TX2_Busy=0;TX2_Cnt=0;RX2_Cnt=0;////函数:voidUART1_int(void)interruptUART1_VECTOR//描述:UART1中断函数。////UART1_VECTOR=4voidUART1_int(void)interruptUART1_VECTORif(RI)RI=0;RX1_Buffer[RX1_Cnt]=SBUF;if(++RX1_Cnt>=UART1_BUF_LENGTH)RX1_Cnt=0;if(TI){TI=0;B_TX1_Busy=0;//========================================================//函数:voidUART2_int(void)interruptUART2_VECTOR//描述:UART2中断函数。//========================================================//UART2_VECTOR=8voidUART2_int(void)interruptUART2_VECTORif((S2CON&1)!=0){S2CON&=~1;//清零接收标志位RX2_Buffer[RX2_Cnt]=S2BUF;if(++RX2_Cnt>=UART2_BUF_LENGTH)RX2_Cnt=0;}if((S2CON&2)!=0){S2CON&=~2;//清零发送标志位B_TX2_Busy=0;
本文档为【51单片机的2个串口分别通信的方法】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥15.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
lipeng1013
暂无简介~
格式:doc
大小:39KB
软件:Word
页数:13
分类:建筑/施工
上传时间:2022-11-16
浏览量:13