51单片机串口通信

合集下载

51单片机串行通信T1、T2常用波特率设置

51单片机串行通信T1、T2常用波特率设置

22.1184MHZ时RCAP的选值 24MHZ时RCAP的选值 波特率 RCAP2H RCAP2L 波特率 RCAP2H RCAP2L 误差 4800 FF 70 4800 FF 64 0.25 9600 FF B8 9600 FF B2 0.13 14400 FF D0 14400 FF CC 0.08 19200 FF DC 19200 FF D9 0.06 38400 FF EE 38400 FF EC 0.48 57600 FF F4 57600 FF F3 0.02 115200 FF FA 115200 FF F9× 0.49 注:打×的经本人调试是有问题的,大家最好不要选择。你可以自己测试下
波特率 4800 9600 14400 19200 38400
误差 0.04 0.02 0.32 0.49 0.26
T2定时器作波特率发生器
公式: 11.0592MHZ时RCAP的选值 波特率 RCAP2H RCAP2L 4800 FF B8 9600 FF DC 14400 FF E8 19200 FF EE 38400 FF F7 57600 FF FA 115200 FF FD 波特率 = fosc/(32*(65536 - (RCAP2H,RCAP2L))) 12MHZ时RCAP的选值 波特率 RCAP2H RCAP2L 误差 4800 FF B2 0.13 9600 FF D9 0.06 14400 FF E6 0.04 19200 FF EC 0.47 38400 FF F6 0.23 57600 FF F9× 0.49 115200 FF FD× 0.26
T1定时器作波特率发生器ห้องสมุดไป่ตู้
公式: 11.0592MHZ时TH1的选值 波特率 SMOD = 0 SMOD = 1 4800 FA F4 9600 FD FA 14400 FE FC 19200 FD 22.1184MHZ时TH1的选值 波特率 SMOD = 0 SMOD = 1 4800 F4 E8 9600 FA F4 14400 FC F8 19200 FD FA 38400 FD 波特率 = (2的SMOD次方/32)*fosc/(12*(256-TH1)) 12MHZ时TH1的选值 波特率 SMOD = 0 误差 SMOD = 1 误差 4800 F9× 0.49 F3 0.02 9600 FD× 0.26 F9× 0.49 14400 FE× 0.17 FC× 0.34 19200 FD× 0.26 24MHZ时TH1的选值 SMOD = 0 误差 SMOD = 1 F3 0.02 E6 F9× 0.49 F3 FC× 0.34 F7 FD× 0.26 F9× FE× 0.37 FD×

c 51单片机串口初值计算

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可以根据实际需求进行设置。

c51单片机串口初值计算

c51单片机串口初值计算

c51单片机串口初值计算
单片机串口的初值计算是为了设置串口通信的波特率(Baud Rate),波特率是指串口每秒传输的位数。

在51单片机中,串口模块由SBUF(串口数据寄存器)、SCON(串口
控制寄存器)和PCON(功耗控制寄存器)组成。

串口通信的波特率设置
是通过控制SCON和PCON寄存器的相关位实现的。

以下是一种计算波特率初值的方法:
1.确定所需的波特率,例如1200。

2.计算定时器T1的初值:
其中,CPU时钟频率是指单片机的工作频率,如12MHz。

3.将T1的高8位和低8位分别存储到TH1寄存器和TL1寄存器中:
TH1=T1高8位
TL1=T1低8位
4.设置串口模式和波特率控制位:
SCON=SCON,0x50;//设置串口工作在模式1(8位数据,可变波特率)PCON=PCON,0x80;//设置波特率控制位,使能T1控制波特率
5.启动定时器T1:
TR1=1;//启动定时器T1
通过以上步骤,就可以计算并设置51单片机串口的波特率初值。

需要注意的是,由于计算初值时取整会导致一定的误差,因此实际波特率可能会略有偏差。

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)滤波器:用于滤除噪声干扰。

51单片机串口工作方式0和1解析

51单片机串口工作方式0和1解析

RXD
7.1.1 串行口控制寄存器SCON b7 b6 b5 b4 b3 b2 b1 TI b0 RI
SM0 SM1 SM2 REN TB8 RB8
9FH 9EH 9DH 9CH 9BH 9AH 99H 98H
SM0、SM1 —— 串行接口工作方式定义位
• SM0、SM1 = 00 —— 方式 0,8位同步移位寄存器 • SM0、SM1 = 01 —— 方式 1,10 位异步接收发送 • SM0、SM1 = 10 —— 方式 2,11 位异步接收发送 • SM0、SM1 = 11 —— 方式 3,11 位异步接收发送 注意: 方式 0 的特点,方式 2、方式 3 的差异
寄存器 SCON、PCON、SBUF
寄存器 IE、IP
• MCS-51 单片机串Fra bibliotek接口工作方式 方式 0 方式 2 方式 1 方式 3
有两个数据缓冲寄存器 SBUF,一个输入移位寄存器,一个 串行控制寄存器SCON和一个特殊功能寄存器PCON等组成。 8 位SBUF是全双工串行接口寄存器, 它是特殊功能寄存器, 地址为 99H,不可位寻址;串行输出时为发送数据缓冲器,发送
时钟振荡频率为6MHz或12 MHz时,产生的比特率偏差较大, 故用到串口通信时通常选用11.0592MHZ晶体振荡器。
串行口的结构
• MCS-51 单片机串行接口的硬件
P3.0 位的第二功能 —— 收端 RXD P3.1 位的第二功能 —— 发端 TXD
• MCS-51 单片机串行接口的控制
比特率 比特率
= /12
P.110
=
/32 计1次 计3次 计3次 计6次 计12次 计24次
=
/12/计次/16

51单片机的串口通信程序(C语言)

51单片机的串口通信程序(C语言)

#include <reg52.h>#include<intrins.h>#include <stdio.h>#include <math.h>#define uchar unsigned char#define uint unsigned intsbit Key1 = P2^3;sbit Key2 = P2^2;sbit Key3 = P2^1;sbit Key4 = P2^0;sbit BELL = P3^6;sbit CONNECT = P3^7;unsigned int Key1_flag = 0;unsigned int Key2_flag = 0;unsigned int Key3_flag = 0;unsigned int Key4_flag = 0;unsigned char b;unsigned char code Num[21]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00, 0x10,0x89};unsigned char code Disdigit[4] = {0x7F,0xBF,0xDF,0xEF};unsigned char Disbuf[4];void delayms(uint t){uint i;while(t--){/* 对于11.0592M时钟,约延时1ms */for (i=0;i<125;i++){}}}//-----------------------------------------------------void SendData(uchar Dat){uchar i=0;SBUF = Dat;while (1){if(TI){TI=0;break;}}}void ScanKey(){if(Key1 == 0){delayms(100); if(Key1 == 0){Key1_flag = 1; Key2_flag = 0; Key3_flag = 0;Key4_flag = 0;Key1 = 1;}else;}if(Key2 == 0){delayms(100);if(Key2 == 0){Key2_flag = 1; Key1_flag = 0; Key3_flag = 0;Key4_flag = 0;Key2 = 1;}else;}if(Key3 == 0){delayms(50);if(Key3 == 0){Key3_flag = 1; Key1_flag = 0; Key2_flag = 0;Key4_flag = 0;Key3 = 1;}else;}if(Key4 == 0){delayms(50);if(Key4 == 0){Key4_flag = 1;Key1_flag = 0;Key2_flag = 0;Key3_flag = 0;Key4 = 1;}else;}else;}void KeyProc(){if(Key1_flag){TR1 = 1;SendData(0x55);Key1_flag = 0; }else if(Key2_flag){TR1 = 1;SendData(0x11); Key2_flag = 0;}else if(Key3_flag) {P1=0xff;BELL = 0;CONNECT = 1;Key3_flag = 0;}else if(Key4_flag){CONNECT = 0;BELL = 1;Key4_flag = 0;}else;}void Initdisplay(void){Disbuf[0] = 1;Disbuf[1] = 2;Disbuf[2] = 3;Disbuf[3] = 4;}void Display() //显示{unsigned int i = 0;unsigned int temp,count;temp = Disdigit[count]; P2 =temp;temp = Disbuf[count];temp = Num[temp];P0 =temp;count++;if (count==4)count=0;}void time0() interrupt 1 using 2 {Display();TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;}void main(){Initdisplay();TMOD = 0x21;TH0 = (65535 - 2000)/256;TL0 = (65535 - 2000)%256;TR0 = 1;ET0 = 1;TH1 = 0xFD; //11.0592MTL1 = 0xFD;PCON&=0x80;TR1 = 1;ET1 = 1;SCON = 0x40; //串口方式REN = 1;PT1 = 0;PT0 = 1;EA = 1;while(1){ScanKey();KeyProc();if(RI){Disbuf[0] = 0;Disbuf[1] = 20;Disbuf[2] = SBUF>>4;Disbuf[3] = SBUF&0x0f;RI = 0;}else;}}51单片机串口通信C语言程序2**************************************************************; 平凡单片机工作室;ckss.asm;功能:反复向主机送AA和55两个数;主机使用一个串口调试软件设置19200,n,8,1***************************************************************/#include "reg51.h"#define uchar unsigned char#define uint unsigned int//延时程序//////////////////由Delay参数确定延迟时间*/void mDelay(unsigned int Delay){ unsigned int i;for(;Delay>0;Delay--){ for(i=0;i<124;i++){;}}}//////////////////// 主程序////////////////////void main(){ uchar OutDat; //定义输出变量TMOD=0x20; //TMOD=0TH1=0xf3; //12MHZ ,BPS:4800,N,8,1TL1=0xf3;PCON=0x80; //方式一TR1=1; //?????????????????????????????SCON=0x40; //串口通信控制寄存器模式一OutDat=0xaa; //向串口发送固定数据值for(;;) //循环程序{SBUF=OutDat;//发送数据for(;;){ if(TI) //发送中断位当发送停止位时置1,表示发送完成break;}mDelay(500);TI=0; //清零中断位OutDat=~OutDat; //显示内容按位取反}}。

QT串口与51单片机通信

QT串口与51单片机通信

QT串口与51单片机通信通过这个小例子主要想说明QT怎样进行线程编程的思想,实例如图,好吧,下面是过程上一个例子我们采用的是手工编写代码的方法,这个例子我们来玩一下designer,其实Qt4己经把界面与功能分开了,用designer来进行界面设计,再手工编写一些功能,如信号与槽,这样开发效率会大大提高,呵呵,开一个终端,输入/usr/local/Trolltech/Qt-4.5.1/bin/designer,如果第一次打开出现字体不对,可以打开qtconfig进行一些相关配置,打开后我们新建一个Main Window,在右边的属性框中设置一下界面大小,我ARM板的LCD大小为320x240,所以我也设为320x240;左边是一些我们常用的窗口部件,这里我们用到一个lable标签来做显示,再放几个pushButton按钮,在属性objectName重新更改它的名字,改为我们记得的,这样在写功能时记得哪个按钮叫什么名字,对于一个初学QT的人来说,很想知道每一个部件到底有什么信号和槽,别急,我们可以这样来看,选中一个lable,按F4,再点击lable拖动出现接地符号时松开,弹出编辑信号与槽,这时左边列出的是信号,右边为槽,这里我们不用配置连接,等下我们再手工写,最后我们用到一个lable标签和三个pushButton按钮,并命名为dis_label、writeButton、readButton、closeButton,然后保存为mainwindow.ui,这样designer就完工了,呵呵..下面我们编写一个线程,用于管理串口收发工作,它不涉及到任何界面,只做好它的本份工作就得了,编写一个thread.h文件gedit thread.h,#ifndef THREAD_H#define THREAD_H#include<QThread>class Thread:public QThread{Q_OBJECTpublic:Thread();char buf[128];volatile bool stopped;volatile bool write_rs;volatile bool read_rs;protected:virtual void run();};#endif我们定义一个Thread类,它继承于QThread,看到只设有一些变量和一个run函数,virtual表示为虚函数,你也可以去掉,加上去会增加一些内存开销,但提高了效率,对于这个小程序是看不出什么效果的,volatile这个大家都懂了吧,就是防止偷懒,呵呵,再看看thread.cpp#include"thread.h"#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h> //串口用到的#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <strings.h>#define BAUDRATE B9600//#define RS_DEVICE "/dev/ttyS0" //串口1#define RS_DEVICE "/dev/ttySAC1" //串口1Thread::Thread(){} //析构void Thread::run() //这就是线程的具体工作了{int fd,c=0,res;struct termios oldtio,newtio; //termios结构是用来保存波特率、字符大小等printf("start...\n");fd=open(RS_DEVICE,O_RDWR|O_NOCTTY); //以读写方式打开串口。

MCS-51单片机串行通信

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。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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. 数据丢失
当发送方连续发送数据时,接收方可能会出现数据丢失的情况。

这是因为接收方没有及时读取和处理数据。

解决方法是及时读取SBUF 寄存器中的数据,并进行相应的处理。

3. 噪声干扰
在串口通信中,可能会受到外界的电磁干扰,导致通信中断或数据错误。

解决方法是加入电磁屏蔽或选择合适的通信线路,以减小信号干扰。

4. 缓冲区溢出
当接收方的数据处理速度跟不上发送方的发送速度时,可能会导致接收缓冲区溢出。

解决方法是增加接收缓冲区的大小或优化接收方的数据处理算法。

结语
51单片机串口通信是嵌入式系统中常见并且重要的通信方式。

通过本文的介绍,我们了解了串口通信的原理、使用方法以及一些常见问题与解决方法。

希望可以帮助读者更好地理解和运用51单片机串口通信技术。

相关文档
最新文档