精华内容
下载资源
问答
  • 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指...
  • 51 单片机串口通信程序,RS232串口通信 含详细例子。 含详细例子,RS232串口通信单片机接收发送数据的 C51程序,手把手教你用增强型51 实验板实现RS232 串口通信 51串口通信
  • 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进制的)。

    展开全文
  • 串口与中断的关系: SBUF: 是指串行口中的两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,但地址是重叠的。它们都是字节寻址的寄存器,字节地址均为99H。 在这里讲讲RI ,TI; RI ...

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    例如:奇偶校验,前面发送八位数据码,第九位为验证码,第九位计算前面的二进制中有多少个1,如果1的个数是偶数,验证码发1;如果1的个数是奇数,则为0.这样可以在一定程度上验证数据在发送期间是否出错。
    在这里插入图片描述
    串口与中断的关系:
    在这里插入图片描述
    SBUF: 是指串行口中的两个缓冲寄存器,一个是发送寄存器,一个是接收寄存器,在物理结构上是完全独立的,但地址是重叠的。它们都是字节寻址的寄存器,字节地址均为99H。

    在这里讲讲RI ,TI;
    RI : 接收中断位,当定时器1的时间到后,中断标志位RI置1,与定时器0中的(TF)一样;这样中断就会数据把数据提取出来,将数据缓存到SBUF中,在把数据读到程序中; 例如int a; a = SBUF;
    TI : 发送数据中断 , 当定时器1的中断时间到后,也会定时发送数据 ,同样把中断数据提取出来 , 将数据缓存到SBUF中,再通过SBUF发送到需要接受的端口(例如: 单片机);例如 : SBUF = a;

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    (除了这几个口,其他都是用来配置其他工作方式的,本节只参考工作方式1即可,所以我们对于其他的配置全部置0,对于SM0 ,SM1 ,SM2 ,REN,RI,TI,我们需要根据情况使用)

    这是根据STC–ISP串口调节的,串口调节数据;
    (按照这里设置即可)
    在这里插入图片描述
    (如果想更多了解串口的内容,可以观看AT89C52的使用手册,对日后学习STM32会有很大帮助)

    串口通信:单片机只收不发

    在这里插入代码片:
    #include <REGX52.H>
    #include "delay.h"
    
    unsigned char sec;
    
    void UartInit(void)		//4800bps@12.000MHz
    {
    	PCON |= 0x80;		//使能波特率倍速位SMOD
    	SCON = 0x40;		//8位数据,可变波特率(0x40单片机只收不发)
    	TMOD &= 0x0F;		//清除定时器1模式位
    	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    	TL1 = 0xF3;		//设定定时初值
    	TH1 = 0xF3;		//设定定时器重装值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    }
    
    void UART_SendByte(unsigned char Byte)
    {
       SBUF = Byte;
       while(TI == 0);
    	 TI = 0; 
    }
    
    void main()
    {
    	UartInit();
      while(1)
    	{
    	  UART_SendByte(sec);
    		sec++;
    		Delay(1000);  //1s
    	
    	}
    
    }
    
    
    

    电脑通过串口控制LED灯:

    在这里插入代码片:
    #include <REGX52.H>
    #include "delay.h"
    
    unsigned char sec;
    
    void UartInit(void)		//4800bps@12.000MHz  串口的初始化
    {
    	PCON |= 0x80;		//使能波特率倍速位SMOD
    	SCON = 0x50;		//8位数据,可变波特率,接受和发送数据
    	TMOD &= 0x0F;		//清除定时器1模式位
    	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
    	TL1 = 0xF3;		//设定定时初值
    	TH1 = 0xF3;		//设定定时器重装值
    	ET1 = 0;		//禁止定时器1中断
    	TR1 = 1;		//启动定时器1
    	EA = 1;
    	ES = 1;  //串口使能中断
    }
    
    void UART_SendByte(unsigned char Byte)  //字节的发送
    {
       SBUF = Byte;
       while(TI == 0);
    	 TI = 0; 
    }
    
    
    void main()
    {
    	UartInit();
      while(1)
    	{
    
    	
    	}
    
    }
    
    
    void UART_Routine() interrupt 4
    {
       if(RI == 1)   //接收中断
    	 {
    	   P2 = ~SBUF;          //  读取数据
    		 UART_SendByte(SBUF);   //将数据发送到电脑端
    		 RI = 0;
    	 
    	 }
    
    }
    
    //波特率的计算,用到了定时器1 ,8位自动重装
    //0xf3 = 243
    //又因为定时器每隔256溢出一次
    //所以256-243=13 每次计数13次=13us就溢出
    // 频率 = 1/13us=0.07698MHZ
    //波特率 = 0.07692/16=0.00480769MHZ*10的六次方
    //误差 = 4807.68HZ / 4800 = 0.16
    //HEX文件是十六进制
    //文本模式是ASCLL码值,也可以是字符‘A’
    
    
    
    
    
    
    
    
    
    
    
    
    展开全文
  • //打开串口中断 } void main() { UartInit(); while(1) { if(flag==1) { ES = 0; flag = 0; SBUF = a; while(!TI); //等待数据传输完成 TI = 0; ES = 1; } }; } void serial() interrupt 4 { a = SBUF; P0 = a; RI ...

    硬件说明

    • 单片机型号:STC89C52
    • 晶振频率:11.0592MHZ

    参考代码

    #include <reg52.h>
    
    /*     自定义变量类型    */
    typedef unsigned char uchar;   //0~255
    typedef unsigned int uint;     //0~65535
    
    uchar a;
    uchar flag = 0;
    
    void UartInit(void)		//9600bps@11.0592MHz
    {
        TMOD = 0x20;    //设置定时器1为方式2
        TH1 = 0xfd;     //装入初值 波特率为9600
        TL1 = 0xfd;     
        TR1 = 1;        //启动定时器1
        SM0 = 0;
        SM1 = 1;
        REN = 1;        //接收使能
        EA = 1;         //打开总中断
        ES = 1;         //打开串口中断
    }
    
    
    void main()
    {
        UartInit();
        while(1)
        {
            if(flag==1)
            {
                ES = 0;
                flag = 0;
                SBUF = a;
                while(!TI); //等待数据传输完成
                TI = 0;
                ES = 1;
            }
        };
    }
    
    void serial() interrupt 4
    {
        a = SBUF;
        P0 = a;
        RI = 0;
        flag = 1;
    }
    
    展开全文
  • 51单片机的串口通信实例

    万次阅读 多人点赞 2017-05-21 14:50:16
    Question:以16进制发送一个0-255之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定。#include #define uchar unsigned char #define uint unsigned int sbit duan =P2^6; sbit wei =P2^7;...

    Question:以16进制发送一个0-255之间的任一数,当单片机收到后在数码管上动态显示出来,波特率自定。

    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    sbit duan =P2^6;
    sbit wei =P2^7;
    uchar code table[]={
    0x3f,0x06,0x5b,0x4f,
    0x66,0x6d,0x7d,0x07,
    0x7f,0x6f,0x77,0x7c,
    0x39,0x5e,0x79,0x71};
    uchar flag;
    uchar bai,shi,ge;
    uint num;
    void init();
    void display(uchar bai,char shi,uchar ge);
    void delay(uint xms)
    {
     uint i,j;
     for(i=0;i<xms;i++)
      for(j=0;j<10;j++);
    }
    void main()
    {
     init();
     while(1)
     {
       if(flag==1)
       {
        ES=0;
        flag=0;
        bai=num/100;
        shi=num%100/10;
        ge=num%10;
        /*SBUF=bai;
        while(!TI);
        TI=0;
        SBUF=shi;
        while(!TI);
        TI=0;
        SBUF=ge;
        while(!TI);
        TI=0;*/
        ES=1; 
          }
          display(bai,shi,ge);//如果这个函数写在了上一个循环里面显示会出错,只会显示个位数字!!!!
        }
      }
    void display(uchar bai,uchar shi,uchar ge)
    {
        wei=1;
        P0=0xfe;
        wei=0;
        P0=0xff;
        duan=1;
        P0=table[bai];
        duan=0;
        P0=0xff;
        delay(2);
    
        wei=1;
        P0=0xfd;
        wei=0;
        P0=0xff;
        duan=1;
        P0=table[shi];
        duan=0;
        P0=0xff;
        delay(2);
    
        wei=1;
        P0=0xfb;
        wei=0;
        P0=0xff;
        duan=1;
        P0=table[ge];
        duan=0;
        P0=0xff;
        delay(2);
    
    }
    
    void init()
    {
      TMOD=0x20;
      TH1=0xfd;
      TL1=0xfd;
      SM0=0;
      SM1=1;
      TR1=1;
      REN=1;
      EA=1;
      ES=1;
    
    }
    
    void ser() interrupt 4
    {
    
     num=SBUF;
     flag=1;
     RI=0;
    
    
    }

    Question:以9600bps从计算机发送任一字节数据,当单片机收到该数据后,在此数据前加上一序号然后连同此数据一起发送至计算机,当序号超过255时归零。

    #include <reg52.h>
    #define uchar unsigned char
    #define uint unsigned int
    uchar aa;
    uchar num;
    uchar flag;
    void init();
    void main()
    {
     init();
     while(1)
     {
       if(flag==1)
       {
          flag=0;
          ES=0;             
          if(num==255)
          num=0;
          SBUF=num;
          while(!TI);
          TI=0;
          SBUF=aa;
          while(!TI);
          TI=0;
          ES=1;
    
       }
     }
    }
    void init()
    {
     TMOD=0x20;
     TH1=0xfd;
     TL1=0xfd;
     SM0=0;
     SM1=1;
     TR1=1;
     EA=1;
     ES=1;
     REN=1;
     num=0;
    }
    
    void ser() interrupt 4
    {
     flag=1;
     RI=0;
     aa=SBUF;
     num++;
    
    }
    展开全文
  • 本文主要为两个单片机之间的串口通信实例,希望对你的学习有所帮助。
  • 单片机串口通信程序

    2013-12-12 22:18:46
    单片机串口通信是单片机...近期我们做了个程序:利用单片机串口通信编译一个程序在打开时向电脑发送问候语“hello”,然后电脑输入一个“start”,之后单片机将电脑输入任何字符都显示出来,除非是电脑输入为“end”
  • 利用ARDUINO单片机和设备串口通信,采集数据,数据处理,并利用MODBUS协议传之网络,该例子为实例,可以照此实例改写自己的程序,快捷方便。
  • 51单片机串口通讯例程源码

    千次阅读 2019-01-15 23:06:18
    一、完整工程参考:示例工程源码(点击下载@akoc) 二、源码展示: #define USART_RX_LEN 20 //接收缓存长度(请勿超过芯片rom剩余空间大小) #define USART_TX_LEN 20 //发送缓存长度 typedef struct //串口相关结构体...
  • 这一讲将介绍单片机上的串口通信。通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。  一、原理简介  51 单片机内部有一个全双工串行接口。...
  • 在《51单片机(三十一)—— 串口通信介绍》中,我们介绍了51单片机串口的工作原理及寄存器定义,在本文中,我们通过一个实例来熟悉51单片机的串口使用方法。本文的资源中有实例的源码。在源码中首先是串口的初始化...
  • 这一讲将介绍单片机上的串口通信。通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。  一、原理简介  51 单片机内部有一个全双工串行接口。...
  • 上讲介绍并应用了单片机内部定时器和中断,并给出了实例。这一讲将介绍单片机上的串口通信。通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。
  • 51单片机串口应用实例(汇编)

    千次阅读 2020-11-18 23:26:42
    51串口结合外部中断实例一、 实验题目二、 设计方案及电路三、 实验步骤四、 实验程序 一、 实验题目 猜数字小游戏:串行口发送0x01、0x02、0x03 HEX数据中的一个到51单片机,对应的按键key1-key3,发送数据之后,另...
  • 关于PC机与51单片机串口通信的VC串口通信实例
  • 51单片机串口通讯示例+Proteus仿真 Proteus仿真 本示例需要借助虚拟串口工具,创建2个虚拟串口,用来模拟收发。 关于中文汉字乱码问题,可以使用补丁修复字符编码0Xfd的问题。汉字乱码补丁到华军软件园下载。...
  • 两个单片机之间实现串口通信,包括仿真和程序,使用protues进行仿真
  • 这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能...
  • 51单片机串口通信(UART)

    千次阅读 2019-06-02 19:11:29
    1.串口工作方式为1(8位UART,波特率可变),无校验位; 2.通信数据格式为:1位起始位 + 8位数据位 + 1位停止位; 3.单片机上电或复位后会给下位机发送一个字符串问候语,之后便一直等待接收下位机的数据,并在P0口...
  • STM32串口编程 参考官方文档 串口常用的相关寄存器 USART_SR 状态寄存器 USART_DR数据寄存器 USART_BRR波特率寄存器 串口波特率配置 波特率计算公式 fPCLKx:串口的时钟,从手册中Memory map和Clock ...
  • 51单片机串口通讯程序代码

    千次阅读 2009-10-15 17:02:00
    51单片机双机通讯程序代码 有A和B两台单片机,晶体频率分别为13MHz和14MHz,在容易编程的条件下,以最快的速度进行双工串行通信,A给B循环发送大写字母从‘A’到‘Z’,B给A循环发送小写字母从‘a’到‘z’,双方...
  • 51单片机与电脑通过串口通信的例子,包括单片机程序和电脑主机程序(VC),主机程序使用CSerialPort串口类。数据包格式是自定义的一个简单格式,格式如下: ●下位机返回数据格式:1字节导引头 + 5字节命令 + 1字节...
  • 程序是Labview与单片机串口通讯实例,包括了串口初始化,下位机单片机进行数采,然后将数据不停的发送给上位机,也就是PC,labview读取这些数据,进行显示。该实例是最简单的Labview与单片机通讯实例,希望对...
  • 这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信
  • 这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能...
  • 程序串口PM2,.5串口接收转换程序,已经测试通过
  • N76E003 模拟串口实例

    2018-06-08 17:40:19
    里面涵盖了基本上常用的N76E003实例。其中模拟串口占用了一个IO中断脚和一个定时器,对于急需帮助的工程师们有点用处。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,944
精华内容 1,177
关键字:

51串口通信程序实例