51单片机串口传输汉字总结
单片机多机串口的通信

摘要本文详细介绍了基于RS-485总线的单片机与多台单片机间的串行通信原理、实现方法和相应的通信硬件、软件设计。
该设计是由单片机与单片机组成的主从控制系统,其中单片机做为上位机对下位单片机是实现控制和监视功能。
它包括通信和控制两个功能模块。
单片机作为下位机在整个系统中属于从属地位,主要用来接收上位机的命令。
由于此通信的单片接口是RS232的9针接口,且下位机数目有限(32台)。
所以本设计采用了RS485总线以及RS232转RS485的协议芯片以满足长距离多机通信,本文讨论了总线接口转换、主从式通信协议设计方法,给出了采用中断式处理的通信过程流程图,并叙述了设计过程中必备的绘图软件Protel DXP的应用,以及编辑源代码软件keil uVision2的应用,实现了单片机对多个单片机组成采集终端的通信与管理。
关键词:单片机单片机RS-485 通信AbstractThe communication 、realized method and corresponding design of hardware and software between 单片and multiple MCUs based on RS-485 is described in detai in the article. This design instroduces a pincipal and subordinate control system which is composed of 单片and single chip. Divided from its function, it includes two parts: communication and control, in which 单片is used as master, and MCUs is used as slave so as to receive the single order from the master.The bus interface conversion and the design of master-slave communication protocol is introduced and The program flowchart of communication with interrupt process is also given. In the process of design, the use of unnecessary painter software and code editor software is depicted so that realize the communication and administration between 单片and multiple MCUs which composed collection terminal.Keywords: 单片MCUs RS-485 communication目录第一章绪论 (1)第二章课题实施方案 (2)2.1 系统硬件设计 (2)2.2 系统软件设计 (3)第三章硬件电路设计 (9)3.1 C51单片机结构 (9)一CPU结构 (10)二ROM存储器 (11)三I/O端口 (11)四定时器/计数器 (12)五中断系统 (13)3.1.2 51单片机引脚功能及其连接 (13)3.1.3 51 中断系统 (15)3.1.4 C-51的串行通信 (15)3.2.1串行接口RS232结构与引脚功能 (21)3.3 Protel DXP 2004原理图设计 (23)3.3.1 Protel 2004的基本操作 (23)3.3.2绘制原理图 (25)3.3.3制作芯片原理图库 (27)第四章软件电路设计 (30)4.1 系统的通信协议 (31)4.2 C51编程实现单片机与单片机之间的串行通信 (31)4.3 Windows集成开发环境uVision2 (35)4.3.1启动uVision2 (35)4.3.2创建程序 (36)总结 (41)致谢 (42)参考文献 (43)第一章绪论单片机由于其具有控制功能强、设计灵活和性能价格比高的特点。
单片机串口通信协议

单片机串口通信协议1. 引言单片机串口通信是一种常见的数据通信方式,它允许单片机与其他外部设备进行通信。
串口通信协议定义了数据传输的格式、波特率等参数,确保通信的稳定和可靠性。
本文将介绍单片机串口通信协议的基本原理和常用协议。
2. 串口通信基础串口通信是通过串行数据传输来实现的。
其中,UART(通用异步收发传输器)是实现串口通信的重要组件。
UART将并行数据转换为串行数据,并通过串口进行传输。
在单片机中,常用的串口通信引脚是TX(发送)和RX(接收)。
3. 串口通信协议串口通信协议定义了数据传输时各个数据包的格式和规则。
常见的串口通信协议有以下几种:3.1. RS-232RS-232是最早出现的串口通信协议之一。
它定义了数据传输的电气特性和信号级别。
RS-232使用9个引脚进行数据传输,包括发送和接收数据线、数据控制线等。
该协议具有较长的最大传输距离和可靠性,但通信速率相对较慢。
3.2. RS-485RS-485是一种多点通信的串口协议。
相比于RS-232,RS-485支持多个设备之间的通信。
它使用不同的信号级别和电气特性,可实现更远的传输距离和更高的通信速率。
RS-485通信中设备分为主设备和从设备,主设备负责控制通信流程。
3.3. SPISPI(Serial Peripheral Interface)是一种同步串口通信协议,常用于单片机与外部设备之间的通信。
SPI使用四条引脚进行通信,包括时钟线、数据线、主设备输出从设备输入线和主设备输入从设备输出线。
SPI通信速率较快,适用于高速数据传输。
3.4. I2CI2C(Inter-Integrated Circuit)是一种多主从通信的串口协议。
I2C使用两条引脚进行通信,包括时钟线和数据线。
在I2C总线上,可以连接多个设备,实现多个设备之间的通信和数据交换。
I2C通信速率较慢,但具有较简单的硬件设计和较低的功耗。
4. 协议选择和配置选择合适的串口通信协议需要考虑通信距离、通信速率、设备数量等因素。
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可以根据实际需求进行设置。
单片机原理及接口技术AT89S51单片机系统的串行扩展

单片机原理及接口技术AT89S51单片机系统的串行扩展在单片机系统中,为了扩展其功能和使用,需要与其他外部设备进行通信。
串行通信是一种常见的通信方式,它通过将数据逐位地进行传输和接收。
AT89S51单片机具有多种功能引脚,可以用来实现串行扩展。
包括UART串口、SPI接口和I2C总线等。
UART串口是一种常用的串行通信接口,它使用两根引脚(TXD和RXD)进行数据传输。
在AT89S51单片机中,可以使用其内置的UART模块来实现串行扩展。
首先,需要设置串口的波特率、数据位、停止位和校验位等参数。
然后,在程序中通过读写串口数据寄存器来进行数据的传输和接收。
SPI接口是一种全双工的串行通信接口,它使用四根引脚(SCLK、MISO、MOSI和SS)进行数据的传输和接收。
在AT89S51单片机中,可以使用其内置的SPI模块来实现串行扩展。
首先,需要设置SPI的工作模式、数据位、时钟极性和相位等参数。
然后,在程序中通过读写SPI数据寄存器来进行数据的传输和接收。
I2C总线是一种双向的串行通信总线,它使用两根引脚(SDA和SCL)进行数据的传输和接收。
在AT89S51单片机中,可以通过软件实现I2C总线的功能。
首先,需要设置I2C的时钟频率和器件地址等参数。
然后,在程序中通过控制I2C总线的起始、停止、发送和接收来进行数据的传输和接收。
串行扩展可以实现单片机与其他外设的数据交互,包括和PC机的通信、与传感器的连接等。
通过串行扩展,单片机能够实现更复杂的功能和应用。
在编程过程中,需要合理地使用串口、SPI接口和I2C总线等技术,根据具体的应用需求选择合适的通信方式。
总之,单片机原理及接口技术是一种重要的扩展技术,可以极大地增强单片机的功能和使用。
在AT89S51单片机系统中,串行扩展是一种常见的技术。
通过合理地使用UART串口、SPI接口和I2C总线等技术,可以实现单片机与其他外设的数据交互,进而实现更复杂的功能和应用。
深藏不露的‘NUL‘(51单片机串口通讯是遇到的错误之一)

深藏不露的‘NUL‘(51单片机串口通讯是遇到的错误之一)NUl 的定义:C 语言中规定以字符\0 作为字符串结束标志。
\0 是一个ASCII 码为0 的字符,从ASCII 码表中可以看到ASCII 码为0 的字符是空操作字符,它不引起任何控制动作,也不是一个可显示的字符这是本人在用单片机做串口通讯时遇到的小问题,因为那个电子设备比较特殊,发送的数据也是比较的特殊,所以我便遇到了这个问题。
一开始按照预定的指令和电子设备通讯,总是不行,后来通过串口调试器才发现,发送的数据只能发送一半。
于是我返回去看代码,这才发现了症结所在。
以下便是我的程序出错的原因:出错的程序代码段:void Send_data(char p[]){a=0;while(p[a] != \0){SBUF = p[a]; //SUBF 接受/发送缓冲器(又叫串行通信特殊功能寄存器)while(!TI);// 等特数据传送(TI 发送中断标志)TI = 0;// 清除数据传送标志a++; // 下一个字符} }调用该程序的代码段:const char Message[8]={0x01,0x03,0x00,0xB9,0x00,0x02,0x15,0xEE};while(1){ if (Flag==1){Send_data(Message);while(TI!=0);TI=0;Flag=0;}}(刚开始的时候没发现,很郁闷,通过串口调试器才找到原因。
)对于程序错误的分析:程序执行到0x00==p[2]时,即相当于\0==p[2];(即遇到NUL 退出)到这一步程序的判断结束,发送函数也结束。
在C 语言中\0 其实就是ASCII 码表上值为0 的,它是不显示的。
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); //以读写方式打开串口。
单片机基础知识点总结(热门6篇)

单片机基础知识点总结第1篇MCS-51单片机是标准数字电路芯片,其输入输出引脚电平符合TTL电平规则(高电平逻辑3 -5V,低电平逻辑0-1V),该电平标准有效传输距离较短(15米以内),不适于远距离通信信号传输。
为了提高串行通信可靠性,增大通信距离,人们定义了各种新的通信电平标准。
后经美国电子工业协会(EIA)指定标准规范化,形成RS422,RS232,RS485三种异步串行通信电平标准和硬件接口协议。
RS232接口标准是一种用于短距离或带调制解调器(Modem)的串行通信接口标准,1 970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的。
MCS-51单片机串行口主要由发送数据寄存器、发送控制器、输出控制门、接收数据寄存器、接收控制器、输入移位寄存器等组成SM0、 SM1:串行口工作方式选择位。
SM2:多机通信控制位。
REN:允许接收控制位。
TB8:发送的第9位数据RB8:接收的第9位数据。
TI:发送中断标志位。
RI:接收中断标志位。
当SMOD位为1,则串行口方式1、方式2、方式3的波特率加倍。
方式o通常用来外接移位寄存器,用作扩展I/O口。
方式0工作时波特率固定为: f o s c / 12 f_{osc} /12 fosc/12。
工作时,串行数据通过RXD输入和输出,同步时钟通过TXD输出。
在TI=0时,当CPU执行一条向SBUF写数据的指令时,启动发送过程。
从RXD依次发送出去,同步时钟从TXD送出。
8位数据发送完后,发送中断标志TI置位,并向CPU申请中断。
在RI=0的条件下,将REN置 “1”就启动一次接收过程。
在移位脉冲的控制下,RXD上的串行数据依次移入移位寄存器。
当8位数据全部移入移位寄存器后,8位数据送入接收数据缓冲器SBUF中,同时,接收中断标志RI置位,向CPU申请中断。
单片机基础知识点总结第2篇为了方便用户,C51编译器把S1单片机的常用的特殊功能寄存器和特殊位进行了定义,放在一个“regsl。
手把手教你学51单片机之十八 RS485通信与Modbus协议

在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。
最初采用的方式是RS232接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
除此之外,RS232接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到几十米,不能满足远距离通信要求。
而RS485则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200米,并且允许多个收发设备接到同一条总线上。
随着工业应用通信越来越多,1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus协议,本节课我们要讲解一下RS485通信和Modbus协议。
单单使用一块KST-51开发板是不能够进行RS485实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB转485通信模块。
18.1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。
2、传输速率有局限,不可以过高,一般到几十Kb/s就到极限了。
3、接口使用信号线和GND与其他设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、传输距离有限,最多只能通信几十米。
5、通信的时候只能两点之间进行通信,不能够实现多机联网通信。
针对RS232接口的不足,就不断出现了一些新的接口标准,RS485就是其中之一,他具备以下的特点:1、我们在讲A/D的时候,讲过差分信号输入的概念,同时也介绍了差分输入的好处,最大的优势是可以抑制共模干扰。
尤其工业现场的环境比较复杂,干扰比较多,所以通信如果采用的是差分方式,就可以有效的抑制共模干扰。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机串口传输汉字总结
1.串口通信中,始终应该站在单片机的主体上,所以SBUF=A表示在单片机的内存中把A的值取出放到发送的寄存器中发出去,所以,A=SBUF,表示把寄存器收到的数据赋值给单片机中的一个空间A;(SBUF是一个逻辑地址,两个物理地址)。
2.单片机中定时器只起到控制发送速度的快慢,不产生中断;
3.如果在初始化设定了REN=1(即允许串口接收数据),在单片机供电的那一刻,由于SBUF中本来就有值,所以刚刚供上电就会产生一次读中断;
# include //实例分析一//
# define uint unsigned int
# define uchar unsigned char
uchar table[]={"大家晚上好"}; 实例一的目的是为了通过串口向电脑发出
uchar *x=0;
void delay(uint z) 一串汉字“大家晚上好”,发送方式即为把
{ int i,j; 汉字转化成ASCII码发送。
for(i=0;i<z;i++)
for(j=0;j<110;j++); 程序初始化中设定REN=1,且RI初始值即为0,所以当给单片机供上电之
}
void init() 后就会产生一个读中断,程序直接进入中断服务程
{ 序。
TMOD=0X20;
TH1=0XFD; 所以“要电脑再给单片机发一个字符”后程序才能正常
TL1=0XFD; 执行下去,否则就会停留在while(!RI);处。
TR1=1; 可以通过@1和@2两个语句验证。
SM0=0;
SM1=1;
// REN=1;
EA=1;
ES=1;
}
void read_mess() interrupt 4 {
ES=0; //中断服务程序
RI=0;
*x=SBUF;
x++;
P0=0X45;@1
while(!RI);
P0=0X75;@2
RI=0;
ES=1;
}
void send_mess(uchar dat) {
ES=0;
TI=0;
SBUF=dat;
while(!TI);
TI=0;
ES=1;
}
void message(uchar *p)
{
while(*p)
{
send_mess(*p);
p++;
}
}
void main()
{
init();
while(1)
{ message(table);
delay(300);
}
}
/*******************************************************/ 实例分析二
# include
# define uint unsigned int
# define uchar unsigned char
uchar table[]="你好123";
uchar *p=table;
void init()
{
TMOD=0X20;//定时器设置为八位初值自动重装TH1=0XFD;
TL1=0XFD;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
/**********************************
串口设定开启程序
************************************/
void send_mess(uchar dat)
{
ES=0;
TI=0;
SBUF=dat;
while(!TI);
TI=0;
ES=1;
}
void delay()
{
uint i,j;
for(i=0;i<300;i++)
for(j=0;j<110;j++);
}
void message(uchar *s)
{
while(*s)
{
send_mess(*s);
s++;
} 实例二和实例一在程序设计上几乎一样,
}
void main() 若只启用第三行,则跟实例一几乎相同(实例一有读中断服务程序);但是启用第一
</z;i++)
二行代码,
{ 看似没有改变功能但是却无法正常发送汉字,
init(); 笔者仔细观察后发现,实例一跟实例而之间的
细微差别,实例一是把所有的ASCII码发送完之后
while(1) 才产生一个延时,但是实例二是每发送一个ASCII
{ 码就延时一次,笔者猜想,一个汉字是用两个
第一行// send_mess(*p); ASCII码表示的,PC机在某一个时间间隔内顺序
第二行 //p++; 接受到某个汉字的两个ASCII码,就显示为一个汉字,否则就分别显示,一般为乱码。
笔者测试当发送时间小于1ms时就可以正常显示。
第三行 message(table);
delay();
} while(1)
for(k=0;k<4;k++)
{
send_mess(*p);
p++;
// message(table);
delay();
}
message(p);
delay();
}
用上面的这段程序就可以验证笔者的想法,延时时间函数dalay()大约就是一毫秒。