|
通信,单片机与外部设备之间的信息交换。
通信方式包含:串行通信和并行通信。
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.png
(32.44 KB, 下载次数: 56)
评分
-
查看全部评分
|