单片机串口名称_一个单片机通过串口控制2个单片机串口 - CSDN
  • 串口通信好东西,但我没用过。 下面照着普中科技的ppt搬运下。  随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息...

    串口通信好东西,但我没用过。

    下面照着普中科技的ppt搬运下。


           随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。

    通信方式

    并行通信串行通信两种。

    并行通信通常是将数据字节的各位用多条数据线同时进行传送 。

    图一:并行通信

    串行通信是将数据字节分成一位一位的形式在。

    图二:串行同行

     

     

     

     

     

    串行通信的传输方向

    单工是指数据传输仅能沿一个方向,不能实现反向传输。

    半双工是指数据传输可以沿两个方向,但需要分时进行。

    全双工是指数据可以同时进行双向传输。

     

    串行通信常见的错误校验 

    奇偶校验、循环冗余校验

     

    传输速率(比特率):

    比特率是每秒钟传输二进制代码的位数,单位是:位/秒(bps)。

     

    80C51串行口的结构

    图三:串口结构

     有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H ;接收器是双缓冲结构 ;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。

     

    串行口的控制寄存器(SCON)(有点复杂,没咋整明白,以后用的时候再说)

    用以设定串行口的工作方式、接收/发送控制以及设置状态标志:

    图四:SCON

    SM0和SM1为工作方式选择位,可选择四种工作方式:

    图五:工作方式

    SM2,多机通信控制位,主要用于方式2和方式3。当接收机的SM2=1时可以利用收到的RB8来控制是否激活RI(RB8=0时不激活RI,收到的信息丢弃;RB8=1时收到的数据进入SBUF,并激活RI,进而在中断服务中将数据从SBUF读走)。当SM2=0时,不论收到的RB8为0和1,均可以使收到的数据进入SBUF,并激活RI(即此时RB8不具有控制RI激活的功能)。通过控制SM2,可以实现多机通信。在方式0时,SM2必须是0。在方式1时,如果SM2=1,则只有接收到有效停止位时,RI才置1。

    REN,允许串行接收位。由软件置REN=1,则启动串行口接收数据;若软件置REN=0,则禁止接收。

    TB8,在方式2或方式3中,是发送数据的第九位,可以用软件规定其作用。可以用作数据的奇偶校验位,或在多机通信中,作为地址帧/数据帧的标志位。在方式0和方式1中,该位未用。

    RB8,在方式2或方式3中,是接收到数据的第九位,作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。

    TI,发送中断标志位。在方式0时,当串行发送第8位数据结束时,或在其它方式,串行发送停止位的开始时,由内部硬件使TI置1,向CPU发中断申请。在中断服务程序中,必须用软件将其清0,取消此中断申请

    RI,接收中断标志位。在方式0时,当串行接收第8位数据结束时,或在其它方式,串行接收停止位的中间时,由内部硬件使RI置1,向CPU发中断申请。也必须在中断服务程序中,用软件将其清0,取消此中断申请。 

    PCON中只有一位SMOD与串行口工作有关

    图六:PCON

    SMOD(PCON.7)  波特率倍增位。在串行口方式1、方式2、方式3时,波特率与SMOD有关,当SMOD=1时,波特率提高一倍。复位时,SMOD=0。 

     

    波特率的计算(用波特率计算器)

    方式0的波特率 =  fosc/12

    方式2的波特率 =(2SMOD/64)· fosc

    方式1的波特率 =(2SMOD/32)·(T1溢出率)

    方式3的波特率 =(2SMOD/32)·(T1溢出率)

     T1 溢出率 = fosc /{12×[256 -(TH1)]}

           在单片机的应用中,常用的晶振频率为:12MHz和11.0592MHz。所以,选用的波特率也相对固定。常用的串行口波特率以及各参数的关系如表所示。

    图七:波特率

    串口如何使用 

    确定串行口控制(编程SCON寄存器);

    确定T1的工作方式(编程TMOD寄存器);

    计算T1的初值,装载TH1、TL1;

    启动T1(编程TCON中的TR1位);

    PC和单片机通信:

    #include<reg52.h>
    
    typedef unsigned char uchar;
    
    void Serial_comInit()
    {
    	SCON=0X50;			//设置为工作方式1 ,既然是方式一,自然要确定波特率,设置定时器1
    	TMOD=0X20;//8位重装载
    	PCON=0X80;
    	TH1=0xF3;//波特率4800
    	TL1=0XF3;
    	ES=1;						//打开通信中断
    	EA=1;						//打开总中断
    	TR1=1;					//打开计数器
    }
    
    void main(void)
    {
    	Serial_comInit();
    	while(1);
    }
    
    void communication() interrupt 4
    {
    	uchar receiveData;
    	receiveData=SBUF;//出去,接,收到的数据
    	RI = 0;//清除接收中断标志位
    	SBUF=receiveData;//将接收到的数据放入到发送寄存器
    	while(!TI);			 //等待发送数据完成
    	TI=0;						 //清除发送完成标志位
    }

     

     电脑发送数据到单片机:

    (来源:https://blog.csdn.net/u014453898/article/details/57123007

    
    #include<reg52.h>
    
    #define uchar unsigned char
    
    #define uint  unsigned int
    uchar buf;
    
    #define led P2
    
    void main(void)
    
    {
    
    SCON=0x50;//设定串口工作方式0101 0000
    
    PCON=0x00;
    
    TMOD=0x20;
    
    EA=1;
    
    ES=1;
    
    TL1=0xfd;//波特率9600
    
    TH1=0xfd;
    
    TR1=1;
    
    while(1);
    
    }
    
     
    
    //串行中断服务函数
    
    void serial() interrupt 4
    
    	{
    
    	ES=0;		//暂时关闭串口中断
    
    	RI=0;
    
    	buf=SBUF;	//把收到的信息从SBUF放到buf中。
    
    	switch(buf)
    
    	{
    
    	case 0x31: led=0xfe;break;   //二进制 0011 0001  十进制 49 控制字符 1  16进制 0X31
    
    	case 0x32: led=0xfd;break;	 //1111 1101
    
    	case 0x33: led=0xfb;break;
    
    	case 0x34: led=0xf7;break;
    
    	case 0x35: led=0xef;break;   
    
    	case 0x36: led=0xdf;break;	
    
    	case 0x37: led=0xbf;break;
    
    	case 0x38: led=0x7f;break;
    
    	}
    
    	ES=1;		//重新开启串口中断
    
    	SBUF=buf;
    	while(!TI);
    	TI=0;
    
    }
    
     
    

     我的串口助手有点智障,不过程序应该没有啥大问题。

     

    参考文章:

    C51学习五)单片机与PC通过串口通信 

     

       

     

     

     

     

    一条传输线上逐个地传送。

     

     

     

     

    展开全文
  • 串行 只能一位一位的传送。 同步(了解) 建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙。 发送方对接收方的同步...

    通信方式


    并行

    适合短距离通信,并行通信控制简单、相对传输速度快(8位一起传输)。



    串行

    只能一位一位的传送。



    同步(了解)

    建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。此时,传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符间不留间隙。

    发送方对接收方的同步可以通过外同步和自同步


    异步

    以字符(构成的帧)为单位进行传输。数据位从低到高传送。

    格式:


    这里的空闲时间是任意的。


    串行通信的制式(传输方向)


    单工(仅能沿一个方向)



    半双工(可进行双向,但需分时)



    全双工




    串行通信的错误校验


    奇偶校验

    在发送数据时,数据位尾随的1位为奇偶校验位(1/0)。奇校验时,数据中1的个数与检验位1的个数之和应为奇数;偶校验时,数据中1的个数与校验位1的个数之和应为偶数。接收字符时,对1的个数进行校验,若字符不一致,则说明传输数据过程中出现错误。


    代码和校验

    发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时,同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,一致则无差。


    循环冗余校验

    通过某种数学预算实现有效信息与校验位之间的循环校验,常用语对磁盘信息的传输、存储区的完整性校验。



    串口的基本结构



    SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。
    发送使用时,就采用SBUF=XXX;  (XXX为需要传送的数据)
    接收使用时,采用XXX=SBUF;
    记得因为是串行的所以传输都是一位一位进行的。
    T1溢出率:T1计时器的溢出频率(就是计时器每次低位计满向高位进位时间的倒数)
    用处:用于计算波特率(每秒传输二进制代码的位数)

    实现单片机与电脑之间的互相传送字符串通信


    工具:STC-ISP


    代码:

    #include <reg52.h>
    #include <stdio.h>              //printf头文件
    #define uc unsigned char 
    #define uint unsigned int
    
    uc flag,i,flag_t,s[50]="",j=0,flag_n=0;
    uc code table[]="I get ";        
    
    void init()
    {
    	TMOD=0x20;	  //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。		 
    	TH1=0xfd;	  //定时器1初值	,设置波特率为9600 晶振11.0529MHZ?
    	TL1=0xfd;
    	TR1=1;		  //开启定时器1
    
    	SM0=0;
    	SM1=1;		  //10位异步接收,(8位数据)波特率可变
        REN=1;		  //允许串行口接收位
    	EA=1;	      //允许中断(总闸)
    	ES=1;		  //允许串口中断
    }
    void main()
    {
    	init();
    	while(1)
    {
    	  if(flag==1)
    	{	  if(flag_n!=0)		   //使第二个及以后I get xx 换行,不与You transfer在一行(单纯为了格式好看)
    			{TI=1;
    			printf("\n");
    			while(!TI);
    			TI=0;
    			}
    		for(i=0;i<6;i++)
    		{
    			SBUF=table[i];
    			while(!TI);
    			TI=0;
    		}
    			for(i=0;s[i]!='#'&&i<50;i++)
    		{
    			SBUF=s[i];
    			while(!TI);
    			TI=0;
    		}
    		flag=0;
    	}
    	if(flag_t==1)						   //发送完毕之后,在电脑端输出。
    	{
    		TI=1;							   //printf之前必须将T1置为1才行。
    		printf ("\nYou transfer %s",s);
    		while(!TI);
    		TI=0;
    		flag_t=0;
    	}	
    }
    }
    
    void ser() interrupt 4
    {
    		if(RI)		 //接收数据,手动将RI清0
    	{	    
    		RI=0;
    		
    		if(flag==0&&j!=0)//1.循环赋值为'\0'(字符串结尾标志符),j=0,为了第二次传递字符串是又是从头输出
    		{			 //2.flag为0和j不为0时,保证是第二次及以后,传输字符串(控制输出格式)
    			flag_n++;			 
    			for(j=0;s[j]!='#'&&j<50;j++)
    				  s[j]='\0';
    				  j=0;
    		}
    		s[j]=SBUF;
    		flag=1;
    		if(s[j]=='#'||j==49)	 //以'#'作为传送字符串的结尾符,我定义的字符数组最长为50所以49也应该结束。
    			flag_t=1;
    		else
    		 	j++;
    	}
    
    	if(TI)     //发送数据
    	{
    	}	 
    }



    运行截图:




    代码解读:基本上就是几个模块:计时器、中断以及串口通信

    中断

    寄存器介绍

    IE(interrupt enable):(可位寻址)设定各个中断源的打开和关闭
    IP(interrupt prior)中断优先级寄存器:(可位寻址)用来设定各个中断源属于两级中断中的哪一级

    中断源:




    中断响应条件:

    1.中断源有中断请求
    2.此中断源的中断允许位为1
    3.CPU开中断(EA=1)

    代码书写:

    1.先开总中断EA
    2
    .然后再开特定的中断去控制
    3.如果有特殊需要优先级问题再设置IP
    4.中断函数书写
    格式
    void 函数名() interrupt 中断号(上面图示的序号)
    //中断函数返回值一定是void  
    //函数名随便写
    //中断号用来判断是哪个中断源


    计时器

    寄存器介绍

    TCON 支持位寻址 :控制寄存器,控制T1、T0的启动和停止及设置溢出标志


    TMOD,不支持位寻址:定时/计数器的工作方式寄存器,确定工作方式和功能







    计时器代码书写步骤:

    1.EA=1;

    2.ETX=1;                            //开启计时器X中断

    3.配置工作方式  TMOD=0x..; //根据自己需求按照上表来配     

    3.配置计时器初值

    //THX=(65535-N)/256;
    //TLX=(65535-N)%256;    
    //N由你要计时的时长决定。计时器计一个数花费一个时钟周期来计算。

    4.TRX=1;                           //开启计时器X


    串口通信

    寄存器介绍

    PCON电源管理寄存器 :(不可位寻址)

    用来管理单片机的电源部分,包括上电复位检测、掉电模式

    、空闲模式等





    SCON:(可位寻址)用以设定串行口的工作方式、接收/发送控制以及设置状态标志







    波特率计算




    SMOD就是PCON中的第一位,默认为0
    fosc为晶振频率,所以自己设定不同波特率时,也要考虑晶振不同的问题。


    代码书写

    1.上面都书写完毕之后
    2.还需要ES=1
    3.传输数据时,SBUF=XX
       接收数据时,XX=SBUF
    4.中断函数书写 
    一定要将RI清0,但是TI的清0在主函数中进行
    //因为TI在中断中进行,(1)没有if(TI)的判断,那么就会和RI的处理混淆(2)如果有TI判断
    //那么有可能永远进行不了传输数据,因为最开始TI是为0的,无法进入TI条件,就无传
    //输数据(SBUF=XX)。而且在传输数据的时候会又一次进入中断,就是还没处理中
    //断就又进入了另外一个中断,导致通信出现异常。


    相信有了这些模块的讲解之后加上代码的注释应该都懂了~
    如果有任何问题和不懂的都可以提出~

    展开全文
  • 基于STC单片机串口接收发送程序/**************************************************************************** * 程序名称:STC89C52RC单片机串口发送接收程序 * 实验条件:11.0592的晶振频率
  • 51单片机串口通讯UART

    2018-12-25 20:47:51
    1、串行通信的的基本知识 在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交换均可称为通信。 通信的方式有两种,分别为串行通信和并行通信。我们通常...

    1、串行通信的的基本知识

    在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交换均可称为通信。

    通信的方式有两种,分别为串行通信和并行通信。我们通常根据实际信息传输的距离还决定采用哪种通信方式。

    并行通信:

    并行通信是指数据的各位同时进行传送(发送或者接收)的通信方式。其优点是传送速度快,缺点是数据有多少位,就需要有多少根传送线。

    串行通信:

    串行通信是指数据 一位一位的按顺序传送的通信,他的优点是传送线少(只需要一对传输线),特别适用于远距离的数据通信,缺点是传送速度低。

    其通信的原理如下图所示

    串行通信的数据传输方式:

    分为3种:1、单向(单工)配置,只允许数据向一个方向传送。2、半双向(半双工)配置,允许数据向两个方向中的任一方向传送,但每次只能有一个站点在发送。3、全双向(全双工)配置,允许同时双向传送数据,因此,他要求两端的通信设备都具有完整和独立的发送和接收的能力。如下图所示

    串行通信的通信方式

    串行通信有两种基本的通信方式:同步通信和异步通信

    1、异步通信

    异步通信数据格式一般为字符格式

    一个字符一个字符地传输,每个字符一位一位的传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符间没有固定的间隔要求。每一个字符的前面都有一位起始位(低电平),字符本身由5-7位数据位组成,接着字符后面是一位校验位(也可以没有校验位),最后一位或一位半或两位停止位,停止位后面是不定长的空闲位。停止位和空闲位都规定为高电平,这样就保证了起始位开始处有一个下跳沿。

                                           图一异步通信的传输方式

                                           图二异步通信的数据传输格式

    2、同步通信(了解即可)

    同步通信就比如说是老师发作业本,约定学习委员来取作业本。建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步,而且传输数据的位之间的距离均为“位间隔”的整数倍,同时传送的字符之间不留间隙,即保持位同步关系,也保持字符同步关系。

    同步通信使用的数据格式根据采用的控制规程(通信双方就如何交换信息所建立的一些规定和过程称为通信控制规程),可分为面向字符型面向位型两种,面向字符型数据格式又有单同步,双同步,和外同步之分。三个同步方式均以2个字节的冗余检验码CRC作为一帧信息的结束。

    单同步:发送方先发送一个同步字符,再传送数据块,接收方检测到同步字符后接收数据

    双同步:发送方先传送2个同步字符,再传送数据块,接收方检测到同步字符后接收数据;

    外同步:用一条专用线来传送同步字符,以实现收发双方同步操作同步通信中,在数据开始传送前用同步字符来指示(常约定1~2个),并由时钟来实现发送端与接收端的同步,我们使用QQ的文件传输功能就可以看做是一个同步通信的例子,首先传文件的双方必须说好一个传文件的时间,如果双方有一个不在线上,就不能传输。其次,发送方发送文件命令后,接收方要确认是否接收,这个就是建立文件传输的过程,一旦传输开始,所有文件数据必须连续的传输过去,任何中断都将导致传输失败。

    3、波特率

    波特率即数据传速率,表示每秒传送二进制代码的位数,它的单位是b/s。波特率对于CPU与外界的通信是很重要的,假设数据传送的速率是120字符/s,而每个字符格式包含10个代码位(一个起始位,一个中止位、8位数据位D0-D7),这是传送的波特率为:10bit/字符*120字符/s = 1200 b/s。波特率即为1200 b/s。每一位的时间即为1/1200。

    4、串行通信接口种类

    根据串行通信格式及约定(如同步方式、通信速率、数据块格式等)不同,形成了许多串行通信接口标准,如常见的:

    UART(串行异步通信接口)

    USB(通用串行总线接口)

    I2C(集成电路间的串行总线)

    SPI(串行外设总线)

    485总线、CAN总线接口等。

    二、89c51串行口及应用

    我所采用的单片机串口通信是用一个USB接口接了一个CH340(USB转异步串口)来进行计算机与单片机双方的通信,如下图所示

    下图所用硬件原理图

    当开关SW1按下之后,经过USB1再连接一个USB转异步通信串口芯片CH340,使计算机通过USB来与单片机进行通信。

    串行通信的工作原理如下

    串行通信必须保持设备的同步性,即1、数据双方必须采用统一的编码。2、通信双方必须使用相同的传送速率

    1、89c51串行口特点

    ※全双工串口,能同时发送和接收数据

    ※可编程:其帧格式可以是8位,10位,11位,并能设置各种波特率

    ※发送完一个数据TI标志置1,接受完一个数据RI标志置1,可以工作在中断或查询方式

    ※波特率可以是固定的,也可以是由定时器1的溢出率来决定

    ※有一个地址相同的接受(发送)缓冲器SBUF(地址99H)

    2、结构与工作原理

    89c51通过引脚RXD(P3.0串行数据接收端)和引脚TXD(P3.1串行数据发送端)与外界进行通信。其内部结构简化图如图所示

    图中有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H,可同时发送。接收数据。发送缓冲器只能写入,不能读出;接收缓冲器只能读出,不能写入。

    串行发送与接收的速率与移位时钟同步。89c51用定时器1作为串行通信的波特率发生器。T1溢出率经2分频(或不分频)后又经16分频作为串行发送或接收的移位脉冲。移位脉冲的速率即波特率。

    从图中可以看出,接收器是双缓冲结构,在前一个字节被从接收缓冲器SBUF读出之前,第二个字节即开始接收(串行输入至移位寄存器),但是,在第二个字节接收完毕而前一个字节CPU未读取时,会丢失前一个字节。

    串行口的发送和接收都是以特殊功能寄存器SBUF的名义进行读/写的。当向SBUF发送“写”命令时(SBUF = num,假设num是我已经定义好的一个变量),即是向发送缓冲器SBUF装载并开始由TXD引脚向外发送一帧数据,发送完后发送中断标志位TI则自动置1。

    在满足串行口接收中断标志位RI = 0的条件下,置允许接收位REN = 1,就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI = 1,当发读SBUF命令时(num = SBUF),便由接收缓冲器SBUF取出信息通过89c51内部总线送CPU。

    对于发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误,一般不需要用双缓冲结构来保持最大传送速率。

    3、 串行口控制字及控制寄存器

     89c51串行口是可编程接口,对它初始化编程只用两个控制字分别写入特殊功能寄存器SCON和电源控制寄存器PCON中即可。

    1)SCON

    SM0、SM1工作方式控制位

    SM2:多机通信控制位,1-允许、0-不允许

    REN:串行接收允许位。1-允许、0-不允许

    TB8:发送数据第九位

    RB8:接收数据第九位

    TI:发送中断标志位

    RI:接收中断标志位

    ①SM0和SM1 :串行口工作方式选择位 ,两个选择位对应四种通信方式,如下图所示,其中fosc是振荡频率

    SM2:多机通信控制位,主要用于方式2和方式3。

    若SM2 = 1;则允许多机通信。多机通信协议规定,第9位数据(D8)为1,说明本帧数据为地址帧;若第9位数据为0,则本帧数据为数据帧。当一个89c51(主机)与多个89c51(从机)通信时,所有从机的SM2位都置1,主机首先发送的一帧数据为地址,即某从机号,其中第9位为1,所有的从机接收数据后,将其中第9位数据装入RB8中。各个从机根据接收到的第9位数据(RB8中)的值来决定从机是否再接收主机的信息、若(RB8)= 0,说明是数据帧,则使接收中断标志位RI = 0,信息丢失,若RB8 = 1,说明是地址帧,数据装入SBUF并置RI = 1,中断所有从机,被寻址的目标从机清除SM2,以接收主机发来的一帧数据,其它从机仍然保持SM2 = 1。

    若SM2 = 0,即不属于多机通信情况,则接收完一帧数据后,不管第9位数据是0还是1,都置RI = 1,接收到的数据装入SBUF中。在方式0时SM2必须置0。在方式1时,若SM2 = 1,则只有接收到有效停止位时,RI才置1,以便接收下一帧数据。

    REN:允许接收控制位,由软件置1或清0

    REN = 1时,允许接收,相当于串行接收的开关

    REN = 0时,禁止接收

    在串行通信接收控制过程中,如果满足RI = 0和REN = 1的条件,就允许接收。

    TB8:发送数据的第9位(D8)装入TB8中。在方式2或方式3中,根据发送数据的需求由软件置位或复位。在许多通信协议中可用作奇偶校验位,也可以在多机通信中作为发送地址帧或者数据帧的标志位。

    RB8:接收数据的第9位,原理同TB8

    TI:发送中断标志位,在一帧数据发送完时被置位。在串行发送到停止位的开始时由硬件置位,可用软件查询。它同时也申请中断。TI置位意味着向CPU提供“发送缓冲器SBUF已空”的信息,CPU可以准备发送下一帧数据。串行口发送中断被响应后,TI不会自动清0,必须软件清0.

    RI:接收中断标志,在接收到一帧数据后由硬件置位。当RI = 1时,申请中断,表示一帧数据接收结束,并已装入接收SBUF中,要求CPU取走数据,CPU响应中断,取走数据。RI位也必须由软件来清0,。

    串行发送中断标志TI和接收中断标志RI是同一个中断源,CPU事先不知道是发送中断TI还是接收中断RI产生的中断请求,所以,在全双工通信时,必须由软件来判别。复位时SCON所有位都清0.

    2)PCON

    电源控制位寄存器PCON中只有SMOD位与串口工作有关,如下图所示

    SMOD:波特率倍增位。在方式1、2、3中,当SMOD = 1时,波特率提高一倍。

    4、串行通信工作方式

    根据实际需要,89c51串口可以设置四种工作方式,可有8位、10位或11位帧格式

    方式0:8位同步移位寄存器,以8位数据为一帧,不设起始位和停止位,先发送或接收最低位(用于I/O口扩展)。

     ※RXD:数据输入/输出端

    ※TXD:同步脉冲输出端,每个脉冲对应一个数据位

    基本很少用到方式0,一般都是用到方式0是通过串口扩展8位并行I/O输出口,如下图所示

    方式1:10位异步通信模式

    一帧10位:起始位+8位数据位+停止位

    波特率:定时器1作为波特率发生器,公式为

    方式2和方式3:11位异步通讯方式

    一帧11位:起始位+9位数据位+停止位

    第九位数据位在TB8/RB8中,常用作校验位或者多机通信地址标识位或者数据标识位

    波特率分别为:

    发送:先填写TB8,写入SBUF(启动发送),发送完TI = 1.

    接收:REN = 1,RI = 0且第9位为1(或SM2 = 0),将接收数据装入SBUF,第9位装入RB8,使RI = 1,否则丢弃接收数据,不置位RI。

    接下来我用串口通信来实现计算机与51单片机之间的串口通信,计算机给单片机发送一个数,单片机接收后把这个数加1再发送给计算机,具体操作如下

    #include<reg52.h>
    #define uint unsigned int
    void UART_Init();
    uint num ;
    /*
    ******************************************
    **函数名称:主函数
    *******************************************
    */
    int main()
    {
            UART_Init();
            while(1);
    }
    /*
    *****************************************
    **函数功能:串口初始化函数
    *****************************************
    */
    void UART_Init()
    {
         
                TMOD = 0x20; //定时器0工作模式2,自动重装8位计数器
                TH1 = 0xfd;
                TL1 = 0xfd;//定时器溢出时,会自动将高8位中的值赋值给低8位.比特率9600
                TR1 = 1;
                SM0 = 0;
                SM1 = 1;
                REN = 1;
                EA = 1;
                ES = 1;
    }
    /*
    ********************************************
    **函数名称:串口中断函数
    ********************************************
    */
    void UART() interrupt 4
    {
        if(RI == 1)        //如果接收到计算机发的数据
            {
                num = SBUF;  //取出数据
                num++;       
                RI = 0;       //清除标志位
                SBUF = num;  //把数据加1后再发送给计算机
            }
            if(TI == 1)    //如果发送完毕
            {
                TI = 0;       //清除标志位
            }
    }
        
    我用串口助手循环发送从1-8,单片机会返回2-9,实现现象如下:

     

    展开全文
  • 单片机 串口编程之串口通信仿真实验 一、简述 记--简单的使能串口串口收发数据的例子。(使用Proteus仿真+虚拟串口调试) 代码,仿真文件打包:链接: https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A 提取...

    单片机 串口编程之串口通信仿真实验

    一、简述

           记--简单的使能串口,串口收发数据的例子。(使用Proteus仿真+虚拟串口调试)

           代码,仿真文件打包:链接: https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A 提取码: j44s 

             蓝奏:https://www.lanzous.com/i2fx3oh

          虚拟串口调试软件打包:链接: https://pan.baidu.com/s/1qaOgM8P7ZRmXb903NkiMOQ 提取码: r18u 

             蓝奏:https://www.lanzous.com/i2fx41a

           串口助手源码:链接: https://pan.baidu.com/s/1T9ZA8jnsjXDhNLuL1ezGdg 提取码: 6usr 

    二、效果

            PC机通过串口调试助手发送数据给单片机,单片机收到之后回复:I received.。如果单片机收到的是'1'则点亮LED灯,否则熄灭LED灯。

               

       使用c#编写的串口助手

          

      (真实硬件实验:使用Keil C51将代码编译为HEX文件,用串口线/USB转串口线连接PC机,可以使用STC-ISP软件烧写到51单片机,在PC机可以使用串口调试助手(STC-ISP也有这个功能,也可以是其他软件,当然也可以自己编写串口程序)与单片机进行串口通信。实际中,电脑串口采用232电平,而单片机串口则采用TTL电平,如果不进行电平转换,单片机与电脑就无法正常通信,甚至单片机芯片可能会被烧坏。MAX232 芯片可以进行电平转换,是将单片机输出的TTL电平转换成PC机能接收的232电平或将PC机输出的232电平转换成单片机能接收的TTL电平。​​​​电平是个电压范围,如可能规定输出电压>2.4V则为高电平,输出电压低于<0.4V则为低电平,不同的电子器件、不同的标准有着不同的电压范围​​​)

           注:一个COM一般不能同时被两个程序占用。

    三、工程结构及各属性设置

            keil工程

             

             

             

              

            proteus仿真

            

    添加虚拟串口

                                    

    四、源文件

           main.c文件 

    #include <reg51.h>
    sbit p1_0 = P1^0;
    
    //初始化串口 (设置串口,开启串口中断)
    void init_uart(void)
    {
    	SCON = 0x50;		        // SCON: 方式 1, 8-bit, 允许接收数据 
    	TMOD |= 0x20;               // TMOD: 设置定时器1工作在方式2, 8-bit 自动重装
    	TH1 = 0xFD;               // TH1:  初始值为0xFD  波特率:9600 晶振频率:11.0592MHz  
    	TL1 = 0x0;
    	TR1 = 1;                  // TR1:  开启定时器1                         
    	EA  = 1;                  //打开总中断
    	ES  = 1;                  //打开串口中断
    }       
    
               
    // 发送一个字节数据
    void uart_send_byte(unsigned char dat)
    {
    	SBUF = dat; // 将数据送到发送缓冲寄存器SBUF,一位一位的发送
    	while(!TI); // 等待发送完毕 (发送完毕TI硬件置1)
    	TI = 0;// 将TI清零,表示可以发送下一字节数据。
    }
    
    // 发送字符串
    void uart_send_str(unsigned char *s)
    {
    	while(*s != '\0')// '\0':字符串结束标志
    	{
    		uart_send_byte(*s);// 发送1个字节数据,1个字符占8位,1字节
    		s++;// 指向下一个字符
    	}
    }
    
    
    // 串口中断处理函数 (串口接收到数据,发送数据完毕都可以引起串口中断)
    void uart_interrupt(void) interrupt 4 		//也叫串行中断服务程序
    {
    	unsigned char recv_data;// 用来存放接收到的数据
    	unsigned char send_data[] = "I received.\n";// 要发送的信息
    	
    	if(RI) //接收数据(1字节)完毕,RI会被硬件置1
    	{
    		RI = 0;            		// 将 接收中断标志位 清零(让串口可以继续接收数据)
    		recv_data = SBUF;           	//读取接收到的数据,并存放到data
    	
    		
    		if(recv_data == '1')//如果收到的字符是'0',就让灯灭
    		{
    			p1_0 = 0;//  p1.0引脚低电平,LED灯亮
    		}
    		else
    		{
    			p1_0 = 1;// p1.0引脚高电平,LED灯灭
    		} 
    
    	    uart_send_str(send_data); //收到数据之后,发送字符串"I received."给对方
    	}
    	if(TI)// 发送数据(1字节)完毕
    	{
    		TI = 0;// 将 发送中断标志位 清零(让串口可以继续发送数据)
    	}
    } 
    
    void main(void)
    {
    	init_uart();// 初始化串口
    	
    	while(1)// 主循环不做任何动作。(死循环)
    	{}
    }
    
    

    五、总结

           51单片机系列

          1、单片机的串口相关的寄存器

                1) 串口控制寄存器SCON:(Serial CONtrol)

                2) 串行数据寄存器SBUF:(Serial data BUFfer)

                3)电源管理寄存器PCON:(Power CONtrol)

          2、串口控制寄存器SCON

                用来对串口进行控制,其寄存器地址为0x98,支持位寻址。

                一般来说单片机的寄存器的个数在制作好就已经确定了,MCS-51单片机有一些寄存器是8位的(可以存放8位数据),有一些是16位的,这些寄存器有点像全局变量(寄存器名-变量名),它们分配了固定的地址空间,我们可以对这个寄存器变量进行赋值或读取值。比如我们禁止串口中断,那么我们可以设置相应的值,当系统处理串口相关的任务时,读取到这个我们设置的值时,直到我们要禁止串口中断,那么系统就不会相应串口中断。串口控制寄存器SCON的地址为0x98,我们可以直接对SCON这个"变量"进行赋值,支持位寻址意思是:SCON一共有8位,每1位代表的意思都有不同,可以直接单独对某一位进行设置,有一些寄存器是不可以位寻址的。

               

    SCON控制寄存器
    位编号

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    位名称

    SM0

    SM1

    SM2

    REN

    TB8

    RB8

    TI

    RI

    位地址

    9FH

    9EH

    9DH

    9CH

    9BH

    9AH

    99H

    98H

     

    SM0,SM1串行口工作方式控制位

    SM0

    SM1

    工作方式

    功能

    波特率

    0

    0

    方式0

    8位同步移位寄存器

    晶振频率/12

    0

    1

    方式1

    10位UART

    可变

    1

    0

    方式2

    11位UART

    晶振频率/64或晶振频率/32

    1

    1

    方式3

    11位UART

    可变

     

    SM2 多机通信控制位 当该位置1为多机通信,多机通信仅在方式2、方式3有效。
    REN 接收允许位  为1允许接收,为0禁止接收
    TB8 待发送的第9位数据  同来存放工作方式2,工作方式3模式下等待发送的第9位数据
    RB8 收到的第9位数据 同来存放工作方式2,工作方式3模式下接收到的第9位数据,在方式1下为接收到的停止位,工作当时0不使用该位。
    TI 发送中断标志位  发送完成标志位,当SBUF中的数据发送完成后由硬件置1,并且当单片机硬件中断被使能之后触发中断事件,该位必须由软件清零,并且该位被清零之后才能进行下一个字节数据的发送。
    RI 接收中断标志位 接受完成标志位,当SBUF收到一个字节的数据后由硬件系统置1,并且当单片机硬件中断被使能之后触发串行中断事件,该位必须由软件清零,并且只有该位被清零之后才能够进行下一字节数据的接收。

          3、串行数据寄存器SBUF

                用于存放串行通信中发送和接收的相关数据。其寄存器地址是0x99。

                SBUF由发送缓冲寄存器和接收缓冲寄存器组成,这两个寄存器占用同一个寄存器地址。其中发送缓冲寄存器只写,接收寄存器只读。

               发送数据:当将一个数据写入SBUF后,单片机立即根据选择的工作方式和波特率将写入的字节数据进行相应的处理然后从TXD(P3.1)引脚串行发送出去,发送完成之后置位相应寄存器的标志位,只有相应的标志位被清除之后才能进行下一次的数据发送。

               接收数据:当RXD(P3.0)引脚根据工作方式和波特率接收到一个完整的数据字节后单片机将该数据字节放入接收缓冲寄存器中,并置位相应的标志位。接收缓冲寄存器是双字节的,这样就可以在单片机读取接收缓冲寄存器的数据时同时进行下一个字节的数据接收。不会发生前后两个字节的数据冲突(数据覆盖)。

          4. 电源管理寄存器PCON

                可以控制串口波特率加倍。

                                                                                             PCON电源管理寄存器

    位编号

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    位符号

    SMOD

    SMOD0

    LVDF

    POF

    GF1

    GF0

    PD

    IDL

          SMOD:该位与串口通信有关。

          SMOD=0; 串口方式1,2,3时,波特率正常。

          SMOD=1; 串口方式1,2,3时,波特率加倍。

          5、串口的工作方式

                MCS-51单片机的串口一共4种工作方式。其中工作方式0为同步通信方式,其余3种为异步通信。

                工作方式0:外部引脚TXD(P3.0)为数据的输出输入端,外部引脚TXD(P3.1)提供数据的同步脉冲。

                                    因此工作在方式0进行串口通信不需要考虑波特率。

               工作方式1:使用定时器作为波特率发生器。

                                   波特率的计算  

                                                  

                                                                              常见的波特率对应的初始值
    波特率/工作频率 11.0592MHz 12MHz

    14.74456MHz

    16MHz 20MHz SMOD值
    150(b/s) 0x40 0x30 0x00     0
    300(b/s) 0xA0 0x98 0x80 0x75 0x52 0
    600(b/s) 0xD0 0xCC 0xC0 0xBB 0xA9 0
    1200(b/s) 0xF8 0xE6 0xE0 0xDE 0xD5 0
    2400(b/s) 0xF4 0xF3 0xF0 0xEF 0xEA 0
    4800(b/s)   0xF3 0xEF 0xEF   1
    4800(b/s) 0xFA   0xF8   0xF5 0
    9600(b/s) 0xFD   0xFC     0
    9600(b/s)         0xF5 1
    19200(b/s) 0xFD   0xFC     1

          工作方式2:

                                                                         

          工作方式3:波特率计算方式与工作方式1相同。 

         

          6.波特率

               波特率是指数据信号对载波的调制速率,它用单位时间内载波调制状态改变的次数来表示。

               在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。

               通信双方约定一致的波特率以便正确的接收数据。(数据发送前可能进行了调制,波特率不同,调制参数不同)

              如果收发双方的波特率不一样,那么调制与解调的参数不一样,就很有可能读取不到正确的数据,从而解读为乱码。

              通常串口工作方式1使用定时器作为波特率发生器。

          7、串口中断

                使能串口中断:打开总中断-中断控制寄存器IE的EA位置1,打开串口中断中断控制寄存器IE的ES位置1

                                                                                                   中断控制寄存器IE(Interrupt Enable

    位序号

    D0

    D1

    D2

    D3

    D4

    D5

    D6

    D7

    说明

    外部中断0

    定时/计数0

    外部中断1

    定时/计数1

    串行口中断

    保留位

    保留位

    全局中断位

    位符号

    EX0

    ET0

    EX1

    ET1

    ES

    --

    --

    EA

    位地址

    A8H

    A9H

    AAH

    ABH

    ACH

    --

    --

    AFH

    EX0 外部中断0允许位 EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。
    ET0 T0溢出中断允许位 ET0=1,允许T0中断;ET0=0,禁止T0中断。
    EX1 外部中断1允许位 EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。
    ET1 T1溢出中断允许位 ET1=1,允许T1中断;ET1=0,禁止T1中断。
    ES

    串行中断允许位

    (Enable Serial)

    ES=1,允许串行口中断;ES=0,禁止串行口中断。
    EA

    中断总允许位

    (Enable All)

    EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。

     

         使能串口中断之后,接收到数据(RI置1)/完成发送(TI置1),RI/TI被置1就会触发串口中断事件,然后执行中断处理函数。

         中断处理函数编写格式:               

    void 函数名(void) interrupt 4 using 工作寄存器组编号
    {
        //要执行的动作
    }

          4的含义: 一共5个中断编号为0~4,串口中断的编号为4

          using 寄存器组编号:一共4组工作寄存器组,编号为0~3,如果不写默认为工作寄存器组0。

    8、初始化串口为模式1过程。

          1) SCON设置

    位名称

    SM0

    SM1

    SM2

    REN

    TB8

    RB8

    TI

    RI

    设置值

    0

    1

    0

    1

    0

    0

    0

    0

    含义 工作在方式1 波特率不加倍 允许接收数据 工作方式1不设置该位 初始为未发送完数据

    初始为为接收到数据

          SCON = 0x01010000 = 0x50    

           2) PCON设置

           

    位编号

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    位符号

    SMOD

    SMOD0

    LVDF

    POF

    GF1

    GF0

    PD

    IDL

    默认波特率不加倍 0 0 0 0 0 0 0 0
    波特率加倍 1 0 0 0 0 0 0 0

          PCON = 0x00 (SMOD=0,波特率不加倍)

          PCON = 0x80 (SMOD=1,波特率加倍)

          3) 定时器设置

                  工作方式设置:

                                                                      MI,M0定时器模式选择

    M1

    M0

    工作方式

    功能说明

    0

    0

    方式0

    13位定时器/计数器

    0

    1

    方式1

    16位定时器/计数器

    1

    0

    方式2

    自动重载8位定时器/计数器

    1

    1

    方式3

    T0分为2个8位独立计数器,T1无方式3

                开启定时器1:将控制寄存器TCON的TR1置1

                设置定时器1的初值:TH1数据寄存器装载初值的高8位,TL1数据寄存器装载初值的低8位。

                定时器用作波特率发生器时,使用上面的波特率计算公式得到初始值,或直接查看常见的波特率对应的初始值。

                TH1 = 0xFD;// 11.0592MHz的工作频率,9600的波特率 对应的初始值。 

            4) 打开总中断 EA = 1; 打开串口中断 ES = 1;

                  

    ================以下回复 qq_45096251 这位兄弟==============

    两个单片机之间的串口通信仿真实验:

    测试的仿真文件和代码:链接: https://pan.baidu.com/s/1PMu6dT-1DMEJllgv9gxqMA 提取码: hrcy

    使用虚拟串口软件,虚拟出两对串口,例子中是com1<==>com2,  com3<==>com4,其中com2,com4分别对应单片机A和单片机B。com1和com3分别是PC端与单片机A、B通信的端口。在PC端使用串口工具实现两个仿真单片机的串口通信。

    测试效果:

    展开全文
  • 文章目录一、单片机串口通信寄存器串行口数据缓冲器SBUF串行口控制寄存器SCONSM2:多机通信控制位REN:串口接受允许位TB8:发送的第9位数据RB8:接收的第9位数据TI:发送中断标志RI:接收中断标志电源控制寄存器PCON...

    单片机串口通信理解(一)

    一、单片机串口通信寄存器

    • 串行口数据缓冲器SBUF

    SBUF(serial data buffer)用于串口数据传输,在51单片机内部分为两个物理上独立的8位缓冲器:发送缓冲器和接收缓冲器。而这两个缓冲器共用一个名称SBUF,共用一个地址99H,这意味着在程序中对SBUF进行修改时,发送缓冲器和接收缓冲器的值都会改变,且发送缓冲器与接受缓冲器的值始终相等。
    那么物理上独立是什么意思呢?物理上独立指的是在51单片机的硬件中存在发送缓冲器和接收缓冲器。其中,
    在执行写指令 MOV SBUF , A 时发送缓冲器起作用
    在执行读指令 MOV A , SBUF 时接受缓冲器起作用
    这意味着通过物理上独立的SBUF缓冲器可以实现全双工通信。

    • 串行口控制寄存器SCON

    SCON寄存器原理图

    SM2:多机通信控制位

    用于多机通信中的从机,仅用于从机被寻址的阶段。在一次通信过程正式开始前,从机接收并侦测主机发出的每一个信息帧,试图寻找呼叫自身的地址码。换句话说,SM2位用于从机筛选自身,一旦筛选完毕,该位的使命就完成了。

    REN:串口接受允许位

    对于单片机来说,数据的发送过程是主动的,只要将发送数据送入SBUF,发送过程就开始了。但数据的接收是被动的,一旦数据到来,串口便会自动接收而不管CPU是否需要接收。因此需要有控制的接收行为。REN=1,允许串口接收;REN=0,不允许串口接收。

    TB8:发送的第9位数据

    在方式2和方式3中发送的第9位数据,TB8=1,说明主机发送的是地址;TB8=0,说明主机发送的是数据。

    RB8:接收的第9位数据

    在方式2和方式3中接收的第9位数据。RB8=1,说明从机接收到的是地址帧;RB8=0,说明从机接收的是数据帧。

    TI:发送中断标志

    在第8位发送结束时自动置位,需软件清零。

    RI:接收中断标志

    在第8位接收结束时自动置位,需软件清零。

    • 电源控制寄存器PCON

    仅D7位与穿孔通信有关,为波特率倍增位SMOD,在方式1,方式2,方式3中波特率倍增。

    在工作方式1和3中会会涉及TMOD,TCON寄存器,这里不提。想看自己去别的地方看

    二、串口通信工作原理

    在这里插入图片描述
    从网上找不到好图就自己拍了

    在图上发现一个很有趣的地方,在接收时需要一个移位寄存器,而发送时没有。因为发送时CPU是主动的,不会发生帧重叠错误,而接收时CPU是被动的,通过移位寄存器与接收缓冲器的双缓冲结构可以避免在数据接收过程中产生帧重叠。

    接下来介绍串口通信的数据格式,方式0为8位同步首发,直接传送8位数据。
    方式1为10位异步收发,第一位为起始位,第二至第九位为传送的8位数据,第十位为停止位。
    方式2和方式3为11位异步收发,第一位为起始位,第二至第九位为传送的8位数据,第十位为传输数据的第九位,当发送数据时第九位为TB8,接收数据时第九位为RB8,TB8和RB8用来判断数据位的前8位为数据还是地址,第十一位为停止位。

    串口通信的数据格式可以如下表示

    方式0:数据位(8位)
    方式1:起始位+数据位(8位)+停止位
    方式2:起始位+数据位(8位)+第九位数据位+停止位
    方式3:起始位+数据位(8位)+第九位数据位+停止位

    • 波特率/比特率

    比特率的单位是bps(bit per second),为每秒传输的位的数量,例如4000bps意味着一秒钟传送4000个位。

    波特率的单位是bd(boud),意为每秒传输码元的数量,码元指的是携带信息的信号,对于方式0,8bit(位)=1码元,对于方式1,10bit=1码元,对于方式2和方式3,11bit=1码元。所以对于方式1,4000bps=400bd。

    不过多数搞单片机的人认为波特率=比特率,我翻的书上也确实都是这么写的,他们说波特率4800的意思是4800bps,不过上应该是比特率4800,可能这也是约定俗成,将错就错?

    三、单片机串口通信流程

    这篇文章仅涉及单机通信,我认为双机通信原理更加简单,本文不涉及

    单片机的串口通信是一位一位输入,在单片机时钟周期的下降沿读出或写入数据,其中,TI置位条件是数据位全部发送完成,停止位发送之前。RI置位条件是停止位发送结束后,换句话说,除方式0,其他3种方式TI置位提前于RI,提前量为1个时钟周期。

    在这里插入图片描述
    我在网上又没找到图

    上图为单片机中断原理图,在第1个机器周期的第5个时钟周期的第1个振荡周期结束后进行采样,在第2个机器周期的第6个时钟周期的第1个振荡周期结束后进入中断。(为了方便,我将用X表示机器周期,S表示时钟周期,P表示振荡周期,X1S5P2即为上图中的采样置标志)

    中断注意事项

    1.中断响应条件是在采样置标志采集成功,在下一个机器周期查询标志转入处理(该处理是为了确定先响应哪个中断),之后根据中断优先级进入中断,即使只有一个中断信号,也必须在下一个机器周期结束后进入中断。
    2.采样置标志在每个机器周期的S5P2都会查询。
    3.中断的响应必须在该条语句结束后。
    4.若当前执行的指令是RETI或对IE/IP寄存器进行修改时,不响应中断。
    5.在中断中只响应中断优先级高于正在执行的中断的中断。
    6.存在这样一种情况,中断标志位被置位但由于某种条件没有被响应,在下一个机器周期中断置位标志消失(对,说的就是你,低电平触发的外部中断),此时该中断被忽略(!)换句话说,如果未及时响应,虽然曾经产生过中断信号,我们不予处理。

    我们给出这样的一个程序段:

    			MOV SBUF,A
    			JNB TI,$
    			CLR TI
    			SJMP $
    ZHONGDUAN:  JB TI,EXIT//中断子程序入口
    		    CLR RI
    		    RETI
    EXIT: 		CLR TI
    			RETI
    

    接下来开始分析,对于方式1,共有10位数据需要发送,MOV SBUF , A 这条语句将会占用2个机器周期,在S3结束时TI置位,S4结束时RI置位,由于查询标志在S5P2,此时TI,RI均置位,在MOV SBUF , A 语句结束后,因为单片机还没有运行到查询标志转入处理(X2S6P2),下一机器周期执行JNB TI , $ 指令,由于此时TI为1,所以顺序执行的下一条语句为CLR TI。但此时必须进行中断响应,此时TI仍然为1,程序跳转到EXIT清空TI。

    此时出现了一个很不可思议的情况:虽然在中断返回时,他应该执行CLR TI指令,但在中断中TI被清零了,所以JNB TI,$指令被重新判断,此时TI为零,所以单片机将停在JNB TI,$这条语句,而非SJMP $。

    实际上,在单片机执行过程中,由于RI=1,所以单片机还能继续进入中断,在JNB TI,$和中断程序中不断反复。这很奇怪,我在中断中清空RI,TI也为0,为什么还会进入中断呢?因为虽然我们通过软件清空了RI,但由于SBUF寄存器未清零,单片机将一直认为有数据发送至单片机,将有硬件自动将RI置位。

    最后捎带扯一下多机通信,多机通信极极极极极极极极极极极极少出现TI,RI同时置1的情况(我认为可能性为0),在实际实现过程中若RI或TI置1,那么单片机将不再写或读,上述例子只是为了理解。

    执行 MOV A ,SBUF指令可以自动清零SBUF。

    在这里插入图片描述
    由于作者本人单片机水平着实有限(低得可怕),且结论得出仅通过keil软件仿真,如有理解不当之处请指出。

    展开全文
  • 单片机(AT89C51)的串行接口及串行通信是非常重要的一项技术,我们需要有深度的解刨才可以理解透彻,既然进来了我肯定不会让你失望,点个小赞再走吧。 正式进入串口通信前我们需要了解什么是通信? 计算机与...
  • 本文只针对初学者。高手绕行,本程序目的实现串口把数值打印到电脑端。...* 项目名称 : STC15W4K 单片机串口打印调试 * M C U : STC15W4K * 编译环境 : KEIL4 * 文件名称 : Main.c * 其它说明 : 主函数 * 当前版本 :
  • labview与单片机串口通信   VISA是虚拟仪器软件体系结构的缩写(即Virtual Instruments Software Architecture),实质上是一个I/O口软件库及其规范的总称。 VISA是应用于仪器编程的标准I/0应用程序接口,是工业界...
  • stm32f103系列单片机串口初始化 这篇文章是本人从小白到熟悉这个单片机的过程,本在使用过程中主要是针对的64为单片机,但是其它引脚位数的单片机应该也是比较实用,由于篇幅较长, 废话不多说,开始单片机学习之...
  • 本人最近在尝试在linux下用串口单片机通信,虽然说网上资料例程五花八门,但是缺乏严格的注释或者完整的实例,或许本人能力有限,某些问题无法理解,在实际过程中遇到不少问题,无从下手,特此写篇文章请求各位...
  • Table of Contents 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 ...1.熟悉串行接口模/数转换器的基本原理和编程方法。...2.进一步熟悉单片机应用系统开发步骤和方法。... 图19.1 串行接口A/D...
  • 51 单片机串行口是一个可编程的全双工的通信接口,具有 UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可以作为同步移位寄存器使用。51 单片机串行口主要有两个独立的串行数据缓冲寄存器 ...
  • 随着单片机系统的广泛应用和计算机网络技术的普及,单片机的通信功能愈来愈显得重要。单片机通信分为并行和串行通信方式。并行通信通常是将数据字节的各位用多条数据线同时进行传送,每一位数据都需要一条传输线。...
  • 我们采用串行口1编程,主要用到的特殊功能寄存器有:数据缓冲寄存器SBUF、串行口1方式控制寄存器SCON、辅助寄存器AUXR等 两个补充链接; C51中的ABSACC.H介绍...
  • 基于PC与单片机串口通信的温度监控系统程序设计  1.系统介绍  1)本系统主要讲解基于PC与单片机串口通信的温度监控系统程序设计(如图1),上位机采用常用的PC机,下位机使用的是STC89C52...
  • 51单片机一般使用串口的方法都是这样的 #include<reg52.h> #define uint unsigned int void UART_Init(); uint num ; /* ****************************************** **函数名称:主函数 *****************...
  • <br />8051单片机串行口及串行通信   一、串行通信的基础知识 CPU与其他外部设备要进行信息交换,一台计算机与其他计算机之间有时也要交换信息,这些信息交换就称为通信。通信有并行通信和...
  • STC单片机串口输出ADXL335角度值: 1 //*****************... 2 //名称单片机串口输出ADXL335角度值 3 //使用单片机:stc12c5a60s2 4 //供电:电压5v 5 //晶振:11.0592m 6 //X轴-&gt;(ADC0)P1.0 7 /...
  • 工业控制中单片机与pc机通讯,常常通过串口通讯来完成,本次基于RS232通讯来完成的,硬件是普中的STC51单片机开发板;板子如下图: 不需要液晶显示器,自带的例子这里就不贴了,主要实验是Qt进行串口链接,发送...
1 2 3 4 5 ... 20
收藏数 4,311
精华内容 1,724
关键字:

单片机串口名称