精华内容
下载资源
问答
  • 单片机串口调试助手

    2012-01-04 20:26:59
    单片机 串口调试助手
  • 51单片机串口通信

    2018-12-28 23:03:37
    这是一个关于51单片机串口通信的小例子,用串口助手发送"ab01"led流水,发送“ab02”单片机led另一种效果,发送“ab03”蜂鸣器响,,如果不切换发送的指令,一直处于上一个发送的指令效果上,希望对刚开始学习的有所...
  • 姓名:周崇杰 学号:16040120059 专业:机械设计制造及其自动化转载自:http://blog.csdn.net/a514371309/article/details/73481423...【嵌牛鼻子】:单片机,C语言,串口通信协议【嵌牛提问】:单片机是通过协议进...

    姓名:周崇杰   学号:16040120059    专业:机械设计制造及其自动化

    转载自:http://blog.csdn.net/a514371309/article/details/73481423,有删节

    【嵌牛导读】:单片机与计算机系统最关键的莫过于信息与数据,本文将在上篇文章的基础上,详细介绍了单片机的串口通信协议。

    【嵌牛鼻子】:单片机,C语言,串口通信协议

    【嵌牛提问】:单片机是通过协议进行通信的,那么协议是怎么一回事,它又是怎么让单片机进行通信呢?

    【嵌牛正文】:

    现实生活中, 我们总是要与人打交道,互通有无。单片机也一样,需要跟各种设备交互。例如汽车的显示仪表需要知道汽车的转速及电动机的运行参数,那么显示仪表就需要从汽车的底层控制器取得数据。而这个数据的获得过程就是一个通信过程。类似的例子还有控制器通常是单片机或者PLC与变频器的通信。通信的双方需要遵守一套既定的规则也称为协议,这就好比我们人之间的对话,需要在双方都遵守一套语言语法规则才有可能达成对话。

    通信协议又分为硬件层协议和软件层协议。硬件层协议主要规范了物理上的连线,传输电平信号及传输的秩序等硬件性质的内容。常用的硬件协议有串口,IIC, SPI, RS485, CAN和 USB。软件层协议则更侧重上层应用的规范,比如modbus协议。

    好了,那这里我们就着重介绍51单片机的串口通信协议,以下简称串口。串口的6个特征如下。

    (1)、物理上的连线至少3根,分别是Tx数据发送线,Rx数据接收线,GND共用地线。

    (2)、0与1的约定。RS232电平,约定﹣5V至﹣25V之间的电压信号为1,﹢5V至﹢25V之间的电压信号为0 。TTL电平,约定5V的电压信号为1,0V电压信号为0 。CMOS电平,约定3.3V的电压信号为1,0V电压信号为0 。其中,CMOS电平一般用于ARM芯片中。

    (3)、发送秩序。低位先发。

    (4)、波特率。收发双方共同约定的一个数据位(0或1)在数据传输线上维持的时间。也可理解为每秒可以传输的位数。常用的波特率有300bit/s, 600bit/s, 2400bit/s, 4800bit/s, 9600bit/s。

    (5)、通信的起始信号。发送方在没有发送数据时,应该将Tx置1 。 当需发送时,先将Tx置0,并且保持1位的时间。接受方不断地侦测Rx,如果发现Rx常时间变高后,突然被拉低(置为0),则视为发送方将要发送数据,迅速启动自己的定时器,从而保证了收发双方定时器同步定时。

    (6)、停止信号。发送方发送完最后一个有效位时,必须再将Tx保持1位的时间,即为停止位。

    2c914c33933e

    好了,理论暂时到这里,现在我们要做一个实验,将一个字节从51单片机发送到电脑串口调试助手上。这个实验的目的是为了掌握串口通信协议的收发过程。

    虚拟串口

    实验一、虚拟串口实验

    一般单片机都有专门的串口引脚,51里面分别是P3.0和P3.1,这些引脚拥有串口的硬件电路,因此使用它们并不需要设置信号的发送停止。为了掌握协议,我们使用其他的引脚来模拟串口,所以也叫虚拟串口。这里我们选用P1.0,然而注意到我们51单片机要发送数据给电脑,必须经过一个串口转USB设备(即TTL电平转换为RS232电平),而限于我们的开发板只有P3.0与P3.1连接到了串口转USB设备,所以我们可以将P1.0短接到P3.1 。 下图是这个串口转USB的原理图。

    2c914c33933e

    好了直接上代码吧。

    #include "reg51.h"

    /*

    将P1.0虚拟成串口发送脚TX

    以9600bit/s的比特率向外发送数据

    因为波特率是    9600bit/s

    所以me发送一位的时间是 t=1000000us/9600=104us

    */

    sbit TX=P3^1;//P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1

    #define u16 unsigned int //宏定义

    #define u8 unsigned char

    u8 sbuf;

    bit ti=0;

    voiddelay(u16 x)

    {

    while(x--);

    }

    voidTimer0_Init()

    {

    TMOD |= 0x01;

    TH0=65440/256;

    TH0=65440%256;

    TR0=0;

    }

    voidIsr_Init()

    {

    EA=1;

    ET0=1;

    }

    voidSend_Byte(u8 dat)

    {

    sbuf=dat;//通过引入全局变量sbuf,可以保存形参dat

    TX=0;//A 起始位

    TR0=1;

    while(ti==0);//等待发送完成

    ti=0;//清除发送完成标志

    }

    voidTF0_isr() interrupt 1//每104us进入一次中断

    {

    staticu8 i;//记录进入中断的次数

    TH0=65440/256;

    TL0=65440%256;

    i++;

    if(i>=1 && i<=8)

    {

    if((sbuf&(1<

    {

    TX=0;

    }

    else

    {

    TX=1;

    }

    }

    if(i==9)//停止位

    {

    TX=1;

    }

    if(i==10)

    {

    TR0=0;

    i=0;

    ti=1;//发送完成

    }

    }

    voidmain()

    {

    TX=1;//使TX处于空闲状态

    Timer0_Init();

    Isr_Init();

    while(1)

    {

    Send_Byte(65);//0x41

    delay(60000);

    }

    }

    实验引入了定时器0来控制发送线上的各个位的保持时间。首先main函数进入,TX置1则使发送线处于空闲,这时候发送方和接受方都处于空闲。接下来初始化定时器0,TR0置0表示还不要启动定时器0。接着中断系统初始化,此时中断系统已经开启。进入while循环,先进Send_Byte()函数,将65传给形参dat,dat再将65赋值给sbuf,到这里准备工作就做好了。接着TX置0,这个是起始位,要保持这个起始位104us。于是就启动定时器TR0置1,计时器开始计数。当第一次溢出的时候,也就是过了104us,进入中断,同时接收方也侦测到了这个突然被拉低的信号,于是迅速启动自己的定时器。进入中断子函数后,先是重装定时器初值,然后i加1,也就是当i=1时,就应该发送数据的最低位了,总共有8位数据,所以使用条件语句if(i>=1 && i<=8)来判断是否发送完数据位。然后再通过if(i==9) 来发送停止位,最后当i=10时,也就是发送完了,这时候要关闭定时器(那么程序也就),同时i置0,ti置1(才能跳出while(ti==0)循环),最后将ti置0,保证下次要发送字节时让程序停留在while(ti==0)。

    片上串口

    以上说的是虚拟串口,上文中谈到与串口相关的引脚P3.0与P3.1,事实上51单片机自带片上串口,那这个串口又该怎么使用呢?

    片上串口支持同步模式与异步模式。简单来说同步模式就是指有时钟线,而异步模式无时钟线。这里的时钟线是指在同步通信时,用一根线专门传输时钟信号,这个信号用来与要发送的每一位保持同步,这样就避免了例如异步通信中因为采用定时器而引入的时间误差。

    片上串口还支持8位模式和9位模式。如下图所示

    2c914c33933e

    其中D0-D7是一个字节的8个位。9位模式只是多了一个位TB8,这个TB8的作用是奇偶校验或多机通信。奇偶校验原理这不加分析。多机通信时比如主机只发送数据给网络中的一台地址为0x02的设备,这时候先让TB8为1,前面的D0-D7则为地址即0x02,之后再让TB8为0,前面的D0-D7则为数据了。

    上面设置了片上串口的模式,另外还要设置串口的波特率。

    片上串口的波特率等于定时器1工作在方式2时溢出率的32分频。如果要定时器1工作在方式2,那么TMOD=0x20。另外要保证为32分频,我们还必须设置计数器初值。设晶振为11.0592Mhz,则定时器的计数脉冲为F=f/12,则定时器每计一个脉冲的时间为T=12/f。又令计数器的起点为x,则溢出一次要计的脉冲数为(256-x)。所以在计数起点为x时,溢出一次的时间为t=12/f*(256-x)。则对应的溢出率为1/t=f/(12*(256-x))。对应的波特率就为b=f/(384*(256-x))。

    x=256-f/(384*b)

    其中f为晶振频率,b为希望的波特率,x为定时器的计数起点TH1的值。

    例如当晶振为11.0592M,希望波特率为9600bit/s,则TH1=253。题外话,我们同样可以演算出在其他常用波特率情况下,TH1始终为一个整数。这里也就解释了为什么51里面选用了11.0592M的晶振而不是12M,这样就保证了串口的时序更加准确,虽然牺牲了定时器的准确度。

    实验二,片外串口发送一个字节。

    好了现在开始我们的实验之旅。直接看代码吧。

    #include "reg51.h"

    #define u16 unsigned int

    #define u8 unsigned char

    voiddelay(u16 x)

    {

    while(x--);

    }

    voidUart_Init()//串口初始化

    {

    SCON=0x50;//8位异步模式

    TMOD|=0x20;//定时器1工作方式2

    TH1=253;//9600bit/s

    TR1=1;

    }

    voidSend_Byte(u8 dat)

    {

    SBUF=dat;//启动发送,只需要把发送内容给SBUF这个寄存器

    while(TI==0);//等待发送完成,因为TI为1时表示在发送停止位

    TI=0;

    }

    voidmain()

    {

    Uart_Init();

    while(1)

    {

    Send_Byte('m');

    delay(60000);

    }

    }

    实验二较之实验一,代码减少了很多,而且不用考虑繁琐的位发送时序。只需要明白各个寄存器SCON,TMOD,TCON,SBUF的用法。TI是SCON中的第一位,为发送中断请求标志位。在本方式中,在停止位开始发送时由内部硬件置位,响应中断后TI必须又软件清零。

    实验三、片上串口发送一个字符串

    上面介绍了如何发送一个字节,那如何发送一个字符串甚至文本呢?这里我们首先介绍下字符串的概念。

    字符串:从存储器的某个地址开始,连续存放多个字符的ASCII码,并且在最后一个字符的后面存放一个0,这段连续的内存空间就叫字符串,最后的0叫字符串的结束符。注意这里的0和加单引号的0不是一个概念,加单引号的0是指0的ASCII码。

    数组与字符串的关系:字符串是数组的一种特殊情况,数组在特定条件下可当做字符串用。C语言用双引号描述一个字符串,如“abcd”。

    下面我们通过一个实验来展示如何发送字符串。我们实验的目标是打印字符串“Hello World ! 第一!”到打印机。直接上代码。

    #include "reg51.h"

    #define u16 unsigned int

    #define u8 unsigned char

    voiddelay(u16 x)

    {

    while(x--);

    }

    voidUart_Init()//串口初始化

    {

    SCON=0x50;//8位异步模式

    TMOD|=0x20;//定时器1工作方式2

    TH1=253;//9600bit/s

    TR1=1;

    }

    voidSend_Byte(u8 dat)//串口发送一个字节

    {

    SBUF=dat;//启动发送,只需要把发送内容给SBUF这个寄存器

    while(TI==0);//等待发送完成,因为TI为1时表示在发送停止位

    TI=0;

    }

    voidSend_String(u8 *str)//发送一个字符串  *str为字符串第一个字符的地址

    {

    abc://标号

    if(*str != 0)

    {

    Send_Byte(*str);

    str++;

    gotoabc;

    }

    }

    voidmain()

    {

    Uart_Init();

    while(1)

    {

    Send_String("Hello World! 第一!");

    Send_Byte(10);

    delay(60000);

    delay(60000);

    }

    }

    实验效果

    2c914c33933e

    展开全文
  • 单片机串口通信

    2014-04-13 13:07:22
    PC机 到 单片机之间的通信 可以传输数据,使用串口助手完成
  • 单片机 串口调试助手

    2010-08-03 14:57:44
    单片机串口通信进行调试测试 对单片机串口通信进行调试测试 对单片机串口通信进行调试测试 对单片机串口通信进行调试测试等等
  • 最简洁的单片机串口通信程序,芯片STC15系列 一个同学写的,希望不算盗用版权
  • c#与单片机串口通信 自己项目用的一个程序 用串口助手测试过没问题 用的serialport控件 需要注意的是用serialport时需要调用委托 里面有通信协议 可以直接更改通信协议拿来用
  • openMV和单片机串口通信

    千次阅读 2020-12-16 18:23:19
    openMV和单片机串口通信 前段时间用到openmv用到了串口通信,与PC通信还好,单片机之间通信就有小问题了,这几天有时间总结一下,做个笔记。 以下有三个要点: 1、波特率不要太小,默认的9600就别用了(个别机型也...

    openMV和单片机串口通信

    前段时间用到openmv用到了串口通信,与PC通信还好,单片机之间通信就有小问题了,这几天有时间总结一下,做个笔记。
    以下有三个要点:
    1、波特率不要太小,默认的9600就别用了(个别机型也可能适用),建议115200。
    2、openmv串口通信必须以字节为单位发送数据,否则单片机连串口接收中断都进不了(串口助手例外)。可采用以下函数:

    data=bytearray([0x30])  #ascill码0x30对应字符0
    uart.write(data)
    

    3、单片机进入串口接收中断处理数据,数据大多以回车换行为结束符(0x0d,0x0a),所以最后别忘了连结束符一块发过去,顺序别颠倒,多数据连续发送时可以考虑采用恰当的帧格式保证数据的准确性。

    data=bytearray([0x300x0d,0x0a]) 
    uart.write(data)
    
    展开全文
  • PC机 单片机 串口通信 VB MSComm控件
  • 描述串口通信概述串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。常用三种串口通信协议1、RS-232RS-232(ANSI/EIA-232标准)是...

    描述

    串口通信概述

    串口通信指串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。

    常用三种串口通信协议

    1、RS-232

    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

    6a257845692ffa6ffa3f7703b1878071.png

    从计算机连出的线的截面。

    RS-232针脚的功能:

    数据:

    TXD(pin 3):串口数据输出(Transmit Data)

    RXD(pin 2):串口数据输入(Receive Data)

    握手:

    RTS(pin 7):发送数据请求(Request to Send)

    CTS(pin 8):清除发送(Clear to Send)

    DSR(pin 6):数据发送就绪(Data Send Ready)

    DCD(pin 1):数据载波检测(Data Carrier Detect)

    DTR(pin 4):数据终端就绪(Data Terminal Ready)

    地线:

    GND(pin 5):地线

    其它

    RI(pin 9):铃声指示

    2、RS-422

    RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。

    3、RS-485

    RS-485(EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个设备的能力,你可以使用一个单个RS-485口建立设备网络。出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。

    串口的基本结构

    SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。

    当发送使用时,就采用SBUF=XXX; (XXX为需要传送的数据)

    当接收使用时,采用XXX=SBUF;

    记得因为是串行的所以传输都是一位一位进行的。

    T1溢出率:T1计时器的溢出频率(就是计时器每次低位计满向高位进位时间的倒数)

    用处:用于计算波特率(每秒传输二进制代码的位数)

    b77ce504592f5509b0c2fa1f396ccb7f.png

    串口通信方式

    并行

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

    25fd5f778ea42e010780aba50061d281.png

    串行

    只能一位一位的传送。

    eedc56f05f33a1b07bb3d7b8e64ff00e.png

    同步(了解)

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

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

    异步(常)

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

    格式:

    ba762b1930b9146546b666508827edc5.png

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

    单片机C语言之串口通信协议

    现在我们要做一个实验,将一个字节从51单片机发送到电脑串口调试助手上。这个实验的目的是为了掌握串口通信协议的收发过程。

    虚拟串口

    实验一、虚拟串口实验

    一般单片机都有专门的串口引脚,51里面分别是P3.0和P3.1,这些引脚拥有串口的硬件电路,因此使用它们并不需要设置信号的发送停止。为了掌握协议,我们使用其他的引脚来模拟串口,所以也叫虚拟串口。这里我们选用P1.0,然而注意到我们51单片机要发送数据给电脑,必须经过一个串口转USB设备(即TTL电平转换为RS232电平),而限于我们的开发板只有P3.0与P3.1连接到了串口转USB设备,所以我们可以将P1.0短接到P3.1 。 下图是这个串口转USB的原理图。

    2ba9bee626a62b1444f21ada479905e0.png

    代码如下:

    #include “reg51.h”

    /*

    将P1.0虚拟成串口发送脚TX

    以9600bit/s的比特率向外发送数据

    因为波特率是 9600bit/s

    所以me发送一位的时间是 t=1000000us/9600=104us

    */

    sbit TX=P3^1; //P1^0 output TTL signal, need to transferred to rs232 signal, can be connected to P3^1

    #define u16 unsigned int //宏定义

    #define u8 unsigned char

    u8 sbuf;

    bit ti=0;

    void delay(u16 x)

    {

    while(x--);

    }

    void Timer0_Init()

    {

    TMOD |= 0x01;

    TH0=65440/256;

    TH0=65440%256;

    TR0=0;

    }

    void Isr_Init()

    {

    EA=1;

    ET0=1;

    }

    void Send_Byte(u8 dat)

    {

    sbuf=dat;//通过引入全局变量sbuf,可以保存形参dat

    TX=0; //A 起始位

    TR0=1;

    while(ti==0); //等待发送完成

    ti=0; //清除发送完成标志

    }

    void TF0_isr() interrupt 1 //每104us进入一次中断

    {

    static u8 i; //记录进入中断的次数

    TH0=65440/256;

    TL0=65440%256;

    i++;

    if(i》=1 && i《=8)

    {

    if((sbuf&(1《《(i-1)))==0) // (sbuf&(1《《(i-1)))表示取出i-1位

    {

    TX=0;

    }

    else

    {

    TX=1;

    }

    }

    if(i==9) //停止位

    {

    TX=1;

    }

    if(i==10)

    {

    TR0=0;

    i=0;

    ti=1; //发送完成

    }

    }

    void main()

    {

    TX=1; //使TX处于空闲状态

    Timer0_Init();

    Isr_Init();

    while(1)

    {

    Send_Byte(65); //0x41

    delay(60000);

    }

    }

    实验引入了定时器0来控制发送线上的各个位的保持时间。首先main函数进入,TX置1则使发送线处于空闲,这时候发送方和接受方都处于空闲。接下来初始化定时器0,TR0置0表示还不要启动定时器0。接着中断系统初始化,此时中断系统已经开启。进入while循环,先进Send_Byte()函数,将65传给形参dat,dat再将65赋值给sbuf,到这里准备工作就做好了。接着TX置0,这个是起始位,要保持这个起始位104us。于是就启动定时器TR0置1,计时器开始计数。当第一次溢出的时候,也就是过了104us,进入中断,同时接收方也侦测到了这个突然被拉低的信号,于是迅速启动自己的定时器。进入中断子函数后,先是重装定时器初值,然后i加1,也就是当i=1时,就应该发送数据的最低位了,总共有8位数据,所以使用条件语句if(i》=1 && i《=8)来判断是否发送完数据位。然后再通过if(i==9) 来发送停止位,最后当i=10时,也就是发送完了,这时候要关闭定时器(那么程序也就),同时i置0,ti置1(才能跳出while(ti==0)循环),最后将ti置0,保证下次要发送字节时让程序停留在while(ti==0)。

    片上串口

    以上说的是虚拟串口,上文中谈到与串口相关的引脚P3.0与P3.1,事实上51单片机自带片上串口,那这个串口又该怎么使用呢?

    片上串口支持同步模式与异步模式。简单来说同步模式就是指有时钟线,而异步模式无时钟线。这里的时钟线是指在同步通信时,用一根线专门传输时钟信号,这个信号用来与要发送的每一位保持同步,这样就避免了例如异步通信中因为采用定时器而引入的时间误差。

    片上串口还支持8位模式和9位模式。如下图所示

    68716797530b21a96af17b327492308a.png

    其中D0-D7是一个字节的8个位。9位模式只是多了一个位TB8,这个TB8的作用是奇偶校验或多机通信。奇偶校验原理这不加分析。多机通信时比如主机只发送数据给网络中的一台地址为0x02的设备,这时候先让TB8为1,前面的D0-D7则为地址即0x02,之后再让TB8为0,前面的D0-D7则为数据了。

    上面设置了片上串口的模式,另外还要设置串口的波特率。

    片上串口的波特率等于定时器1工作在方式2时溢出率的32分频。如果要定时器1工作在方式2,那么TMOD=0x20。另外要保证为32分频,我们还必须设置计数器初值。设晶振为11.0592Mhz,则定时器的计数脉冲为F=f/12,则定时器每计一个脉冲的时间为T=12/f。又令计数器的起点为x,则溢出一次要计的脉冲数为(256-x)。所以在计数起点为x时,溢出一次的时间为t=12/f*(256-x)。则对应的溢出率为1/t=f/(12*(256-x))。对应的波特率就为b=f/(384*(256-x))。

    x=256-f/(384*b)

    其中f为晶振频率,b为希望的波特率,x为定时器的计数起点TH1的值。

    例如当晶振为11.0592M,希望波特率为9600bit/s,则TH1=253。题外话,我们同样可以演算出在其他常用波特率情况下,TH1始终为一个整数。这里也就解释了为什么51里面选用了11.0592M的晶振而不是12M,这样就保证了串口的时序更加准确,虽然牺牲了定时器的准确度。

    实验二,片外串口发送一个字节。

    好了现在开始我们的实验之旅。直接看代码吧。

    #include “reg51.h”

    #define u16 unsigned int

    #define u8 unsigned char

    void delay(u16 x)

    {

    while(x--);

    }

    void Uart_Init() //串口初始化

    {

    SCON=0x50; //8位异步模式

    TMOD|=0x20; //定时器1工作方式2

    TH1=253;//9600bit/s

    TR1=1;

    }

    void Send_Byte(u8 dat)

    {

    SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器

    while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位

    TI=0;

    }

    void main()

    {

    Uart_Init();

    while(1)

    {

    Send_Byte(‘m’);

    delay(60000);

    }

    }

    实验二较之实验一,代码减少了很多,而且不用考虑繁琐的位发送时序。只需要明白各个寄存器SCON,TMOD,TCON,SBUF的用法。TI是SCON中的第一位,为发送中断请求标志位。在本方式中,在停止位开始发送时由内部硬件置位,响应中断后TI必须又软件清零。

    实验三、片上串口发送一个字符串

    上面介绍了如何发送一个字节,那如何发送一个字符串甚至文本呢?这里我们首先介绍下字符串的概念。

    字符串:从存储器的某个地址开始,连续存放多个字符的ASCII码,并且在最后一个字符的后面存放一个0,这段连续的内存空间就叫字符串,最后的0叫字符串的结束符。注意这里的0和加单引号的0不是一个概念,加单引号的0是指0的ASCII码。

    数组与字符串的关系:字符串是数组的一种特殊情况,数组在特定条件下可当做字符串用。C语言用双引号描述一个字符串,如“abcd”。

    下面我们通过一个实验来展示如何发送字符串。我们实验的目标是打印字符串“Hello World ! 第一!”到打印机。直接上代码。

    #include “reg51.h”

    #define u16 unsigned int

    #define u8 unsigned char

    void delay(u16 x)

    {

    while(x--);

    }

    void Uart_Init() //串口初始化

    {

    SCON=0x50; //8位异步模式

    TMOD|=0x20; //定时器1工作方式2

    TH1=253;//9600bit/s

    TR1=1;

    }

    void Send_Byte(u8 dat) //串口发送一个字节

    {

    SBUF=dat; //启动发送,只需要把发送内容给SBUF这个寄存器

    while(TI==0); //等待发送完成,因为TI为1时表示在发送停止位

    TI=0;

    }

    void Send_String(u8 *str) //发送一个字符串 *str为字符串第一个字符的地址

    {

    abc: //标号

    if(*str != 0)

    {

    Send_Byte(*str);

    str++;

    goto abc;

    }

    }

    void main()

    {

    Uart_Init();

    while(1)

    {

    Send_String(“Hello World! 第一!”);

    Send_Byte(10);

    delay(60000);

    delay(60000);

    }

    }

    实验效果

    fa83f601afe6b5c4ff528ec1bd175179.png

    打开APP阅读更多精彩内容

    点击阅读全文

    展开全文
  • 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进制的)。

    展开全文
  • 文章目录单片机串口通信原理和控制程序 单片机串口通信原理和控制程序 我们前边学串口通信的时候,比较注重的是串口底层时序上的操作过程,所以例程都是简单的收发字符或者字符串。在实际应用中,往往串口还要和...
  • 通信协议: 第1字节,MSB为1,为第1字节标志,第2字节,MSB...测试方法:可以将串口调试助手的发送框写上 95 10 20 25,并选上16进制发送, 接收框选上16进制显示,如果每发送一次就接收到95 10 20 25,说明测试成功。
  • 单片机串口助手

    2013-03-18 13:55:47
    各种单片机常用的串口助手串口通信调试专用
  • 适用于AT89c51/52单片机串口通信例程,可根据实际需求更改发送的数据和发送波特率
  • 问题:测试51单片机串口通信时,设置主程序为单片机将接收到的数据发送出去,但在串口助手接收到的单片机发来的数据总是乱码。 解决:经检查,是晶振频率设置错误,将原先的12MHz改为11.0592MHz后通信正常。在设置的...
  • 使用串口调试助手观察51单片机keil环境实现的串口通信程序。含串口调试助手和USB驱动。
  • Linux与单片机串口通信 [复制链接] hutians 发表于 2015-2-10 14:48 | 显示全部楼层 Windows下PC与单片机进行串口通信时,几乎什么都是现成的:串口调试助手、usb转串口驱动,...
  • 51单片机串口通信

    2021-03-25 14:58:20
    单片机通信是指单片机单片机 或者 单片机和计算机的相互通信,一般比较多都是单片机(下位机)和计算机(上位机)作为通信。 串行通信其实用的还是挺多的,就比如我们在调试程序时,可以通过串行口来调试程序。像...
  • 单片机 串口编程之串口通信仿真实验

    万次阅读 多人点赞 2018-11-17 18:28:24
    单片机 串口编程之串口通信仿真实验 一、简述 记--简单的使能串口,串口收发数据的例子。(使用Proteus仿真+虚拟串口调试) 代码,仿真文件打包:链接: https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A 提取...
  • 用C#编写的上位机源码,功能可以接收单片机通过串口发来的数据,也可以回发过去,可以显示清除保存数据。调试完毕的工程源码
  • 51单片机串口通讯UART

    万次阅读 多人点赞 2018-08-05 20:33:39
    1、串行通信的的基本知识 在实际的工业生产,或者生活中,计算机的CPU要与外部的设备之间进行信息的交流,数据的交换,所有的这些信息交换均可称为通信通信的方式有两种,分别为串行通信和并行通信。我们通常...
  • 单片机串口通信协议的实现

    千次阅读 2017-12-13 13:27:02
    单片机串口通信协议的实现 单片机上的串口是日常调试和做一些简单人机交互的一种重要的通信方式,其原理网上有一大堆,这里就不再赘述了,下面主要和大家分享一种我在实际项目中经常用到的一个简单的串口通信协议...
  • 51单片机串口通信——串口设置

    万次阅读 2017-08-08 14:19:28
    51单片机串口通信如果全部把发送原理讲完的话可能要打好久几万字, 最重要的是我有些地方也没搞懂的,也讲不清楚,所以今天就直接用代码来解释…….hahahaha 串行口工作之前,应对其进行初始化,主要是设置产生...
  • 用于单片机与pc机间实现串口通信,可以实时在上位机上显示单片机相应端口的输出。

空空如也

空空如也

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

单片机串口通信助手