Presentation is loading. Please wait.

Presentation is loading. Please wait.

第八章 数据通信.

Similar presentations


Presentation on theme: "第八章 数据通信."— Presentation transcript:

1 第八章 数据通信

2 任课教师:刘忠国 山东大学课程中心网站: 宏晶官方网站: STC单片机编译(汇编)/编程(烧录)/仿真工具说 明书; stc15系列单片机器件手册等 keil μvision软件下载及指导手册(Help→μvision Help) Keil Software –Cx51 编译器用户手册: Cx51编译 器--对传统和扩展的8051微处理器的优化的C 编译器和库参考

3 第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理
第八章 数据通信 本章学习目标 了解通信的有关概念 掌握串行通信和并行通信的原理 掌握常见串行接口(RS232/RS485/SPI/I2C)的原 理及应用方法 掌握单片机并行接口的扩展方法

4 第八章 数据通信 8.1 通信的有关概念 串行通信的相关概念 并行通信的相关概念 8.2 串行接口 单片机的串行接口 RS232串行通信接口 RS485通信接口 SPI通信接口 I2C通信接口 8.3 并行接口的扩展方法 A接口及其应用 HC595接口及其应用 1. 串行口的寄存器 2. 串行口的工作方式 3. 多处理机通信 4. 波特率的设定 5. 串行口通信应用举例

5 8.2.1 单片机的串行接口 (1)串口1的编程要点 5、串行接口通信应用举例
下面分别说明STC15F2K60S2单片机使用串口1和串 口2的串行通信程序编程要点。 编程应用中, 虽然可用查询方式进行通信, 但为了有 效进行实时任务处理, 一般用中断方式进行串行通信。 (1)串口1的编程要点 1)设置串口的工作模式 设置SCON寄存器的内容。若要串口接收,需将其中 的REN位置1。 串口1控制寄存器SCON 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 SM0/FE SM1 SM2 REN TB8 RB8 TI RI

6 5、串行接口通信应用举例 (1)串口1的编程要点 2)设置正确的波特率 ①使用定时器1作为波特率发生器时, 需设置定时器1的工 作方式和时间常数(设置TMOD和TH1,TL1寄存器内容), PCON. SMOD位;启动定时器1(置位TCON. TR1)。 ②使用定时器2作为波特率发生器时, 需设置定时器2寄 存器和相应的位, 包括: 定时器2自动重装寄存器T2H和 T2L, AUXR. T2_C/ 位, T2x12位。启动T2(置位T2R), T2开始计数。 位号 D7 D6 D5 D4 D3 D2 D1 D0 定时器名 定时器1 定时器0 位名称 GATE C/ M1 M0 TMOD

7 5、串行接口通信应用举例 (1)串口1的编程要点 3)设置串口的中断优先级 (设置IP寄存器PS位, 也 可以不设置, 取默认值), 设置相应的中断控制位 (IE. ES和IE. EA)。 4)如要串口1发送,将数据送入SBUF。 5)编制串行中断服务程序,在中断服务程序中要有 清除中断标志指令(将SCON. TI和RI清0)。 中断优先级寄存器IP 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PPCA PLVD PADC PS PT1 PX1 PT0 PX0 中断允许寄存器IE 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 EA ELVD EADC ES ET1 EX1 ET0 EX0

8 5、串行接口通信应用举例 (2)串口2的编程要点 1)设置串口2的工作模式
设置S2CON寄存器中的S2SM0位。如要串口2接 收,将S2REN置1。 2)设置串口2的波特率相应的寄存器和位。 包括:T2H和T2L, AUXR. T2_C/ 位,T2x12 位。启动T2(置位T2R),T2开始计数。

9 5、串行接口通信应用举例 (2)串口2的编程要点 3)设置串口2的中断优先级(设置PS2, 也可以不设置, 取默认值), 设置打开相应的中断控制位(ES2和EA)。 4)如要串口2发送,将数据送入S2BUF。 5)编制串行中断服务程序,在中断服务程序中要设置 清除中断标志指令(分别是接收完成标志S2RI和发送 完成标志S2TI (位于S2CON ) )。 第二中断优先级低字节寄存器IP2 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 PSPI PS2 中断允许寄存器IE2 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ET2 ESPI ES2

10 5、串行接口通信应用举例 下面举例说明12T模式下,STC15F2K60S2单片机 串行通信程序的编制方法。
【例8-1】 设有甲、乙两台单片机,编写程序,使 两台单片机间实现如下串行通信功能。(假设系 统时钟为 MHz。) 甲机(发送机):将首址为ADDRT的128字节外 部RAM数据块顺序向乙机发送; 乙机(接收机):将接收的数据,顺序存放在以 首址为ADDRR的外部RAM中。

11 【例8-1】 两台单片机实现数据传输的串行通信功能
硬件电路连接 双机通信时, 二者的TxD和RxD信号线应交叉连接, 即甲机的TxD连接乙机的RxD; 甲机的RxD连接乙机 的TxD。 并且,电源地线要连接到一起。

12 [例8-1] 两台单片机实现数据传输的串行通信功能
解:甲机发送数据程序流程如图所示。 DPTR←ADDRT首址 R0←计数初值0 MOVX MOV SBUF, A 图8-15 甲机发送程序流程图

13 [例8-1] 两台单片机实现数据传输的串行通信功能
甲机(发送机)汇编语言程序: $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ORG 0000H LJMP MAINT ; ORG 0023H LJMP INTSE1 ;串口1中断服务程序入口 ORG 0100H MAINT: MOV SP, #60H ;设置堆栈指针 MOV SCON, # B ;置串行口工作方式1 MOV AUXR, #00H ;选择定时器1为波特率发生器 MOV TMOD, #20H ;定时器1为工作方式2: 8位自重装方 式 MOV TH1, #0FDH ;9600bps的时间常数 MOV TL1, #0FDH ;可查表8-4(SMOD=0) SETB TR1 ;启动定时器1 按程序流程图 ×SYSclk/12/(256-TH1) /12/( )/32=9600 8位UART,可变波特 率

14 [例8-1] 两台单片机实现数据传输的串行通信功能
甲机(发送机)汇编语言程序(续): (续) SETB TR1 ;启动定时器1 SETB ES ;串行口开中断 SETB EA ;开中断 MOV DPTR, #ADDRT ;ADDRT首址,可用EQU定义 MOV R0, #00H ;R0计数传送字节数(128), 初值=0 MOVX ;取第一个发送字节 MOV SBUF,A ;启动串行口发送 SJMP $ ;等待中断 按程序流程图

15 [例8-1] 两台单片机实现数据传输的串行通信功能
;中断服务程序 INTSE1: CLR TI ;将中断标志清零 CJNE R0, #7FH, LOOPT ;判128B是否发完,若没完,则转 CLR ES ;全部发送完毕, 禁止串行口中断 LJMP ENDT ;转中断返回 LOOPT: INC R0 ;修改传送字节数(128) 计数值 INC DPTR ;修改发送数据的地址指针 MOVX ;取发送数据 MOV SBUF, A ;启动串行口 ENDT: RETI ;中断返回 END

16 [例8-1] 两台单片机实现数据传输的串行通信功能
乙机接收数据的程序流程如图所示。 DPTR←ADDRR首址 R0←计数初值0 图8-16 乙机接收数据流程图

17 [例8-1] 两台单片机实现数据传输的串行通信功能
乙机接收汇编语言程序(接收方波特率须和发送方波特率相同): $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ORG 0000H LJMP MAINR ;转主程序 ORG 0023H LJMP INTSE2 ;串口1中断服务程序入口 ORG 0100H MAINR:MOV SP, #60H ;设置堆栈指针 MOV SCON, # B ;置串口方式1,允许接收 MOV AUXR, #00H ;选定时器1作为波特率发生器 MOV TMOD, #20H ;定时器1为工作方式2 MOV TH1, #0FDH ;产生9600bps的时间常数 MOV TL1, #0FDH ;可查表8-4(SMOD=0) SETB TR1 ;启动定时器1 SETB ES ;串行口开中断 SETB EA ;开中断 MOV DPTR,#ADDRR ;乙机数据缓冲区首址送DPTR MOV R0, #00H ;置传送字节数初值 SJMP $ ;等待中断 [例8-1] 两台单片机实现数据传输的串行通信功能

18 [例8-1] 两台单片机实现数据传输的串行通信功能
;中断服务程序 INTSE2:CLR RI ;清接收中断标志 MOV A, SBUF ;取接收的数据 ;接收的数据送缓冲区 CJNE R0, #7FH, LOOPR ;接收完?若没,转LOOPR CLR ES ;若接收完, 则关串行口中断 LJMP ENDR LOOPR:INC R0 ;修改传送字节数计数值 INC DPTR ;修改地址指针 ENDR: RETI ;中断返回 END 乙机对应的C语言程序请读者参照主机的C语言程序自行编写。

19 5、串行接口通信应用举例 【例8-2】 设有甲、乙两台单片机,以工作方式2进行串 行通信。每帧为11位,可程控的第9位数据为奇偶校验 用的补偶位。编程实现如下所述的应答通信功能: 甲机取一数据,进行奇偶校验后发送。 乙机对收到的数据进行奇偶校验, 若补偶正确则乙机向 甲机发应答信息 “00H”, 代表“数据发送正确” , 甲机收 到此信息后再发送下一字节。 若奇偶校验错, 则乙机向甲机发 “0FFH” , 表“数据不正 确” , 要求甲机再次发送原数据, 直至数据发送正确。 甲机发送128字节数据后停止发送。乙机接收128字节 数据。

20 [例8-2] 两台单片机进行奇偶校验的串行通信。
解:甲机流程图 甲机中断服务程序 (入口0023H) 主程序 方 式 2: 9位固定波特率 与定时器无关 (a)甲机发送数据流程图

21 [例8-2] 两台单片机进行奇偶校验的串行通信
乙机中断服务程序 (入口0023H) 乙机主程序 方式2: 9位固定波特率 与定时器无关 (b)乙机接收数据流程图

22 [例8-2] 两台单片机进行奇偶校验的串行通信
甲机汇编源程序: $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ADDRT EQU 0000H ORG 0000H LJMP MAINT ;跳至主程序入口地址 ORG 0023H ;串口1中断服务程序入口 LJMP INTSET ORG 0100H MAINT: MOV SP, #60H MOV PCON, #80H ;波特率加倍(SMOD=1) MOV SCON, # B ;置方式2, 并允许接收 MOV DPTR, #ADDRT ;数据块首址ADDRT地址指针 MOV R0, #00H ;设置发送字节数计数器初值

23 [例8-2] 两台单片机进行奇偶校验的串行通信
甲机汇编源程序(续): SETB ES ;允许串行口中断 SETB EA ;CPU开中断 MOVX ;取第一个发送数据 MOV C, P ;数据补偶 MOV TB8, C MOV SBUF, A ;启动串行口,发送数据 SJMP $

24 [例8-2] 两台单片机进行奇偶校验的串行通信
;甲机中断服务程序 INTSET: JB RI, LOOPT1;接收中断?若RI=1,则转接收 乙机发送的应答信息 CLR TI ;因RI=0,则必有TI=1,表明是甲机发送数据中断请求 LJMP ENDT ;甲机发送一数据完毕跳至中断返回程序 LOOPT1: CLR RI ;清接收中断标志 MOV A, SBUF ;取乙机的应答数据 SUBB A, #01H ;判断乙机应答信息是否为“00H” JC LOOPT2 ;数据传送正确, 则转LOOPT2,发送下一数据 MOVX ;数据传送不正确,则重新发送 MOV C, P ;数据补偶 MOV TB8, C MOV SBUF, A ;启动串行口, 重发一次数据 LJMP ENDT ;跳至中断返回程序

25 [例8-2] 两台单片机进行奇偶校验的串行通信
;甲机中断服务程序(续) LOOPT2:INC DPTR ;修改地址指针,发送下一个数据 INC R0 ;修改发送字节数计数值 MOVX ;下一个数据补偶 MOV C, P MOV TB8, C ;不能直接使用MOV TB8, P MOV SBUF, A ;启动串行口,发送新的数据 CJNE R0, #80H, ENDT ;数据发送完?若没则中断返回 CLR ES ;全部发送完毕, 禁止串行口中断 ENDT: RETI ;中断返回 END 传送128个字节 应该是7FH

26 [例8-2] 两台单片机进行奇偶校验的串行通信
甲机的C语言程序: #include “stc15.h” //包含单片机寄存器定义文件 unsigned char xdata ADDRT[128]; unsigned char num=0, retval; unsigned char *mypdata; void main (void) { PCON=0x80; // 波特率加倍(SMOD=1) SCON=0x90; //置方式2, 并允许接收 ES=1; EA=1; mypdata=ADDRT; ACC=*mypdata; //将发送数据送到ACC,以反映奇偶性 TB8=P; //数据补偶, 汇编不能这样用,但C语言可以 SBUF=ACC; while(1); }

27 [例8-2] 两台单片机进行奇偶校验的串行通信
甲机中断服务程序 void Serial_ISR(void) interrupt 4 { if(RI) //若RI=1,说明是接收中断 { RI=0; //将中断标志清零 retval = SBUF; //将串行口缓冲器中的内容读到retval中 if(retval!=0) //若retval≠0,传输有错, 需重新发送原数据 { ACC=*mypdata; //从发送数据区中取数据到A TB8 = P; SBUF = ACC; //数据发送 } else { mypdata++; //指向发送数据区的地址指针加1 ACC=*mypdata; //取新数据到A TB8=P; SBUF=ACC; //发送新数据 if(num++ == 0x7F) //若数据发完, 则清中断标志返回 ES=0; TI = 0;

28 [例8-2] 两台单片机进行奇偶校验的串行通信
乙机汇编语言程序: $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ADDRR EQU 0000H ORG 0000H LJMP MAINR ;主程序入口 ORG 0023H ;串行中断入口地址 LJMP INTSER ;转至串口中断服务程序 ORG 0100H MAINR:MOV SP, #60H MOV PCON,#80H ;波特率加倍(SMOD=1) MOV SCON, # B ;置串口方式2, 并允许接收 MOV DPTR, #ADDRR ;数据地址指针指向首址 MOV R0, #00H ;接收数据字节数计数器置初值 SETB ES ;串行口开中断 SETB EA ;CPU开中断 SJMP $ ;等待中断

29 [例8-2] 两台单片机进行奇偶校验的串行通信
;乙机串行口中断服务程序 INTSER: JB RI, LOOPR1 ;若RI=1,则转接收程序入口 CLR TI ;若RI=0,必有TI=1,是发送中断,故清零 LJMP ENDR ;跳至中断返回程序 LOOPR1:CLR RI ;清接收中断标志 MOV A, SBUF ;读取接收的数据 MOV C, P ;奇偶校验 JC LOOPR2 ;8位数奇数个1, 则转LOOPR2再检测RB8位 ORL C, RB8 ;若8位数偶数个1,则C | RB8应为0 JC LOOPR3 ;奇偶校验错误时,转LOOPR3报错并中断返回 LJMP LOOPR4 ;补偶正确, 转LOOPR4, 传输继续 LOOPR2:ANL C,RB8 ; 8位数奇数个1, 则C & RB8应为1 JC LOOPR4 ;补偶正确, 转LOOPR4, 传输继续 LOOPR3:MOV A,#0FFH ;应答“0FFH” 给甲机,数据不正确 MOV SBUF,A ;该指令发送“0FFH” 给甲机 LJMP ENDR ;跳至中断返回程序 [例8-2] 两台单片机进行奇偶校验的串行通信

30 [例8-2] 两台单片机进行奇偶校验的串行通信
;乙机串口中断服务程序(续) A ;将接收正确数据送数据缓冲区 MOV A, #00H ;数据传送正确,发应答“00H”给甲机 MOV SBUF, A ;该指令发送“00H”给甲机 INC R0 ; 数据传送字节数计数器 值加1 INC DPTR ;修改发送数据的地址指针 CJNE R0, #80H, ENDR ;若数据没接收完,则中断返回 CLR ES ;接收完毕,关串行口中断 ENDR: RETI ;中断返回 END 前页有指令MOV A, SBUF 要接收128个字节 这里应该是80H

31 [例8-2] 两台单片机进行奇偶校验的串行通信
乙机的C语言程序: #include “stc15.h” //包含单片机寄存器定义文件 unsigned char xdata ADDRR[128]; unsigned char num=0; unsigned char *mypdata; void main (void) { PCON=0x80; //波特率加倍(SMOD=1) SCON=0x90; //置串口方式2, 并允许接收 mypdata=ADDRR; //数据地址指针指向首址 ES=1; //串行口开中断 EA=1; //CPU开中断 while(1); }

32 [例8-2] 两台单片机进行奇偶校验的串行通信
void Serial_ISR(void) interrupt 4 { if(RI) { RI=0; ACC = SBUF; //读缓冲区数据到A if(P==RB8) //P=RB8时,奇偶校验正确 { *mypdata = ACC; //保存数据 SBUF=0x00; //发出信息“0x00” mypdata++; if (num++ == 0x80) ES = 0; } else SBUF = 0xff; //奇偶校验错误,发出信息“0xFF” TI = 0;

33 5、串行接口通信应用举例 【例8-3】 多机通信编程举例。
用简单实例说明多机串行通信中从机的基本工作过程。 而实际应用中还需要考虑通信的规范协议。有些协议 很复杂,在此不加以考虑。并且,一般情况下,最好 使用RS485接口进行多机通信。 假设系统晶振频率为 MHz。 进行多机通信时应注意,只有在从机启动以后,处 于接收状态,主机才能开始发送信息。

34 【例8-3】 多机通信编程举例。 设多机单工通信示意图如图。编程实现如下功能:
主机: 先向从机发送一帧地址信息,然后再向从机发送 10个数据信息。 从机: 接收主机发来地址帧信息, 并与本机地址号比较, 若不符合, 保持SM2=1不变; 若相等, 则使SM2清零, 准备 接收后续的数据信息, 直至接 收完10个数据信息。 图 多机单工通讯连线图

35 【例8-3】 多机通信编程举例 解: 主机的程序流程图 用串行口方式3, 含定时器1初始化 且禁止接收中断 (a)主机的程序流程图
图8-19 多机单工通信流程图

36 【例8-3】 多机通信编程举例 从机的程序流程图 用串行口方式3, 含定时器1初始化 (b)从机的程序流程图 图8-19 多机单工通信流程图

37 【例8-3】 多机通信编程举例 $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ADDRT EQU 0000H
主机汇编语言程序: $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ADDRT EQU H SLAVE EQU ;从机地址号 ORG H LJMP MAINT ;主程序入口地址 ORG 0023H LJMP INTST ;串口1中断入口地址 ORG 0100H MAINT:MOV SP, #60H MOV SCON, #0C0H ;串行口方式3, 禁止接收中断 MOV AUXR, #00H ;选定时器1作波特率发生器 MOV TMOD, #20H ;置T1工作方式2 MOV TH1, #0FAH ;置4800波特率(可查表8-4) MOV TL1, #0FAH ;相应的时间常数

38 【例8-3】 多机通信编程举例 主机汇编语言程序(续): MOV DPTR,#ADDRT ;置数据地址指针,指向首址 MOV R0, #00H ;发送数据字节数计数器清0 MOV R2, #SLAVE ;从机地址号5 →R2 SETB TR1 ;启动T1 SETB ES 串行口开中断 SETB EA ;CPU开中断 SETB TB8 ;置位TB8, 作为地址帧信息特征 MOV A, R2 ;发送地址帧信息 MOV SBUF, A SJMP $ ;等待中断

39 【例8-3】 多机通信编程举例 ;主机串行口中断服务程序: INTST:CLR TI ;清发送中断标志 CLR TB8 ;清TB8位, 为发数据帧信息做准备 MOVX ;发送一个数据字节 MOV SBUF, A INC DPTR ;修改数据地址指针 INC R0 ;发送字节数计数器加1 CJNE R0, #0AH, LOOPT ;判数据字节是否发送完 CLR ES LOOPT:RETI END

40 主机的C语言程序: #include “stc15
主机的C语言程序: #include “stc15.h” //包含单片机寄存器定义文件 unsigned char xdata ADDRT[10]; //外部数据RAM单元 unsigned char SLAVE; //保存从机地址号的变量 unsigned char num=0, *mypdata; void main (void) { SCON=0xC0; //串行口方式3, 禁止接收中断 AUXR=0x0; //选定时器1作波特率发生器 TMOD=0x20; //置T1工作方式2 TH1=0xfa; TL1=0xfa; //置4800波特率的时间常数 mypdata=ADDRT; //置数据地址指针,指向首址 SLAVE=5; //定义从机地址,假设从机地址为5 TR1=1; ES=1; EA=1; TB8=1; SBUF=SLAVE; //发送从机地址号5 while(1); //等待中断 } 【例8-3】 多机通信编程举例

41 【例8-3】 多机通信编程举例 //主机串行口中断服务C程序: void Serial_ISR(void) interrupt 4 { TI=0; TB8=0; SBUF=*mypdata; //发送数据 mypdata++; //修改数据地址指针 num++; //发送字节数计数器加1 if(num==0x0a) ES=0; }

42 【例8-3】 多机通信编程举例 从机汇编语言主程序: $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 ADDRR EQU 0000H SLAVE EQU 5 ;从机地址号 ORG 0000H LJMP MAINR ;从机主程序入口地址 ORG 0023H LJMP INTSR ;串口1中断入口地址 ORG 0100H MAINR:MOV SP, #60H MOV SCON, #0F0H ;串口方式3, SM2=1, REN=1, 接收状态 MOV AUXR, #00H ;选定时器1作为波特率发生器 MOV TMOD, #20H ;置T1为工作方式2

43 【例8-3】 多机通信编程举例 ;从机汇编语言主程序(续): MOV TH1,#0FAH ;置4800波特率 MOV TL1,#0FAH ;相应的时间常数 MOV DPTR,#ADDRR ;置数据地址指针,指向首址 MOV R0,#0AH ;接收数据字节数计数器置为10(减一计数) SETB TR1 ;启动T1 SETB ES ;串行口开中断 SETB EA ;CPU开中断 SJMP $ ;等待中断

44 【例8-3】 多机通信编程举例 ;从机串口汇编中断服务程序: INTSR: CLR RI ;清接收中断标志 MOV A, SBUF ;取接收信息 MOV C, RB8 ;取RB8(信息特征位)→C JNC LOOPR1 ;RB8=0,为数据帧,转 LOOPR1接收继续 XRL A, #SLAVE ;RB8=1,为地址帧,与本机地址号比较 JZ LOOPR2 ;地址相等, 则转LOOPR2准备收数据 LJMP ENDR ;地址不相等,则中断返回ENDR LOOPR2:CLR SM2 ;清SM2,为接收数据帧信息做准备 LJMP ENDR ;中断返回 ;接收的数据→数据缓冲区 INC DPTR ;修改数据地址指针 DJNZ R0, ENDR ;数据没全部接收完,则转LOOPR2 SETB SM2 ;全部接收完, 置SM2=1 ENDR: RETI ;中断返回 END 中断返回

45 【例8-3】 多机通信编程举例 从机对应C语言程序: #include “stc15.h” //包含单片机寄存器定义文件 unsigned char xdata ADDRR[10]; unsigned char SLAVE, num=0x0a, rdata, *mypdata; void main (void) { SCON=0xf0; //串口方式3, SM2=1, REN=1允许接收中断 AUXR=0x0; //选定时器1作波特率发生器 TMOD=0x20; //置T1工作方式2 TH1=0xfa; TL1=0xfa; //置4800波特率的时间常数 mypdata=ADDRR; //置数据地址指针,指向首址 SLAVE=5; //设定从机地址 TR1=1; ES=1; EA=1; while(1); //等待中断 }

46 只有SM2=1, RB8=1或SM2=0, RB8=0才产生中断
【例8-3】 多机通信编程举例 void Serial_ISR(void) interrupt 4 { RI=0; rdata=SBUF; //将接收缓冲区数据保存到rdata变量 if(RB8) //RB8=1说明收到的信息是地址 { if(rdata==SLAVE) //如果地址相等, 则SM2=0 SM2=0; } else //接收到的信息是数据 { *mypdata=rdata; mypdata++; num--; if(num==0x00) //所有数据接收完毕 SM2=1; //令SM2=1,为下次接收地址信息做准备 SM2=1, RB8=0的情形不会产生中断, 只有SM2=1, RB8=1或SM2=0, RB8=0才产生中断

47 [例8-4]串口1用定时器2做波特率发生器的串行通信实例
#include “stc15.h” //包含寄存器定义文件 #include “intrins.h” #define RELOAD_COUNT 0xfbD8 // RL_TL2=0xD8 //SYSclk=18.432MHz, 12T, SMOD=0(无关), RL_TH2 =0FFH, [RL_TH2, RL_TL2]=0FFD8H=65496; 此时波特率9600bps; unsigned char array[9]={0,2,4,6,8,10,12,14,16}; void UART_send(unsigned char i); void delay UART_Receive(void); 当串口1方式1用定时器2(固定的16位自动重装模式) 时, 当T2x12=0时, 定时器2的溢出率 =SYSclk/12/( [RL_TH2, RL_TL2] ) 此时,串口1的波特率 = SYSclk/12/( [RL_TH2,RL_TL2])/4 波特率= /12/( ])/4=9600

48 [例8-4]串口1用定时器2做波特率发生器的串行通信实例
void main(void) { unsigned char i; //串口初始化 SCON = 0x50; //方式1 (0101,0000) 8位可变波特率, 无奇偶校验位 T2H = 0; // 应该为T2H = 0FFH T2L = RELOAD_COUNT; // T2L = 0xD8 AUXR = 0x191; // T2R=1, 启动定时器2, T2_C/ =0, 定时器方式; //S1ST2 = 1, 选择定时器2作为波特率发生器 ES = 1; //允许串口中断 EA = 1; //开总中断 UART_send(0x34); //串口发送数据表示单片机串口正常工作 UART_send(0xa7); //串口发送数据表示单片机串口正常工作 for(i = 0;i<9;i++) UART_send(array[i]); while(1); } 波特率= /12/( ])/4=9600

49 [例8-4]串口1用定时器2做波特率发生器的串行通信实例
void UART_send(unsigned char i) { ES = 0; //关串口中断 TI = 0; //清零串口发送完成中断请求标志 SBUF = i; while(TI ==0); //等待发送完成 ES = 1; //允许串口中断 }

50 [例8-4]串口1用定时器2做波特率发生器的串行通信实例
void UART_Receive(void) interrupt 4 { unsigned char k; if(RI==1) RI=0; k=SBUF; UART_send(k+1); } else TI=0;

51 用串口2发送一组数据。设晶振频率SYSclk=18.432MHz, 波特率为115200bps。发送数据以0作为结束标志。
【例8-5】串行口2的使用实例。 115200/12=9600 用串口2发送一组数据。设晶振频率SYSclk=18.432MHz, 波特率为115200bps。发送数据以0作为结束标志。 解:假设用1T方式,汇编语言程序如下: $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 NONE_PARITY EQU ;无校验;这6行定义奇偶校验模式 ODD_PARITY EQU ;奇校验 EVEN_PARITY EQU ;偶校验 MARK_PARITY EQU ;Mark校验, 校验位固定为1 SPACE_PARITY EQU ;空检验, 校验位固定为0 PARITYBIT EQU EVEN_PARITY ;测试偶校验 S2RI EQU 01H S2TI EQU 02H S2RB8 EQU 04H S2TB8 EQU 08H BUSY BIT 20H ;传输忙标志

52 [例8-5]串口2使用实例。发送数据前, 校验位送S2TB8
ORG 0000H LJMP MAIN ORG 0043H LJMP UART2_ISR ORG 0100H MAIN:CLR BUSY CLR EA MOV SP, #7FH IF PARITYBIT==NONE_PARITY MOV S2CON, #50H ;8位UART, 不用校验位,允许接收 ELSEIF (PARITYBIT==ODD_PARITY)||(PARITYBIT==EVEN_PARI TY) ||(PARITYBIT==MARK_PARITY) MOV S2CON, #0DAH ;9位UART, 校验位初始值设为1 ELSEIF PARITYBIT==SPACE_PARITY MOV S2CON, #0D2H ;9位UART, 校验位初始值设为0 ENDIF 除发送数据, 也接收数据并在P0口显示数据, P2.2口显示奇偶校验位。 S2SM0 方式 功能说明 方式0 8位UART, 波特率可变 1 方式1 9位UART, 波特率可变

53 [例8-5]串口2使用实例。发送数据前, 校验位送S2TB8
MOV AUXR, #05H ;T2工作于1T模式,T2作为波特率发生器 MOV T2L, #0D8H ;设置波特率发生器自动重装常数低节 MOV T2H, #0FFH ;设置波特率发生器自动重装常数高字 ORL AUXR, #10H ;T2R=1, 启动定时器2 ORL IE2, #01H ;允许UART2中断 SETB EA ; 开总中断 MOV DPTR, #TESTSTR ;数字串首址送DPTR LCALL SENDSTRING ;调用发送子程序 SJMP $ TESTSTR: ;测试数字串 DB "STC15F Uart2 Test!", 0DH, 0AH,0 字符串

54 【例8-5】串行口2的使用实例。 本例除发送数据, 也接收数据并在P0口显示数据, P2.2口显示奇偶校验位。
;UART2 中断服务子程序 UART2_ISR: PUSH ACC PUSH PSW MOV A, S2CON ;读取UART2控制寄存器 JNB ACC.0, CHECKTI ;检查S2CON的S2RI位, 为0查S2TI ANL S2CON, #NOT S2RI ;将S2RI位清0, NOT按位求补(非) MOV P0, S2BUF ;在P0口上显示接收到的数据 ANL A, #S2RB8 ;获得S2RB8, #S2RB8=04H MOV P2, A ;在P2.2上显示奇偶校验位 LJMP ISR_EXIT ;中断返回 CHECKTI: JNB ACC.1, ISR_EXIT ;检查S2CON的S2TI位 ANL S2CON, #NOT S2TI ;将S2TI位清0, NOT按位求补 CLR BUSY ;将传输忙标志清0, 发送数据时置BUSY为1, ISR_EXIT: POP PSW POP ACC RETI ;中断返回 【例8-5】串行口2的使用实例。 #S2RI的值01H #S2TI的值02H 通过发送完的中断, 将BUSY位清0。

55 【例8-5】串行口2的使用实例。 ;发送数字串子程序(DPTR是数字串的首地址) SENDSTRING: CLR A MOVC ;读取当前数据 JZ STRINGEND ;检查数字串是否发送完毕(以0作为标志) INC DPTR ;修改地址指针 LCALL SENDDATA ;调用发送字节子程序发送当前字符 SJMP SENDSTRING ;发送下一个字符 STRINGEND: RET END

56 【例8-5】串行口2的使用实例。 ; 设置校验位后,发送一个字节子程序(发送字节存放在ACC中) SENDDATA: JB BUSY, $ ;等前一数发送结束,结束后中断程序中BUSY清0 JNB P, EVEN1INACC ;根据P标志设置奇偶校验位为偶校验 ODD1INACC: ; “A有奇数个1” 标号部分设置奇校验 IF PARITYBIT==ODD_PARITY ANL S2CON, #NOT S2TB8 ; A中奇数个1,置奇偶校验位为0 ELSEIF PARITYBIT==EVEN_PARITY ORL S2CON, #S2TB8 ; A中偶数个1, 设置奇偶校验位为1 ENDIF SJMP PARITYBITOK EVEN1INACC: ; “A有偶数个1” 标号部分设置偶校验 ORL S2CON, #S2TB8 ;A中奇数个1,设置奇偶校验位为1 ANL S2CON, #NOT S2TB8 ;A中偶数个1, 置奇偶校验位为0 PARITYBITOK: ;奇偶校验位设置完毕, 发送数据 SETB BUSY ;发送数时将BUSY置1, 发完后在中断程序中清0 MOV S2BUF, A ;写数据到UART2缓冲器 RET #S2RB8的值04H #S2TB8的值08H

57 【例8-5】串行口2的使用实例。 对应的C语言程序如下: #include "stc15.h" #include "intrins.h"
typedef unsigned char BYTE; typedef unsigned int WORD; #define NONE_PARITY //无校验, 下面定义奇偶校验模式 #define ODD_PARITY //奇校验 #define EVEN_PARITY //偶校验 #define MARK_PARITY //Mark校验 #define SPACE_PARITY //空检验 #define PARITYBIT EVEN_PARITY //测试偶校验 #define S2RI 0x01 #define S2TI 0x02 #define S2RB8 0x04 #define S2TB8 0x08 bit busy; void SendData(BYTE dat); void SendString(char *s);

58 void main(void) {#if (PARITYBIT == NONE_PARITY) S2CON = 0x50; //8位可变波特率UART #elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY) S2CON = 0xda; //9位波特率可变UART, 奇偶校验位置初值1 #elif (PARITYBIT == SPACE_PARITY) S2CON = 0xd2; //9位波特率可变UART, 奇偶校验位置初值0 #endif AUXR = 0x05; //T2工作于1T模式 T2L=0xD8; //设置波特率发生器自动重装常数低字节 T2H=0xFF; //设置波特率发生器自动重装常数高字节 AUXR|=0x10; //T2R=1, 启动定时器2 IE2 = 0x01; //允许UART2中断 EA = 1; SendString("STC15F\r\nUart2 Test !\r\n"); while(1); } 【例8-5】串行口2的使用实例。

59 【例8-5】串行口2的使用实例。 //UART2中断服务程序 void Uart2(void) interrupt 8 using 1 { if (S2CON & S2RI) S2CON &= ~S2RI; //接收中断标志清0 P0 = S2BUF; //在P0口上显示接收到的数据 P2 = (S2CON & S2RB8); //在P2.2上显示奇偶校验位 } if (S2CON & S2TI) S2CON &= ~S2TI; //发送中断标志清0 busy = 0; //发送忙标志清0

60 【例8-5】串行口2的使用实例。 //发送字符串子函数 void SendString(char *s) { while (*s) //检查字符串结束标志 SendData(*s++); //发送当前字符并修改字符串指针 }

61 //发送一个字节子程序 void SendData(BYTE dat) { while (busy); //等前一数发送完毕,完毕后中断程序中BUSY清0 ACC = dat; //检测P标志位(PSW.0) if (P) //根据P标志设置奇偶校验位 { #if (PARITYBIT == ODD_PARITY) S2CON &= ~S2TB8; //设置奇偶校验位为0 #elif (PARITYBIT == EVEN_PARITY) S2CON |= S2TB8; //设置奇偶校验位为1 #endif } else S2CON |= S2TB8; //设置奇偶校验位为1 S2CON &= ~S2TB8; //设置奇偶校验位为0 busy = 1; S2BUF = ACC; //将数据写入UART2缓冲器 【例8-5】串行口2的使用实例。

62 8.2.2 RS232串行通信接口 在以计算机为中心的数据采集与控制系统 中,通常需要用单片机采集数据,然后将 数据用异步串行通信方式传给计算机; 要完成的控制命令由计算机通过串行通信 方式传给单片机,由单片机进行控制。 计算机和单片机之间的串行通信一般采用 RS-232或RS-485总线标准接口。这里介绍 RS-232接口串行通信的设计方法。

63 8.2.2 RS232串行通信接口 RS-232 是早期为公用电话网络数据通信而制定的标准。
其逻辑电平与TTL/CMOS电平完全不同。逻辑 “0” 规定为+5~+15V之间,逻辑“1” 规定为-5~-15V之间。 由于RS-232发送和接收之间有公共地,传输采用非 平衡模式,因此共模噪声会耦合到信号系统中,标 准中建议的最大通信距离为15米。 下面通过一个实例,介绍计算机与单片机进行 RS232通信的硬件接口设计和软件设计。

64 8.2.2 RS232串行通信接口 [例8-6] 计算机向单片机发送一个数据, 单片机接收到数 据后, 将接收到的数据按位取反后回发给计算机。 假设单片机的系统时钟为 MHz,通信参数为 “9600,n,8,1” (这是常见通信参数表示方法, 即波特率为 9600bit/s, 无奇偶校验(n: none) (或E:Even, O:Odd) , 8 个数据位, 1个停止位)。 在计算机上显示从单片机发送过来的数据。在这种方 式中,计算机通常称为上位机。

65 计算机串行口是RS-232电平, 而单片机串口是TTL电 平。因此, 须用电路实现TTL电平和RS-232电平转换。
1、硬件接口设计 计算机串行口是RS-232电平, 而单片机串口是TTL电 平。因此, 须用电路实现TTL电平和RS-232电平转换。 常用电平转换集成电路是MAX232(或兼容转换芯片)。 该芯片用单电源(+5V)供电, RS232电平由内部电荷泵 产生。 图8-20 单片机与计算机进行串行通信的硬件连接

66 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
目前,较新的个人计算机都没有了DB9串行口,特 别是笔记本电脑,而USB接口较多。在这种情况下, 我们可以使用USB转串口的芯片进行转换, 常见的USB转串口芯片有CH340T、CP210x等。 USB转串口电路只是实现USB传输协议和UART传输 协议之间的转换,对于用户而言,程序设计上没有 本质的改变,相当于一个串口使用。 唯一需要注意的是,在计算机上编程选择串口的时 候,串口号的选择要正确。

67 CH340T与单片机的接口电路如图所示 图8-21 CH340T与单片机的接口电路

68 CH340T管脚定义: TXD:输出,串行数据输出(CH340R 型号为反相输出) RXD:输入,串行数据输入,内置可控的上拉和下拉电阻
XI:输入, CH340T/R/G 晶体振荡的输入端,需要外接晶体及电容 XO:输出,CH340T/R/G 晶体振荡的输出端,需要外接晶体及电容 RST#:输入,CH340B外部复位输入,低电平有效,内置上拉电阻 UD+:USB信号,直接连到USB总线的D+数据线 UD-:USB信号,直接连到USB总线的D-数据线 CTS#:输入,MODEM联络输入信号,清除发送,低(高)有效 RTS#:输出,MODEM联络输出信号,请求发送,低(高)有效 DSR#:输入,MODEM联络输入信号,数据装置就绪,低(高)有效 DTR#:输出,MODEM联络输出信号,数据终端就绪,低(高)有效 RI#:输入,MODEM联络输入信号,振铃指示,低(高)有效 DCD#:输入,MODEM联络输入信号,载波检测,低(高)有效

69 CH340T管脚定义: R232:输入,CH340T/R/G辅助RS232使能,高有效,内置下拉电阻 NOS#(16管脚芯片无):输入,禁止USB设备挂起,低电平有效,内置 上拉电阻 ACT#(16管脚芯片无):输出,USB配置完成状态输出,低电平有效 IR#(16管脚芯片无):输入,CH340R串口模式设定输入,内置上拉电 阻,低电平为SIR红外线串口,高电平为普通串口 CKO(16管脚芯片无):输出,CH340T时钟输出 VCC:电源,正电源输入端,需要外接0.1uF电源退耦电容 GND:电源,公共接地端,直接连到USB总线的地线 V3:电源,在3.3V 电源电压时连接VCC输入外部电源,在5V电源 电压时外接容量为0.01uF退耦电容

70 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
2、软件设计 软件设计往往因应用系统要求的不同而不同。软件 设计分为上位机程序设计和单片机程序设计两部分。 如果仅仅为了测试串口的电路连接以及单片机通信 程序设计正确与否,上位机程序可以直接使用现成 的串口调试助手软件。 当然,也可以使用Visual C++等可视化程序开发环 境自行设计。 串口调试助手软件可以从 下载。

71 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
下面的单片机程序设计中,利用 STC15F2K60S2单片机的串口2和上位计算机 通信。 如果采用串行口1进行通信,则可以选择定时 器1作为波特率发生器,也可以选择定时器2 作为波特率发生器,程序设计方法与此类似, 请读者自行实验。

72 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
汇编语言程序(设系统晶振 MHz,波特率9600bit/s): $INCLUDE (STC15.INC) ;包含单片机寄存器定义文件 BITTEST DATA 20H S2TIbit BIT 01H S2RIbit BIT 00H ORG 0000H LJMP MAIN ORG 0043H LJMP UART2_ISR ORG 0100H MAIN: MOV SP, #60H ;设置堆栈 MOV S2CON,#50H ;8位可变波特率,无奇偶校验,允许接收 MOV T2L, #0FDE8H MOV T2H, #0FFH MOV AUXR, #11H ;T2R = 1(启动T2), S1S2=1(串口2) MOV IE2, #01H ;允许串口2中断,ES2=1 SETB EA SJMP $ S2RIbit, S2RIbit分别是BITTEST(20H)的0,1位  S2CON 位号 D7 D6 D 5 D 4 D 3 D 2 D 1 D 0 名称 S2SM0 - S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI IE2 位号 D7 D6 D5 D4 D3 D2 D1 D0 位名称 ET2 ESPI ES2 SYSclk/12/(65536-[RL_TH2, RL_TL2])/4 /12/( )/4=9600 AUXR 位号 D7 D6 D5 D4 D3 D2 D1 D0 名称 T0x12 T1x12 UART_M0x6 T2R T2_C/ T2x12 EXTRAM S1S2

73 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
UART2_ISR: MOV BITTEST, S2CON ;S2CON保存到20H以便位寻址 JBC S2RIbit, RDATA ;若是接收中断, 则S2RI清零, 去读数 CLR S2TIbit;否则就是发送中断(发完后无操作), 将S2TI清零 LJMP RETURN ;中断返回 RDATA: MOV A, S2BUF ;读取收到的数据 CPL A MOV S2BUF, A ;将收到的数据发送回去 RETURN: MOV S2CON, BITTEST ;中断标志清零作用 RETI END JBC  bit, rel;直接寻址位为1转移并清该位  S2RIbit, S2RIbit分别是BITTEST(20H)的0,1位  S2CON 位号 D7 D 6 D 5 D 4 D 3 D 2 D 1 D 0 位名称 S2SM0 S2SM2 S2REN S2TB8 S2RB8 S2TI S2RI

74 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
对应的C语言程序如下: #include “stc15.h” //包含单片机寄存器定义文件 char bdata bittest; //为了保存中断标志 sbit TIbit=bittest^1; //第1位 sbit RIbit=bittest^0; //第0位 void main(void) { S2CON=0x50; T2L=0xFD; T2H-0xFF; AUXR=0x11; IE2=0x01; EA=1; while(1); }

75 [例8-6] 计算机向单片机送数据,单片机取反后回发计算机
void UART2_ISR(void) interrupt 8 { unsigned char tmpdata; bittest=S2CON; if (RIbit) { RIbit = 0; tmpdata=S2BUF; S2BUF=~tmpdata; } else TIbit=0; S2CON=bittest; //清0中断标志

76 RS485串行通信接口 RS-485串行数据接口是为弥补RS-232通信距 离短、速率低等缺点而产生的。 在RS-422基础上制定的标准,增加了多点、 双向通信能力,即允许多个发送器连接到同 一条总线上,同时增加了发送器的驱动能力 和冲突保护特性。 RS-485标准只规定了平衡发送器和接收器的 电特性,而没有规定接插件、传输电缆和应 用层通信协议。

77 RS485串行通信接口 RS-485数据信号采用差分传输方式,也称作 平衡传输,它使用一对双绞线,将其中一线 定义为A,另一线定义为B。 A、B之间(A-B)的正电平在+2V~+6 V,表示 逻辑状态“l”;负电平在-2V~-6 V,表示逻 辑状态“0”。 RS-485标准的最大传输距离约为1200米,最 大传输速率为10Mbps。

78 RS485串行通信接口 RS-485网络采用平衡双绞线作为传输介质。 平衡双绞线的长度与传输速率成反比,只有 在20 kbps速率以下,才可能使用规定最长的 电缆长度。只有在很短的距离下才能获得最 高速率传输。 一般来说,100米长的双绞线最大传输速率 仅为1Mbps。如果采用光电隔离方式,则通 信速率一般还会受到光电隔离器件响应速度 的限制。

79 RS485串行通信接口 RS-485 利用RS-485标准,可以建立一个相对经济、具有 高噪声抑制、高传输速率的通信平台,该平台同 时具有传输距离远、宽共模范围、控制方便等优 点。 目前,在工程应用的现场网络中,RS-485半双工 异步通信总线被广泛应用在集中控制枢纽与分散 控制单元之间通信的场合。

80 8.2.3 RS485串行通信接口 一台计算机作主机, 通过RS-485连接现场的控制单元, 系统结构如图所示。

81 图8-24 MAX3082的结构及典型的半双工通信电路图
RS485串行通信接口 RS-485接口芯片可用半双工传输的MAX3082 (或其他 RS485接口芯片, 如MAX485, MAX487)。 MAX3082的结构及典型半双工通信电路图如图所示。 单片机接收数据时, 应通过指令将P1.0清0; 单片机 发送数据时,应通过指令将P1.0置1。 (A-B)>-0.05v, RO=1 (A-B)<-0.2v, RO=0 A : 485差分信号的正向端; B : 485差分信号的反向端; VCC :电源端; GND :接地端。 RE :接收允许端低电平有效; DE :发送允许端高电平有效; RO:接收数据的TTL电平输出端; DI :发送数据的TTL电平输入端; 图8-24 MAX3082的结构及典型的半双工通信电路图

82 8.2.3 RS485串行通信接口 连接计算机的RS-232和RS-485转换电路如图所示。 8脚MAX485与MAX3082管脚定义相同
(A-B)>0.2v, RO=1 (A-B)<-0.2v, RO=0 MAX485 图8-25 连接计算机的RS-232和RS-485转换电路

83 8.2.4 SPI通信接口 8.2.4 SPI通信接口 1、SPI接口简介
STC15F2K60S2集成了串行外设接口(Serial Peripheral Interface,简称SPI)。 SPI接口既可以和其他微处理器通信,也可以与 具有SPI兼容接口的器件,如存储器、A/D转换 器、D/A转换器、LED或LCD驱动器等进行同 步通信。


Download ppt "第八章 数据通信."

Similar presentations


Ads by Google