51单片机串口通讯
51单片机的串口通信程序(C语言)
51单片机的串口通信程序(C语言) 51单片机的串口通信程序(C语言)在嵌入式系统中,串口通信是一种常见的数据传输方式,也是单片机与外部设备进行通信的重要手段之一。
本文将介绍使用C语言编写51单片机的串口通信程序。
1. 硬件准备在开始编写串口通信程序之前,需要准备好相应的硬件设备。
首先,我们需要一块51单片机开发板,内置了串口通信功能。
另外,我们还需要连接一个与单片机通信的外部设备,例如计算机或其他单片机。
2. 引入头文件在C语言中,我们需要引入相应的头文件来使用串口通信相关的函数。
在51单片机中,我们需要引入reg51.h头文件,以便使用单片机的寄存器操作相关函数。
同时,我们还需要引入头文件来定义串口通信的相关寄存器。
3. 配置串口参数在使用串口通信之前,我们需要配置串口的参数,例如波特率、数据位、停止位等。
这些参数的配置需要根据实际需要进行调整。
在51单片机中,我们可以通过写入相应的寄存器来配置串口参数。
4. 初始化串口在配置完串口参数之后,我们需要初始化串口,以便开始进行数据的发送和接收。
初始化串口的过程包括打开串口、设置中断等。
5. 数据发送在串口通信中,数据的发送通常分为两种方式:阻塞发送和非阻塞发送。
阻塞发送是指程序在发送完数据之后才会继续执行下面的代码,而非阻塞发送是指程序在发送数据的同时可以继续执行其他代码。
6. 数据接收数据的接收与数据的发送类似,同样有阻塞接收和非阻塞接收两种方式。
在接收数据时,需要不断地检测是否有数据到达,并及时进行处理。
7. 中断处理在串口通信中,中断是一种常见的处理方式。
通过使用中断,可以及时地响应串口数据的到达或者发送完成等事件,提高程序的处理效率。
8. 串口通信实例下面是一个简单的串口通信实例,用于在51单片机与计算机之间进行数据的传输。
```c#include <reg51.h>#include <stdio.h>#define BAUDRATE 9600#define FOSC 11059200void UART_init(){TMOD = 0x20; // 设置定时器1为模式2SCON = 0x50; // 设置串口为模式1,允许接收TH1 = 256 - FOSC / 12 / 32 / BAUDRATE; // 计算波特率定时器重载值TR1 = 1; // 启动定时器1EA = 1; // 允许中断ES = 1; // 允许串口中断}void UART_send_byte(unsigned char byte){SBUF = byte;while (!TI); // 等待发送完成TI = 0; // 清除发送完成标志位}unsigned char UART_receive_byte(){while (!RI); // 等待接收完成RI = 0; // 清除接收完成标志位return SBUF;}void UART_send_string(char *s){while (*s){UART_send_byte(*s);s++;}}void main(){UART_init();UART_send_string("Hello, World!"); while (1){unsigned char data = UART_receive_byte();// 对接收到的数据进行处理}}```总结:通过以上步骤,我们可以编写出简单的51单片机串口通信程序。
51单片机串口烧写和串口通信冲突
51单片机串口烧写和串口通信冲突51单片机是一款经典的单片机芯片,广泛应用于各种嵌入式系统中,具有体积小、功耗低、成本低等特点。
其中,串口烧写和串口通信是其重要的功能之一。
然而,在使用51单片机进行串口烧写和串口通信时,我们常常会遇到串口烧写和串口通信冲突的问题。
本文将从深度和广度两个方面介绍51单片机串口烧写和串口通信冲突的原因、解决方法以及个人观点和理解。
一、51单片机串口烧写和串口通信冲突的原因1. 引脚冲突:51单片机的串口通信使用了P3口的两个引脚(RXD和TXD),而串口烧写也需要使用这两个引脚。
当两者同时使用时,就会发生引脚冲突,导致串口通信无法正常进行。
2. 中断冲突:51单片机的串口通信和串口烧写都需要使用中断来进行数据的传输和处理。
然而,当两者同时进行时,就会发生中断冲突,导致程序异常或无法正常执行。
二、51单片机串口烧写和串口通信冲突的解决方法1. 引脚复用:通过引脚复用的方式,将串口通信和串口烧写使用的引脚分时复用。
可以在程序中通过控制器或开关来切换引脚的功能。
这样就可以避免引脚冲突,使串口烧写和串口通信能够正常进行。
2. 中断优先级设置:通过设置中断的优先级,可以解决串口通信和串口烧写同时进行时的中断冲突问题。
可以根据实际需求将串口通信和串口烧写的中断优先级进行设置,确保两者能够正确地进行数据传输和处理。
三、个人观点和理解作为一名嵌入式系统工程师,我对51单片机的串口烧写和串口通信冲突问题深有感触。
在实际项目中,我遇到过串口烧写和串口通信冲突导致程序异常的情况。
通过分析和解决这个问题,我更加深入地理解了51单片机的串口烧写和串口通信原理,以及相关的硬件和软件知识。
在解决串口烧写和串口通信冲突问题时,我发现引脚复用和中断优先级设置是较为常用且有效的方法。
通过合理设计引脚和优先级,可以有效解决冲突问题,同时保证系统的稳定性和可靠性。
总结回顾:通过本文的介绍,我们了解了51单片机串口烧写和串口通信冲突的原因及解决方法。
51单片机串口设置及应用
51单片机串口设置及应用单片机的串口设置及应用是指通过单片机的串口功能来进行通信的一种方式。
串口通信是一种全双工通信方式,可以实现双向数据传输。
单片机通过串口可以与其他设备进行通信,如计算机、传感器、LCD显示屏等。
1. 串口设置:单片机的串口通信一般需要进行以下设置:(1)串口模式选择:要根据实际情况选择串口工作模式,一般有异步串口和同步串口两种。
(2)波特率设置:串口通信需要设置一个波特率,即数据传输速率。
常见的波特率有9600、19200、115200等,需要与通信的设备保持一致。
(3)数据位设置:设置传输的数据位数,常见的有8位、9位等。
(4)停止位设置:设置停止位的个数,常见的有1位、2位等。
(5)校验位设置:可以选择是否启用校验位,校验位主要用于检测数据传输的正确性。
2. 串口应用:串口通信在很多领域都得到广泛应用,下面列举几个常见的应用场景:(1)串口与计算机通信:通过串口可以实现单片机与计算机的通信,可以进行数据的读写、控制等操作。
例如,可以通过串口将传感器采集到的数据发送给计算机,由计算机进行进一步处理分析。
(2)串口与传感器通信:串口可以与各种传感器进行通信,可以读取传感器采集到的数据,并进行处理和控制。
例如,可以通过串口连接温度传感器,读取实时的温度数据,然后进行温度控制。
(3)串口与LCD显示屏通信:通过串口可以实现单片机与LCD显示屏的通信,可以将需要显示的数据发送给LCD显示屏进行显示。
例如,可以通过串口将单片机采集到的数据以数字或字符的形式显示在LCD上。
(4)串口与外部存储器通信:通过串口可以与外部存储器进行通信,可以读写存储器中的数据。
例如,可以通过串口读取SD卡中存储的图像数据,然后进行图像处理或显示。
(5)串口与其他设备通信:通过串口可以和各种其他设备进行通信,实现数据的传输和控制。
例如,可以通过串口与打印机通信,将需要打印的数据发送给打印机进行打印。
总结:单片机的串口设置及应用是一种实现通信的重要方式。
c 51单片机串口初值计算
c 51单片机串口初值计算单片机是一种集成电路,可以用来实现各种功能。
而串口是一种用于数据传输的通信接口,常用于单片机与外部设备之间的通信。
在单片机中使用串口通信时,需要对串口进行初始化,设置其波特率和各种参数。
本文将通过详细介绍C51单片机串口的初值计算方法,帮助读者更好地理解单片机串口的使用。
在C51单片机中,串口的初始化可以通过设置相应的寄存器来实现。
下面以51系列单片机为例,介绍串口初始化的过程。
首先,需要设置串口的波特率。
波特率是指在一个时间单位内,通过通信线路传输的波形的变化次数。
常用的波特率有9600bps、115200bps等。
要设置波特率,需要先确定所使用的晶振频率和串口的时钟分频系数。
C51单片机的串口通信是通过定时器T1实现的,波特率的计算公式为:波特率 = 晶振频率 / (12 * 2^n * (65536 - T1初值))其中,n为波特率位数,可以取3、4、5等。
按照常用的8位数据位和1位停止位,可以将n取为4。
以晶振频率为11.0592MHz,波特率为9600bps为例,计算T1初值:9600 = 11059200 / (12 * 2^4 * (65536 - T1初值))通过计算得到T1初值为77。
将77转换成16进制,得到的值为4D。
接下来,需要设置串口的工作模式和相关参数。
C51单片机的串口通信有两种模式:帧模式和位模式。
帧模式是指在每个数据字节的前后都添加起始位、停止位和校验位,可以提高数据的可靠性。
位模式是指仅传输数据位,不添加起始位、停止位和校验位,可以提高传输速率。
C51单片机的串口默认为位模式,但可以通过设置相应的寄存器来选择工作模式。
串口相关的寄存器包括SCON、PCON和T2CON。
设置串口工作模式以及数据位数、停止位数和校验方式的方法如下所示:SCON = (模式选择位7) (模式选择位6) 0 (8位数据位选择) (校验方式选择) (停止位数选择) (模式选择位1) (模式选择位0)其中,模式选择位7和模式选择位6可以根据实际需求进行设置。
51单片机串口通信
一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。
由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。
串口通信的工作原理请同学们参看教科书。
以下对串口通信中一些需要同学们注意的地方作一点说明: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、通信协议的使用通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定:0xA1:单片机读取P0端口数据,并将读取数据返回PC机;0xA2:单片机从PC机接收一段控制数据;0xA3:单片机操作成功信息。
51单片机串口通信程序。。含详细例子
{ P3_4=0; P3_3=1;
} void RstPro()//编程器复位 {
pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 }
void ReadSign()//读特征字 {
} void serial () interrupt 4 using 3 //串口接收中断函数 {
if (RI) { RI = 0 ; ch=SBUF; read_flag= 1 ; //就置位取数标志 }
} main()
{ init_serialcom(); //初始化串口 while ( 1 ) { if (read_flag) //如果取数标志已置位,就将读到的数从串口发出 { read_flag= 0 ; //取数标志清 0 send_char_com(ch); } }
while(RI == 0); RI = 0; c = SBUF; // 从缓冲区中把接收的字符放入 c 中 SBUF = c; // 要发送的字符放入缓冲区 while(TI == 0); TI = 0; } }
4.//////////////// /////////////////////////////////////////////////////////
SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); }
void Lock()//写锁定位
{
pw.fpLock();
SendData();
单片机教程 第9章-串口通信
9.2
MCS-51单片机串行接口
方式1所传送的波特率取决于定时器T1的溢出 率和特殊功能寄存器PCON中SMOD的值,即方式1的
波特率=(2SMOD/32)×定时器T1的溢出率。
②方式1接收:当串行口置为方式1,且REN=1 时,串行口处于方式1输入状态。它以所选波特率 的16倍的速率采样RXD引脚状态。
示字符的结束。异步传送的字符格式如图所示。 ①字符帧:也叫数据帧,由起始位、数据位、奇 偶校验位和停止位4个部分组成。
9.1
串行通信基础
9.1
串行通信基础
②波特率:就是数据的传送速率,即每秒钟传送的 二进制位数,单位:位/秒。 说明:要求发送端与接收端的波特率必须一 致。波特率越高,传送速度越快。
9.1
串行通信基础
下图为以上两种通信方式的示意图。由图可知, 假设并行传送N位数据所需时间为T,那么串行传送 的时间至少为NT,实际上总是大于NT的。
9.1
串行通信基础
9.1.1
串行通信的分类
1、异步通信
异步传送的特点是数据在线路上的传送不连
续。在传送时,数据是以一个字符为单位进行传送
的。它用一个起始位表示字符的开始,用停止位表
;清0接收中断标志 ;接收数据 ;取奇偶校验位 ;偶校验时转L1 ;奇校验时RB8为0转出错处理
;偶校验时RB8为1转出错处理 ;奇偶校验对时存入数据 ;修改指针 ;恢复现场 ;中断返回 ;出错处理 ;中断返回
L1: L2:
ERR:
9.2
MCS-51单片机串行接口
4、方式3 方式3为波特率可变的9位异步通信方式,除了
fOSC 2 SMOD 64
T 1溢出率2 SMOD 32
51单片机模拟串口通讯
论坛新老朋友们。
祝大家新年快乐。
在新的一年开始的时候,给大家一点小小的玩意。
工程师经常碰到需要多个串口通信的时候,而低端单片机大多只有一个串行口,甚至没有串口。
这时候无论是选择高端芯片,还是更改系统设计都是比较麻烦的事。
我把以前搞的用普通I/O口模拟串行口通讯的程序拿出来,供大家参考,希望各位兄弟轻点拍砖。
基本原理:我们模拟的是串行口方式1.就是最普通的方式。
一个起始位、8个数据位、一个停止位。
模拟串行口最关键的就是要计算出每个位的时间。
以波特率9600为例,每秒发9 600个位,每个位就是1/9600秒,约104个微秒。
我们需要做一个精确的延时,延时时间+对IO口置位的时间=104微秒。
起始位是低状态,再延时一个位的时间。
停止位是高状态,也是一个位的时间。
数据位是8个位,发送时低位先发出去,接收时先接低位。
了解这些以后,做个IO模拟串口的程序,就是很容易的事。
我们开始。
先上简单原理图:就一个MAX232芯片,没什么好说的,一看就明白。
使用单片机普通I/ O口,232数据输入端使用51单片机P3.2口(外部中断1口,接到普通口上也可以,模拟中断方式的串行口会有用。
呵呵)。
数据输出为P0.4(随便哪个口都行)。
下面这个程序,您只需吧P0.4 和P3.2 当成串口直接使用即可,经过测试完全没有问题.2、底层函数代码如下:sbit TXD1 = P0^4; //定义模拟输出脚sbit RXD1 = P3^2; //定义模拟输入脚bdata unsigned char SBUF1; //定义一个位操作变量sbit SBUF1_bit0 = SBUF1^0;sbit SBUF1_bit1 = SBUF1^1;sbit SBUF1_bit2 = SBUF1^2;sbit SBUF1_bit3 = SBUF1^3;sbit SBUF1_bit4 = SBUF1^4;sbit SBUF1_bit5 = SBUF1^5;sbit SBUF1_bit6 = SBUF1^6;sbit SBUF1_bit7 = SBUF1^7;void delay_bps() {unsigned char i; for (i = 0; i < 29; i++); _nop_(); _nop_();} //波特率9600 模拟一个9600波特率unsigned char getchar2() //模拟接收一个字节数据{while (RXD1);_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); delay_bps();SBUF1_bit0 = RXD1; //0delay_bps();SBUF1_bit1 = RXD1; //1delay_bps();SBUF1_bit2 = RXD1; //2delay_bps();SBUF1_bit3 = RXD1; //3delay_bps();SBUF1_bit4 = RXD1; //4delay_bps();SBUF1_bit5 = RXD1; //5delay_bps();SBUF1_bit6 = RXD1; //6delay_bps();SBUF1_bit7 = RXD1; //7delay_bps();return(SBUF1) ; //返回读取的数据}void putchar2(unsigned char input) //模拟发送一个字节数据{SBUF1 = input;TXD1 = 0; //起始位delay_bps();TXD1 = SBUF1_bit0; //0delay_bps();TXD1 = SBUF1_bit1; //1delay_bps();TXD1 = SBUF1_bit2; //2delay_bps();TXD1 = SBUF1_bit3; //3delay_bps();TXD1 = SBUF1_bit4; //4delay_bps();TXD1 = SBUF1_bit5; //5delay_bps();TXD1 = SBUF1_bit6; //6delay_bps();TXD1 = SBUF1_bit7; //7delay_bps();TXD1 = 1; //停止位delay_bps();}3、实现串行通讯。
MCS-51单片机串行通信
9.1 串行通信概述
• ④停止位 表示发送一个数据的结束,用高电平表示,占1 位、1.5 位或2 位。 • 线路空闲时,线路处于逻辑“1”等待状态,即空闲位为1。 空闲位是异步通信特征之一。异步通信中数据传送格式如 图9.1 所示。 • 图9.1 异步通信数据帧格式
图9.1 异步通信数据帧格式
9.1 串行通信概述
9.1 串行通信概述
• 3.波特率 • 波特率是数据传递的速率,指每秒传送二进制数据的位数, 单位为位/秒(bit/s)。 • 例9.1 假设微型打印机最快的传送速率为30 字符/秒,每 个字符为10 位,计算波特率。 • 解: • 波特率=10 b/字符×30字符/s=300 b/s • 每一位代码的传送时间Td 为波特率的倒数: • Td=1/300=3.3 ms • 异步通信的波特率一般在50~19 200 b/s 之间,常用于 计算机到终端机和打印机之间的通信、直通电报以及无线 电通信的数据发送等。
异步10位收发 异步11位收发 异步11位收发
9.2 串行口结构与工作原理
• SM2:多机通信控制位。 • a.用于方式2和方式3。若SM2=1,则允许多机通信。 多机通信协议规定,若第9位数据(RB8)为1,则表明本帧 数据为地址帧。否则,若第9位数据(RB8)为0,则表明本 帧数据为数据帧。 • 当一个8051(主机)与多个8051(从机)进行通信时,令所有 从机的SM2都置1。主机要与某个从机通信,首先发送一 个与该从机相一致的地址帧(每个从机的地址必须惟一), 且第9位为1,所有从机接收到数据后,将第9位送入RB8 中。 • 若RB8=1,说明是地址帧,将数据装入SBUF,且置RI =1,即中断所有从机,若从机判断出该地址帧数据与本 机号(地址)一致,则置SM2=0,准备接收主机发来的数 据。其他从机仍然保持SM2=1。
51单片机双机通信原理(一)
51单片机双机通信原理(一)51单片机双机通信简介•什么是51单片机双机通信•双机通信的作用和应用场景基本原理•单片机串口通信原理–串口通讯协议–数据帧的构成•串口通信的硬件连接–引脚连接方式–串口信号格式设置单向通信实现•主从模式–主机发送数据–从机接收数据•编程实现–主机端程序设计–从机端程序设计双向通信实现•主从模式–主机发送数据–从机接收数据–主机接收数据–从机发送数据•编程实现–主机端程序设计–从机端程序设计通信协议的设计•自定义通信协议–协议的格式–数据的解析与封装高级功能扩展•多机通信实现•数据加密与解密•异常处理与误码纠错总结•51单片机双机通信的基本原理和实现方式•可能遇到的问题及解决方案•双机通信的进一步应用展望简介51单片机双机通信是指使用51系列单片机实现两台或多台单片机之间的数据传输和通信。
双机通信可以实现在多个单片机之间传递数据、完成控制指令的下发、数据的采集和处理等功能。
在各种电子设备和嵌入式系统中,双机通信被广泛应用,可以实现设备之间的互联和协同工作,提高系统的灵活性和智能化水平。
基本原理单片机串口通信原理串口通信是一种将数据通过串行线路进行传输的通信方式。
在51单片机的串口通信中,常用的是UART(通用异步收发传输器)通信协议。
UART通信采用的是异步传输方式,数据按照固定的数据帧格式进行传输。
串口通信的硬件连接在51单片机的串口通信中,需要将主机和从机的UART引脚连接起来。
常用的连接方式是通过一对直线的串行数据线(TXD和RXD)连接主从机,其中TXD是发送数据的引脚,RXD是接收数据的引脚。
为了确保数据的正确传输,还需要进行串口信号格式的设置,包括波特率、数据位数、停止位数和校验位等。
单向通信实现主从模式在单向通信中,主机负责发送数据,从机负责接收数据。
主机通过串口发送数据帧,从机通过串口接收数据帧,并进行相应的处理。
编程实现在主机端程序设计中,需要配置串口通信的参数,并使用串口发送数据的相关函数来发送数据。
51单片机模拟串口的三种方法
51单片机模拟串口的三种方法单片机模拟串口是指通过软件实现的一种串口通信方式,主要应用于一些资源有限的场合,如单片机中没有硬件UART模块的情况下。
下面将介绍三种常用的单片机模拟串口的方法。
1.轮询法轮询法是最简单的一种模拟串口方法,其原理是通过轮询方式不断查询接收和发送的数据。
在接收数据时,单片机通过忙等待的方式查询接收端是否有数据到达,并且处理数据。
在发送数据时,单片机通过检查发送端是否空闲,然后发送数据。
这种方法的优点是实现简单,占用资源少。
缺点是轮询过程可能会浪费一定的时间,同时由于忙等待可能会占用CPU资源,影响其他任务的执行。
2.中断法中断法是一种基于中断机制实现的模拟串口方法,其原理是通过外部中断或定时器中断触发,单片机响应中断并进行串口数据的接收和发送。
在接收数据时,单片机通过外部中断或定时器中断来检测串口接收中断,并处理接收到的数据;在发送数据时,单片机通过定时器中断来定时发送数据。
这种方法的优点是能够及时响应串口的数据接收和发送,不会浪费过多的时间。
缺点是中断处理可能会占用一定的CPU资源,同时中断嵌套可能会引起一些问题。
3.环形缓冲法环形缓冲法是一种基于环形缓冲区的模拟串口方法,其原理是通过环形缓冲区来缓存接收和发送的数据。
在接收数据时,单片机将串口接收到的数据放入环形缓冲区,并使用指针指示当前读取位置和写入位置,然后通过轮询或中断方式从缓冲区中读取数据并进行处理;在发送数据时,单片机将要发送的数据放入环形缓冲区,并通过轮询或中断方式从缓冲区中读取数据并发送。
这种方法的优点是能够有效地处理串口数据的接收和发送,不会浪费过多的时间,并且能够缓存一定量的数据。
缺点是需要额外的缓冲区,占用一定的内存空间。
综上所述,通过轮询法、中断法和环形缓冲法三种方法,可以实现单片机的串口模拟功能。
根据实际需求,选择合适的方法来实现串口通信。
51单片机串口通信相关寄存器及设置指引
51单片机串口通信相关寄存器及设置指引关键字SBUF:串口数据缓存寄存器SCON:串口通信状态控制寄存器Fosc:晶振的震荡频率PSW:程序状态字寄存器1、SBUF数据缓存寄存器SBUF可直接寻址专用寄存器,是个8位寄存器,不可进行位操作。
字节地址99H。
物理上它是两个寄存器,一个发送寄存器,一个接收寄存器。
写数据到SBUF中时(SBUF = 0x52;),单片机自己会判断是写到发送寄存器。
读取SBUF中数据时(rReg = SBUF;),单片机自己会判断是读取接收寄存器。
接收寄存器是双缓冲的,以避免在接收下一帧数据之前,单片机还来不及响应接收中断,没有把上一帧的数据读取走,而产生两次帧数据重叠问题。
发送寄存器,没有缓冲,发送时单片机直接主动发出数据,不会产生重叠问题。
(扩展知识:为了保持最大的传输速率,一般不需要发送寄存器建立双缓冲功能。
双缓冲功能有别于发送数据队列缓存区。
)2、SCON串口通讯状态控制寄存器SCON可直接寻址专用寄存器,是个8位寄存器,可以进行位操作。
SCON用于控制串行通信的模式选择、接收和发送,标识串口的状态。
SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
系统复位时,SCON的所有位都被清除。
SCON串口通讯状态控制寄存器的格式及各位的功能定义如下:●SM0、SM1SM0和SM1是串口模式选择位。
SM0和SM1编码对应串口4种模式,如下表:●SM2SM2在模式2和模式3中是多机通信的使能位。
在模式0中,SM2必须为0。
在模式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在模式2和模式3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
●RENREN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
51单片机串口通信实例
51单片机串口通信实例一、原理简介51 单片机内部有一个全双工串行接口。
什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。
串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。
其缺点是传输速度较低。
与之前一样,首先我们来了解单片机串口相关的寄存器。
SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。
从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。
串行口控制寄存器SCON(见表1) 。
表1 SCON寄存器表中各位(从左至右为从高位到低位)含义如下。
SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。
表2 串行口工作方式控制位其中,fOSC 为单片机的时钟频率;波特率指串行口每秒钟发送(或接收)的位数。
SM2 :多机通信控制位。
该仅用于方式2 和方式3 的多机通信。
其中发送机SM2 = 1(需要程序控制设置)。
接收机的串行口工作于方式2 或3,SM2=1 时,只有当接收到第9 位数据(RB8)为1 时,才把接收到的前8 位数据送入SBUF,且置位RI 发出中断申请引发串行接收中断,否则会将接受到的数据放弃。
当SM2=0 时,就不管第位数据是0 还是1,都将数据送入SBUF,并置位RI 发出中断申请。
工作于方式0 时,SM2 必须为0。
REN :串行接收允许位:REN =0 时,禁止接收;REN =1 时,允许接收。
TB8 :在方式2、3 中,TB8 是发送机要发送的第9 位数据。
在多机通信中它代表传输的地址或数据,TB8=0 为数据,TB8=1 时为地址。
RB8 :在方式2、3 中,RB8 是接收机接收到的第9 位数据,该数据正好来自发送机的TB8,从而识别接收到的数据特征。
51单片机的2个串口分别通信的方法
51单片机的2个串口资源分别通信的方法当使用51单片机的2个串口资源进行通信时,比如用一个串口与PLC的串口使用RS485协议通信,一个串口通过蓝牙模块和另一个单片机无线通信时,该如何处理呢?传统的51单片机只有1个串口资源,只能采用分时复用的方法。
STC的15系列增强版51单片机具有多个串口资源,本文将描述如何使用IAP15W4K58S单片机用一个串口资源与PLC的RS485有线通信,另一个串口资源与Arduino单片机通过蓝牙模块无线通信,该通讯连接过程中PLC作为主机,IAP15W4K58S作为中间机,Arduino单片机作为最低层级。
工作过程是按下启动按键,PLC发信息给IAP15W4K58S单片机发高速脉冲控制步进电机驱动的机械臂运动取走货物,当货物取走后,IAP15W4K58S单片机通过蓝牙模块通知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表示系统时钟频率,[RL_TH2,RL_TL2]表示T2H,T2L的定时初值设置值。
51单片机串行通讯
51单片机串行通讯在当今的电子世界中,单片机的应用无处不在,从家用电器到工业自动化,从智能仪表到航空航天,都能看到它的身影。
而在单片机的众多功能中,串行通讯是一项非常重要的技术。
首先,咱们来了解一下什么是串行通讯。
简单来说,串行通讯就是指数据一位一位地按顺序传送。
与并行通讯(数据的各位同时传送)相比,串行通讯虽然速度相对较慢,但它只需要少数几条线就能完成数据传输,大大降低了硬件成本和连线的复杂性。
51 单片机的串行通讯有两种工作方式:同步通讯和异步通讯。
异步通讯是比较常用的一种方式。
在异步通讯中,数据是以字符为单位进行传输的。
每个字符由起始位、数据位、奇偶校验位和停止位组成。
起始位是一个低电平信号,用于通知接收方数据即将开始传输。
数据位通常是 5 到 8 位,可以表示一个字符的信息。
奇偶校验位用于检验传输数据的正确性,而停止位则是高电平,标志着一个字符传输的结束。
同步通讯则是在发送和接收两端使用同一个时钟信号来控制数据的传输。
这种方式传输速度快,但硬件要求相对较高。
51 单片机的串行口结构包括发送缓冲器和接收缓冲器。
发送缓冲器只能写入不能读出,而接收缓冲器只能读出不能写入。
在进行串行通讯时,我们需要对 51 单片机的串行口进行初始化设置。
这包括设置波特率、数据位长度、奇偶校验位和停止位等参数。
波特率是指每秒传输的位数,它决定了数据传输的速度。
通过设置定时器 1 的工作方式和初值,可以得到不同的波特率。
在编程实现串行通讯时,我们可以使用查询方式或者中断方式。
查询方式相对简单,但会占用大量的 CPU 时间,影响系统的实时性。
中断方式则可以在数据接收或发送完成时触发中断,提高系统的效率。
比如说,我们要实现 51 单片机与 PC 机之间的串行通讯。
在 PC 端,我们可以使用串口调试助手等软件来发送和接收数据。
在单片机端,通过编写相应的程序,设置好串行口的参数,然后根据接收的数据执行相应的操作,或者将需要发送的数据发送出去。
单片机串口通信及波特率设置
51单片机串口通信及波特率设置MCS-51单片机具有一个全双工的串行通信接口,能同时进行发送和接收。
它可以作为UART(通用异步接收和发送器)使用,也可以作为同步的移位寄存器使用。
1. 数据缓冲寄存器SBUFSBUF是可以直接寻址的专用寄存器。
物理上,它对应着两个寄存器,即一个发送寄存器一个接收寄存器,CPU写SBUF就是修改发送寄存器;读SBUF就是读接收寄存器。
接收器是双缓冲的,以避免在接收下一帧数据之前,CPU未能及时的响应接收器的中断,没有把上一帧的数据读走而产生两帧数据重叠的问题。
对于发送器,为了保持最大的传输速率,一般不需要双缓冲,因为发送时CPU是主动的,不会产生重叠问题。
2. 状态控制寄存器SCONSCON是一个逐位定义的8位寄存器,用于控制串行通信的方式选择、接收和发送,指示串口的状态,SCON即可以字节寻址也可以位寻址,字节地址98H,地址位为98H~9FH。
它的各个位定义如下:MSB LSBSM0 SM1 SM2 REN TB8 RB8 TI RI SM0和SM1是串口的工作方式选择位,2个选择位对应4种工作方式,如下表,其中Fosc是振荡器的频率。
SM0 SM1 工作方式功能波特率0 0 0 8位同步移位寄存器Fosc/120 1 1 10位UART 可变1 02 11位UART Fosc/64或Fosc/321 1 3 11位UART 可变SM2在工作方式2和3中是多机通信的使能位。
在工作方式0中,SM2必须为0。
在工作方式1中,若SM2=1且没有接收到有效的停止位,则接收中断标志位RI不会被激活。
在工作方式2和3中若SM2=1且接收到的第9位数据(RB8)为0,则接收中断标志RB8不会被激活,若接收到的第9位数据(RB8)为1,则RI置位。
此功能可用于多处理机通信。
REN为允许串行接收位,由软件置位或清除。
置位时允许串行接收,清除时禁止串行接收。
TB8是工作方式2和3要发送的第9位数据。
c 51单片机串口初值计算
c 51单片机串口初值计算
在C51单片机中,串口通信是一种常用的通信方式。
为了实现串口通信,我们需要对串口的波特率、停止位、数据位、校验位等进行配置。
其中,波特率是串口通信中最重要的参数之一,它决定了数据传输的速度。
在C51单片机中,我们通常使用定时器来产生串口的波特率。
具体来说,我们可以通过配置定时器的溢出值和分频系数来计算波特率。
假设我们要配置的波特率为9600,单片机的晶振频率为12MHz,那么我们可以使用定时器T1来产生波特率。
首先,我们需要将定时器T1设置为工作方式2,即自动重装载模式。
然后,我们可以根据下面的公式计算波特率的初值:
波特率= (2^SMOD / (32 * (65536 - TH1))) * 12
其中,SMOD是波特率倍增位,TH1是定时器T1的初值。
根据上面的公式,我们可以计算出TH1的值为:
TH1 = 65536 - (2^SMOD * 12 / (32 * 波特率))
假设SMOD=0,那么我们可以将上面的公式代入计算出TH1的值为:
TH1 = 65536 - (2^0 * 12 / (32 * 9600)) = 0x4B88
因此,我们可以将TH1的值写入单片机的寄存器中,以配置串口的波特率。
除了配置波特率外,我们还需要配置串口的其他参数,例如停止位、数据位、校验位等。
这些参数可以通过对串口控制寄存器的相应位进行设置来配置。
具体配置方法可以参考单片机的数据手册或参考手册。
51单片机串口通信
51单片机串口通信串行口通信是一种在计算机和外部设备之间进行数据传输的通信方式,其中包括了并行通信、RS-232通信、USB通信等。
而在嵌入式系统中,最常见、最重要的通信方式就是单片机串口通信。
本文将详细介绍51单片机串口通信的原理、使用方法以及一些常见问题与解决方法。
一、串口通信的原理串口通信是以字节为单位进行数据传输的。
在串口通信中,数据传输分为两个方向:发送方向和接收方向。
发送方将待发送的数据通过串行转并行电路转换为一组相对应的并行信号,然后通过串口发送给接收方。
接收方在接收到并行信号后,通过串行转并行电路将数据转换为与发送方发送时相对应的数据。
在51单片机中,通过两个寄存器来实现串口通信功能:SBUF寄存器和SCON寄存器。
其中,SBUF寄存器用于存储要发送或接收的数据,而SCON寄存器用于配置串口通信的工作模式。
二、51单片机串口通信的使用方法1. 串口的初始化在使用51单片机进行串口通信之前,需要进行串口的初始化设置。
具体的步骤如下:a. 设置波特率:使用波特率发生器,通过设定计算器的初值和重装值来实现特定的波特率。
b. 串口工作模式选择:设置SCON寄存器,选择串行模式和波特率。
2. 发送数据发送数据的过程可以分为以下几个步骤:a. 将要发送的数据存储在SBUF寄存器中。
b. 等待发送完成,即判断TI(发送中断标志位)是否为1,如果为1,则表示发送完成。
c. 清除TI标志位。
3. 接收数据接收数据的过程可以分为以下几个步骤:a. 等待数据接收完成,即判断RI(接收中断标志位)是否为1,如果为1,则表示接收完成。
b. 将接收到的数据从SBUF寄存器中读取出来。
c. 清除RI标志位。
三、51单片机串口通信的常见问题与解决方法1. 波特率不匹配当发送方和接收方的波特率不一致时,会导致数据传输错误。
解决方法是在初始化时确保两端的波特率设置一致。
2. 数据丢失当发送方连续发送数据时,接收方可能会出现数据丢失的情况。
51单片机与PC机通信
51单片机与PC机通信随着嵌入式系统和物联网技术的发展,51单片机在许多应用中扮演着重要的角色。
这些单片机具有低功耗、高性能和易于编程等优点,使其在各种嵌入式设备中得到广泛应用。
在这些应用中,与PC机的通信是一个关键的需求。
本文将探讨51单片机与PC机通信的方法和协议。
串口通信是51单片机与PC机进行通信的最常用方式之一。
串口通信使用一个或多个串行数据线来传输数据,通常使用RS232或TTL电平标准。
在硬件连接方面,需要将51单片机的串口与PC机的串口进行连接。
通常使用DB9或USB转TTL电路来实现这一连接。
在软件编程方面,需要使用51单片机的UART控制器来进行数据的发送和接收。
具体实现可以使用Keil C51或IAR Embedded Workbench 等集成开发环境进行编程。
USB通信是一种比较新的通信方式,它具有传输速度快、支持热插拔等优点。
在51单片机中,可以使用USB接口芯片来实现与PC机的通信。
在硬件连接方面,需要将51单片机的USB接口芯片与PC机的USB接口进行连接。
通常使用CH340G或FT232等USB转串口芯片来实现这一连接。
在软件编程方面,需要使用51单片机的USB接口芯片来进行数据的发送和接收。
具体实现可以使用相应的USB库来进行编程。
网络通信是一种更加灵活和高效的通信方式。
在51单片机中,可以使用以太网控制器来实现与PC机的网络通信。
在硬件连接方面,需要将51单片机的以太网控制器与PC机的网络接口进行连接。
通常使用ENC28J60等以太网控制器来实现这一连接。
在软件编程方面,需要使用51单片机的以太网控制器来进行数据的发送和接收。
具体实现可以使用相应的网络库来进行编程。
需要注意的是,网络编程涉及到更多的协议和数据格式,需要有一定的网络基础知识。
本文介绍了51单片机与PC机通信的三种常用方式:串口通信、USB 通信和网络通信。
每种方式都有其各自的优缺点和适用场景。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机串口通讯一、串口通信原理串口通讯对单片机而言意义重大,不但可以实现将单片机的数据传输到计算机端,而且也能实现计算机对单片机的控制。
由于其所需电缆线少,接线简单,所以在较远距离传输中,得到了广泛的运用。
串口通信的工作原理请同学们参看教科书。
以下对串口通信中一些需要同学们注意的地方作一点说明: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、通信协议的使用通信协议是通信设备在通信前的约定。
单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。
假定我们需要在PC机与单片机之间进行通信,在双方程式设计过程中,有如下约定: 0xA1:单片机读取P0端口数据,并将读取数据返回PC机; 0xA2:单片机从PC机接收一段控制数据; 0xA3:单片机操作成功信息。
在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。
当单片机接收到0xA1时,读取P0端口数据,并将读取数据返回PC机;当单片机接收到0xA2时,单片机等待从PC机接收一段控制数据;当PC机接收到0xA3时,就表明单片机操作已经成功。
3、硬件连接51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。
进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。
我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。
这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。
使用MAX232串口通信电路图(9孔串口接头)串口通讯的硬件电路如上图所示为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调试软件来观察。
串口调试助手窗口SBUF 数据缓冲寄存器这是一个可以直接寻址的串行口专用寄存器。
有朋友这样问起过“为何在串行口收发中,都只是使用到同一个寄存器SBUF?而不是收发各用一个寄存器。
”实际上SBUF包含了两个独立的寄存器,一个是发送寄存,另一个是接收寄存器,但它们都共同使用同一个寻址地址-99H。
CPU在读SBUF时会指到接收寄存器,在写时会指到发送寄存器,而且接收寄存器是双缓冲寄存器,这样可以避免接收中断没有及时的被响应,数据没有被取走,下一帧数据已到来,而造成的数据重叠问题。
发送器则不需要用到双缓冲,一般情况下我们在写发送程序时也不必用到发送中断去外理发送数据。
操作SBUF寄存器的方法则很简单,只要把这个99H地址用关键字sfr定义为一个变量就可以对其进行读写操作了,如sfr SBUF = 0x99;当然你也可以用其它的名称。
通常在标准的reg51.h或at89x51.h 等头文件中已对其做了定义,只要用#include引用就可以了。
SCON 串行口控制寄存器通常在芯片或设备中为了监视或控制接口状态,都会引用到接口控制寄存器。
SCON就是51芯片的串行口控制寄存器。
它的寻址地址是98H,是一个可以位寻址的寄存器,作用就是监视和控制51芯片串行口的工作状态。
51芯片的串口可以工作在几个不同的工作模式下,其工作模式的设置就是使用SCON寄存器。
它的各个位的具体定义如下:(MSB)(LSB)表8-1 串行口控制寄存器SCONSM0、SM1为串行口工作模式设置位,这样两位可以对应进行四种模式的设置。
看表8-2串行口工作模式设置。
表8-2 串行口工作模式设置在这里只说明最常用的模式1,其它的模式也就一一略过,有兴趣的朋友可以找相关的硬件资料查看。
表中的fosc代表振荡器的频率,也就是晶振的频率。
UART为(Universal Asynchronous Receiver)的英文缩写。
SM2在模式2、模式3中为多处理机通信使能位。
在模式0中要求该位为0。
REM为允许接收位,REM置1时串口允许接收,置0时禁止接收。
REM是由软件置位或清零。
如果在一个电路中接收和发送引脚P3.0,P3.1都和上位机相连,在软件上有串口中断处理程序,当要求在处理某个子程序时不允许串口被上位机来的控制字符产生中断,那么可以在这个子程序的开始处加入REM=0来禁止接收,在子程序结束处加入REM=1再次打开串口接收。
大家也可以用上面的实际源码加入REM=0来进行实验。
TB8发送数据位8,在模式2和3是要发送的第9位。
该位可以用软件根据需要置位或清除,通常这位在通信协议中做奇偶位,在多处理机通信中这一位则用于表示是地址帧还是数据帧。
RB8接收数据位8,在模式2和3是已接收数据的第9位。
该位可能是奇偶位,地址/数据标识位。
在模式0中,RB8为保留位没有被使用。
在模式1中,当SM2=0,RB8是已接收数据的停止位。
TI发送中断标识位。
在模式0,发送完第8位数据时,由硬件置位。
其它模式中则是在发送停止位之初,由硬件置位。
TI置位后,申请中断,CPU响应中断后,发送下一帧数据。
在任何模式下,TI都必须由软件来清除,也就是说在数据写入到SBUF后,硬件发送数据,中断响应(如中断打开),这时TI=1,表明发送已完成,TI不会由硬件清除,所以这时必须用软件对其清零。
RI接收中断标识位。
在模式0,接收第8位结束时,由硬件置位。
其它模式中则是在接收停止位的半中间,由硬件置位。
RI=1,申请中断,要求CPU取走数据。
但在模式1中,SM2=1时,当未收到有效的停止位,则不会对RI置位。
同样RI也必须要靠软件清除。
常用的串口模式1是传输10个位的,1位起始位为0,8位数据位,低位在先,1位停止位为1。
它的波特率是可变的,其速率是取决于定时器1或定时器2的定时值(溢出速率)。
AT89C51和AT89C2051等51系列芯片只有两个定时器,定时器0和定时器1,而定时器2是89C52系列芯片才有的。
波特率在使用串口做通讯时,一个很重要的参数就是波特率,只有上下位机的波特率一样时才可以进行正常通讯。
波特率是指串行端口每秒内可以传输的波特位数。
有一些初学的朋友认为波特率是指每秒传输的字节数,如标准9600会被误认为每秒种可以传送9600个字节,而实际上它是指每秒可以传送9600个二进位,而一个字节要8个二进位,如用串口模式1来传输那么加上起始位和停止位,每个数据字节就要占用10个二进位,9600波特率用模式1传输时,每秒传输的字节数是9600÷10=960字节。
51芯片的串口工作模式0的波特率是固定的,为fosc/12,以一个12M的晶振来计算,那么它的波特率可以达到1M。
模式2的波特率是固定在fosc/64或fosc/32,具体用那一种就取决于PCON寄存器中的SMOD位,如SMOD为0,波特率为focs/64,SMOD为1,波特率为focs/32。
模式1和模式3的波特率是可变的,取决于定时器1或2(52芯片)的溢出速率。
那么我们怎么去计算这两个模式的波特率设置时相关的寄存器的值呢?可以用以下的公式去计算。
波特率=(2SMOD÷32)×定时器1溢出速率上式中如设置了PCON寄存器中的SMOD位为1时就可以把波特率提升2倍。
通常会使用定时器1工作在定时器工作模式2下,这时定时值中的TL1做为计数,TH1做为自动重装值,这个定时模式下,定时器溢出后,TH1的值会自动装载到TL1,再次开始计数,这样可以不用软件去干预,使得定时更准确。
在这个定时模式2下定时器1溢出速率的计算公式如下:溢出速率=(计数速率)/(256-TH1)上式中的“计数速率”与所使用的晶体振荡器频率有关,在51芯片中定时器启动后会在每一个机器周期使定时寄存器TH的值增加一,一个机器周期等于十二个振荡周期,所以可以得知51芯片的计数速率为晶体振荡器频率的1/12,一个12M的晶振用在51芯片上,那么51的计数速率就为1M。
通常用11.0592M晶体是为了得到标准的无误差的波特率,那么为何呢?计算一下就知道了。
如我们要得到9600的波特率,晶振为11.0592M和12M,定时器1为模式2,SMOD设为1,分别看看那所要求的TH1为何值。
代入公式:11.0592M9600=(2÷32)×((11.0592M/12)/(256-TH1))TH1=250 //看看是不是和上面实例中的使用的数值一样?12M9600=(2÷32)×((12M/12)/(256-TH1))TH1≈249.49上面的计算可以看出使用12M晶体的时候计算出来的TH1不为整数,而TH1的值只能取整数,这样它就会有一定的误差存在不能产生精确的9600波特率。
当然一定的误差是可以在使用中被接受的,就算使用11.0592M的晶体振荡器也会因晶体本身所存在的误差使波特率产生误差,但晶体本身的误差对波特率的影响是十分之小的,可以忽略不计。
下位机:51单片机实现RS232串口通信上一期,我们已经利用增强型51实验板学会了单片机控制步进电机转动的方法,这一期,我们将一起来学习一下单片机如何与PC机进行通信,一起来完成一个简单的RS232通信实例,我们不做太多的理论,从实例出发,相信能够给大家一个比较通俗、透彻地认识,掌握了它的原理,那你就可以编出任何和PC机进行通信的程序了。