找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2253|回复: 0
打印 上一主题 下一主题
收起左侧

单片机串行通信技术

[复制链接]
跳转到指定楼层
楼主
通信,单片机与外部设备之间的信息交换。
通信方式包含:串行通信和并行通信。
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. #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. }








  37. 接收端
  38. #include<reg52.h>
  39. unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
  40. void Send(unsigned char dat)
  41. {
  42.    SBUF=dat;
  43.    while(TI==0)        //若发送中断标志位没有置"1",就等待
  44.    {
  45.       ;
  46.    }
  47.    TI=0;
  48. }
  49. void delay(void)
  50. {
  51.    unsigned char m,n;
  52.    for(m=0;m<200;m++)
  53.         for(n=0;n<250;n++)
  54.             ;
  55. }
  56. void main()
  57. {
  58.    unsigned char i;
  59.    TMOD=0x20;           //定时器工作在方式2
  60.    SCON=0x40;           //串口工作方式1
  61.    PCON=0x00;           //设置波特率为9600b/s
  62.    TH1=0xfd;
  63.    TL1=0xfd;
  64.    TR1=1;
  65.    while(1)
  66.    {
  67.       for(i=0;i<8;i++)
  68.          {
  69.              Send(Tab[i]);
  70.                 delay();
  71.          }                  
  72.    }
  73. }
复制代码

1.png (32.44 KB, 下载次数: 56)

1.png

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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