单片机串行通讯实验原理_单片机是并行通讯还是串行通讯 - CSDN
精华内容
参与话题
  • 单片机C51 - 串行通信原理及串口编程实验

    千次阅读 多人点赞 2016-09-07 11:52:51
    一、两种通信方式概念 1.并行通信 ...传输原理串行通信的数据是一位一位地址进行传输的,在传输中每一位数据都占据一个固定的时间长度。优点:串行通信传输线少,占用引脚资源少,成本低,适合远

    一、两种通信方式概念

    1.并行通信

    • 传输原理:并行通信时数据的各个位同时传送,以字节为单位并行传输
    • 优点:并行通信速度快,传输的数据宽度可以是1~128位,甚至更宽
    • 缺点:并口上导线之间数据同步难处理,占用引脚资源多
    2.串行通信
    • 传输原理:串行通信的数据是一位一位地址进行传输的,在传输中每一位数据都占据一个固定的时间长度。
    • 优点:串行通信传输线少,占用引脚资源少,成本低,适合远距离传送
    • 缺点:速度相对较慢
    二、串行通信方式
    1.串行数据通信模式
    • 单工通信:数据仅能从一台设备到另一台设备进行单一方向的传输。
    • 半双工通信:数据可以从一台设备到另一台设备进行传输,也可以相反方向传输,但不能在同一时刻双向传输数据。
    • 全双工通信:数据可以在同一时刻从一台设备到另一台设备进行传输,也可以进行相反方向的传输,即可以同时双向传输数据。
    2.异步串行通信方式

           异步通信是指数据是以字符为单位i进行传送的,字符与字符间的传送是完全异步的,位与位之间的传送基本上是同步的。异步通信时,数据是一帧一帧传送的,每帧数据包含有起始位(“0”)、数据位、奇偶校验位和停止位(“1”),每帧数据的传送靠起始位来同步。

    3.同步串行通信方式

           同步通信是指同步传输采用字符块的方式,字符与字符之间、字符内部的位之间都同步,减少了每个字符的控制和错误检测数据位,因而可以具有较高的传输速率。

    三、串口编程实验

    1、SCON寄存器工作方式

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    功能

    SM0

    SM1

    SM2

    REN

    TB8

    RB8

    TI

    RI

    • RI:接收中断标志位——接收结束时,会由硬件置1,向CPU发出中断请求。(要由软件复位)
    • TI:发送中断标志位——发送结束时,会由硬件置1,向CPU发出中断请求。要由软件复位)
    • TB8:用来存放发送的第9位。
    • RB8:用来存放接收的第9位。
    • REN:是串行接收允许位——0时:允许串行接收;1时:禁止串行接收

    2、串行口的工作方式

    SM0

    SM1

    方式

    说明

    波特率

    0

    0

    0

    移位寄存器

    fosc/12

    0

    1

    1

    10位异步收发(8位数据)

    可变

    1

    0

    2

    11位异步收发(9位数据)

    fosc/64或fosc/32

    1

    1

    3

    11位异步收发(9位数据)

    可变

    3、PCON寄存器工作方式

    D7

    D6

    D5

    D4

    D3

    D2

    D1

    D0

    功能

    SMOD

    -

    -

    -

    -

    -

    -

    -

    • PCON是没有位寻址的,也就是说不能直接操作SMOD要直接操作PCON寄存器。
    • SMOD:是波特率是否加倍的选择位。——0时:波特率不加倍;1时:波特率加倍。
    4、代码实现
    #include <reg51.h>  
    #include <intrins.h>  
    #include "array.h"  
    #define uint unsigned int  
    #define uchar unsigned char  
    #define ulong unsigned long 
    
    /*******************************************************************************
    * 函数名         :UsartConfiguration()
    * 函数功能		   :设置串口
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void UsartConfiguration()
    {
    	SCON=0X50;			//设置为工作方式1
    	TMOD=0X20;			//设置计数器工作方式2
    	PCON=0X80;			//波特率加倍
    	TH1=0XF3;			//计数器初始值设置,注意波特率是4800的
    	TL1=0XF3;
    	ES=1;				//打开接收中断
    	EA=1;				//打开总中断
    	TR1=1;				//打开计数器
    }
    
    void main()
    {
    	UsartConfiguration();
    	while(1)
    	{
    	}
    }
    
    
    /*******************************************************************************
    * 函数名         :Delay(unsigned int i)
    * 函数功能		   : 延时函数
    * 输入           : 无
    * 输出         	 : 无
    *******************************************************************************/
    void Usart() interrupt 4
    {
    	unsigned char receiveData;
    
    	receiveData=SBUF;	//出去接收到的数据
    	RI = 0;				//清除接收中断标志位
    	SBUF=receiveData;	//将接收到的数据放入到发送寄存器
    	while(!TI);			//等待发送数据完成
    	TI=0;				//清除发送完成标志位
    }
    




    展开全文
  • 一、实验内容 甲乙两个单片机进行串行通信。采用12MHZ时钟频率晶振频率和方式1进行通信。甲机上有4*4键盘、一个七段数码管,乙机上有两个七段数码管;甲机发出按键显示内容,乙机接收后在数码管上交替显示。 二、...

    一、实验内容

    甲乙两个单片机进行串行通信。采用12MHZ时钟频率晶振频率和方式1进行通信。甲机上有4*4键盘、一个七段数码管,乙机上有两个七段数码管;甲机发出按键显示内容,乙机接收后在数码管上交替显示。

    二、实验目的

    理解单片机串行口实现通信的各种工作方式

    掌握单片机串行通信程序设计、调试方法

    三、实验设备

    DELL台式机 、keilC51版本7、proteus版本6

    四、实验电路图


    五、程序流程图 

    查询方式接收流程图


    查询方式发送流程图


    六、程序源码  

    //接收程序
    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int 
    uchar old=16;
    uchar code DSY_CODE[]=
    { 0x3f,0x06,0x5b,0x4f,
      0x66,0x6d,0x7d,0x07,
      0x7f,0x6f,0x77,0x7c,
      0x39,0x5e,0x79,0x71,0x00 };
    //延迟子程序
    void DelayMS(uint ms){
    uchar t;
    while(ms--)
    for(t=0;t<120;t++);
    }
    void main(){
    P0=0x00;P2=0x00;
    SCON=0x50;//串口模式1,8位异步,允许接受
    TMOD=0x20;//T1工作在模式2,8位自动装载
    PCON=0x00;//波特率不倍增
    TH1=0xfd;//波特率9600
    TL1=0xfd;
    RI=0;
     TR1=1;//启动定时器T1
    while(1){
         if(RI){
    RI=0;
    P0=DSY_CODE[old];//显示旧值
    P2=DSY_CODE[SBUF];//显示新值
    old=SBUF;
    }
    DelayMS(100);
    }	  
    }
    //发送程序
    #include<reg51.h>
    #define uchar unsigned char
    #define uint unsigned int 
    uchar code DSY_CODE[]=
    { 0x3f,0x06,0x5b,0x4f,
      0x66,0x6d,0x7d,0x07,
      0x7f,0x6f,0x77,0x7c,
      0x39,0x5e,0x79,0x71 };
    uchar pre_key=16,key=16;
    //延迟子程序
    void DelayMS(uint ms){
    uchar t;
    while(ms--)
    for(t=0;t<120;t++);
    }
    //键盘扫描子程序
    void keys_scan(){
    uchar temp;
    P0=0x0f;
    DelayMS(1);
    temp=P0^0x0f;
    switch(temp){
    case 1:key=0;break;
    case 2:key=1;break;
    case 4:key=2;break;
    case 8:key=3;break;
    }
    P0=0xf0;
    DelayMS(1);
    temp=P0>>4^0x0f;
    switch(temp){
    case 1:key+=0;break;
    case 2:key+=4;break;
    case 4:key+=8;break;
    case 8:key+=12;break;
    }
    }
    //发送子程序
    void putc_to_SerialPort(uchar c){
    SBUF=c;
    while(TI==0);
    TI=0;
    }
    void main(){
    P1=0x00;
    SCON=0x40;//串口工作在方式1(01000000)
    TMOD=0x20;//T1工作在模式2,8位自动装载
    PCON=0x00;//波特率不倍增
    TH1=0xfd;//波特率9600
    TL1=0xfd;
    TI=0;
    TR1=1;//启动定时器T1
    while(1){
    P0=0xf0;
    if(P0!=0xf0)
    keys_scan();
    if(pre_key!=key){
    P1=DSY_CODE[key];
    putc_to_SerialPort(key);
    pre_key=key;
    }
    DelayMS(100);
    }	  
    }
    



    展开全文
  • PC机与单片机串行通信的硬件设计

    千次阅读 2008-01-17 16:14:00
    2006-05-13 21:34:29  摘 要:从实际出发,阐述了几种PC机与单片机串行通信的接口设计方案。经试验验证可适用于多种不同的串行通信控制系统,并达到了预期的效果。 关键词:串行通信;异步方式;近程与...
    2006-05-13 21:34:29

    字体变小字体变大
       摘 要:从实际出发,阐述了几种PC机与单片机串行通信的接口设计方案。经试验验证可适用于多种不同的串行通信控制系统,并达到了预期的效果。
      

      关键词:串行通信;异步方式;近程与远程通信;电流环路
      

      目前,计算机控制系统已逐步从单机控制发展成为多机控制并出现了以计算机技术为核心,与数据通讯技术相结合的集检测、控制和管理为一体的计算机网络,即集中分布式测控系统。其中单片机作为从机,负责现场控制和实时数据的采集;PC机作为主机,负责对各从机发来的数据进行分析、处理,并向各从机发布命令,以实现对工业现场的集中监控与管理。由于主从机需不断进行信息交流,因此通信成为分布式测控系统重要而基本的功能。
      

      本文以MCS-96系列单片机中的8098为例,论述了几种实现PC机和单片机串行通信的硬件接口设计,其中包括RS232标准接口、RS422标准接口、20 mA电流环路串行接口以及利用调制解调器实现远程通信。


    1 基本原理
      PC机与单片机之间通常采用2种通信方式:并行通信和串行通信。并行通信是指将待发送数据的各位同时传送,串行通信则将数据一位一位地按顺序传送。并行通信虽然传输效率高,由于所需硬件设备复杂,不适于长距离通信,所以一般只适用于要求实时性强,传送速率较高的控制系统中,实用面较窄;相比之下,串行通信简单易实现,传输距离较长,所以已被广泛应用于各种工控系统中。
      

      串行通信分为同步通信和异步通信2种方式。同步通信是指通过在每个数据块开始时的同步字符来实现收/发双方同步的一种数据传输方法,常用于信息量大,速度要求高的场合;异步通信则规定了标准的字符数据传输格式,即每一帧信息由起始位、数据位、奇偶校验位和停止位组成。由于有冗余位,所以传送效率不高,常用于信息量不大,速度较低的场合。在计算机测控系统中,由于串行接口的标准化,一般采用异步串行通信方式,以提高其通用性。由于各种接口的机械和电器特性有所差异,串行通信分为近程通信和远程通信。

    2 接口电路的设计
    2.1 近程通信
      目前,PC机是利用异步通讯控制器来实现串行通讯的,其核心是8250通讯芯片加上一些收发逻辑电路。接口标准大多是RS232标准,其通讯距离小于15 m,传输速率小于20 kb/s。RS232标准是按负逻辑定义的,他的“1”电平在-5~-15 V之间,“0”电平在+5~+15 V之间。由于PC机使用的是TTL电平信号,因此数据输出时必须把TTL电平信号转换成驱动器MC1488和接收器MC1489,其作用除了电平转换外,还实现正负逻辑电平转换。如图1和图2所示。

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=160 src="http://www.sodz.com/TECH/gf/5-1.jpg" width=259>

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=182 src="http://www.sodz.com/TECH/gf/5-2.jpg" width=259>

     


      PC机的串行口适用25针D型插座,其中RTS(请求发送,输出)和CTS(清除发送,输入),DSR(数据准备好,输入)和DTR(数据终端准备好,输出),分别连在一起,这是因为PC机的BIOS中的INT14H(串行通讯程序)在接收和发送数据时均要判断CTS和DSR是否有效。8098与RS232标准接口电路图如图3所示。

                            0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=214 src="http://www.sodz.com/TECH/gf/5-3.jpg" width=396>

    2.2 远程通信

      (1)RS422标准接口
      虽然RS232应用很广,但由于数据传输速率慢,通讯距离短,特别是在100 m以上的远程通讯中难以让人满意,因此通常采用RS422,RS449,RS423及RS485等接口标准来实现远程通讯。这里以RS422为例。
     

       RS422接口标准通过提供平衡电路来改进接口电气特性,通过传输线驱动器将逻辑电平变为电位差,实现信息传送。通过传输线接收器将电位差变为逻辑电平,实现信息接收。因而可以支持较高的传输速率和较长的传输距离,在最大传输率10 Mb/s的情况下,电缆允许长度为120 m;如果采用低传输率,如90 kb/s时,最大距离可达1 200 m。

     


      RS422每个通道用两条信号线,一条为逻辑“1”,一条为逻辑“0”。RS422A电路由发送器,接收器,平衡连接电缆,电缆终端负载,接收器等部分组成,通常采用点对点通信方式。
      

      该标准允许驱动器输出为目前RS422A与TTL的电平转换常用芯片是驱动器SN75174和接收器SN75175。该标准允许驱动器输出为±2~±6 V,接收器可以检测到的输入信息电平可低到200 mA。采用光隔离的RS422标准来实现8098与PC机的远程通信的通讯接口电路如图4所示。
     

    (2)20 mA电流环路串行接口
      20 mA电流环是目前远程通讯广泛使用的另一种接口。其原理如图5所示,发送正和负,接受正或负4根线组成一个输入回路和一个输出回路。由于20 mA电流环是一种异步串行接口标准,所以每次发送数据时必须以无电流的起始作为字符的起始位,接收端检测到起始位便开始接收数据。

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=238 src="http://www.sodz.com/TECH/gf/5-4.jpg" width=562>


      电流环路串行接口的优点是低阻抗传输线对电气噪声不敏感,以实现光电隔离,有利于长距离传输。图6为一个带光电隔离的20 mA电流环接口线路图。发送端将TTL电平转为环路电流信号,在接收端又转换成TTL电平。

    (3)Modem实现远程通信
      尽管RS232总线标准无法实现远程数字通讯,但由于电话网络的普及,利用Modem和现有电话线实现PC机和单片机的远程双向通讯也是工业控制系统中广泛采用的一种方法。基本原理框图如图7所示。

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=229 src="http://www.sodz.com/TECH/gf/6-1.jpg" width=280>

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=250 src="http://www.sodz.com/TECH/gf/6-2.jpg" width=600>

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=73 src="http://www.sodz.com/TECH/gf/6-3.jpg" width=441>

     


     
      通常外置式Modem具有RS232接口,通过DB9插头可与计算机RS232口相连接。如果单片机串行口直接与Modem接口,由于没有握手信号,只能保证单个字节传输的正确,对大量数据的传输将导致数据丢失,这点可通过软件处理来避免;如果采用单片机的I/O口与Modem握手,将占用单片机I/O口资源。因此一般采用前一种方法实现对Modem接口。
     

      本文仅以Modem芯片MSM7512B为例,阐述一下接口电路的设计。由于PC机与Modem芯片的接口已非常普及,现仅将8098和MSM7512B的接口电路画出。如图8所示。
     

       MSM7512B主要由调制器、解调器、接口控制逻辑组成。AI是解调器的输入端;AO是调制器输出端。通过控制MOD1,MOD2可使MSM7512B工作在4种不同的工作方式。在工作时,计算机首先检测CD端。若为高电平,表明Modem处于等待与上位机通信状态;

      若其为低电平,则标明Modem已和上位机建立数据通道。而要想使Modem发送数据,应置脚为低电平。单片机发送和接收数据就是对串行通信口写和读,可采用中断或查询方式工作。

    0 && image.height>0){if(image.width>=510){this.width=510;this.height=image.height*510/image.width;}}" height=166 src="http://www.sodz.com/TECH/gf/6-4.jpg" width=381>

     

    3 结 语
      上述几例是工业控制系统中比较实用的串行通信接口电路设计,在具体的控制系统中可根据要求编制相应的软件程序来实现近程或远程的PC机与单片机串行通信。

    展开全文
  • 掌握单片机串行口通信的程序设计,及简易三线式通讯的方法。 2.了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 3.学习串口通讯的中断方式的程序编写方法。 4.进一步熟悉利用 PROTEUS、Keil uVision...

    一、实验目的 1.掌握单片机串行口通信的程序设计,及简易三线式通讯的方法。 
    2.了解实现串行通讯的硬环境、数据格式的协议、数据交换的协议。 
    3.学习串口通讯的中断方式的程序编写方法。 
    4.进一步熟悉利用 PROTEUS、Keil uVision5 等软件进行单片机系统仿真设计的方法。
    二、实验任务 
    1.基本任务 
    (1)已知甲机接 8 个开关,乙机接 8 个发光二极管,利用它们的串口方式 1,波
    特率自定义,实现:将甲机中 8 个开关所代表的数据传送到乙机,并在乙机的 8 个 LED
    灯显示。请在 Proteus 中画出电路原理图,并编写程序仿真实现上述功能。 
    (2)已知单片机的 P0 口接了 8 个发光二极管 LED0~LED7,现要求通过单片机的
    串口收发上位机的命令,实现对这 8 个发光二极管的控制。PC 端采用串口调试程序进
    行数据发送(如使用 stc-isp 烧写软件向单片机发送“88 FB AF XX FC FC”6 个字节的
    命令,其中“88 FB AF”及“FC FC”为数据的帧头和帧尾,“XX”为 00~07 数据。 )单片机
    使用串口中断进行数据接收,同时需要判断帧头和帧尾的正确性。判断帧头和帧尾完毕
    后,若正确的话再判断“XX” 数据,对应“XX” 数据对 LED0~LED7 进行点亮、熄灭控
    制;若不正确丢掉数据, 转入等待接收。 请在 Proteus 中画出电路原理图,并编写程
    序仿真实现上述功能。 
    2.拓展任务 
    在以上基本任务 1 的基础上,奇校验,实现甲机和乙机的全双工通信,即甲机和乙
    机都分别接 8 个开关和 8 个发光二极管,甲机 8 个开关所代表的数据能传送到乙机并在
    乙机的 8 个 LED 灯显示,同时乙机 8 个开关所代表的数据能传送到甲机并在甲机的 8
    个 LED 灯显示,若校验出错则指示灯(自定义)闪烁。请在 Proteus 中画出电路原理图,
    并编写程序仿真实现上述功能。 

     

    //-----------------------发送端---------------------------//
    #include  "STC15.H" 
    bit busy=0;
    //-----------------------串口初始化子函数-------------------------//
    void Uart1_Init(void)	 //9600bps@11.0592MHz         
    {
    	SCON = 0x40;		//8位数据,可变波特率 方式1 
    	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
    	TL1 = 0xE0;		//设定定时初值
    	TH1 = 0xFE;		//设定定时初值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    	ES = 1;     //启动串口中断
    }
    //-----------------------数据发送子函数---------------------------//
    void SendData(unsigned char dat)
    {
      while(busy);   
      SBUF=dat;     
      busy=1;      
    }
    //---------------------------中断函数------------------------------//
    void UART1_isr (void) interrupt 4
    {
      if(TI)        
      { 
        TI=0;    //清除标志位           
        busy=0;  //清除忙标志位              
      }
    }
    //---------------------------主函数------------------------------//
    void main()                                    
    { 
      Uart1_Init();   //串口初始化
      EA=1;	    //打开总中断
      while(1)
    	{
    		SendData(P1);   //发送P1口数值
    	}
    }
    //-----------------------接收端---------------------------//
    #include  "STC15.H" 
    unsigned int temp; 
    //-----------------------串口初始化子函数-------------------------//
    void Uart1_Init(void)	 //9600bps@11.0592MHz         
    {
    	SCON = 0x50;		//8位数据,可变波特率 REN=1处于接受状态
    	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
    	TL1 = 0xE0;		//设定定时初值
    	TH1 = 0xFE;		//设定定时初值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    	ES = 1;     //启动串口中断
    }
    //-------------------------中断函数------------------------------//
    void UART1_isr (void) interrupt 4
    {
      if(RI)                                      
       {
    	   RI=0;    //标志位清0
    		 temp=SBUF;   //数据暂存
    		 P0=temp;		 //P0接收发送端数据
       }
    }
    //---------------------------主函数------------------------------//
    void main()                                    
    { 
      Uart1_Init();    //串口初始化
      EA=1;	     //打开总中断
      while(1);
    }

    #include "stc15.h" 
    #define uchar unsigned int      //对数据类型进行声明定义
    volatile bit Flag=0;
    uchar i,val;
    uchar arr[6];
    //-----------------------串口初始化子函数-------------------------//
    void Uart1_init()  //9600bps@11.0592MHz
    {	
    	PCON &= 0x7F;   //波特率不加倍控制/帧错误检测
    	SCON = 0x50;		//8位数据,可变波特率
    	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
    	TL1 = 0xE0;		//设定定时初值
    	TH1 = 0xFE;		//设定定时初值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    	ES=1;       // 串口1中断打开
    	EA=1;       //全局中断使能
    }
    //---------------------------中断函数------------------------------//
    void Uart1_INT() interrupt 4
    {
    	ES=0;      //串口1中断关闭
    	if(RI)
    	{
    	Flag=1;    //接收到数据,接收标识符有效
    	RI=0;      //串口接收标志位清0
    	arr[i]=SBUF;      //将接收到的数据赋给数组中判断        
    	if(arr[i]==0x88)  //判断数组
         {
            arr[0]=arr[i];
            i=0;
         }
         i++;
         if(i==6)
           {
            i=0;
            if(arr[0]==0x88&&arr[1]==0xFB&&arr[2]==0xAF&&arr[4]==0xFC&&arr[5]==0xFC)
            {
                val=arr[3];
                 switch (val)
                {
                    case 0x00:P0=0XFE;break;
                    case 0x01:P0=0XFD;break;
                    case 0x02:P0=0XFB;break;
                    case 0x03:P0=0XF7;break;
                    case 0x04:P0=0XEF;break;
                    case 0x05:P0=0XDF;break;
                    case 0x06:P0=0XBF;break;
                    case 0x07:P0=0X7F;break;
                } 
            }
          }
    	}
    	 ES=1;             // 串口1中断打开
    }
    //---------------------------主函数------------------------------//
    void main()
    {
    	Uart1_init();      //串口初始化
    	while(1);          //循环运行
    }

    #include "stc15.h"
    #include "intrins.h"
    volatile bit Flag=1;
    //---------------------------延时函数------------------------------//
    void Delay150ms()		//@11.0592MHz
    {
    	unsigned char i, j, k;
    
    	_nop_();
    	_nop_();
    	i = 7;
    	j = 78;
    	k = 167;
    	do
    	{
    		do
    		{
    			while (--k);
    		} while (--j);
    	} while (--i);
    }
    //-----------------------串口初始化子函数-------------------------//
    void Uart1_Init(void)		//9600bps@11.0592MHz
    {
    	SCON = 0x90;		//9位数据,方式2,可变波特率,带TB8/RB8奇偶校验位
    	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
    	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
    	TMOD &= 0x0F;		//设定定时器1为16位自动重装方式
    	TL1 = 0xE0;		  //设定定时初值
    	TH1 = 0xFE;			//设定定时初值
    	ET1 = 0;				//禁止定时器1中断
    	TR1 = 1;				//启动定时器1
    	ES = 1;     		//使能串口中断
    	EA=1;           //全局中断使能
    }
    //-------------------------数据发送函数-----------------------------//
    /*********************************************************************
     * 由于PSW中的P可以表达累加器ACC中“1”的个数奇偶性,P=1,A中“1”的个数为 *
     * 奇数,P=0,A中“1”的个数为偶数                                       *
     *********************************************************************/
    void Send_Data(unsigned char dat)
    {
    	ACC=dat;    //将数据赋给累加器ACC
    	TB8=P;      //发送从累加器得到的第9位数据
    	SBUF=dat;   //发送数据到数据缓冲器
    	while(TI==0);//当TI标志位等于零时 
    	TI=0;       //TI标志位清零
    }
    //-------------------------数据传送函数-----------------------------//
    void UART1_Puts(void)
    {
    	if(Flag)
    	{
    		ES=0;       //串口1中断关闭
    		Send_Data(P1);  //发送P1接收到的数据
    		ES=1;       //串口1中断开启
    		Flag=0;     //清除接收标识符
    	}
    }
    //---------------------------中断函数------------------------------//
    void Uart1_Isr(void) interrupt 4
    {
    	ES=0;         //串口1中断关闭
    	if(RI)			  //RI为1,接收数据
    	{
    		RI=0;		    //RI标志位清零
    		Flag=1;     //接收到数据,接收标识符有效
    		if(RB8==1)	//接收第9位数据校验结果是否为奇数
    		{
    			P0=SBUF;  //将接收到的数据赋给P0端
    		}
    		else 				//校验结果不为奇数时,出错执行P0端LED全亮全灭
    		{
    				P0=0x00;
    				Delay150ms();
    				P0=0xFF;
    				Delay150ms();
    		}
    	}
    		if(TI)			//TI为1,发送数据
    	{
    		TI=0;		    //TI标志位清零
    	}
    	  ES=1;       //串口1中断打开
    }
    //---------------------------主函数------------------------------//
    void main()
    {
    	Uart1_Init();	  //串口初始化
    	while(1)        //循环运行
    	{
    		UART1_Puts(); //数据传送
    	}
    }

     

    展开全文
  • 单片机实验报告-串口实验

    千次阅读 2018-07-22 16:20:44
    1. 掌握 51 单片机串口工作原理。 2. 掌握 51 单片机串口初始化编程。 3. 掌握 51 单片机串口的软硬件编程。 二.实验设备和器件 1.KEIL软件 2.PROTEUS仿真软件 3.伟福实验箱 三.实验内容 (1)编程实现:...
  • 【斯鹭】徐良军利用8031单片机串行口,实现与PC机通讯。本实验实现以下功能,将从实验机键盘上键入的数字,字母显示到PC机显示器上,将PC机键盘输入的字符(0-F)显示到实验机的数码管上。二.实验目的1.掌握...
  • 单片机与 PC 机串口通信实验

    千次阅读 2019-02-26 21:36:14
    实验原理 51 单片机串行口是一个可编程的全双工的通信接口,具有 UART(通用异步收发器)的全部功能,能同时进行数据的发送和接收,也可以作为同步移位寄存器使用。51 单片机串行口主要有两个独立的串行数据...
  • 串行异步通讯模块 在MSP430系列产品中,每一款型号都能实现串行通讯的功能,在MSP430F1X11系列中,可以用定时器A和软件编程结合实现串行通讯功能。而在其它系列产品中都带有硬件的串行通讯模块USART;另外,MSP430F14X...
  • 基于51单片机的串口通信实验

    千次阅读 2018-05-02 21:58:35
    /*************************************************************************************** 串口通信实验 *实现现象:通过串口向单片机发送 10 进制数字,将数字 16 进制显示在数码管上。...
  • tid=206905 串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。...
  • 零成本学Arduino单片机串行通讯

    千次阅读 2014-05-08 00:37:46
        ... 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。...
  • 51单片机编程:双机串行通信

    千次阅读 2016-01-25 11:27:10
    利用 2 个实验系统通过 232 通信,实现双机串行通信功能。用汇编或 C 语言编写一个 51 单片机程序,用本侧的 K0~K3 能控制对侧的 L0~L3,用对侧的 K0~K3 能控制本侧的 L0~L3。通信线断开后,不需重启,接上通信...
  • 51单片机Proteus仿真+Keil工程-实验5-单片机串行口中断实验:放置两个单片机,通过串行口线的互连,应用方式1和方式3,同时设计发送和接受程序,完成两个方式的应用,将发送和接收的内容在虚拟串口中显示。
  • 单片机串口通信实例

    千次阅读 2016-06-24 23:53:27
    上讲介绍并应用了单片机内部定时器和中断,并给出了实例。这一讲将介绍单片机上的串口通信。通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。 ...
  • 51单片机串口多机通信 需要用的的寄存器 (了解的可直接跳到下一节) TMOD 定时器/计数器模式控制寄存器 TCON 定时器控制寄存器 SCON 串口控制寄存器 PCON 电源控制位寄存器 IE 中断中断使能寄存器 补充说明,...
  • 实验七 双机通信

    千次阅读 2019-12-11 18:50:42
    实验七 双机通信 一、实验要求 在两个单片机上实现串行通信,将一块单片机上的按键信息发送到另一块单片机上用八个数码管动态显示出键值。 二、实验目的 1.学习双机通信的基本使用方法。 2.学习双机通信程序的...
  • (2)了解实现串行通讯的硬环境,数据格式的协议,数据交换的协议 (3)了解PC机通讯的基本要求 二、实验内容 利用8051单片机串行口,实现与PC机通讯。本实验实现以下功能,将从实验板键盘上键入的字符或数字显示到PC机...
  • 单片机串口通信实验 一、实验目的 二、实验内容 三、实验步骤 四、C代码如下 五、实验结果 六、实验体会 一、实验目的 1、 掌握单片机串口通信的设计方法; 2、 了解双单片机通信的原理。 二、实验内容...
  • 嵌入式系统的概念 第一种定义:嵌入式系统是以应用为中心、计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 第二种定义:把基于处理器(通用处理器和...
  • 第六章:串行口通信原理及操作流程 6.1并行与串行基本通行方式 单片机通信是指单片机与计算机或单片机单片机之间的信息交换,后者的通信通常用的较多。 通信有并行和串行龄种方式,在单片机系统以及现代单片机测控...
1 2 3 4 5 ... 20
收藏数 729
精华内容 291
关键字:

单片机串行通讯实验原理