STC系列单片机串口通信的总结

合集下载

STC单片机串口通信与应用

STC单片机串口通信与应用

STC单片机串口通信一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。

由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。

串口通信的工作原理请同学们参看教科书。

以下对串口通信中一些需要同学们注意的地方作一点说明:1、波特率选择波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。

MSC-51串行端口在四种工作模式下有不同的波特率计算方法。

其中,模式0和模式2波特率计算很简单,请同学们参看教科书;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。

在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。

在此模式下波特率计算公式为:波特率=(1+SMOD)*晶振频率/(384*(256-TH1))其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;TH1——定时器的重载值。

在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。

这要根据系统的运作特点,确定通信的频率范围。

然后考虑通信时钟误差。

使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。

为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。

下面举例说明波特率选择过程:假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。

则TH1=256-62500/波特率根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。

列计数器重载值,通信误差如下表:因此,在通信中,最好选用波特率为1200,2400,4800中的一个。

2、通信协议的使用通信协议是通信设备在通信前的约定。

单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。

STC12C5A60S2单片机双串口通信

STC12C5A60S2单片机双串口通信
0000,0000
//-----------------------------------
sbit CY = PSW;
sbit AC = PSW;
sbit F0 = PSW ;
sbit RS1 = PSW;
sbit RS0 = PSW;
sbit OV = PSW ;
sbit P = PSW;
//-----------------------------------
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;//开总中断
STC12C5A60S2单片机双串口通信
STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双
工串行通信接口,串口1的功能及操作与传统51单片机串行口相同;特殊的
是STC12C5A60S2单片机内部有一个独立波特率发生器,串口1可以使用定
时器1作为波特率发生器,也可以使用独立波特率发生器作为波特率发生
{
if(S2CON&S2RI)
{
S2CON&=~S2RI;
flag2=1;
temp2=S2BUF;
}
}
12C5A60S2.h的头文件如下:
//--------------------------------------------------------------------------------

单片机串口总结

单片机串口总结

单片机串口总结第一篇:单片机串口总结51单片机串口总结有句话说“尽信书不如无书”,要学好单片机就要不断的、大胆的实验,要多怀疑,即使我们的怀疑最终被证明是错误的那么这也是进步(人们认识事物很多情况下来源于怀疑),当怀疑出现时就要去实践。

有很多东西如果不通过实践是不可能掌握其中隐藏的奥秘,就拿51单片机串口通讯这一块,我认为掌握很好了,可以很轻松的实现数据的接收、发送,但这段时间当我重新学习串口时,我才发现里面还有很多小细节从没注意,更别说研究了。

对于接收发送程序永远是按照别人的模式来编写程序,并没有真真正正的挖掘深层次的内容。

我身边太多的人在临摹别人的程序,当然我不反对,但是希望自己多问几个问什么,单纯的会编程是学不好单片机的,毕竟单片机有自己独特的硬件结构。

开讲之前先简要说一下同步、异步通信:同步通信:发送方时钟对接收方时钟控制,使双方达到完全同步。

异步通信:发送与接受设备使用各自的时钟控制数据的发送和接受过程(虽然时钟不同,但一般相差不大)。

51单片机串行口结构从上图中我们看到,51单片机有两个物理上独立的接收、发送缓冲器SBUF,它们共用同一个地址99H,但是请注意:接收缓冲器只能读而不能写,发送缓冲器只写不读。

单片机可以同时实现数据的发送与接收功能。

特别注意:接收器是双缓冲结构:当前一个字节从接收缓冲区取走之前,就已经开始接收第二个字节(串行输入至移位寄存器),此时如果在第二个字节接收完毕而前一个字节还未被读走,那么就会丢失前一个字节。

51单片机串口控制寄存器关于51单片机的控制寄存器各个位表示的含义在这里我只谈SM2。

SM2为多机控制位,主要用于工作方式2和3,当接收机的SM2=1时,可以利用接收到的RB8来控制是否激活RI(RB8=0不激活RI,收到的数据丢失;RB8=1时收到的数据进入SBUF,并激活RI ,进而在中断服务程序中将数据从SBUF中读走)。

当SM2=0时,不论收到的RB8为何值都将使接收到的数据进入SBUF,并激活RI,通过控制SM2实现多机通信。

单片机串口通信设计与总结报告

单片机串口通信设计与总结报告

通信系统综合设计报告单片机串口通信设计与总结报告无线收发电路设计与总结报告红外收发器设计与总结报告学院计算机与电子信息学院专业通信工程班级小组成员单片机串口通信设计与总结报告一、 串口通信及原理简介51 单片机内部有一个全双工串行接口。

什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。

串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。

其缺点是传输速度较低。

串行通信分为两种,串口同步通信和串口同步通信。

本实验采用串口异步通信,其中比较重要的两个指标是:字符帧格式和波特率。

其在串行通信方式中,数据是安位逐一传输的。

数据从低位开始发送到高位,数据帧格式图如下图:对于发送方来说,发送时先输出低电平的起始位,然后按特定速率发送数据位(包括奇偶校验位),当最后一位数据发送完毕后,发送一个高电平的停止位,这样就发送完了一帧的数据。

如果不在需要发送新数据活数据尚未准备就绪时,就将数据传输线钳位于高电平状态。

对于接收方来说,接收方不断的检测传输线的电平状态,当发现传输线由高电平变为低电平时(起始位标志),即认为有数据传入,进入接收准备状态,然后以相同速率检测传输线的电平状态,接收随后送来的数据位,奇偶校验位和停止位。

二、单片机串口相关的寄存器及波特率计算:1、SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。

从而控制外部两条独立的收发信号线RXD (P3.0)、TXD (P3.1),同时发送、接收数据,起始位数据位奇偶校验位停止位空闲位起始位数据位实现全双工。

2、串行口控制寄存器SCON(见表1):表中各位(从左至右为从高位到低位)含义如下:SM0 和SM1 :串行口工作方式控制位SM2 :多机通信控制位。

单片机串行通信实验结果描述

单片机串行通信实验结果描述

单片机串行通信实验结果描述一、引言单片机串行通信是嵌入式系统中常用的一种通信方式,通过串行通信可以实现单片机与其他外部设备的数据交换。

本文将详细描述单片机串行通信实验的结果。

二、实验目的本次实验的目的是通过单片机串行通信,实现与计算机之间的数据传输。

具体要求如下: 1. 使用串口通信模块与计算机进行数据交互; 2. 在计算机端编写相应的程序,实现数据的发送和接收; 3. 确保数据的准确传输和接收。

三、实验器材1.单片机开发板;2.串口通信模块;3.计算机。

四、实验步骤1. 连接硬件将单片机开发板与计算机通过串口通信模块连接,确保连接稳定。

2. 编写单片机程序在单片机开发板上编写程序,实现与计算机的串行通信。

具体步骤如下: 1. 初始化串口通信模块的相关参数,包括波特率、数据位、停止位等; 2. 设置串口通信模块为发送模式; 3. 通过串口发送数据。

3. 编写计算机程序在计算机上编写程序,实现与单片机的串行通信。

具体步骤如下: 1. 打开串口通信端口,并设置相关参数,与单片机的配置保持一致; 2. 接收串口发送的数据,并进行处理; 3. 将处理后的数据显示在计算机的界面上。

4. 运行实验将单片机程序烧录到开发板上,运行计算机程序。

观察数据的传输和接收情况,并记录实验结果。

五、实验结果与分析经过实验,我们得到了如下结果: 1. 数据传输稳定:通过串行通信,单片机与计算机之间的数据传输稳定可靠,没有出现丢失数据或传输错误的情况。

2. 传输速率较快:串行通信的传输速率较快,可以满足实际应用的需求。

3. 数据处理准确:计算机程序正确接收并处理了从单片机发送的数据,实现了数据的正确显示。

六、实验总结通过本次实验,我们掌握了单片机串行通信的基本原理和操作方法,实现了与计算机之间的数据传输。

实验结果表明,单片机串行通信是一种稳定可靠的通信方式,能够满足实际应用的需求。

在今后的实际工作中,我们可以利用串行通信实现更多功能,提高系统的性能和可靠性。

关于单片机stc15芯片学习的串口通信测试问题

关于单片机stc15芯片学习的串口通信测试问题

关于单片机stc15芯片学习的串口通信测试问题 今天闲来无事,再次操起很久之前的一块板子,板载stc15芯片,要做个串口通信。

看完数据手册直接写程序,写完烧写进去后测试串口不通。

 百思不得其姐啊,小编写了不下十次的串口程序,今天怎幺就不通了呢?  好吧,老老实实的再看一遍数据手册(话说小编写程序都是看着数据手册写的),看完后更是郁闷了,哪哪都没问题啊,但是就是不通。

 好吧,再回来从头仔细看程序,从申明到函数定义,从初始化到中断函数,都没问题,最后看主函数吧。

 因为小编用P3.3口驱动一个三极管,所以偷懒写了: P3M1=0x00; P3M0=0xff; 整个程序就只是比平时的多了这两句。

是它的原因引起了串口通信不正常的吗?抱着试试的态度,把以上程序改为: P3M1=0x00; P3M0=0x00; 在测试,完美解决问题,串口通信正常,收发都正常↓↓。

 所以问题就出在这里。

 这样下结论是不是太早了,小编还算严谨,接着往下测试, 就之前的问题,我既然是设置为输出模式,那按道理是要能发送数据才对吧,好吧,小编改代码,下载测试↓↓ 果不其然,还真的能发送数据。

 到此,测试结束,可以大胆的说了,小编今天遇到的问题就是因为错误的设置了IO口的工作模式引起的。

 科普: STC单片机从12系列后就支持IO的工作模式的设置了,有兼容传统51的双向IO,强上拉推挽输出,输入,开漏四种模式,我们在使用是请一定按实际使用要求设置,具体设置方式请看下图↓↓ 最最后,今天的问题,相信很多小伙伴都遇到过,在此就算给自己或者大家提个醒,你也遇到过同样的问题请点赞,如果你还没遇到望后续学习中不要在出现这样的问题,你在单片机学习的道路上遇到过哪些头疼的问题,文后留言和大家交流,小编前来学习。

stc c51 串口通信协议常用校验计算以及一些常用方法

stc c51 串口通信协议常用校验计算以及一些常用方法

stc c51 串口通信协议常用校验计算以及一些常用方法一、引言随着现代通信技术的快速发展,串口通信在各领域得到了广泛应用。

STC C51 作为一种高性能、低功耗的单片机,其串口通信协议在实际工程中具有很高的实用价值。

本文将详细介绍STC C51 串口通信协议的常用校验计算方法及其实现,以期为相关领域的研究和应用提供参考。

二、STC C51 串口通信协议简介1.串口通信的基本原理串口通信是通过传输线将数据位按照位顺序依次传输的一种通信方式。

在数据传输过程中,通常采用异步串行通信和同步串行通信两种方式。

2.STC C51 串口通信的特点STC C51 单片机内部集成了异步串行通信模块,具有以下特点:(1)高速率:最高可达1Mbps;(2)低功耗:待机模式下电流小于1uA;(3)丰富的波特率选择:支持0-115200bps等多种波特率;(4)灵活的通信模式:支持多机通信、广播通信等;(5)内置硬件滤波器:可滤除噪声干扰,提高通信可靠性。

三、常用校验计算方法1.奇偶校验奇偶校验是一种简单而有效的校验方法。

在数据传输过程中,根据数据位中1的个数是否为奇数来判断数据是否正确。

若数据位中1的个数为奇数,则为奇校验;若为偶数,则为偶校验。

2.循环冗余校验(CRC)循环冗余校验是一种基于二进制多项式的校验方法。

发送方和接收方使用相同的生成多项式,对数据位进行异或操作,得到校验位。

接收方在接收到数据后,同样对数据位进行异或操作,若结果与接收到的校验位相同,则数据正确;否则,数据错误。

3.异或校验异或校验是一种基于异或运算的校验方法。

在数据传输过程中,发送方和接收方约定一个校验位,并对数据位进行异或操作。

接收方在接收到数据后,对数据位进行异或操作,若结果与接收到的校验位相同,则数据正确;否则,数据错误。

四、STC C51 串口通信协议的实现1.硬件配置为实现STC C51 串口通信,需要配置以下硬件:(1)串口通信模块:UART0、UART1 或UART2;(2)波特率发生器:用于产生不同的波特率;(3)电平转换器:用于匹配发送和接收端的电平;(4)滤波器:用于滤除噪声干扰。

单片机串行通信实验结果描述

单片机串行通信实验结果描述

单片机串行通信实验结果描述一、实验介绍本实验是单片机串行通信实验,主要目的是通过串口通信,实现单片机与计算机之间的数据传输。

本实验所使用的单片机为STC89C52,串口通信方式为UART。

二、实验设备和材料1. STC89C52单片机开发板2. 电脑一台3. USB转TTL模块4. 杜邦线若干三、实验原理1. UART串口通信原理:UART是一种异步串行通信方式,其数据传输格式包括起始位、数据位、校验位和停止位。

在发送数据时,先发送起始位,然后发送数据位和校验位,并在最后发送停止位。

接收方接收到起始位后开始接收数据,并在接收完数据和校验位后等待停止位。

2. STC89C52串口通信原理:STC89C52具有两个UART串口,分别为UART0和UART1。

其中UART0可以通过P3.0(RXD)和P3.1(TXD)引脚进行连接;UART1可以通过P3.2(RXD1)和P3.3(TXD1)进行连接。

四、实验步骤1. 将USB转TTL模块连接到计算机上,并将杜邦线连接到模块上的TXD、RXD引脚。

2. 将另一端的杜邦线连接到STC89C52单片机开发板上的P3.0(RXD)和P3.1(TXD)引脚。

3. 打开串口调试助手,设置波特率为9600,数据位为8位,校验位为无,停止位为1位。

4. 编写单片机程序,实现串口通信功能。

具体代码如下:#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit LED = P1^0;void InitUART(){TMOD |= 0x20;SCON = 0x50;TH1 = 0xFD;TL1 = 0xFD;TR1 = 1;}void SendByte(uchar dat) {SBUF = dat;while(TI == 0);TI = 0;}uchar ReceiveByte() {while(RI == 0);RI = 0;return SBUF;}void main(){InitUART();while(1){uchar ch = ReceiveByte();SendByte(ch);if(ch == 'A')LED = ~LED;}}5. 烧录程序到单片机中,并将开发板连接到电脑上。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
串口通信:
软件调试,在调试过程中需要使用虚拟串口助手。在编程中注意设计时钟和波特率。注意程序的串口设置和串口调试助手中串口设置相同。
单串口:
mode com2 9600,0,8,1
assign com2 <sin> sout
stime = 0
多串口:
mode com2 9600,0,8,1
assign com2 <s0in> s0out
{
uchar Data;
Data = ucRecData;
ucRecData = 0;
return Data;
}
Unsigned char RString(unsigned char *s, unsigned int len)
{
Unsigned int i;
For(i =0;i<len ;i++)
{
{
Unsigned int i;
For(i =0;i<len ;i++)
{
SendData(*s++);
}
}
一个比较好的接收处理框架(利用通信协议):
void UART1_ISR(void) interrupt 4 using 1
{
unsigned char sbuffer;
if(RI)
{
RI = 0;
Rec_Len = 0;
uarttext[0] = sbuffer; //这里保留了包头
}
else if(Rec_Flag) //开始接收
{
if(Rec_Len < (REC_MAX - 1))
{
Rec_Len++;
uarttext[Rec_Len] = sbuffer; //当数据送缓冲区
}
else if(Rec_Len == (REC_MAX - 1)) //接收完成
*s++ = ReadUart();
}
}
void UartIRQ(void) interrupt 4
{
if(RI)
{
RI = 0;
ucRecData = SBUF;
}
if(TI)
{
TI = 0;
ucSendedCount++;
if(ucSendedCount >= ucSendLength)
{
UartBuzy = 0;
sbuffer = SBUF;
if(nflag == 0)
{
REC_MAX= REC_MAX_NAME ;
}
else
REC_MAX= REC_MAX_DATA;
if((sbuffer == CHECK_HEAD) && (Rec_Flag == 0))//如果收到文件头而且当前未接收
{
Rec_Flag = 1;
void SendData(BYTE dat)
{
EAห้องสมุดไป่ตู้= 0;
S2BUF = dat;//SBUF=dat
while (!(S2CON & S2TI)); //等待前面的数据发送完成while(TI);
S2CON &= ~S2TI; //TI = 0;
EA = 1;
}
Unsigned char SendString(unsigned char *s, unsigned int len)
{
while(*s)//检测字符串结束标志
{
SendData(*s++);//发送当前字符
}
}
SendString()字符串函数,当遇到发送的字符串里面有0x00就会终止,实用性不强。SendData()函数中三条语句的顺序容易引起死机。
比较好的处理串口接收一个字节数据的方法,不采用中断处理标志位。通过关中断,然后处理串口接收标志,从而减少在处理过程中因为触发中断而造成的死循环。修改好的串口接收一个字节的代码(这是采用的串口2接收一个字节数据的处理函数,其控制寄存器不支持位操作)如下:
}
if (TI)//发送数据
{
TI = 0;//清除TI位
busy = 0;//清忙标志
}
}
void SendData(unsigned char dat)
{
while (busy);//等待前面的数据发送完成
busy = 1;
SBUF = dat;//写数据到UART数据寄存器
}
void SendString(char *s)
0表示单片机的串口0
编程:
STC12介绍的方法:
接收一个字节的函数和发送字符串的函数,发送字符串需要知道字符串的长度。对于接收字符串的函数,可以仿照通过调用接收一个字节的函数,写出接收字符串函数。
void WriteUart(uchar *pucData ,uchar ucLength)
{
if(ucLength == 0)
return;
}
else
{
SBUF = *(pucSendData + ucSendedCount);
}
}
}
STC15:
STC15只给出了发送函数,且发送函数有瑕疵,具体见最后分析。
void UART1_ISR(void) interrupt 4 using 1
{
if (RI)//接收数据
{
RI = 0;//清除RI位
{
return;
}
if(UartBuzy == 1)
return;
ucSendLength =ucLength;
pucSendData = pucData;
SBUF = *pucSendData;
UartBuzy = 1;
ucSendedCount = 0;
}
uchar ReadUart(void)
{
/*if(uarttext[Rec_Len] == CHECK_TAIL) //表明接收成功未出错
{
//
}
else//有误码
{
}
Rec_Flag = 0;//接收完成,标志清0
}
}
}
else if(TI)
{
TI = 0;
busy=0;
}
}
相关文档
最新文档