精华内容
下载资源
问答
  • 51单片机串口通信程序

    热门讨论 2012-06-10 15:35:52
    51单片机串口通信程序, 确认调式通过。
  • 51 单片机串口通信程序,RS232串口通信 含详细例子。 含详细例子,RS232串口通信单片机接收发送数据的 C51程序,手把手教你用增强型51 实验板实现RS232 串口通信 51串口通信
  • 51单片机串口通信程序集 呵呵 很有用的 好东西大家一起分享啊
  • 51单片机的所有串口程序集合,多串口串口通讯,单串口通讯,
  • 使用串口调试助手观察51单片机keil环境实现的串口通信程序。含串口调试助手和USB驱动。
  • stc51单片机串口通信程序

    万次阅读 多人点赞 2019-04-12 17:37:06
    51单片机串口通信,是全双工的,就是可以同时收/发的,互相不影响的。 串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。 但是,对于接收或发送,确实是接收到一...

    首先请大家认真看下预备知识:_
    (耐心一点)
    51单片机的串口通信,是全双工的,就是可以同时收/发的,互相不影响的。
    串口是可以同时收/发的,虽然都是用SBUF,但却是两个独立的寄存器,互不影响,只是都叫一个名,SBUF。
    但是,对于接收或发送,确实是接收到一个字节以后才能接收下一个,不可能同时接收几个。对于送,也是同样的,发送一个字节数据后,要等发送完成了,才能再发下一个。
    接收和发送,可先定义一两个变量,如,接收用rec变量保存,发送数据在send变量中。
    发送时,SBUF=send;while(TI==0);TI=0;//这是用查询方式发送的。当一个字节的数据发送完成后,就会自动置TI=1,所以,可以查询TI=1时,就说明是发送结束了。如果是允许中断,就是会产生中断,判断TI=1,就是发送中断,要用指令清0,就是TI=0;
    接收时, 当收到一个数据后,也会自己置RI=1,通常,接收都是中断方式,所以, 当RI=1, 就会产生中断。而响应中断,执行中断程序,就要用指令清0,即中断中判断是RI=1,说明是接收中断,RI=0; 清除RI。
    接 收数据:rec=SBUF; 就行了。如果是接收一组数据,可以定义一个数组,用数组保存接收一组数据就行了。
    SBUF中不能存放数据,收到后必须立即读取,否则,下一个数据到了就被替代了。RI和TI置1,是硬件自动的,就是这么设计的,想改也改不了的。
    多个字节发送和接收,可以用循环控制次数。
    下面附上代码:(具体原理不再讲述可以自己搜一下学一学)

    /**************************************************************************************
    *		              串口通信实验												  *
    实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示
    			在串口助手上。
    注意事项:无。																				  
    ***************************************************************************************/
    
    #include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
    
    typedef unsigned int u16;	  //对数据类型进行声明定义
    typedef unsigned char u8;
    
    
    /*******************************************************************************
    * 函数名         :UsartInit()
    * 函数功能		   :设置串口
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void UsartInit()
    {
    	SCON=0X50;			//设置为工作方式1
    	TMOD=0X20;			//设置计数器工作方式2
    	PCON=0X80;			//波特率加倍
    	TH1=0XF3;				//计数器初始值设置,注意波特率是9600的
    	TL1=0XF3;
    	ES=1;						//打开接收中断
    	EA=1;						//打开总中断
    	TR1=1;					//打开计数器
    }
    
    /*******************************************************************************
    * 函 数 名       : main
    * 函数功能		 : 主函数
    * 输    入       : 无
    * 输    出    	 : 无
    *******************************************************************************/
    void main()
    {	
    	UsartInit();  //	串口初始化
    	while(1);		
    }
    
    /*******************************************************************************
    * 函数名         : Usart() interrupt 4
    * 函数功能		  : 串口通信中断函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void Usart() interrupt 4
    {
    	u8 receiveData;
    
    	receiveData=SBUF;//出去接收到的数据
    	RI = 0;//清除接收中断标志位
    	SBUF=receiveData;//将接收到的数据放入到发送寄存器
    	while(!TI);			 //等待发送数据完成
    	TI=0;						 //清除发送完成标志位
    }
    
    

    我的单片机是STC90C516RD+属于51系列的,我的晶振频率是11.899MHZ。
    对于初值的计算机可以使用如下软件:
    在这里插入图片描述

    其中注意:(1)计算初值时,波特率是加倍之前(对于SMOD=1时这种情况)的波特率。
    (2)软件是51波特率初值计算,还有一个是定时器初值计算,不要下载错误
    下面就是烧录程序了,连接好USB线,打开串口助手软件,设置波特率4800
    如下图:
    在这里插入图片描述
    枣红色框框里面是波特率设置的地方,波特率为4800,绿色框框和红色框框(挨着绿色的那个)是模式的设置,文本模式如图,hex模式则是数字(16进制的)。

    展开全文
  • 串口通信简介串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。本文...

    串口通信简介

    串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。

    本文主要介绍单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。

    6c2299b4037dc9f23be8a3050d069ba0.png

    一、原理简介

    51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。

    与之前一样,首先我们来了解单片机串口相关的寄存器

    SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。

    串行口控制寄存器SCON(见表1) 。

    fb073a6f826d3409e77d6a376adaa6f6.png

    表中各位(从左至右为从高位到低位)含义如下。

    SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。

    0ae0ed6584a1bb69314bf8e69b41bb5a.png

    其中,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,从而识别接收到的数据特征。

    TI :串行口发送中断请求标志。当CPU 发送完一串行数据后,此时SBUF 寄存器为空,硬件使TI 置1,请求中断。CPU 响应中断后,由软件对TI 清零。

    RI :串行口接收中断请求标志。当串行口接收完一帧串行数据时,此时SBUF 寄存器为满,硬件使RI 置1,请求中断。CPU 响应中断后,用软件对RI 清零。

    电源控制寄存器PCON(见表3) 。

    fd931b32891fd13c4222907b90120115.png

    表中各位(从左至右为从高位到低位)含义如下。

    SMOD :波特率加倍位。SMOD=1,当串行口工作于方式1、2、3 时,波特率加倍。SMOD=0,波特率不变。

    GF1、GF0 :通用标志位。

    PD(PCON.1) :掉电方式位。当PD=1 时,进入掉电方式。

    IDL(PCON.0) :待机方式位。当IDL=1 时,进入待机方式。

    波特率计算:在了解了串行口相关的寄存器之后,我们可得出其通信波特率的一些结论:

    ① 方式0 和方式2 的波特率是固定的。

    在方式0 中, 波特率为时钟频率的1/12, 即fOSC/12,固定不变。

    在方式2 中,波特率取决于PCON 中的SMOD 值,即波特率为:

    47fee70c64732a31b05c1276b127a4e4.png

    当SMOD=0 时,波特率为fosc/64 ;当SMOD=1 时,波特率为fosc/32。

    ② 方式1 和方式3 的波特率可变,由定时器1 的溢出率决定。

    6490cab786e9f2a9333a475c4bcf4b4a.png

    当定时器T1 用作波特率发生器时,通常选用定时初值自动重装的工作方式2( 注意:不要把定时器的工作方式与串行口的工作方式搞混淆了)。其计数结构为8 位,假定计数初值为Count,单片机的机器周期为T,则定时时间为(256 ?Count)×T 。从而在1s内发生溢出的次数(即溢出率)可由公式(1)所示:

    df014e18dde5d28892a99c398257153c.png

    从而波特率的计算公式由公式(2)所示:

    ef66914fc6d41d8d0afeb5c0a9bf3e20.png

    在实际应用时,通常是先确定波特率,后根据波特率求T1 定时初值,因此式(2)又可写为:

    bf31f09e4095d899a2397171ffcd985d.png

    二、电路详解

    下面就对图1 所示电路进行详细说明。

    ce83cc80fbb053c347a0ff5816100e68.png

    最小系统部分(时钟电路、复位电路等)第一讲已经讲过,在此不再叙述。我们重点来了解下与计算机通信的RS-232 接口电路。可以看到,在电路图中,有TXD 和RXD 两个接收和发送指示状态灯,此外用了一个叫MAX3232 的芯片,那它是用来实现什么的呢?首先我们要知道计算机上的串口是具有RS-232 标准的串行接口,而RS-232 的标准中定义了其电气特性:高电平“1”信号电压的范围为-15V~-3V,低电平“0”

    信号电压的范围为+3V~+15V。可能有些读者会问,它为什么要以这样的电气特性呢?这是因为高低电平用相反的电压表示,至少有6V 的压差,非常好的提高了数据传输的可靠性。由于单片机的管脚电平为TTL,单片机与RS-232 标准的串行口进行通信时,首先要解决的便是电平转换的问题。一般来说,可以选择一些专业的集成电路芯片,如图中的MAX3232。MAX3232 芯片内部集成了电压倍增电路,单电源供电即可完成电平转换,而且工作电压宽,3V~5.5V 间均能正常工作。其典型应用如图中所示,其外围所接的电容对传输速率有影响,在试验套件中采用的是0.1μF。

    值得一提的是MAX3232 芯片拥有两对电平转换线路,图中只用了一路,因此浪费了另一路,在一些场合可以将两路并联以获得较强的驱动抗干扰能力。此外,我们有必要了解图中与计算机相连的DB-9型RS-232的引脚结构(见图2)。

    3d3e0714d21c7e6ffac5920973a7a871.png

    其各管脚定义如下(见表4)。

    27bb8208445b3c70991b22fc704ee3f2.png
    展开全文
  • 串口通信简介串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。本文...

    串口通信简介

    串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。

    本文主要介绍单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。

    77797117a6ad2d3754ffdb1ee963f671.png

    一、原理简介

    51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。

    与之前一样,首先我们来了解单片机串口相关的寄存器

    SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是对接收缓冲器的操作还是对发送缓冲器的操作。从而控制外部两条独立的收发信号线RXD(P3.0)、TXD(P3.1),同时发送、接收数据,实现全双工。

    串行口控制寄存器SCON(见表1) 。

    ac64bbb1cb30b6e409d04509e6ab2b16.png

    表中各位(从左至右为从高位到低位)含义如下。

    SM0 和SM1 :串行口工作方式控制位,其定义如表2 所示。

    23fcdfdb93c1f4d9c903a2a1702182d3.png

    其中,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,从而识别接收到的数据特征。

    TI :串行口发送中断请求标志。当CPU 发送完一串行数据后,此时SBUF 寄存器为空,硬件使TI 置1,请求中断。CPU 响应中断后,由软件对TI 清零。

    RI :串行口接收中断请求标志。当串行口接收完一帧串行数据时,此时SBUF 寄存器为满,硬件使RI 置1,请求中断。CPU 响应中断后,用软件对RI 清零。

    电源控制寄存器PCON(见表3) 。

    19ca067d5ef4b2e895706538dfe7c666.png

    表中各位(从左至右为从高位到低位)含义如下。

    SMOD :波特率加倍位。SMOD=1,当串行口工作于方式1、2、3 时,波特率加倍。SMOD=0,波特率不变。

    GF1、GF0 :通用标志位。

    PD(PCON.1) :掉电方式位。当PD=1 时,进入掉电方式。

    IDL(PCON.0) :待机方式位。当IDL=1 时,进入待机方式。

    波特率计算:在了解了串行口相关的寄存器之后,我们可得出其通信波特率的一些结论:

    ① 方式0 和方式2 的波特率是固定的。

    在方式0 中, 波特率为时钟频率的1/12, 即fOSC/12,固定不变。

    在方式2 中,波特率取决于PCON 中的SMOD 值,即波特率为:

    c75cc99f46f4f775f754033050a741b4.png

    当SMOD=0 时,波特率为fosc/64 ;当SMOD=1 时,波特率为fosc/32。

    ② 方式1 和方式3 的波特率可变,由定时器1 的溢出率决定。

    34390c5ff431849552d181319481a30a.png

    当定时器T1 用作波特率发生器时,通常选用定时初值自动重装的工作方式2( 注意:不要把定时器的工作方式与串行口的工作方式搞混淆了)。其计数结构为8 位,假定计数初值为Count,单片机的机器周期为T,则定时时间为(256 ?Count)×T 。从而在1s内发生溢出的次数(即溢出率)可由公式(1)所示:

    47e10eaae94b2c03f65671a226b77b2c.png

    从而波特率的计算公式由公式(2)所示:

    9f5fe72956baae9685c59c1bd08ef7f8.png

    在实际应用时,通常是先确定波特率,后根据波特率求T1 定时初值,因此式(2)又可写为:

    cb172c46d21c12f09acc9e1f8ef47319.png

    二、电路详解

    下面就对图1 所示电路进行详细说明。

    0217ea5cdb7a241e296bd7fe842da56c.png

    最小系统部分(时钟电路、复位电路等)第一讲已经讲过,在此不再叙述。我们重点来了解下与计算机通信的RS-232 接口电路。可以看到,在电路图中,有TXD 和RXD 两个接收和发送指示状态灯,此外用了一个叫MAX3232 的芯片,那它是用来实现什么的呢?首先我们要知道计算机上的串口是具有RS-232 标准的串行接口,而RS-232 的标准中定义了其电气特性:高电平“1”信号电压的范围为-15V~-3V,低电平“0”

    信号电压的范围为+3V~+15V。可能有些读者会问,它为什么要以这样的电气特性呢?这是因为高低电平用相反的电压表示,至少有6V 的压差,非常好的提高了数据传输的可靠性。由于单片机的管脚电平为TTL,单片机与RS-232 标准的串行口进行通信时,首先要解决的便是电平转换的问题。一般来说,可以选择一些专业的集成电路芯片,如图中的MAX3232。MAX3232 芯片内部集成了电压倍增电路,单电源供电即可完成电平转换,而且工作电压宽,3V~5.5V 间均能正常工作。其典型应用如图中所示,其外围所接的电容对传输速率有影响,在试验套件中采用的是0.1μF。

    值得一提的是MAX3232 芯片拥有两对电平转换线路,图中只用了一路,因此浪费了另一路,在一些场合可以将两路并联以获得较强的驱动抗干扰能力。此外,我们有必要了解图中与计算机相连的DB-9型RS-232的引脚结构(见图2)。

    934cd06a0de804b7811c3ec87daec701.png

    其各管脚定义如下(见表4)。

    fe13a8efd0bf902bfa900d90ce594a34.png
    展开全文
  • 利用汇编编写51单片机串口通信程序,实现对于按键次数的显示 题目如下 甲乙两个单片机之间通信,其中甲机连接有8个流水灯循环闪烁和一个按键,乙机连接有一个LED数码管,按下甲机的按键,流水灯闪烁不受影响,乙机...

    利用汇编编写51单片机串口通信程序,实现对于按键次数的显示

    题目如下

    甲乙两个单片机之间通信,其中甲机连接有8个流水灯循环闪烁和一个按键,乙机连接有一个LED数码管,按下甲机的按键,流水灯闪烁不受影响,乙机显示按键按下的次数。

    U1发送端代码

    ORG 0000H
    LJMP MAIN
    ORG 0013H
    LJMP SEND
    ORG 0100H
    MAIN: MOV TH1,#0FDH
    MOV TL1,#0FDH
    MOV TMOD,#20H
    SETB EX1
    SETB EA
    SETB TR1
    SETB IT1
    MOV SCON,#50H
    MOV A,#0FEH

    START: MOV P1,A
    LCALL DELAY
    RL A
    LJMP START

    SEND: MOV B,#0
    MOV SBUF,B
    JNB TI,$ ;发送标志,ti=0时未发送,ti=1时发送
    CLR TI;清零,重新发送
    RETI

    DELAY: MOV R7,#05H
    LOOP:MOV R6,#0FFH
    LOOP1:MOV R5,#0FFH
    DJNZ R5,$
    DJNZ R6,LOOP1
    DJNZ R7,LOOP
    RET

    END

    U2接收端代码

    ORG 0000H
    LJMP START
    ORG 0100H
    START: MOV TH1,#0FDH
    MOV TL1,#0FDH
    MOV TMOD,#20H
    SETB TR1
    SETB EA
    MOV SCON,#50H
    MOV A,#1

    WAIT: JNB RI,$
    MOV R4,SBUF
    CJNE R4,#0,WAIT
    CPL P0.0
    MOV DPTR,#TAB
    PUSH ACC
    MOVC A,@A+DPTR
    MOV P0,A
    POP ACC
    INC A
    CJNE A,#10,COUNT
    MOV A,#0

    COUNT: CLR RI
    LJMP WAIT

    TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H
    DB 82H,0F8H,80H,90H

    END
    

    结果如下图所示

    在这里插入图片描述

    展开全文
  • 含详细例子,RS232串口通信单片机接收发送数据的 C51程序,手把手教你用增强型51 实验板实现RS232 串口通信
  • 基于51单片机的一个串口程序 用中断实现波特率的调整
  • 本意是通过串口发送4个字节数据,单片机串口接收后,发送回4个字节数据(在串口助手显示出来)。 但我通过uvison3下载到stc12c5a60s2最少单片机系统,通过串口测试工具(波特率19200,校验位:无,数据位:8,停止...
  • 看了很多串口通信,应该是配置问题很多代码烧进去都不对,或者没有反应。 代码控制输入,串口输出区输出自己想要的数据,下面直接上代码:(代码亲测有效) /*****************************************************...
  • C51单片机串口通信控制与信号反馈 作者:nathen_zhang 博客:http://hi.baidu.com/nathen 将单片机与电脑串口相连,电脑发送数0~9到单片机,单片机相应的P2的0~7端口和P1的0~1端口将输出高(或低)电平, ...
  • 51单片机串口通信软件程序
  • 程序用于51单片机串口通信发送程序,波特率为9600,
  • C51单片机串口通信程序.txt C51单片机串口通信程序.txt
  • 物联网STM32入门 - 直播课程 - 创客学院​www.makeru.com.cn本文我们主要讲单片机串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。一、原理简介51 单片机内部有一个全双工...
  • 本文主要为51单片机串口通信点亮led灯程序,下面一起来学习下
  • 51单片机的简单串口通信测试程序,串口发送什么回什么
  • C51单片机串口通信C程序,实现PC与单片机的通信,本例主要实现将PC机发给单片机的数据再发回给PC机,可以借助串口调试工具进行调试
  • 这是我自己写的51单片机串口通信的c#界面代码,供学习使用,有兴趣的可以下下研究研究!
  • 通过C语言实现51单片机串口通信,上位机发送相应数字单片机接收数字点亮相应小灯并返回接收到的数据;
  • 51单片机串口通信C++源程序 含有程序中文注释
  • 51单片机串口通信

    2016-08-28 15:05:13
    51单片机与PC机串口通信程序
  • 51单片机串口通信代码作者:佚名来源:本站原创点击数:9407更新时间:2007年06月17日【字体:大中小】1.发送:向总线上发命令2.接收:从总线接收命令,并分析是地址还是数据。3.定时发送:从内存中取数并向主机发送....
  • S51单片机串口通信程序,已经通过调试。
  • 关于51单片机串口通信的讲解的博客有很多,这里就不再详细讲解。下面给出程序 1.uart.h #ifndef __UART__ #define __UART__ typedef unsigned char u8; void UART_Init(); void UART_Send_Data(u8 byte); u8 UART_...
  • 51单片机串口通信讲解,从原理、使用方法,程序例程多方面介绍。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 672
精华内容 268
关键字:

51单片机串口通信程序