找回密码
 注册

QQ登录

只需一步,快速开始

搜索

51单片机串行通信技术

[复制链接]
eng 发表于 2021-6-7 01:46:59 | 显示全部楼层 |阅读模式
通信,单片机与外部设备之间的信息交换。
通信方式包含:串行通信和并行通信。
1.串行通信特点:传输速度慢,接线简单;并行通信传输速度快,接线复杂。
串行通信分为异步串行通信和同步串行通信。
1.异步串行通信:起始位(0)、数据位、停止位(1)。串行通信时,约定好波特率;
2.同步串行通信:无起始位和停止位,使用的时同步字符指示,由时钟控制发送和接收端的同步。
串行通信的数据传送方向
1.单工、半双工、全双工
串行通信的奇偶校验位
1.为了保证数据的正确传输,使用程序状态子(PSW)的奇偶校验位。如果发送端的奇偶校验位与接收端的奇偶校验位相同,则接收,否则不接收,重新发送。
串行通信的结构
1.两个数据缓冲器SBUF;2输入移位寄存器;3.串行控制寄存器SCON;4.定时器T1(用作波特率发生器)
进行串行通信,主要是控制寄存器的使用。
串行口控制寄存器SCON:SM0和SM1控制串行口的工作方式;SM2控制多机通信;REN允许/禁止数据接收位;TB8:发送第9位,RB8接收第9位;TI和RI分别为发送和接收中断标志。
电源控制寄存器PCON只影响波特率的大小
4种工作方式与波特率设置
1.方式0
1.1数据发送
方式0是同步移位寄存方式,因此串行通信中使用8位串/并转换移位寄存器74LS164,RXD输出串行数据,TXD输出移位脉冲,还需要引脚对74LS136清零.  发送数据前,P1.7引脚对74LS164清零,D0~D7引脚输出0,然后执行写命令,向SBUF写数据,从RXD引脚送出8位数据,74LS164从RXD引脚接收8位数据;
1.2数据接收
接收数据,需要在外部接并/串转换移位寄存器74LS165,RXD断用来接收输入的串行数据,TXD端用来输出移位寄存器,P3.7端用来对74LS165的数据进行所存。
2.方式1
方式1是八位异步收发。可以发送或接收10位数据格式信息。1位起始位,8位数据位,1停止位。
2.1数据发送:从TXD引脚输出一个起始位,然后将8位数据依次输出,然后将TI=1,从TXD输出停止位。
2.2数据接收:REN=1,串行口采样由1到0的负跳变,启动接收位,八位数据依次被接收。
3.方式2
9位异步通信方式,每帧数据是11位。1起始位,1停止位,8数据位,1可编程的第九位。其中TB8可以作为奇偶校验位使用。
3.1发送数据:首先设置TB8,然后将要发送的数据写入sbuf,开始发送数据。串行口自动取走TB8的数据,逐一发送数据。发送完成后,将TI=1.
3.2数据接收:REN=1,才可以接收数据。当RXD发生负跳变,开始接收数据。
3.方式3
与方式2工作原理相同,仅仅波特率不同。
1.png
单片机串行通讯发送数据,控制流水灯的实现
发送端程序
  1. #include<reg52.h>
  2. unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3. void Send(unsigned char dat)
  4. {
  5.    SBUF=dat;
  6.    while(TI==0)        //若发送中断标志位没有置"1",就等待
  7.    {
  8.       ;
  9.    }
  10.    TI=0;
  11. }
  12. void delay(void)
  13. {
  14.    unsigned char m,n;
  15.    for(m=0;m<200;m++)
  16.         for(n=0;n<250;n++)
  17.             ;
  18. }
  19. void main()
  20. {
  21.    unsigned char i;
  22.    TMOD=0x20;           //定时器工作在方式2
  23.    SCON=0x40;           //串口工作方式1
  24.    PCON=0x00;           //设置波特率为9600b/s
  25.    TH1=0xfd;
  26.    TL1=0xfd;
  27.    TR1=1;
  28.    while(1)
  29.    {
  30.       for(i=0;i<8;i++)
  31.          {
  32.              Send(Tab[i]);
  33.                 delay();
  34.          }                  
  35.    }
  36. }
复制代码
接收端程序

  1. #include<reg52.h>
  2. unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  3. void Send(unsigned char dat)
  4. {
  5. SBUF=dat;
  6. while(TI==0) //若发送中断标志位没有置"1",就等待
  7. {
  8. ;
  9. }
  10. TI=0;
  11. }
  12. void delay(void)
  13. {
  14. unsigned char m,n;
  15. for(m=0;m<200;m++)
  16. for(n=0;n<250;n++)
  17. ;
  18. }
  19. void main()
  20. {
  21. unsigned char i;
  22. TMOD=0x20; //定时器工作在方式2
  23. SCON=0x40; //串口工作方式1
  24. PCON=0x00; //设置波特率为9600b/s
  25. TH1=0xfd;
  26. TL1=0xfd;
  27. TR1=1;
  28. while(1)
  29. {
  30. for(i=0;i<8;i++)
  31. {
  32. Send(Tab[i]);
  33. delay();
  34. }
  35. }
  36. }
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-26 08:22

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表