单片机原理及应用-基于汇编、C51及混合编程第8章串行口通信_第1页
单片机原理及应用-基于汇编、C51及混合编程第8章串行口通信_第2页
单片机原理及应用-基于汇编、C51及混合编程第8章串行口通信_第3页
单片机原理及应用-基于汇编、C51及混合编程第8章串行口通信_第4页
单片机原理及应用-基于汇编、C51及混合编程第8章串行口通信_第5页
已阅读5页,还剩91页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1

第8章串行口通信2主要内容8.1串行通信的概念8.2串行口1的相关寄存器8.3串行口1的工作方式8.4串行口1通信中波特率的设置8.5串行口2的相关寄存器8.6串行口2的工作方式8.7串行口的应用8.8RS-232串行标准8.9RS-485串行接口8.10SPI串行接口概述8.11SPI串行数据通信8.12SPI接口的应用38.1串行通信的概念串行通信是按一位一位的顺序传送数据,串行通信方式又分为同步通信和异步通信两种。同步通信:发送方和接收方用同一个时钟控制信号同步字符同步字符N个字节的连续数据校验字符校验字符48.1串行通信的概念异步通信是一种将数据以一个字符为单位进行传送的通信方式传送一个字符又称为一帧信息发送与接收之间无时钟信号控制,发送和接收的速率要求相同起始位:位于一帧数据的开头,逻辑“0”电平信号,用来通知接收设备开始接收一帧信息数据位:紧跟起始位之后的是数据位,对51内核单片机来说,低位在前,高位在后第9位:常用于对串行通信数据进行奇偶校验停止位:逻辑“1”电平信号,应大于或等于一个位数据的时间。在发送完一帧信息后,用于发送的数据线一直处于高电平状态,等待再次发送58.1串行通信的概念串行通信可分为单工、半双工和全双工3种方式单工方式只有一根数据线,数据只能按照一个固定的方向传送半双工方式的数据可以由甲向乙传送,也可以由乙向甲传送,但是不能在两个方向上同时传送全双工方式可以在同一时刻实现双向传送。在串行通信中,用波特率衡量通信速度的快慢。波特率是指每秒钟传送的二进制数的位数单位:位/秒(bps)字节/秒(Bps)波特率(bps)=1个字符的二进制位数×Bps68.1串行通信的概念STC12C5A60S2单片机具有2个UART工作方式的串行口接收缓冲器SBUF地址:99H发送缓冲器SBUF地址:99H串行口1接收缓冲器S2BUF地址:9BH发送缓冲器S2BUF地址:9BH串行口278.2串行口1的相关寄存器STC12C5A60S2单片机的串行口1与8个特殊功能寄存器相关串行控制寄存器SCON电源控制寄存器PCON辅助寄存器AUXR独立波特率发生器寄存器BRT唤醒控制寄存器WAKE_CLKO中断寄存器IE、IP、IPH。88.2串行口1的相关寄存器1.串行控制寄存器SCON,地址为98H,可进行位寻址D7D6D5D4D3D2D1D0SM0/FESM1SM2RENTB8RB8TIRISM0/FE:寄存器PCON中的SMOD0位为1时,该位用于帧错误检测(FE)。当检测到停止位无效时,硬件会将该位置1,必须由软件清零SMOD0位为0时,SM0、SM1两位一起确定串行口1的工作方式SM0SM1工作方式功能说明波特率00方式0同步串行移位寄存器方式当AUXR寄存器中的位UART_M0x6=0时,波特率等于fosc/12;UART_M0x6=1时,波特率等于fosc/201方式18位异步通信(2SMOD/32)×(定时/计数器T1的溢出率或独立波特率发生器的溢出率)10方式29位异步通信(2SMOD/32)×fosc11方式39位异步通信与方式1相同SM2:在方式0中,该位必须为0;在方式2和方式3中,该位为1时,只有接收到的第9位数据RB8位为1时,接收才能有效。在方式1中,该位为1时,只有正确接收到停止位时,接收才能有效REN:允许串行接收控制位。当该位为1时,允许接收信息;当该位为0时,禁止接收信息。TB8:发送数据的第9位RB8:接收数据的第9位TI:串行口1发送中断请求标志位RI:串行口1接收中断请求标志位98.2串行口1的相关寄存器2.电源控制寄存器PCON,地址为87HD7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD:波特率倍频选择位。该位置1,串行口1工作在方式1、2、3时波特率加倍;该位为0,各工作方式的波特率不加倍SMOD0:帧错误检测有效控制位。该位置1,SCON寄存器中的SM0/FE位用于FE功能;该位为0,SCON寄存器中的SM0/FE位用于方式选择。108.2串行口1的相关寄存器3.辅助寄存器AUXR,地址为8EHD7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSUART_M0x6:串行口1方式0的通信速度控制位。UART_M0x6=0,方式0的波特率为系统时钟频率的12分频;UART_M0x6=1,方式0的波特率为fosc/2。BRTR:独立波特率发生器运行控制位。BRTR=0时,不允许独立波特率发生器工作;BRTR=1时,允许独立波特率发生器工作BRTx12:独立波特率发生器计数控制位。BRTx12=0时,独立波特率发生器的计数时钟源为系统时钟频率fosc的12分频;BRTx12=1,独立波特率发生器的计数时钟源为系统时钟频率。S1BRS:串行口1的波特率发生器选择位。S1BRS=0时,选择定时/计数器T1作为串行口1的波特率发生器;S1BRS=1时,选择独立波特率发生器作为串行口1的波特率发生器118.2串行口1的相关寄存器4.独立波特率发生器寄存器BRT,地址为9CH独立波特率发生器是专门用于控制串行通信速度的定时器,与定时/计数器T1工作于方式2的情况相似。BRT用于保存重装时间常数的一个8位寄存器注意:串行口2:只能使用独立波特率发生器控制发送与接收,串行口1:既可以选择T1作为波特率发生器,也可以选择独立波特率发生器。串行口1和串行口2不能同时使用独立波特率发生器,128.2串行口1的相关寄存器5.唤醒控制寄存器WAKE_CLKO,地址为8FHD7D6D5D4D3D2D1D0PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKEBRTCLKOT1CLKOT0CLKORXD_PIN_IE=0时,禁止P3.0/RxD引脚的下降沿置位RI,也禁止RxD引脚唤醒掉电模式;RXD_PIN_IE=1时,允许P3.0/RxD引脚的下降沿将RI置1,并且RxD引脚的下降沿能够唤醒掉电模式138.3串行口1的工作方式8.3.1方式0串行口1工作在方式0,作同步移位寄存器使用D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSUART_M0x6:串行口1方式0的通信速度控制位。UART_M0x6=0,方式0的波特率为系统时钟频率的12分频;UART_M0x6=1,方式0的波特率为fosc/2。148.3串行口1的工作方式8.3.1方式0串行口数据由RxD引脚输入或输出,同步移位脉冲通过TxD引脚输出,发送、接收均为8位数据发送过程:在TI=0的条件下,执行MOVSBUF,A指令,启动发送注意:发送顺序:低位在前,高位在后发送完一帧数据后,由硬件将发送中断标志位TI置1,向CPU发出中断请求。若要再次发送数据,必须先通过程序将TI位清0。158.3串行口1的工作方式8.3.1方式0串行口数据由RxD引脚输入或输出,同步移位脉冲通过TxD引脚输出,发送、接收均为8位数据接收过程:在RI=0的条件下,接收允许控制位REN置1时,处于接收状态接收完一帧数据后,硬件将接收到的数据存入接收缓冲器SBUF,并将中断标志位RI置1,向CPU发出中断请求注意:接收顺序:先收到的是低位,后收到的是高位若要继续接收数据,必须先通过程序将RI位清0。168.3串行口1的工作方式8.3.2方式18位数据,低位在前高位在后发送过程:在TI为0的条件下,执行将数据写入SBUF的指令时,启动发送过程。在内部移位脉冲的控制下,TxD引脚首先发送起始位、8位数据、停止位,发送完毕后TI置1,向CPU发出中断请求178.3串行口1的工作方式8.3.2方式1接收过程:在RI为0、接收允许控制位REN被置1的条件下,CPU处于接收状态。当硬件检测到RxD引脚由高电平变为低电平时,开始接收一帧数据,并同步波特率发生器。188.3串行口1的工作方式8.3.2方式1接收过程:(1)RI=0(2)SM2=0或接收到的停止位为1时硬件自动将接收到的数据装入接收缓冲器SBUF,同时将停止位写入RB8,置中断标志位RI为1,向CPU提出中断请求。若不满足两个条件,接收到的数据无法装入接收缓冲器SBUF,数据丢失。注意:无论满足这两个条件与否,接收控制器将继续检测RxD引脚,接收下一帧数据,所以在接收的过程中,应及时清接收中断标志位RI,以免数据丢失198.3串行口1的工作方式8.3.3方式2、方式3

方式2与方式3唯一的区别在于方式2的波特率是固定的,而方式3的波特率与波特率发生器有关

方式1与方式3的区别是:方式1是8位的串行异步通信、

方式3是9位串行异步通信208.3串行口1的工作方式8.3.3方式2、方式3发送过程:将发送中断标志位TI清0,并通过位传送指令将第9位数据写入TB8中,然后执行MOVSBUF,A指令,启动发送过程。一帧数据发送完毕,硬件将发送中断标志位TI置1218.3串行口1的工作方式8.3.3方式2、方式3接收过程:允许控制位REN被置1后处于接收状态。接收到的第9位(而不是停止位)装入到RB8位中注意:在方式2和方式3中,SM2为1时,只有接收到的第9位数据RB8位为1时,接收才能有效228.3串行口1的工作方式8.3.4多机通信在多机通信中方式2和方式3更适合主从通信主机的SM2位清0从机的SM2位置1通信过程举例

(1)主机向从机发送某一从机的地址,发送前将TB8位置1,然后进入接收状态

(2)各从机接收到主机送出的地址信息后,

与本机地址相符时,表示被选中,将本机地址回发给主机(TB8位为0),执行CLRSM2指令。

未被选中的从机,SM2位依然为1,接收不到TB8位为0的数据信息。238.3串行口1的工作方式8.3.4多机通信在多机通信中方式2和方式3更适合主从通信主机的SM2位清0从机的SM2位置1通信过程举例

(3)主机收到从机回发的地址后,检验是否与主机先前发送的地址一致,若不同,说明发送过程出现错误,再回到第(1)步,若相同,可以发出指令或数据信息(TB8位为0)。

(4)从机正确地接收到主机所发送到的指令或数据信息后,回发先前约定好的应答信号给主机,同时将SM2位重新置1,以便从机能够接收主机再次发送地址信息,本次主机与从机通信过程结束。

理论上,一个主机可以与256个从机通信,但由于每个单片机引脚的输入阻抗及总线上阻抗的存在,总线上所允许并联从机的数量要受到限制。如果主机与过多的从机连接时,波特率应设置的低一些以减少通信错误248.4串行口1通信中波特率的设置(1)方式0D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRS辅助寄存器AUXRUART_M0x6=0时,波特率是fosc/12UART_M0x6=1时,波特率是fosc/2258.4串行口1通信中波特率的设置(2)方式2D7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDL电源控制寄存器PCON波特率=(2SMOD/64)foscD7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD=0时,波特率=fosc/64当SMOD=1时,波特率=fosc/32268.4串行口1通信中波特率的设置(3)方式1和方式3波特率=2SMOD(定时/计数器T1的溢出率/32)D7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDLSMOD=0时,波特率=T1的溢出率/32当SMOD=1时,波特率=T1的溢出率/16D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRST1x12=0时,T1的溢出率=(fosc/12)/(256-THl)T1x12=1时,T1的溢出率=fosc/(256-TH1)278.4串行口1通信中波特率的设置(3)方式1和方式3波特率=2SMOD(独立波特率发生器的溢出率/32)D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSBRTx12=0时,独立波特率发生器的溢出率=(fosc/12)/(256-BRT)BRTx12=1时,独立波特率发生器的溢出率=fosc/(256-BRT)288.4串行口1通信中波特率的设置(3)方式1和方式3T1x12=0,T1工作在方式2时,几种波特率所对应T1的重装初值波特率系统时钟(MHz)SMODT1重装初值1920011.05921FDH960011.05921FAH960011.05920FDH480011.05921F4H480011.05920FAH240011.05921E8H240011.05920F4H120011.05921D0H120011.05920E8H298.5串行口2的相关寄存器与串行口2相关的寄存器有:1.串行口2的控制寄存器S2CON,地址为9AH,不能位寻址D7D6D5D4D3D2D1D0S2SM0S2SM1S2SM2S2RENS2TB8S2RB8S2TIS2RI2.辅助寄存器AUXR——波特率加倍控制位S2SMODD7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSS2SMOD位为0时,串行口2的波特率不加倍S2SMOD位为1时,串行口2的波特率加倍308.5串行口2的相关寄存器与串行口2相关的寄存器有:3.辅助寄存器AUXR14.独立波特率发生器寄存器BRT5.中断寄存器IE、IE2、IP2、IP2HD7D6D5D4D3D2D1D0-PCA_P4SPI_P4S2_P4GF2ADRJ-DPSS2_P4位为0时,TxD2为P1.3,RxD2为P1.2S2_P4位为1时,TxD2为P4.3,RxD2为P4.26.发送缓冲器S2BUF与接收缓冲器S2BUF共用同一个地址9BH318.6串行口2的工作方式8.6.1方式0当S2SM0、S2SM1为00时,串行口2工作在方式0波特率=fosc/12仅有这一种情况8位数据低位在前,高位在后通过RxD2引脚接收或发送数据TxD2引脚输出同步移位时钟328.6串行口2的工作方式8.6.2方式1当S2SM0、S2SM1为01时,串行口2工作在方式1TxD2引脚发送、RxD2引脚接收一帧数据包含一个起始位、8个数据位和一个停止位停止位存放在S2CON寄存器的S2RB8位338.6串行口2的工作方式8.6.2方式1波特率=(2S2SMOD/32)×独立波特率发生器的溢出率D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSBRTx12=0时,独立波特率发生器的溢出率=(fosc/12)/(256-BRT)BRTx12=1时,独立波特率发生器的溢出率=fosc/(256-BRT)348.6串行口2的工作方式8.6.3方式2当S2SM0、S2SM1为10时,串行口2工作在方式2TxD2引脚发送、RxD2引脚接收一帧数据包含一个起始位、9个数据位和一个停止位发送时,第9位数据位来自S2CON寄存器中的S2TB8位,接收时,第9位数据装入S2CON寄存器中的S2RB8位D7D6D5D4D3D2D1D0T0x12T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRSS2SMOD位为0时,波特率=fosc/64S2SMOD位为1时,波特率=fosc/32358.6串行口2的工作方式8.6.4方式3当S2SM0、S2SM1为11时,串行口2工作在方式3TxD2引脚发送、RxD2引脚接收一帧数据包含一个起始位、9个数据位和一个停止位发送时,第9位数据位来自S2CON寄存器中的S2TB8位,接收时,第9位数据装入S2CON寄存器中的S2RB8位波特率的设定与方式1相同368.7串行口的应用1.串行口1的初始化(1)设置SCON寄存器中各个相关位,由SM0、SM1两位确定工作方式,将TI、RI清0,如果需要接收,将REN位置1;(2)设置合适的波特率,即设置定时/计数器T1的工作方式、给TL1、TH1赋初值,启动T1工作;使用独立波特率发生器时,给BRT赋初值,并初始化AUXR寄存器的BRTR及BRTx12两位;(3)根据需要确定是否需要开放中断及中断优先级;(4)编写相应的中断或查询方式的服务程序。378.7串行口的应用2.串行口2的初始化(1)即设置S2CON寄存器中的各个相关位的值,由S2SM0、S2SM1两位确定工作方式,S2RI、S2TI两位清0。如果允许接收,将S2REN位置1;(2)设置独立波特率发生器。初始化AUXR寄存器中的BRTx12、S2SMOD等位,将初值装入BRT寄存器;(3)将AUXR中的BRTR位置1,启动独立波特率发生器工作;(4)根据需要设置中断优先级,开放中断ES2、EA;(5)编写相应的中断或查询方式的服务程序。38

【例8-1】STC12C5A60S2单片机的串行口1与一片8位串入并出的芯片74HC164连接,驱动一组发光二极管,使发光二极管从右至左延时轮流显示。分析:74HC164是一个串行输入并行输出的移位寄存器,Q0-Q7是并行输出端,Dsa、Dsb为串行输入端。CP为时钟输入端。复位端,低电平有效,当复位端输入低电平时清除移位寄存器的值,强制所有的输出为低电平设STC12C5A60S2单片机的系统时钟频率为12MHz,串行口1工作在方式0。对SCON寄存器赋初值为00H39(1)汇编程序:ORG0000HLJMPMAINORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针MOVSCON,#00H;串行口1工作在方式0 MOVA,#0FEH;LED显示码存A寄存器START:MOVSBUF,A;启动发送过程LOOP:JNBTI,LOOP;判断发送是否完毕CLRTI;发送完毕,将TI位清0 ACALLDELAY;延时 RLA;发光二极管显示码左移一位SJMPSTART40DELAY:MOVR7,#0BDH;500ms的延时程序DL1:MOVR6,#0E6HDL0:MOVR5,#21HDJNZR5,$DJNZR6,DL0DJNZR7,DL1RETEND41(2)C语言程序:#include<STC12C5A.h>#include<intrins.h>//声明本征函数库voidDELAY();//延时函数voidmain(){unsignedcharj;SCON=0x00;//串行口1工作在方式0j=0xFE;//LED显示码for(;;){SBUF=j;//启动发送过程while(!TI);//等待发送完毕TI=0;DELAY();//延时500msj=_crol_(j,1);//循环左移一位}}42voidDELAY()//延时500ms函数{unsignedchara,b,c;for(c=189;c>0;c--)for(b=230;b>0;b--)for(a=33;a>0;a--);}43【例8-2】利用STC12C5A60S2单片机的串行口1外接一片8位的并入串出芯片74HC165,用于扩展并行输入,如图所示。分析:74HC165是一种并入串出的芯片,其中D0-D7为并行数据输入端,DS为串行数据输入端,Q7为串行输出端。

当并行输入允许引脚输入为低时,从D0至D7引脚并行输入的数据被输入到内部移位寄存器内,

而当为高时,并行输入禁止,移位寄存器的数据在CP引脚输入的时钟脉冲上升沿的控制下,向右移动一位DS→Q0→Q1→…→Q7,Q7的状态出现在第9引脚上。设串行口1工作在方式0,SCON寄存器的内容为00H。44(1)汇编程序段如下:MOVSCON,#00000000B CLRP1.7;并行输入允许NOP;等待引脚状态稳定NOP NOPNOPNOPNOPSETBP1.7;禁止并行输入NOP;等待引脚状态稳定NOP NOPNOPNOPNOPCLRRI;清除中断标志RISETBREN;允许接收LOOP:JNBRI,LOOP;等待CLRRIMOVA,SBUF45(2)C语言程序#include<STC12C5A.h>#include<intrins.h>sbitP1_7=P1^7;voidmain(){unsignedchartemp;SCON=0x00;P1_7=0;//并行输入允许_nop_();//等待引脚状态稳定_nop_();_nop_();_nop_();_nop_();_nop_();P1_7=1;//并行输入禁止_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();RI=0;//清除接收中断标志RIREN=1;//允许接收while(!RI);//等待接收数据RI=0;//清除接收中断标志RItemp=SBUF;//读入数据while(1);}46【例8-3】在图8-10所示的甲、乙两机间的串行通信中,单片机系统的时钟频率为11.0592MHz,要求波特率为1200bps,编程实现将甲机片内的30H-3FH单元的数据传送到乙机片内40H-4FH单元中。(1)汇编子程序:分析:甲、乙两机都选择串行口1工作在方式3,9位异步通信方式,TB8用作奇偶校验位,甲机串口控制寄存器SCON的初值为0C0H,乙机的控制字0D0H。D7D6D5D4D3D2D1D0SM0/FESM1SM2RENTB8RB8TIRI47【例8-3】在图8-10所示的甲、乙两机间的串行通信中,单片机系统的时钟频率为11.0592MHz,要求波特率为1200bps,编程实现将甲机片内的30H-3FH单元的数据传送到乙机片内40H-4FH单元中。(1)汇编子程序:分析:甲、乙两机都选择串行口1工作在方式3,9位异步通信方式,TB8用作奇偶校验位,甲机串口控制寄存器SCON的初值为0C0H,乙机的控制字0D0H。定时/计数器T1工作在方式2作为波特率发生器,TMOD为20H;波特率=2SMOD[(定时/计数器T1的溢出率)/32],T1的溢出率=(波特率×32)/2SMOD,T1的重装初值=256-(fosc/12)/T1的溢出率=256-(fosc/12)×2SMOD/(波特率×32)=256-(11059200/12)/(1200×32)=232=E8H甲机的发送子程序:48TRA_UART:MOVTMOD,#20H;T1工作在方式2ANLAUXR,#0BFH;T1计数工作在系统时钟的12分频MOVTL1,#0E8H;给T1的低8位赋初值MOVTH1,#0E8H;给T1的高8位赋初值ANLPCON,#7FH;波特率不加倍MOVSCON,#0C0H;串行口1工作在方式3MOVR0,#30H;R0作为片内RAM指针MOVR7,#10H;R7作为发送计数器

SETBTR1;波特率发生器开始工作LOOP:MOVA,@R0;读取片内30H-3FH单元的内容MOVC,P MOVTB8,C;将奇偶校验位写入TB8 MOVSBUF,A;启动发送过程WAIT:JNBTI,WAIT;等待发送完毕 CLRTI;发送完毕,将TI清0 INCR0;指向下一个单元地址 DJNZR7,LOOP;如果数据未发送完,将继续发送 RET49乙机接收子程序:RES_UART:MOVTMOD,#20H;T1的初始化 MOVTL1,#0E8H MOVTH1,#0E8HANLAUXR,#0BFH;系统时钟的12分频 ANLPCON,#7FH;波特率不加倍MOVSCON,#0D0H;方式3,且允许接收 MOVR0,#40H;R0作为片内RAM指针 MOVR7,#10H;R7作为计数器 SETBTR1;波特率发生器开始工作LOOP:NOPWAIT:JNBRI,WAITCLRRI MOVA,SBUF;

50;P与RB8位异或,出错时跳转,

MOVC,PANLC,/RB8MOVF0,CMOVC,RB8ANLC,/PORLC,F0JCERROR MOV@R0,A;数据正确,存放进40H开始的单元 INCR0;R0指向下一个单元 DJNZR7,LOOP;数据未接收完,则继续 RETERROR:…;错误处理,此处略…RET51(2)C语言程序:分析:为了保持通信的通畅与准确,通信中做如下约定:

通信开始时,甲机(主机)首先发送乙机(从机)的地址0AAH,并且TB8位为1,

乙机接收后与自己的地址比较,回发地址0AAH,并将自己的SM2位清0。

甲机收到0AAH后,说明地址发送正确开始发送16个字节的数据。数据缓冲区为数组buf,数据发送完成后发送校验和的低字节。

乙机接收到数据后,存入乙机的缓冲区buf中,并用接收的数据产生校验和与接收的校验和相比较,如相同,乙机发送00H,回答接收正确;如不同,则发送0FFH,请求甲机重发。根据以上约定,利用串行口2的工作方式3,实现甲机作主机,乙机作从机的通信方式。由于甲、乙两机都要发送和接收信息,所以甲、乙两机的串口控制寄存器的S2REN位都应该为1,方式控制字都是0D0H。52甲机的发送程序:#include〈STC12C5A.h〉unsignedcharidatabuf[16];//定义16字节的缓冲区unsignedcharpf;//校验和的低字节voidmain(){unsignedchari,j;S2CON=0xD8;//串行口2的初始化,S2TB8位为1BRT=0xE8;//独立波特率发生器寄存器装入初值AUXR=AUXR|0x10;//独立波特率发生器开始工作53for(;;){do{S2BUF=0xAA;//发送乙机地址do{j=S2CON;}while((j&0x02)!=0x02);//等待发送完毕S2CON=(S2CON&0xFD);//S2TI位清0do{j=S2CON;}while((j&0x01)!=0x01);//等待接收应答信号S2CON=(S2CON&0xFE);//S2RI位清0}while((S2BUF^0xAA)!=0);//如果地址有误;继续联络54do{pf=0;//校验和变量赋初值0S2CON=(S2CON&0xF7);//S2TB8位写入0for(i=0;i﹤16;i++)//发送16个字节的数据{

S2BUF=buf[i];//发送数据pf+=buf[i];//求校验和的低8位字节do{j=S2CON;}while((j&0x02)!=0x02);//等待发送完毕S2CON=(S2CON&0xFD);}55S2BUF=pf;//发送校验和的低8位字节do{j=S2CON;}while((j&0x02)!=0x02);//等待发送完毕S2CON=(S2CON&0xFD);//S2TI位清0do{j=S2CON;}while((j&0x01)!=0x01);//等待接收应答信号S2CON=(S2CON&0xFE);//S2RI位清0}while(S2BUF!=0x00)break;//收到正确应答,退出循环}//否则再重发while(1);}乙机接收程序:#include〈STC12C5A.h〉unsignedcharidatabuf[16];//定义16字节的缓冲区unsignedcharpf;//校验和的低8位字节voidmain(){unsignedchari,j;BRT=0xE8;//独立波特率发生器寄存器装入初值AUXR=AUXR|0x10;//波特率发生器开始工作do{

S2CON=0xF0;//串行口2的初始化do{j=S2CON;}while((j&0x01)!=0x01);//等待接收S2CON=(S2CON&0xFE);//S2RI标志位清0

}while((S2BUF^0xAA)!=0);//判断接收到的是否是乙机地址S2BUF=0xAA;//回送地址do{

j=S2CON;

}

while((j&0x02)!=0x02);//等待发送完毕S2CON=0xD0;//将S2SM2位清0while(1)

{

pf=0;//校验和变量赋初值为0

for(i=0;i﹤16;i++)//接收16个字节的数据

{do{j=S2CON;}while((j&0x01)!=0x01);//等待接收

S2CON=(S2CON&0xFE);//将S2RI位清0

buf[i]=S2BUF;//保存接收数据

pf+=buf[i];//求校验和的低8位字节

}do

{

j=S2CON;

}while((j&0x01)!=0x01);//等待接收校验和的低8位S2CON=S2CON&0xFE;if((S2BUF^pf)==0)//比较校验和{

S2BUF=0x00;

do{

j=S2CON;

}

while((j&0x02)!=0x02);//等待发送完毕

S2CON=(S2CON&0xFD);break;

}else{S2BUF=0xFF;//校验和出错,发送0xFF,重新接收

do{

j=S2CON;

}

while((j&0x02)!=0x02);//等待发送完毕

S2CON=(S2CON&0xFD);

}}while(1);}618.8RS-232串行标准

在实际应用系统中,通常需要单片机进行数据采集,并将采集的数据以串行通信方式传送给计算机,或计算机以串行通信方式向单片机传送指令,如扫描仪、打印机等。因通信时(传输电缆线上有干扰)信号要衰减,所以常采用RS-232标准接口,拉开“0”和“1”的电压档次,以免信息出错。数据传输速率0~20000bpsTTL正逻辑:“0”:0—2.4V;“1”:3.6V—+5V;RS232负逻辑(EIA电平):“0”:+5V—+15V;“1”:-5V—-15V。最大传输信息的长度为15米。62能够适应RS-232通信协议的芯片有很多,下面以MAX-232为例介绍各引脚的功能1~6引脚是内部电源变换电路部分与外部电容连接端,功能是产生+12V和-12V两个电源,提供给RS-232内部串行口的电平转换电路单片机输出的TTL电平数据从T1IN、T2IN输入,转换成RS-232电平数据从T1OUT、T2OUT输出到总线。

总线上的RS-232电平数据从R1IN、R2IN输入后转换成TTL电平数据再从R1OUT、R2OUT输出送给单片机。

63

完整的RS-232接口由主信道、辅信道共25根连线组成,用25芯插座实现连接,但在实际应用中有很多信号线用不到,常采用9芯插座,信号引脚含义如图所示。

当设备间进行串行通信联络时,只需要TxD、RxD、GND三根线实现串行通信,其余的联络信号端可以悬空。TxD:串行数据发送引脚,作为输出RxD:串行数据接收引脚,作为输入GND:接地信号64RS-232的典型应用电路658.9RS-485串行接口RS-232传输距离有限,抗干扰性弱。RS-485标准接

口,能够很好的解决上述问题。RS-485采用电流驱动,接口处的电平比RS-232电平低,不易损坏接口处芯片,且与TTL电平兼容;传输的最大速率为10Mbps由于采用了差分驱动器,提高了抗干扰能力,传输距离可达1200m。RS232负逻辑(EIA电平):“0”:+5V—+15V;“1”:-5V—-15V。最大传输信息的长度为15米。RS485差分信号负逻辑:“0”:-6V—-2V;“1”:+

2V—+6V。最大传输信息的长度为1200米。66以MAX-485为例介绍其功能RO:接收器的输出端。若A引脚的电压大于B引脚的电压200mV时,RO为高电平,若A引脚的电平小于B引脚的电平200mV时,RO为低电平。/RE:接收器输出使能端。当

为低电平时,RO才有效;当

为高电平时,RO处于高阻态。DI:发送器输入端。DE:发送器输出使能端。当DE为高电平时,可以正常发送。在接收时,应将DE拉低,使DI输出驱动器的两输出端呈现高阻态,不影响接收。A:同向接收器输入和同向驱动器输出端。B:反向接收器输入和反向驱动器输出端。67在发送时应将DE拉高,/RE拉低,接收时应将DE、/RE都拉低。RS-485的总线可以采用双绞线传输信号,Rt为终端电阻,可以吸收空间电磁波的干扰,标准值为120Ω。RS-485典型的通信电路如图所示688.10SPI串行接口概述当前有很多类器件(如存储器、A/D转换器、LCD驱动器等)具有SPI通信接口;STC12C5A60S2等系列单片机为了满足与这些类别器件通信的需要,内部集成了SPI接口电路;STC12C5A60S2单片机的SPI接口是一种全双工同步传输的高速通信总线,有主模式和从模式两种工作方式;被设置为主模式时,可以提供给从机的最高时钟频率为fosc/4。698.10.1SPI接口电路STC12C5A60S2单片机的SPI接口电路如图所示。MOSI:SPI同步串行接口的主机的输出和从机的输入引脚,用于实现主机到从机的串行数据传输。在该线上,从机需配置为仅为输入模式,作为传输数据的入口。根据SPI通信协议,主机在时钟信号的前半周期通过该线输出数据,从机在时钟信号的控制下获取数据。MISO:SPI同步串行接口的主机的输入和从机的输出引脚,用于实现从机到主机的数据传输。在该线上,主机配置成输入模式,作为传输数据的入口。根据SPI通信协议,当主机与多个从机中的某一从机通信时,其他从机总线被禁止,被禁止通信从机的MISO引脚为高阻状态。SCLK:串行时钟的输入、输出信号。SCLK时钟用以控制主机和从机同步的时钟信号,控制主机和从机之间在MOSI和MISO线上的串行数据传输。当主机启动一次数据传输时,自动产生8个SCLK时钟周期信号给从机。在SCLK的每个上升沿或下降沿处移出一位数据。所以,主机启动一次可以连续传输一个字节的数据。

SCLK信号在主模式时为输出,在从模式时为输入。/SS:从机选择信号。主机通过控制

引脚的电平来选择处于多从机中的某一从机,主机的

引脚(P1.4)可以作为I/O口使用,在从机模式下,无论是发送还是接收信息,

引脚必须处于低电平。在只有一主一从的情况下,SPI接口可以由3根线构成,从机的/SS

引脚直接接地。708.10.2SPI串行通信的特殊功能寄存器1.控制寄存器SPCTL(字节地址为0CEH)复位后的值为00000100B;SSIG:/SS引脚忽略位。SSIG=1时,由MSTR位确定器件是主机还是从机;SSIG=0时,

/SS引脚与MSTR位共同确定器件是主机还是从机。SPEN:SPI串行通信接口使能位。SPEN=1,SPI串行通信功能有效;SPEN=0,SPI通信功能被禁止,此时,所有SPI串行通信引脚都可作为I/O口或其他功能使用。DORD:设定SPI数据发送和接收的位顺序。DORD=1时,数据字的最高位(D7)最先发送及接收;DORD=0时,数据字的最低位(D0)最先发送及接收。MSTR:主/从模式选择位。该位置1时,被选择为主机模式;该位置0时,被选择为从机模式。CPOL:SPI时钟极性选择位。该位为1时,SCLK空闲时为高电平,SCLK的时钟前沿为下降沿而后沿为上升沿;该位为0时,SCLK空闲时为低电平,SCLK的时钟前沿为上升沿而后沿为下降沿。CPHA:SPI时钟相位的选择控制位。该位为1时,从机输出给主机的首位数据在

引脚的下降沿时被驱动输出,主机输出给从机的首位数据由写入数据寄存器SPDAT的指令控制输出,在SCLK的时钟后沿改变主、从机的位数据输出,由时钟前沿控制采样输入;该位为0时,位数据在SCLK的时钟前沿控制输出,在时钟后沿采样输入。在CPHA位为1时,SSIG位必须为0才能有效。SPR1、SPR0:SPI时钟速率选择控制位。718.10.2SPI串行通信的特殊功能寄存器2.状态寄存器SPSTAT(字节地址为0CDH)复位后的值为00××××××B;SPIF:SPI传输完成标志位。当一个字节的数据串行输出完成时,硬件电路将SPIF位置1。此时,如果SPI中断被允许,则产生中断。当单片机处于主模式且SSIG=0时,如果/ss引脚出现由高变低的下降沿,硬件也将SPIF位置1,表示模式改变,由主模式强行改变为从模式。在SPIF标志位为1的情况下,只有通过指令向其写入1才能将其清零。WCOL:SPI写冲突标志位。当数据正在传输过程中,如果又向数据寄存器SPDAT执行写操作,WCOL位将被置位。只有通过指令对WCOL标志位写入1才能清零。728.10.2SPI串行通信的特殊功能寄存器3.数据寄存器SPDAT(字节地址为0CFH)复位后的值为00000000B;SPI串行通信的发送数据寄存器SPDAT与接收数据寄存器SPDAT属于两个寄存器,地址都是CFH,通过读、写指令加以区分。4.辅助功能寄存器AUXR1(字节地址为0A2H)

当SPI_P4位为0时,SPI在P1口;当SPI_P4位为1时,SPI从P1口切换到P4口:SCLK从P1.7切换到P4.3引脚、MISO从P1.6切换到P4.2引脚、MOSI从P1.5切换到P4.1引脚、

从P1.4切换到P4.0引脚。738.11SPI串行数据通信当单片机之间进行SPI串行通信时,主机可以给从机发送数据,从机也可以给主机发送数据主机给从机发送数据是将发送数据寄存器SPDAT中的数据经MOSI引脚在SCLK的控制之下,一位一位的移出;而从机在SCLK的控制之下,将主机移出的数据一位一位的移入从机的移位数据寄存器。从机的发送数据寄存器中的数据在SCLK的控制之下一位一位的从MISO引脚送出,输入给主机的移位寄存器。即一个8位字节数据从输出引脚移出的同时,另一个8位字节数据从输入引脚输入,一条串行时钟线上的时钟信号控制着两条串行数据线上的信息移位与采样同步进行。SPI的核心是一个8位移位寄存器和数据缓冲器,数据可以同时发送和接收。STC12C5A60S2单片机之间的SPI接口的数据通信方式有3种:单主单从、互为主从、单主多从。748.11.1单主单从通信方式

在单主单从的通信方式中,主机将SPCTL寄存器中的SSIG及MSTR位置1,选择成主机模式,从机将SSIG及MSTR位清0,选择成从机模式,此时主机可使用任何一个I/O引脚来控制从机的

引脚,当从机的

引脚被拉为低电平时,从机被选中。

单主单从数据通信方式的连接如图所示。当主机向SPDAT写入一个字节数据时,立即启动一个连续的8位字节数据移位通信过程,即主机的SCLK向从机的SCLK的引脚连续发出8个脉冲,在这串脉冲的控制下,写入主机SPDAT寄存器的数据从MOSI引脚移出,发送到从机的MOSI引脚,同时从机SPDAT寄存器的数据从MISO引脚移出发送到主机的MISO引脚。当传输完一个字节后,SPI时钟发生器停止,主机及从机的输出完成标志位SPIF由硬件自动置1并产生中断请求。通过字节指令MOVSPSTAT,#0C0H将SPIF位清0。发送与接收的过程都由主机控制,只有主机向数据寄存器写入数据,启动主机发送过程的同时,从机才能实现向主机发送数据

758.11.2互为主从通信方式互为主从数据通信方式的连接如图所示。在互为主从的通信方式中,通常情况下,初始化时甲乙双方都将各自设置成忽略

引脚的主模式,即将各自的控制寄存器SPCTL中的MSTR、SPEN位置1,SSIG位清0,P1.4引脚配置为准双向(复位模式)并输出高电平。在某一时刻,甲方要向乙方发送数据时,首先检测/SS引脚的状态,如果/SS引脚是高电平,说明乙方没有行动,这时将自己的SSIG位置1,设置成忽略/SS引脚的主模式,并将/SS引脚拉低,将乙方设置成从模式,这时的配置方式已成为单主单从数据通信方式。甲机同乙机的通信完毕后,甲机再次将/SS引脚置高,将SSIG位清0,回到初始状态。乙机要发送数据时,可采用同样的方法将自己设置成主机。在SPI被配置为主机(MSTR=1),并且P1.4引脚配置为输入且SSIG=0的情况下,只要/SS引脚被拉低,即可实现模式的转变,成为从机,并将状态寄存器SPSTAT中的中断标志位SPIF置1。注意:互为主/从模式时,双方的SPI通信速率必须相同,使用相同的外部晶体振荡器。768.11.3单主多从通信方式

在这种方式下,各个从机将SSIG位清0,主机要同某一从机通信时,只要将对应从机的/SS引脚拉低,该从机即被选中。其他从机的

引脚保持高电平,这时主机与该从机的通信已成为单主单从的通信。通信完毕,再将该从机的/SS引脚置高。778.11.4SPI通信的具体过程

在以上SPI的三种通信方式中,/SS引脚的使用在主模式和从模式下是有区别的。

对于主模式来说,当发送一字节数据时,只需将数据写到SPDAT寄存器中,即可启动发送过程,此时/SS信号不是必需的,可作任何的I/O口使用。

在从模式下,/SS引脚必须在被主机驱动为低电平的情况下,才可进行数据传输,/SS引脚变为高电平时,表示通信结束。788.11.4SPI通信的具体过程

STC12C5A60S2单片机的SPI串行通信接口的模式配置,由SPEN、SSIG、MSTR位和

/SS引脚的状态共同决定。

主/从模式的配置及使用如表8-4所示。798.11.4SPI通信的具体过程在SPI数据通信的过程中,应明确以下两个问题:

(1)在SPI串行数据通信过程中,传输总是由主机启动。主机向数据寄存器SPDAT执行一次写操作,将启动SPI时钟发生器和数据的传输。(2)SPI串行通信接口在发送数据时为单缓冲,接收数据时为双缓冲。在上一次数据尚未发送完成前,不能将新的数据写入移位寄存器。在发送过程中若对SPDAT进行写操作时,SPSTAT寄存器中的写冲突标志位WCOL置1,以表明此时数据冲突。在这种情况下,当前发送的数据将继续发送,而新写入的数据将丢失。接收到一个字节的数据后,将其保存到SPDAT,此时将释放移位寄存器并继续进行下一个数据的接收,但必须在下个字节数据完全移入之前,将接收的数据从数据寄存器中读取,否则,前一次接收的数据将被覆盖。808.11.5SPI通信时序各种外部设备的SPI通信协议是不完全相同的;

STC12C5A60S2单片机为了能够适应各种外部设备SPI通信的要求,设定了多种通信协议;SPI总线数据传输时序(CPHA=0)818.11.5SPI通信时序SPI总线数据传输时序(CPHA=1)828.12

SPI接口的应用SPI串行通信初始化主要分为以下几个步骤:(1)设置SPI的控制寄存器SPCTL:/SS引脚的控制、SPI使能位、数据传送的位顺序、主/从模式的设置、SPI时钟极性、SPI时钟相位、SPI时钟速率的选择;(2)对SPI的状态寄存器SPSTAT写入0C0H,使SPIF和WCOL标志位清0;(3)根据需要确定开放总中断EA,开放SPI中断ESPI。83【例8-4】假设系统的时钟频率为12MHz,利用STC12C5A60S2单片机的SPI接口功能从温度传感器ADT7301中读取温度数据存入片内RAM30H、31H单元中,接口电路如图8-24所示。84

ADT7301是AD公司生产的13位数字温度传感器芯片,采用+2.7V-+5.5V的电源供电,在芯片内部集成了一个用于温度检测的带隙温度传感器和一个13位AD转换器,14位温度值寄存器,其最小温度分辨率为0.03125℃,具有SPI串行通信接口。ADT7301内部集成有振荡器,不需要再提供A/D转换时钟。该芯片具有两种工作模式,即正常工作模式和节电工作模式。在正常作模式,芯片每秒钟自动进行一次温度转换。完成一次温度转换一般需800μs。因此,温度值寄存器中的温度数据每秒刷新一次。在节电模式下,片内振荡器被关闭,ADT7301不进行温度转换,直到恢复正常模式。

向ADT7301写入数据时,只能写入0000H或2000H。写入0000H后ADT7301进入正常工作模式,写入2000H后进入节电工作模式。在向ADT7301写入数据的同时,该芯片输出在此之前已转换完成的温度值,并且每次写入数据,都启动一次温度转换。85对ADT7301的读写操作是同步进行的,ADT7301的通信时序如上图所示。若在ADT7301温度转换过程中执行读写操作,则会使其自动停止转换,并在串行通信结束后又重新开始,而读取的温度值是前一次的转换结果。

温度值寄存器用于存储ADC的13位二进制补码及1位符号位的温度转换结果(最高位为符号位),温度转换公式如下:正温度值=ADC转换的结果/32;负温度值=(ADC转换的结果(包括符号位)-16384)/32;

负温度值=(ADC转换的结果(不包括符号位)-8192)/32;86温度值(℃)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论