STC系列单片机串口通信的总结
STC单片机串口通信与应用
![STC单片机串口通信与应用](https://img.taocdn.com/s3/m/044e16d233d4b14e852468c2.png)
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单片机双串口通信](https://img.taocdn.com/s3/m/cb55f7a1daef5ef7ba0d3cdd.png)
//-----------------------------------
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的头文件如下:
//--------------------------------------------------------------------------------
单片机串口总结
![单片机串口总结](https://img.taocdn.com/s3/m/458b7da3b8d528ea81c758f5f61fb7360b4c2bb9.png)
单片机串口总结第一篇:单片机串口总结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实现多机通信。
单片机串口通信设计与总结报告
![单片机串口通信设计与总结报告](https://img.taocdn.com/s3/m/142722f5910ef12d2af9e7b4.png)
通信系统综合设计报告单片机串口通信设计与总结报告无线收发电路设计与总结报告红外收发器设计与总结报告学院计算机与电子信息学院专业通信工程班级小组成员单片机串口通信设计与总结报告一、 串口通信及原理简介51 单片机内部有一个全双工串行接口。
什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。
串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。
其缺点是传输速度较低。
串行通信分为两种,串口同步通信和串口同步通信。
本实验采用串口异步通信,其中比较重要的两个指标是:字符帧格式和波特率。
其在串行通信方式中,数据是安位逐一传输的。
数据从低位开始发送到高位,数据帧格式图如下图:对于发送方来说,发送时先输出低电平的起始位,然后按特定速率发送数据位(包括奇偶校验位),当最后一位数据发送完毕后,发送一个高电平的停止位,这样就发送完了一帧的数据。
如果不在需要发送新数据活数据尚未准备就绪时,就将数据传输线钳位于高电平状态。
对于接收方来说,接收方不断的检测传输线的电平状态,当发现传输线由高电平变为低电平时(起始位标志),即认为有数据传入,进入接收准备状态,然后以相同速率检测传输线的电平状态,接收随后送来的数据位,奇偶校验位和停止位。
二、单片机串口相关的寄存器及波特率计算:1、SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。
从而控制外部两条独立的收发信号线RXD (P3.0)、TXD (P3.1),同时发送、接收数据,起始位数据位奇偶校验位停止位空闲位起始位数据位实现全双工。
2、串行口控制寄存器SCON(见表1):表中各位(从左至右为从高位到低位)含义如下:SM0 和SM1 :串行口工作方式控制位SM2 :多机通信控制位。
单片机串行通信实验结果描述
![单片机串行通信实验结果描述](https://img.taocdn.com/s3/m/fc566b90dc3383c4bb4cf7ec4afe04a1b071b022.png)
单片机串行通信实验结果描述一、引言单片机串行通信是嵌入式系统中常用的一种通信方式,通过串行通信可以实现单片机与其他外部设备的数据交换。
本文将详细描述单片机串行通信实验的结果。
二、实验目的本次实验的目的是通过单片机串行通信,实现与计算机之间的数据传输。
具体要求如下: 1. 使用串口通信模块与计算机进行数据交互; 2. 在计算机端编写相应的程序,实现数据的发送和接收; 3. 确保数据的准确传输和接收。
三、实验器材1.单片机开发板;2.串口通信模块;3.计算机。
四、实验步骤1. 连接硬件将单片机开发板与计算机通过串口通信模块连接,确保连接稳定。
2. 编写单片机程序在单片机开发板上编写程序,实现与计算机的串行通信。
具体步骤如下: 1. 初始化串口通信模块的相关参数,包括波特率、数据位、停止位等; 2. 设置串口通信模块为发送模式; 3. 通过串口发送数据。
3. 编写计算机程序在计算机上编写程序,实现与单片机的串行通信。
具体步骤如下: 1. 打开串口通信端口,并设置相关参数,与单片机的配置保持一致; 2. 接收串口发送的数据,并进行处理; 3. 将处理后的数据显示在计算机的界面上。
4. 运行实验将单片机程序烧录到开发板上,运行计算机程序。
观察数据的传输和接收情况,并记录实验结果。
五、实验结果与分析经过实验,我们得到了如下结果: 1. 数据传输稳定:通过串行通信,单片机与计算机之间的数据传输稳定可靠,没有出现丢失数据或传输错误的情况。
2. 传输速率较快:串行通信的传输速率较快,可以满足实际应用的需求。
3. 数据处理准确:计算机程序正确接收并处理了从单片机发送的数据,实现了数据的正确显示。
六、实验总结通过本次实验,我们掌握了单片机串行通信的基本原理和操作方法,实现了与计算机之间的数据传输。
实验结果表明,单片机串行通信是一种稳定可靠的通信方式,能够满足实际应用的需求。
在今后的实际工作中,我们可以利用串行通信实现更多功能,提高系统的性能和可靠性。
关于单片机stc15芯片学习的串口通信测试问题
![关于单片机stc15芯片学习的串口通信测试问题](https://img.taocdn.com/s3/m/24b74efbd5bbfd0a795673af.png)
关于单片机stc15芯片学习的串口通信测试问题 今天闲来无事,再次操起很久之前的一块板子,板载stc15芯片,要做个串口通信。
看完数据手册直接写程序,写完烧写进去后测试串口不通。
百思不得其姐啊,小编写了不下十次的串口程序,今天怎幺就不通了呢? 好吧,老老实实的再看一遍数据手册(话说小编写程序都是看着数据手册写的),看完后更是郁闷了,哪哪都没问题啊,但是就是不通。
好吧,再回来从头仔细看程序,从申明到函数定义,从初始化到中断函数,都没问题,最后看主函数吧。
因为小编用P3.3口驱动一个三极管,所以偷懒写了: P3M1=0x00; P3M0=0xff; 整个程序就只是比平时的多了这两句。
是它的原因引起了串口通信不正常的吗?抱着试试的态度,把以上程序改为: P3M1=0x00; P3M0=0x00; 在测试,完美解决问题,串口通信正常,收发都正常↓↓。
所以问题就出在这里。
这样下结论是不是太早了,小编还算严谨,接着往下测试, 就之前的问题,我既然是设置为输出模式,那按道理是要能发送数据才对吧,好吧,小编改代码,下载测试↓↓ 果不其然,还真的能发送数据。
到此,测试结束,可以大胆的说了,小编今天遇到的问题就是因为错误的设置了IO口的工作模式引起的。
科普: STC单片机从12系列后就支持IO的工作模式的设置了,有兼容传统51的双向IO,强上拉推挽输出,输入,开漏四种模式,我们在使用是请一定按实际使用要求设置,具体设置方式请看下图↓↓ 最最后,今天的问题,相信很多小伙伴都遇到过,在此就算给自己或者大家提个醒,你也遇到过同样的问题请点赞,如果你还没遇到望后续学习中不要在出现这样的问题,你在单片机学习的道路上遇到过哪些头疼的问题,文后留言和大家交流,小编前来学习。
stc c51 串口通信协议常用校验计算以及一些常用方法
![stc c51 串口通信协议常用校验计算以及一些常用方法](https://img.taocdn.com/s3/m/7bbb3721571252d380eb6294dd88d0d233d43ccf.png)
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)滤波器:用于滤除噪声干扰。
单片机串行通信实验结果描述
![单片机串行通信实验结果描述](https://img.taocdn.com/s3/m/890487d90875f46527d3240c844769eae009a396.png)
单片机串行通信实验结果描述一、实验介绍本实验是单片机串行通信实验,主要目的是通过串口通信,实现单片机与计算机之间的数据传输。
本实验所使用的单片机为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. 烧录程序到单片机中,并将开发板连接到电脑上。
STC单片机串口在线烧录芯片问题总结
![STC单片机串口在线烧录芯片问题总结](https://img.taocdn.com/s3/m/9f69b10fcc175527072208a5.png)
STC单片机串口在线烧录芯片问题总结在一个偶然和朋友聊天中了解了STC单片机芯片,从此一发不可收拾。
当时我看中STC芯片的一个主要原因是因为它有AD转换功能和在线烧录功能。
用到现在算起来也大致有三、四年的时间了,在此期间用了不少STC不同型号的芯片。
总的来讲这个芯片还是比较好使的,但在烧录过程中也碰到不少麻烦,现在把它罗列如下,以便和同行们一起交流、探讨和学习。
第一种情况是通过USB转串口烧录。
曾经成功过一段时间,但后来不知道为什么再也烧录不进去了,直到现在也不明白其中的道理。
查了一些资料说是USB转串口的芯片问题,需要专用芯片的USB转串口。
我也信了,但从此给我的印象是-------STC单片机烧录程序时是要挑芯片的。
第二种情况是串口烧录时有些232芯片不好用,一打听才知道是232芯片不好,不能用国产的要用进口的,我又专门去买了一批7元多一片的进口232芯片,结果-------没有成功过。
不得已只好换回用国产的,哎!好了,谢天谢地!阿弥多佛!看来STC芯片串口在线烧录不但挑USB转串口的芯片,还挑232芯片。
第三种情况是同一批板子、同一批232芯片有些板子能在线烧录程序,而有些板子却不能烧录程序,实在没办法。
还好本次产品是采用PLCC封装的,只好把不能烧录的芯片拔到可以烧录的板子上去烧录好再拔插回去,说到这里有人可能会怀疑不能烧录的板子232芯片或外围电路有问题,我当时的直觉也是这样的,但是我板子232口只要烧录好程序,工作时通讯一切正常,这又作何解释?不可思议!第四种情况(也是我偶然发现的)5v的STC15F104E芯片,有时候能烧录,有时候不能烧录,不能烧录的概率在90%以上,真是莫名其妙。
摸索了将近一天时间才发现串口接上后(板子在没有上电的时候)STC芯片电源脚有约3v电压,我想想可能是从串口反串回来的,有这3v电压的存在,芯片就如同没有掉电,所以也就烧录不进去。
我就用镊子把电源到地短接一下,目的是进行放电。
基于STCSTC15F2K60S2单片机的串口通讯综述
![基于STCSTC15F2K60S2单片机的串口通讯综述](https://img.taocdn.com/s3/m/ed5fe63510a6f524ccbf85e6.png)
湖南科技大学信息与电气工程学院《单片机课程设计报告》题目:基于STCSTC15F2K60S2单片机的串口通讯专业:自动化班级:一班姓名:罗永恒学号: 1209010303指导教师:范小春2015年 6月 30日单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
本文将具体介绍单片机与PC机进行串口通信的实现方法和编程方法,并且在最后给出一个实用的单片机与计算机通过串口通信的程序。
关键词:单片机串口通信第一章 STCSTC15F2K60S2的简介 (1)1.1 STCSTC15F2K60S2的内部结构框图 (1)1.2 STC15F2K60S的DIP封装图 (1)1.3 STC15F2K60S的各引脚简介 (2)第二章单片机通过USB与PC机的通信设计 (4)2.1设计方案选择 (4)2.1.1 PC机同单片机通信存在的问题 (4)2.1.2 USB接口同RS-232(DB-9)串口的比较 (4)2.1.3 USB转接芯片的选择 (4)2.2 通信功能要求 (5)第三章硬件电路图的设计 (5)3.1单片机最小系统 (5)3.2 USB与单片机连接主电路 (6)3.3 总电路图 (6)3.4 PCB图 (6)第四章程序设计 (7)4.1 串口初始化 (7)4.2 主程序 (7)4.3 中断服务程序 (8)4.4 总程序 (8)第五章总结与体会 (10)第六章参考文献 (11)第一章 STCSTC15F2K60S2的简介1.1 STCSTC15F2K60S2的内部结构框图1.2 STC15F2K60S的DIP封装图1.3 STC15F2K60S 的各引脚简介(1)电源引脚Vcc :一般接电源的+5V 。
STC15串口总结
![STC15串口总结](https://img.taocdn.com/s3/m/96136010650e52ea55189867.png)
//9600bps(22.1184MHz)
ห้องสมุดไป่ตู้
{
T2L = 0xD0; //设定定时初值
T2H = 0xFF; //设定定时初值
}
if(speedform==1) {
T2L = 0xE8; T2H = 0xFF; } }
//19200bps(22.1184MHz)
//设定定时初值 //设定定时初值
3、串口配置好,波特率设定好之后,打开串口。
STC15 串口总结
一、实验硬件
1、测试芯片 STC15F2K60S。
2、单片机通过 MAX232 电平转换跟计算机通信,波特率为
9600bps。
3、定时器 2 做波特率发生器。
二、程序
1、先配置串口,包括用那组串口,数据帧,波特率是否加倍
//串口配置
void uartconfiguration(void)
{
sendbyteuart(pbufferform[i]);
}
}
//串口中断服务函数
void UART1_int (void) interrupt UART1_VECTOR
{
ES=0;
//关串口中断
If(RI)
{
RI=0;
//………………………….接收中断服务函数部分…………………………… } If(TI) {
数的进行。在完成中断服务函数的时候,要将中断标志位清零,
否则,容易出现进入中断的混乱。
四、单片机串口给计算机发一组数据
1、单片机每次只能给计算机发一字节数据,若要发一组数据,
那要一字节一字节地发,并且发送的过程中,要等前一字节发送
完成,才能接着发送下一字节的数据,否则会出现数据不正确。 五、单片机串口接收计算机发送一组数据
单片机串行口实验报告实验总结
![单片机串行口实验报告实验总结](https://img.taocdn.com/s3/m/1d314069814d2b160b4e767f5acfa1c7aa008201.png)
单片机串行口实验报告实验总结一、实验目的本实验旨在让学生了解单片机串行口的基本原理和应用,掌握单片机串行口的编程方法,培养学生动手实践和解决问题的能力。
二、实验器材1. STC89C52单片机开发板2. 电脑串口线3. 电脑终端仿真软件Tera Term三、实验原理串行口是单片机与外部设备进行通信的重要接口之一。
串行口通信是指将数据一个位一个地传输,每个数据位之间有一个时钟脉冲来同步传输。
常见的串行通信协议有RS232、RS485、SPI等。
本实验主要涉及到RS232协议。
四、实验内容1. 实现单片机向电脑发送数据并显示。
2. 实现电脑向单片机发送数据并控制LED灯闪烁。
五、实验步骤1. 连接STC89C52单片机开发板和电脑,使用Tera Term打开串口终端。
2. 编写程序,设置单片机的串行口通信参数(波特率、数据位数、停止位数等),并利用SendData函数向电脑发送数据。
3. 在Tera Term中设置相应的串口参数,并打开“local echo”选项,以便观察单片机发送的数据。
4. 编写程序,接收电脑发送的数据,并根据接收到的数据控制LED灯闪烁。
5. 在Tera Term中输入相应的命令,向单片机发送数据,观察LED灯的闪烁情况。
六、实验结果1. 实现了单片机向电脑发送数据并显示。
2. 实现了电脑向单片机发送数据并控制LED灯闪烁。
七、实验总结本实验使我对串行口通信有了更深入的理解,掌握了单片机串行口编程方法。
同时也锻炼了我的动手能力和解决问题的能力。
在实验过程中还需要注意串口参数设置和通信协议选择等问题,加深了我对这些知识点的理解。
stc单片机串口使用
![stc单片机串口使用](https://img.taocdn.com/s3/m/ecb7ad2b0640be1e650e52ea551810a6f524c8b1.png)
stc单片机串口使用串口一、中断图二、相关寄存器1、SCON 串行控制寄存器(可位寻址)0x98 B7 B6 B5 B4 B3 B2 B1 B0 SM0/FESM1 SM2 REN TB8 RB8 TI RISM0/FE :当PCON 寄存器中的SMOD0/PCON.6位为1时,该位用于帧错误检测。
当检测到一个无效停止位时,通过UART 接收器设置该位。
它必须由软件清零。
当PCON 寄存器中的SMOD0/PCON.6位为0时,该位和SM1一起指定串行通信的工作方式,如下表所示。
其中SM0、SM1按下列组合确定串行口1的工作方式:SM0 SM1 工作方式功能说明波特率0 0 方式0 同步移位串行方式:移位寄存器当UART_M0x6 = 0时,波特率是SYSclk/12, 当UART_M0x6 = 1时,波特率是SYSclk / 2 0 1 方式1 8位UART ,波特率可变( 2SMOD /32 )×(定时器1的溢出率或BRT 独立波特率发生器的溢出率)1 0 方式2 9位UART( 2SMOD / 64) x SYSclk 系统工作时钟频率 11方式39位UART ,波特率可变(2SMOD /32 )x(定时器1的溢出率或BRT 独立波特率发生器的溢出率)当T1x12 = 0时,定时器1的溢出率 = SYSclk/12/( 256 - T H1);当T1x12 = 1时,定时器1的溢出率 = SYSclk / ( 256 - T H1) 当BRTx12 = 0时,BRT 独立波特率发生器的溢出率= SYSclk/12/( 256 - BRT );当BRTx12 = 1时,BRT 独立波特率发生器的溢出率 = SYSclk / ( 256 - BRT )SM2:允许方式2或方式3多机通信控制位。
EX0EA PX001ET0PT001EX1PX101ET1PT101ES PS 01≥1RI TI SCON TCON IE0TF0IE1TF110101IT0IT1INT0INT1T0T1RX TXIE IP111111110硬件查询自然优先级自然优先级中断入口中断入口高级低级中断源中断源在方式2或方式3时,如果SM2位为1且REN位为1,则接收机处于地址帧筛选状态。
STC15系列51增强版单片机串行通信实现方法串行口1模式1,T2定时器
![STC15系列51增强版单片机串行通信实现方法串行口1模式1,T2定时器](https://img.taocdn.com/s3/m/f64ffd41fab069dc502201d9.png)
IAP15W4K58S4单片机串行通信实现方法串行口1模式1,T2定时器01基础知识当软件设置SCON的SM0和SM1为“01”时,串行口1则以模式1工作。
此模式为8为UART格式,一帧信息为10位;1位起始位,8位数据位(低位在先)和1位停止位。
TxD/P3.1位发送信息,RxD/P3.0位接收信息,串口全双工。
串行口涉及的相关寄存器如下表,串行通信模式1,其波特率可变,当串行口1用定时器T2作为波特率发生器时,串行口1的波特率=(定时器T2的溢出率)/4。
(此时波特率与SMOD无关)当T2工作在1T模式(AUXR.2/T2x12=1)时,定时器T2的溢出率=SYSclk/(65536-[RL_TH2,RL_TL2])。
02设置步骤(1)设置串口1的工作模式,SCON寄存器的SM0和SM1两位决定了串口1的4中工作方式,本文选用方式1,故SMON=0x50。
(2)设置串口1的波特率,使用定时器2寄存器T2H及T2L。
(3)设置寄存器AUXR中的T2x12/AUXR.2,确定定时器2速度是1T还是2T(4)启动定时器2,让T2R位为1,T2H/T2L定时器2寄存器立即开始计数。
(5)设置串口1的中断优先级,及打开中断相应的控制位是PS、ES、EA(6)如要串口1接收,先将SCON寄存器的REN位置1,若串口1发送,将数据送入SBUF即可,接收完的标志位RI,发送完成标志位TI,都要软件清0。
当串口1工作在模式1时,需要计算相应波特率设置的T2重装的初值(用Reload表示),送入T2H/T2L。
计算公式如下:Reload=65536-INT(SYSclk/Baud0/4+0.5)SYSclk=晶振频率,Baud0=标准波特率,INT()表示取整和运算,+0.5四舍五入。
设置时,T2x12/AUXR.2=1,1T工作模式,重新核算用Reload产生的波特率,Baud= SYSclk/(65536-Reload)/4。
单片机串口通信方式总结
![单片机串口通信方式总结](https://img.taocdn.com/s3/m/c134ac2f6ad97f192279168884868762caaebb23.png)
单片机串口通信方式总结第一篇:单片机串口通信方式总结IIC总线通信协议————数据传输高位在前p233 1,起始和停止条件开始信号:SCL为高电平,SDA由高电平向低电平跳变,开始传送数据。
void start()// 开始位 { SDA = 1;//SDA初始化为高电平“1”SCL = 1;//开始数据传送时,要求SCL为高电平“1”_nop_();//等待一个机器周期_nop_();//等待一个机器周期SDA = 0;//SDA的下降沿被认为是开始信号_nop_();//等待一个机器周期_nop_();//等待一个机器周期_nop_();//等待一个机器周期_nop_();//等待一个机器周期SCL = 0;//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)} 结束信号:SCL为高电平,SDA由低电平向高电平跳变,结束传送数据。
void stop()// 停止位 { SDA = 0;//SDA初始化为低电平“0”_nop_();_nop_();//等待一个机器周期SCL = 1;//结束数据传送时,要求SCL为高电平“1”_nop_();//等待一个机器周期_nop_();//等待一个机器周期_nop_();//等待一个机器周期_nop_();//等待一个机器周期SDA = 1;//SDA的上升沿被认为是结束信号 }2,数据格式(数据输入)在IIC总线开始信号后,送出的第一个字节数据是用来选择器件地址和数据方向的,其格式为从器件收到地址型号后与自己的地址比较,一致则此器件就是主器件要找的器件,并返回ACK(不管是写数据还是地址都会返回)。
IIC传送数据时SCL为低电平时SDA可改变高低电平,SCL转跳为高时数据输入(此时SDA不能跳变),发送数据:bit WriteCurrent(unsigned char y){ unsigned char i;bit ack_bit;//储存应答位for(i = 0;i < 8;i++)// 循环移入8个位{SDA =(bit)(y&0x80);//通过按位“与”运算将最高位数据送到S//因为传送时高位在前,低位在后_nop_();SCL = 1;//在SCL的上升沿将数据写入AT24Cxx_nop_();//等待一个机器周期_nop_();//等待一个机器周期SCL = 0;//将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲y <<= 1;//将y中的各二进位向左移一位} SDA = 1;// 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(AT24Cxx)控制_nop_();//等待一个机器周期_nop_();//等待一个机器周期SCL = 1;//根据上述规定,SCL应为高电平_nop_();//等待一个机器周期_nop_();//等待一个机器周期_nop_();//等待一个机器周期_nop_();//等待一个机器周期ack_bit = SDA;//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节//若送高电平,表示没有接收到,传送异常SCL = 0;//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit;// 返回AT24Cxx应答位 } 读数据:unsigned char ReadData()// 从AT24Cxx移入数据到MCU { unsigned char i;unsigned char x;//储存从AT24Cxx中读出的数据for(i = 0;i < 8;i++){SCL = 1;//SCL置为高电平x<<=1;//将x中的各二进位向左移一位x|=(unsigned char)SDA;//将SDA上的数据通过按位“或“运算存入x中SCL = 0;//在SCL的下降沿读出数据} return(x);//将读取的数据返回 } 发送数据步骤:oid WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent { start();//开始数据传递WriteCurrent(OP_WRITE);//选择要操作的AT24Cxx芯片,并告知要对其写入数据WriteCurrent(add);//写入指定地址WriteCurrent(dat);//向当前地址(上面指定的地址)写入数据stop();//停止数据传递delaynms(4);//1个字节的写入周期为1ms, 最好延时1ms以上 } 读数据步骤:/*************************************************** 函数功能:从AT24Cxx中的当前地址读取数据出口参数:x(储存读出的数据)***************************************************/ unsigned char ReadCurrent(){ unsigned char x;start();//开始数据传递WriteCurrent(OP_READ);//选择要操作的AT24Cxx芯片,并告知要读其数据x=ReadData();//将读取的数据存入x stop();//停止数据传递return x;//返回读取的数据} /*************************************************** 函数功能:从AT24Cxx中的指定地址读取数据入口参数:set_add 出口参数:x ***************************************************/ unsigned char ReadSet(unsigned char set_add)// 在指定地址读取 { start();//开始数据传递WriteCurrent(OP_WRITE);//选择要操作的AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_add);//写入指定地址return(ReadCurrent());//从指定地址读出数据并返回 }单总线协议————数据传输低位在前——p2371,初始化单总线器件初始化时序程序:函数功能:将DS18B20传感器初始化,读取应答信号出口参数:flag***************************************************/ bit Init_DS18B20(void){ bit flag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在DQ = 1;//先将数据线拉高for(time=0;time<2;time++)//略微延时约6微秒;DQ = 0;//再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延时约600微秒;//以向DS18B20发出一持续480~960us的低电平复位脉冲DQ = 1;//释放数据线(将数据线拉高)for(time=0;time<10;time++);//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在)for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕;return(flag);//返回检测成功标志 }单总线通信协议中存在两种写时隙:写0写1。
STC单片机1T系列串口通信波特率设置
![STC单片机1T系列串口通信波特率设置](https://img.taocdn.com/s3/m/ec03e62743323968001c9209.png)
STC单片机1T系列串口通信波特率设置本文是以STC12C5Axxxx/51xx系列单片机来进行讲解的。
如果有双串口的单片机以下是以串口1进行讲解的。
一、简介STC12C5A60S2系列单片机串口通信随着所选定时器的工作模式不同而异,对于工作模式0和2其波特率,只与系统时钟频率SYSCLK(下同)和PCON中的波特率选择位SMOD 有关;工作模式1和3其波特率,不仅与系统时钟频率SYSCLK (下同)和PCON中的波特率选择位SMOD有关,还与定时器/计数器1和BRT独立波特率设置有关。
通过对定时器/计数器1和BRT独立波特率设置,可以选择不同的波特率,所以这种波特率是可变的。
串口通信模式1和3波特率是可变的:模式1和3波特率=2SMOD/32*(定时器1溢出率或BRT溢出率)当T1x12=0时,定时器1的溢出率=SYSclk/12/(256-TH1);当T1x12=1时,定时器1的溢出率=SYSclk/(256-TH1)。
当BRTx12=0时,BRT溢出率=SYSclk/12/(256-BRT);当BRTx12=1时,BRT溢出率=SYSclk/(256-BRT)。
在实际应用中多使用串口模式1或3,进行波特率设置。
(1)串口通信模式1和3使用定时器/计数器1设置波特率1、SMOD的使用SMOD只是占用电源控制寄存器的最高一位(如下图所示),当SMOD=1时,PCON=PCON|0x80;(波特率加倍)当SMOD=0时,PCON=PCON|0x00。
2、定时器/计数器溢出率定时器/计数器溢出:是指设定初值后(初值根据要定的时间来计算),启动定时器后,每个机器周期加1,当加到每一位都是“1”时,再加1位就会使所有位都变成“0”,这时(再加1变成0后)就是定时器/计数器溢出。
所以所经历的时间是:(全为“1”的二进制+1-初值)*机器周期。
定时器/计数器溢出率:单位时间(秒)内定时器/计数器回“0”溢出的次数。
STC15W4K32S单片机总结
![STC15W4K32S单片机总结](https://img.taocdn.com/s3/m/5615a00f650e52ea55189863.png)
1、主要寄存器:PT1:定时器1中断优先级控制位,当为0时定时器为最低优先级中断,当为1时为最高的优先级。
TI/RI:软件清零。
SPDAT为SPI数据寄存器AUXR1中的SPI_S1/0两位确定SPI接口在单片机上引脚的位置➢T3T4控制寄存器:P307。
➢IE2(T3~T4)中断控制寄存器。
P309➢PCON电源控制寄存器。
P348/P290➢AUXR辅助寄存器。
P349➢IP1/IP2中断优先级寄存器。
P73/P74➢WDT_CONTR看门狗控制寄存器。
P291➢WKTCL/H电源唤醒专业寄存器。
P295➢T4T3M定时器T3/4控制寄存器。
P307➢TH2/3/4,TL2/3/4。
P303/P308/P307➢S2/3/4CON串口2控制寄存器。
P364/367/P370➢AUXR1为PCA模块引脚切换寄存器。
P390知识点1、时钟周期,又称振荡周期,是处理操作的最基本的单位。
2、任何一个中央处理器都包括控制器和运算器。
3、PC(程序计数器)的特点:总是指向下一条所要执行指令的地址空间。
4、在STC中用于控制指向存储空间位置的是一个堆栈指针(SP)。
P435、SFR是具有特殊功能的RAM区域。
6、片内RAM:低128字节,高128字节,SFR0x0000~0x0EFF)8、主要的5个中断:对于具有相同优先级的事件,按照时间发生的先后顺序执行。
中断源:可以打断当前在执行程序的紧急事件。
9、DATA:指向低128字节RAM。
IDATA:低128字节与DATA重叠,可以定义少量的变量。
XDATA:指向扩展RAMCODE:放在flash中。
10、每个串口包括以下单元1)两个数据缓冲区。
(SBUF/S2BUF/S3BUF/S4BUF)2)一个移位寄存器。
3)一个串行控制器。
4)一个波特率发生器。
stc c51 串口通信协议常用校验计算以及一些常用方法
![stc c51 串口通信协议常用校验计算以及一些常用方法](https://img.taocdn.com/s3/m/03e8dde4b1717fd5360cba1aa8114431b90d8e0d.png)
stc c51 串口通信协议常用校验计算以及一些常用方法STC C51 是一种基于8051 内核的单片机,广泛应用于各种嵌入式系统。
在串口通信中,为了保证数据的正确传输,通常需要使用校验位来检测数据传输过程中可能出现的错误。
以下是一些常用的校验计算方法以及一些常用的方法:1. 奇校验:o 定义:在数据字节的最高位(第8位)为校验位。
该位确保数据中1的个数为奇数。
o 规则:如果字节中的1的个数是偶数,那么奇校验位为1;如果字节中的1的个数是奇数,那么奇校验位为0。
o 优点:简单易懂,易于实现。
o 缺点:对于数据中连续的多个0,可能会产生错误的奇校验结果。
2. 偶校验:o 定义:在数据字节的最高位(第8位)为校验位。
该位确保数据中1的个数为偶数。
o 规则:如果字节中的1的个数是奇数,那么偶校验位为1;如果字节中的1的个数是偶数,那么偶校验位为0。
o 优点:对于数据中连续的多个0,可以避免错误的偶校验结果。
o 缺点:可能会增加多余的1,从而使得接收方无法正确识别信号电平。
3. 无校验:o 定义:不使用额外的校验位。
o 优点:简单、不需要额外的校验位。
o 缺点:无法检测传输错误。
4. 软件校验:o 在发送端对数据进行简单的加和,然后取反(如果是偶数),或减去最大值(如果是奇数),得到一个校验和。
接收端进行相同的计算,并与发送端的校验和进行比较,以检测错误。
5. 硬件校验:o 使用硬件电路(如RS-485 转换器)来实现校验和检测。
这通常更可靠,但也需要额外的硬件成本。
6. 校验方法的选用:o 对于通信距离较短、可靠性要求不高的场合,可以选择简单的校验方法。
o 对于通信距离长、可靠性要求高的场合,建议使用硬件校验或更复杂的软件校验方法。
7. 其他注意事项:o在设计串口通信协议时,应考虑数据的起始、结束标志,以及数据的格式和顺序。
o 为了提高通信的可靠性,可以考虑使用多重的起始和结束标志、重发机制等。
o 在数据传输过程中,应定期检查校验和,以确保数据的完整性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
}
}