STC单片机双串口使用设置与例程
- 格式:docx
- 大小:18.79 KB
- 文档页数:7
双工串口通信技巧及例程一、引言双工串口通信是指在串行通信中,数据可以同时双向传输的一种通信方式。
与单工串口通信相比,双工串口通信具有更高的效率和灵活性。
本文将介绍双工串口通信的基本原理以及一些常用的技巧和例程。
二、双工串口通信原理双工串口通信是通过两根信号线来实现数据的双向传输,这两根信号线分别是发送线(TX)和接收线(RX)。
在双工串口通信中,发送端将要发送的数据通过发送线发送出去,接收端则通过接收线接收数据。
这样,发送端和接收端可以同时进行数据的发送和接收,达到双向通信的效果。
三、双工串口通信的实现1. 硬件设置在使用双工串口通信时,需要设置串口的参数,包括波特率、数据位、停止位和校验位等。
这些参数需要在发送端和接收端保持一致,才能正确地进行数据的传输。
2. 数据帧格式在双工串口通信中,数据的传输是以数据帧的形式进行的。
数据帧一般包括起始位、数据位、校验位和停止位等。
发送端将要发送的数据按照数据帧格式发送出去,接收端则按照相同的数据帧格式接收数据。
3. 数据传输流程在进行双工串口通信时,一般采用中断或轮询的方式进行数据的发送和接收。
发送端将要发送的数据存放在发送缓冲区中,通过发送线发送出去。
接收端通过接收线接收数据,并将接收到的数据存放在接收缓冲区中,等待处理。
四、双工串口通信的技巧1. 数据的同步在双工串口通信中,发送端和接收端需要保持一致的数据帧格式和参数设置,以确保数据的正确传输。
如果数据的格式或参数设置不一致,可能会导致数据传输出错。
2. 缓冲区管理在进行双工串口通信时,发送端和接收端都需要使用缓冲区来存放数据。
发送端将要发送的数据存放在发送缓冲区中,接收端则将接收到的数据存放在接收缓冲区中。
在使用缓冲区时,需要注意缓冲区的大小和数据的读写操作,避免溢出或丢失数据。
3. 错误处理在双工串口通信中,可能会出现数据传输错误的情况,例如数据丢失、校验错误等。
对于这些错误,发送端和接收端都需要进行相应的错误处理,例如重新发送数据或进行数据重组。
STC12C5A60S2 单片机双串口通信STC12C5A60S2 单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1 的功能及操作与传统51 单片机串行口相同;特殊的是STC12C5A60S2 单片机内部有一个独立波特率发生器,串口1 可以使用定时器1 作为波特率发生器,也可以使用独立波特率发生器作为波特率发生器;而串口2 只能使用独立波特率发生器作为波特率发生器。
下面是一段双串口通信的程序:/***********************************************************************时间:2012.11.24芯片:STC12C5A60S2晶振:22.1184MHz 波特率:9600bps引脚定义:串行口1:发送TxD/P3.1;接收RxD/P3.0串行口2:发送TxD2/P1.3;接收RxD2/P1.2功能描述:STC12 双串口通信(中断方式)当串行口1 接收数据后,将此数据由串行口2 发送出去当串行口2 接收数据后,将此数据由串行口1 发送出去******************************************************************* ****/#include#define S2RI 0x01//串口2 接收中断请求标志位#define S2TI 0x02//串口2 发送中断请求标志位unsigned char flag1,flag2,temp1,temp2;/****************串行口初始化函数****************/void InitUART(void){TMOD = 0x20; //定时器1 工作在方式2 8 位自动重装SCON = 0x50; //串口1 工作在方式1 10 位异步收发REN=1 允许接收TH1 = 0xFA; //定时器1 初值TL1 = TH1;TR1 = 1; //定时器1 开始计数EA =1;//开总中断ES =1;//开串口1 中断S2CON = 0x50; //串口2 工作在方式1 10 位异步收发S2REN=1 允许接收BRT = 0xFA; //独立波特率发生器初值AUXR = 0x10; //BRTR=1 独立波特率发生器开始计数IE2 =0x01;//开串口2 中断ES2=1}/****************串行口1 发送****************/void UART_1SendOneByte(unsigned char c){SBUF = c;while(!TI); //若TI=0,在此等待TI = 0;}/****************串行口2 发送****************/void UART_2SendOneByte(unsigned char c){S2BUF = c;while(!(S2CON&S2TI)); //若S2TI=0,在此等待S2CON&=~S2TI; //S2TI=0}/*****************主函数******************/void main(void){InitUART();//串行口初始化while(1){//如果串口1 接收到数据,将此数据由串口2 发送if(flag1==1){flag1=0;UART_2SendOneByte(temp1);}//如果串口2 接收到数据,将此数据由串口1 发送if(flag2==1){flag2=0;UART_1SendOneByte(temp2);}}}/************串行口1 中断处理函数*************/ void UART_1Interrupt(void) interrupt 4{if(RI==1){RI=0;flag1=1;temp1=SBUF;}}/************串行口2 中断处理函数*************/ void UART_2Interrupt(void) interrupt 8{if(S2CON&S2RI){S2CON&=~S2RI;flag2=1;temp2=S2BUF;}}12C5A60S2.h 的头文件如下://--------------------------------------------------------------------------------//新一代1T 8051 系列单片机内核特殊功能寄存器C51 Core SFRs// 7 6 5 4 3 2 1 0 Reset Valuesfr ACC = 0xE0; //Accumulator 0000,0000sfr B = 0xF0; //B Register 0000,0000sfr PSW = 0xD0; //Program Status Word CY AC F0 RS1 RS0 OV F1 P 0000,0000//-----------------------------------sbit CY = PSW;sbit AC = PSW;sbit F0 = PSW ;sbit RS1 = PSW;sbit RS0 = PSW;sbit OV = PSW ;sbit P = PSW;//-----------------------------------sfr SP = 0x81; //Stack Pointer 0000,0111sfr DPL = 0x82; //Data Pointer Low Byte 0000,0000sfr DPH = 0x83; //Data Pointer High Byte 0000,0000//-------------------------------------------------------------------------------- //新一代1T 8051 系列单片机系统管理特殊功能寄存器// 7 6 5 4 3 2 1 0 Reset Valuesfr PCON = 0x87; //Power Control SMOD SMOD0 LVDF POF GF1 GF0 PD IDL 0001,0000// 7 6 5 4 3 2 1 0 Reset Valuesfr AUXR = 0x8E; //Auxiliary Register T0x12 T1x12 UART_M0x6 BRTR S2SMOD BRTx12 EXTRAM S1BRS 0000,0000//-----------------------------------sfr AUXR1 = 0xA2; //Auxiliary Register 1 - PCA_P4 SPI_P4 S2_P4 GF2 ADRJ - DPS 0000,0000/*PCA_P4:0, 缺省PCA 在P1 口1,PCA/PWM 从P1 口切换到P4 口: ECI 从P1.2 切换到P4.1 口,PCA0/PWM0 从P1.3 切换到P4.2 口PCA1/PWM1 从P1.4 切换到P4.3 口SPI_P4:0, 缺省SPI 在P1 口1,SPI 从P1 口切换到P4 口: SPICLK 从P1.7 切换到P4.3 口MISO 从P1.6 切换到P4.2 口MOSI 从P1.5 切换到P4.1 口SS 从P1.4 切换到P4.0 口S2_P4:0, 缺省UART2 在P1 口1,UART2 从P1 口切换到P4 口: TxD2 从P1.3 切换到P4.3 口RxD2 从P1.2 切换到P4.2 口GF2: 通用标志位ADRJ:0, 10 位A/D 转换结果的高8 位放在ADC_RES 寄存器, 低2 位放在ADC_RESL 寄存器1,10 位A/D 转换结果的最高2 位放在ADC_RES 寄存器的低2 位, 低8 位放在ADC_RESL 寄存器DPS: 0, 使用缺省数据指针DPTR01,使用另一个数据指针DPTR1*///-----------------------------------sfr WAKE_CLKO = 0x8F; //附加的SFR WAK1_CLKO/*7 6 5 4 3 2 1 0 Reset ValuePCAWAKEUP RXD_PIN_IE T1_PIN_IE T0_PIN_IE LVD_WAKE _ T1CLKO T0CLKO 0000,0000Bb7 - PCAWAKEUP : PCA 中断可唤醒powerdown。
STC单片机串口下载使用说明书
1、注意学习板、串口线、USB线和电脑的连接顺序:因为电脑串口不能带电拔插,所以要一定要按下面的顺序连接和断开。
连接时的顺序:
(1)先连接好串口线。
(2)再接上USB线(给学习板供电用)。
断开连接的顺序:
(1)先拔去USB线(先去掉学习板上的电源)
(2)再拔去串口连接线
2、硬件连接图:
3、学习板上跳线的设置:要通过串口将程序下载到STC89C51/52时,请将学习
板上单片机的串口引脚接通MAX232(电平转换IC),如下图所示:
注意:用学习板做串口实验时也要将跳线设置如上图所示,因为这样是把单片机的
串口通信脚接通MAX232再到“串口通信口”
4、下载程序使用STC公司提供的下载软件
打开下载软件:在“【精创科技】51初级学习板(红板)80\下载软件和编辑软件\STC公司下载软件\STC-ISP-V4.83”文件夹下双击“”文件即可进入下载软件的操作介面:
下载程序操作过程:(1)在下载介面的左上角“”中选择单片机型号为:STC89C51/52 (2)点击“打开程序文件”选择要下载的目标文件“*.HEX或*.Bin”(3)选择通信连接的
com口(),如果你不确定你电脑认定的是哪一个COM口,你可以在“我的电脑/属性/硬件/设备管理器”中查看“”(4)点击“DowdLoad/下载”后出现如下
图所
示后,请关闭学习板上的电源开
关
,然后再打电源开关,这时程序将自动完成下载,并自动复位后单片机就可以自动运行刚才下载的程序,注意:电源开关按下去为“开”,弹起来为“关”。
◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆学习板上各个配件的接法图:。
单片机双机串行实验报告实验目的:通过单片机实现双机串行通信功能,掌握串行通信的原理、方法和程序设计技巧。
实验原理:双机串行通信是指通过串行口将两台单片机连接起来,实现数据的传输和互动。
常用的串行通信方式有同步串行通信和异步串行通信。
异步串行通信是指通过发送和接收数据时的起始位、停止位和校验位进行数据的传输。
而同步串行通信是指通过外部时钟信号进行数据的同步传输。
实验器材:1.两台单片机开发板(MCU7516)2.两个串口线3.两台计算机实验步骤:1.将两台单片机开发板连接起来,通过串口线连接它们的串行口。
2.在两台计算机上分别打开串口调试助手软件,将波特率设置为相同的数值(例如9600)。
3.在编程软件中,编写两个程序分别用于发送数据和接收数据。
4.在发送数据的程序中,首先要设置串口的波特率、数据位、停止位和校验位,并将数据存储在缓冲区中。
然后利用串口发送数据的指令将数据发送出去。
5.在接收数据的程序中,同样要设置串口的参数。
然后使用串口接收数据的指令将接收到的数据存储在缓冲区中,并将其打印出来。
实验结果与分析:经过实验,我们成功地实现了单片机之间的双机串行通信。
发送数据的单片机将数据发送出去后,接收数据的单片机能够正确地接收到数据,并将其打印出来。
实验中需要注意的是,串口的波特率、数据位、停止位和校验位必须设置为相同的数值。
否则,发送数据的单片机和接收数据的单片机无法正常进行通信。
同时,在实验之前,需要了解单片机开发板支持的串口通信相关的指令和函数。
实验总结:通过本次实验,我们深入了解了单片机之间的双机串行通信原理和方法。
掌握了串口的设置和使用方法,以及相关的指令和函数。
在实验中,我们学会了如何通过串行口实现数据的传输和互动,为今后的单片机应用和开发打下了基础。
同时,我们还发现,双机串行通信在实际应用中有着广泛的用途。
例如,可以通过串行通信实现两台计算机之间的数据传输,或者实现单片机与计算机之间的数据收发。
STC单片机双串口使用设置与例程
在用STC_60s2单片机进行双串口同时收发时,要注意一些容易配置错误的地方。
AUXR寄存器有很多功能。
在对
其中的位置位和复位时,很可能在不同的地方多次进行,应该使用AUXR |= bitx 和AUXR &=~bitx 语句进行对某一位的置位和复位。
这样就不会影响其他功能位了。
附上程序:
#include ;
//sfr AUXR = 0x8E;
#define uchar unsigned char//
#define uint unsigned int //
#define BUADRATE 38400
#define FOSC 24000000
#define S2RI 0x01
#define S2TI 0x02
sbit LED1 = P2^7;
uchar ReceBuf[200]={0};
bit finishflag = 0;
uchar revcnt = 0;
uchar startflag = 0;
void InitUART1(void) //baudrate 115200
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xf3; //115384
TL1 = TH1;
PCON = 0x80; //SMOD = 1;
ES = 1;
TR1 = 1;
}
void InitUART2() //baudrate 38400
{
S2CON = 0x50; //8-Bit 串口模式允许接收
BRT = 236; //[24000000/(256-236)]/32 = 37500 error2.34%
AUXR |= 0x14; //BRTR=1使能BRT BRTx12=1 不分频(AUXR 第二次出现,不能用‘=’应该用“|=”)
IE2 = 0x01; //enable UART2 interrupt
AUXR1 = 0; //UART2 TXD->;P1.3 RXD->;P1.2
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void U1SendString(uchar *dat)
{
while(*(dat)!='\0')
{
SendOneByte(*dat);
dat ;
}
}
void U2SendOneByte(unsigned char c) {
S2BUF = c;
while(!(S2CON & S2TI));
S2CON &= ~S2TI;
}
void U2SendString(uchar *dat)
{
while(*(dat)!='\0')
{
U2SendOneByte(*dat);
dat ;
}
}
void main()
{ uchar temp = 0x01;
AUXR = AUXR|0x40; // T1, 1T Mode AUXR 第一次出现InitUART1();
EA = 1;
SendOneByte(0xaa);
SendOneByte(0xbb);
SendOneByte(0xcc);
InitUART2();
SendOneByte(0xdd);
while(1)
{// temp = ~temp;
// U2SendOneByte(temp);
if(finishflag)
{ LED1 = 1;
finishflag = 0;
U1SendString(ReceBuf);
LED1 = 0;
}
}
void UART1ISR(void) interrupt 4 {
if(RI)
{
RI = 0;
//add your code here!
}
else
TI = 0;
}
void UART2ISR(void) interrupt 8 { static bit flash=0;
static uchar i=0;
static uchar endcnt = 0;
uchar tempdat = 0;
if(S2CON & S2RI)
{
S2CON &= ~S2RI;
if(~finishflag)
flash=~flash;
// LED1 = flash;
tempdat = S2BUF;
if(tempdat=='$')
{
startflag = 1;
}
///////////////////////////////////////////////// ///////////
if(startflag)
{
ReceBuf[i] = tempdat;
i ;
///////////////////////////////////////////////// ///////////
if(i==6&&ReceBuf[3]!='R'&&ReceBuf[5]!='C') //判断是不是$GPRMC帧
{
startflag = 0;
i = 0;
}
else if(ReceBuf[i-1]=='*') {
endcnt ;
if(endcnt==2)
{
revcnt = i;
endcnt = 0;
i = 0;
finishflag = 1;
startflag = 0;
}
}
else ;
}
}
else ;
}
else
S2CON &= ~S2TI;
}。