通信方式


并行

适合短距离通信,并行通信控制简单、相对传输速度快(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 intuc 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;        //开启定时器1SM0=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;elsej++;}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)。而且在传输数据的时候会又一次进入中断,就是还没处理中
//断就又进入了另外一个中断,导致通信出现异常。


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

【51单片机】(手把手教你)串口通信-基础篇相关推荐

  1. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  2. 【自学51单片机】11 -- UART串口通信

    文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...

  3. 51单片机学习笔记(串口通信 LED点阵屏 DS1302)

    四.串口通信 1.基本概念 通信中最重要的两个方面: 信息表示和解析方法: 信息的传输方法. 通信双方事先需要约定好信息的表示方法和解析方法,做到一致,否则信息不能有效传递. 信号的传输方法是指经过编 ...

  4. VB6.0与51单片机、STM32进行串口通信

    参考资料:https://wenku.baidu.com/view/7c9fdc3e1ed9ad51f11df207.html 1.功能描述--控制LED的亮灭 (1)通过设备管理器设置端口(右击属性 ...

  5. 51单片机学习笔记-6串口通信

    6 串口通信 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓库 ...

  6. 51单片机实战教程之C语言基础(一 创建Keil Project)

    创建Keil Project 第 1 步 添加STC单片机型号及头文件到Keil 后面所有教程及示例将以STC15W4K61S4系列单片机为例,因此需先将STC单片机型号及头文件加入到Keil中.Ke ...

  7. 51单片机实战教程之C语言基础(五 C语言函数及其定义)

    虽然部分C语言函数的返回值与其参数存在对应关系,但是它与数学里的函数不是同一概念.有的书上把它定义为完成特定任务的代码集合. C语言函数的格式为:返回值数据格式  函数名(参数列表){函数体}, 函数 ...

  8. 《手把手教你》系列基础篇之3-python+ selenium自动化测试-驱动浏览器和元素定位大法(详细)

    简介 上一篇中,只是简单地一带而过的说了一些驱动浏览器,这一篇继续说说驱动浏览器,然后再说一说元素定位的方法. 完成环境的安装并测试之后,我们对Selenium有了一定的了解了,接下来我们继续驱动浏览 ...

  9. 《手把手教你》系列基础篇之2-python+ selenium自动化测试-打开和关闭浏览器(详细)

    简介 本节介绍如何初始化一个webdriver实例对象driver,然后打开和关闭firefox浏览器.要用selenium打开fiefox浏览器.首先需要去下载一个driver插件geckodriv ...

最新文章

  1. 菜单Menu(AS开发实战第四章学习笔记)
  2. 如何实现android和服务器长连接呢?推送消息的原理
  3. 【转】解析.Net框架下的XML编程技术
  4. c语言计算多个整数加减,求用C编个大数加减法运算程序
  5. servlet里面为什么有时候覆_为什么新来的经理强烈推荐?前后端分离知识,学到了...
  6. java实现发送QQ邮件
  7. PKM2 - PKManager (基于内容的个人知识管理工具) 5M 绿色免费
  8. java base64转Binary
  9. 易点易动助力叮咚买菜数字化管理固定资产和易耗品
  10. js内置对象方法笔记 js内置函数
  11. js调用网页打印接口
  12. 【珍藏版】震撼发布2017年Android百大框架排行榜
  13. 刷脸支付便利更好推动普惠金融的落地
  14. 第九篇:稳定性之面向失败设计【可用性架构设计、可用性容灾】
  15. 反向安装jar包到本地仓库和清除本地仓库中未下载成功的jar包
  16. unity 裙子摆动_随风摆动的草丛——Unity shader graph 2D初探
  17. 湖北地图html代码,echarts全国省市地图代码
  18. Java网课基础笔记(31)19-08-13
  19. mldonkey系列之三──Ini文件[zt]
  20. JS 刷新当前页面 返回上一页并刷新的方法

热门文章

  1. Java用户账号密码创建登录
  2. java怎么画八卦图_自己画八卦图怎么画?电脑绘制八卦图|八卦图的简单画法
  3. 【C语言】以通讯录为例理解宿舍管理系统,图书管理系统完成C语言期末作业。源代码见文章末尾
  4. 59 SD配置-科目分配-分配科目代码
  5. could not resolve dependency: npm err! peer react@“^16.8.0 || ^17.0.0“ from @material-ui/core@4.12.4
  6. C# 反序列化错误 System.Runtime.Serialization.SerializationException: 无法找到程序集
  7. 【网页制作】CSS文本和字体属性讲解【附讲解视频】
  8. 多线程与JUC面试题
  9. 搭建Genero BDL环境-安装篇
  10. ul li列表样式css,列表ul li 专用样式