| 通信,单片机与外部设备之间的信息交换。 通信方式包含:串行通信和并行通信。
 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工作原理相同,仅仅波特率不同。
 
   单片机串行通讯发送数据,控制流水灯的实现
 发送端程序
 
 接收端程序复制代码#include<reg52.h>
unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void Send(unsigned char dat)
{
   SBUF=dat;
   while(TI==0)        //若发送中断标志位没有置"1",就等待
   {
      ;
   }
   TI=0;
}
void delay(void)
{
   unsigned char m,n;
   for(m=0;m<200;m++)
        for(n=0;n<250;n++)
            ;
}
void main()
{
   unsigned char i;
   TMOD=0x20;           //定时器工作在方式2
   SCON=0x40;           //串口工作方式1
   PCON=0x00;           //设置波特率为9600b/s
   TH1=0xfd;
   TL1=0xfd;
   TR1=1;
   while(1)
   {
      for(i=0;i<8;i++)
         {
             Send(Tab[i]);
                delay();
         }                  
   }
}
复制代码
#include<reg52.h>
unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void Send(unsigned char dat)
{
SBUF=dat;
while(TI==0) //若发送中断标志位没有置"1",就等待
{
;
}
TI=0;
}
void delay(void)
{
unsigned char m,n;
for(m=0;m<200;m++)
for(n=0;n<250;n++)
;
}
void main()
{
unsigned char i;
TMOD=0x20; //定时器工作在方式2
SCON=0x40; //串口工作方式1
PCON=0x00; //设置波特率为9600b/s
TH1=0xfd;
TL1=0xfd;
TR1=1;
while(1)
{
for(i=0;i<8;i++)
{
Send(Tab[i]);
delay();
}
}
}
 
 
    【必读】版权免责声明
        1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
     |