26
第 17 第 第第第第第 C51 第第 MCS-51 单单单单单单单单单单单单单单单单单单单单单单1 1 MCS-51 MCS-51 第第第第第第第第第第第第第第第第第第第第第第第第2 2 第第第第第第第第第第第 、。 第第第第第第第第第第第 、。

第 17 章 串行接口及 C51 编程 MCS-51 单片机串行通信的基本原理。 单片机串行通信的应用。

  • Upload
    fell

  • View
    184

  • Download
    0

Embed Size (px)

DESCRIPTION

第 17 章 串行接口及 C51 编程 MCS-51 单片机串行通信的基本原理。 单片机串行通信的应用。. 1 、 MCS-51 单片机串行通信的基本原理。 2 、单片机串行通信的应用。. 8051 串行口结构框图. 8051 串行口结构框图如下所示:. 8051 串行口结构框图. 串行口的控制与状态寄存器 SCON. 2. 串行口控制寄存器 SCON SCON 寄存器用来控制串行口的工作方式和状态,它可以是位寻址。在复位时所有位被清零,字地址为 98H 。 其格式如下:. 串行口的控制与状态寄存器 SCON. 串行口控制寄存器 SCON - PowerPoint PPT Presentation

Citation preview

第 17 章 串行接口及 C51 编程MCS-51 单片机串行通信的基本原理。

单片机串行通信的应用。 11 、、 MCS-51MCS-51 单片机串行通信的基本原理。单片机串行通信的基本原理。22 、单片机串行通信的应用。、单片机串行通信的应用。

8051串行口结构框图

8051 串行口结构框图

8051 串行口结构框图如下所示:

发送 SBUF(99H)

接收 SBUF(99H)

输入移位寄存器

RI(接收中断)

RxD 串行输入

8051 内部总线

TxD 串行输出

移位 时钟

TI(发送中断)

2. 串行口控制寄存器 SCON SCON 寄存器用来控制串行口的工作方式和状态,它可以是位寻址。在复位时所有位被清零,字地址为 98H 。

其格式如下:

串行口的控制与状态寄存器 SCON

位地址位地址 9F9F 9E9E 9D9D 9C9C 9B9B 9A9A 9999 9898

位符号位符号 SMSM00 SMSM11 SMSM22 RENREN TBTB88 RBRB88 TITI RIRI

串行口的控制与状态寄存器 SCON

串行口控制寄存器串行口控制寄存器 SCONSCON各位定义如下:各位定义如下: SM0SM0 、、 SM1SM1 :串行口工作方式选择位:串行口工作方式选择位 其状态组合所对应的工作方式为:其状态组合所对应的工作方式为: SM0 SM1 SM0 SM1 工作方式 功能说明工作方式 功能说明 波特率 波特率 0 0 00 0 0 8 8 位同步移位寄存器 位同步移位寄存器 ffosc/12osc/12 0 1 10 1 1 8 8 位异步收发位异步收发 由定时器控制 由定时器控制 1 0 21 0 2 9 9 位异步收发位异步收发 ffosc/32osc/32 或或 ffosc/6osc/644 1 1 31 1 3 9 9 位异步收发位异步收发 由定时器控制 由定时器控制

串行口的控制与状态寄存器 SCON

SM2SM2 :多机通信控制位:多机通信控制位 因为多机通信是在方式因为多机通信是在方式 22 和方式和方式 33 下进行的,因下进行的,因此此 SM2SM2 主要用于方式主要用于方式 22 和方式和方式 33 。当串行口以方。当串行口以方式式 22 和方式和方式 33 接收数据时,接收数据时, SM2=1SM2=1 ,则只有在接收到的第,则只有在接收到的第 99 位数据位数据 (RB8)(RB8) 为为11 时才将接收到的前时才将接收到的前 88 位数据送入位数据送入 SBUFSBUF ,并置,并置位位 RIRI 产生中断请求;否则将接收到的前产生中断请求;否则将接收到的前 88 位数据位数据丢弃。丢弃。 SM2=0SM2=0 ,则不论第,则不论第 99 位数据是位数据是 00 还是还是 11 ,都将前,都将前88 位数据装入位数据装入 SBUFSBUF 中,并产生中断请求。在方中,并产生中断请求。在方式式 00 时,时, SM2SM2 必须为必须为 00 。。

串行口的控制与状态寄存器 SCON

RENREN :允许接收控制位:允许接收控制位 REN=0REN=0 时禁止串行口接收。时禁止串行口接收。 REN=1REN=1 时允许串行口接收。时允许串行口接收。 该位由软件置位或复位。该位由软件置位或复位。 TB8TB8 :发送数据位:发送数据位 在方式在方式 22 或方式或方式 33 时,时, TB8TB8 是发送数据的第是发送数据的第 99 位,根位,根据发送数据的需要由软件置位或复位。据发送数据的需要由软件置位或复位。 可作为奇偶校验位可作为奇偶校验位 (( 单机通信单机通信 )) 。。 可在多机通信中作为发送地址帧或数据帧的标志位。多可在多机通信中作为发送地址帧或数据帧的标志位。多机通信时,一般约定:发送地址帧时,设置机通信时,一般约定:发送地址帧时,设置 TB8=1TB8=1 ;;发送数据帧时,设置发送数据帧时,设置 TB8=0TB8=0 。在方式。在方式 00 和方式和方式 11 中,中,该位未用。该位未用。

串行口的控制与状态寄存器 SCON

RB8RB8 :接收数据位:接收数据位 在方式在方式 22 和方式和方式 33 时,存放接收数据的第时,存放接收数据的第 99 位。位。 可以是约定的奇偶校验位。可以是约定的奇偶校验位。 可以是约定的地址可以是约定的地址 // 数据标志位,可根据数据标志位,可根据 RB8RB8 被被置位的情况对接收到的数据进行某种判断。在多置位的情况对接收到的数据进行某种判断。在多机通信时,若机通信时,若 RB8=1RB8=1 ,说明收到的数据为地址帧;,说明收到的数据为地址帧;RB8=0RB8=0 ,说明收到的数据为数据帧。在方式,说明收到的数据为数据帧。在方式 11 下,下,若若 SM2=0SM2=0 ,则,则 RB8RB8 用于存放接收到的停止位方用于存放接收到的停止位方式;方式式;方式 00 下,该位未用。下,该位未用。

串行口的控制与状态寄存器 SCON TITI :发送中断标志位:发送中断标志位 用于指示一帧数据发送完否。用于指示一帧数据发送完否。 在方式在方式 00 下,发送电路发送完第下,发送电路发送完第 88 位数据时,位数据时, TITI 由硬件置位。由硬件置位。 在其他方式下,在其他方式下, TITI 在发送电路开始发送停止位时置位,这就是在发送电路开始发送停止位时置位,这就是说:说: TITI 在发送前必须由软件复位,发送完一帧后由硬件置位。在发送前必须由软件复位,发送完一帧后由硬件置位。因此,因此, CPUCPU 查询查询 TITI 状态便可知一帧信息是否已发送完毕。状态便可知一帧信息是否已发送完毕。 RIRI :接收中断标志位:接收中断标志位 用于指示一帧信息是否接收完。用于指示一帧信息是否接收完。 在方式在方式 11 下,下, RIRI 在接收电路接收到第在接收电路接收到第 88 位数据时由硬件置位。位数据时由硬件置位。 在其他方式下,在其他方式下, RIRI 是在接收电路接收到停止位的中间位置时置是在接收电路接收到停止位的中间位置时置位的,位的, RIRI 也可供也可供 CPUCPU 查询,以决定查询,以决定 CPUCPU 是否需要从“是否需要从“ SBUFSBUF(( 接收接收 )”)” 中提取接收到的字符或数据。中提取接收到的字符或数据。 RIRI 也由软件复位。也由软件复位。

电源控制寄存器 PCON

. . 电源控制寄存器电源控制寄存器 PCONPCON PCONPCON 寄存器主要是为寄存器主要是为 CHMOSCHMOS 型单片机的电源型单片机的电源控制设置的专用寄存器,单元地址为控制设置的专用寄存器,单元地址为 87H87H ,不能,不能位寻址。位寻址。其格式如下:其格式如下: 位序位序 D7D7 D6D6 D5D5 D4D4 D3D3 D2D2 D1D1 D0D0

位符号位符号 SMODSMOD // // // GFGF11 GFGF00 PDPD IDLIDL

电源控制寄存器 PCON各位定义如下: 各位定义如下: SMOD:SMOD: 串行口波特率的倍增位。串行口波特率的倍增位。 在在 HMOSHMOS 单片机中,该寄存器中除最高位之外,单片机中,该寄存器中除最高位之外,其他位都是虚设的。在单片机工作在方式其他位都是虚设的。在单片机工作在方式 11 、方式、方式22 和方式和方式 33 时,时, SMOD=1SMOD=1 ,串行口波特率提高一倍。,串行口波特率提高一倍。 SMOD=0SMOD=0 ,则波特率不加倍。系统复位时,则波特率不加倍。系统复位时 SMOD=SMOD=00 。。 GF1GF1 、、 GF0GF0 :通用标志位,由软件置位、复位。:通用标志位,由软件置位、复位。 PDPD :掉电方式控制位,:掉电方式控制位, PD=1PD=1 ,则进入掉电方式。,则进入掉电方式。 IDLIDL :待机方式控制位,:待机方式控制位, IDL=1IDL=1 ,则进入待机方式。,则进入待机方式。

串行口的工作方式 0

1. 1. 方式方式 00 串行接口工作方式串行接口工作方式 00 为同步移位寄存器方式,其为同步移位寄存器方式,其波特率是固定的,为波特率是固定的,为 ffosc(osc( 振荡频率振荡频率 )) 的的 1/121/12 。 。 (1) (1) 方式方式 00 发送发送 数据从数据从 RxDRxD 引脚串行输出,引脚串行输出, TxDTxD 引脚输出同步引脚输出同步脉冲。当一个数据写入串行口发送缓冲器时,串脉冲。当一个数据写入串行口发送缓冲器时,串行口将行口将 88 位数据以位数据以 ffosc/12osc/12 的固定波特率从的固定波特率从 RxDRxD引脚输出,从低位到高位。发送后置中断标志引脚输出,从低位到高位。发送后置中断标志 TITI为为 11 ,请求中断,在再次发送数据之前,必须用,请求中断,在再次发送数据之前,必须用软件将软件将 TITI 清零。清零。

串行口的工作方式 0

(2) (2) 方式方式 00 接收接收 在满足在满足 REN=1REN=1 和和 RI=0RI=0 的条件下,串行口处于方的条件下,串行口处于方式式 00 输入。此时,输入。此时, RxDRxD 为数据输入端,为数据输入端, TXDTXD 为为同步信号输出端,接收器也以同步信号输出端,接收器也以 ffosc/12osc/12 的波特率的波特率对对 RxDRxD 引脚输入的数据信息采样。当接收器接收引脚输入的数据信息采样。当接收器接收完完 88 位数据后,置中断标志位数据后,置中断标志 RI=1RI=1 为请求中断,为请求中断,在再次接收之前,必须用软件将在再次接收之前,必须用软件将 RIRI 清零。清零。 在方式在方式 00 工作时,必须使工作时,必须使 SCONSCON 寄存器中的寄存器中的 SMSM22 位为“位为“ 0”0” ,这并不影响,这并不影响 TB8TB8 位和位和 RB8RB8 位。方位。方式式 00 发送或接收完数据后由硬件置位发送或接收完数据后由硬件置位 TITI 或或 RIRI , , CPUCPU 在响应中断后要用软件清除在响应中断后要用软件清除 TITI 或或 RIRI 标志。标志。

串行口的工作方式 1

2. 2. 方式方式 11 工作方式工作方式 11 时,串行口被设置为波特率可变的时,串行口被设置为波特率可变的 88位异步通信接口。位异步通信接口。(1) (1) 方式方式 ll发送发送 串行口以方式串行口以方式 11 发送数据时,数据位由发送数据时,数据位由 TxDTxD端输端输出,出, 11 帧信息包含帧信息包含 1010 位,即一位起始位、八位位,即一位起始位、八位数据位数据位 ((先低位后高位先低位后高位 )) 和一个停止位“和一个停止位“ 1”1” 。。 CCPUPU执行一条数据写入发送缓冲器执行一条数据写入发送缓冲器 SBUFSBUF 的指令,的指令,就启动发送器发送数据:发送完数据后,就置中就启动发送器发送数据:发送完数据后,就置中断标志断标志 TITI 为为 11 。方式。方式 11 所传送的波特率取决于定所传送的波特率取决于定时器时器 TT 的溢出率和特殊功能寄存器的溢出率和特殊功能寄存器 PCONPCON 中中 SMSMODOD 的值。的值。

串行口的工作方式 1

(2) (2) 方式方式 11 接收接收 当串行口工作在方式当串行口工作在方式 11 下,且下,且 REN=1REN=1 时,串行口处于方时,串行口处于方式式 11 的输入状态。它以所选波特率的的输入状态。它以所选波特率的 1616 倍的速率对倍的速率对 RxDRxD引脚状态采样。当采样到由引脚状态采样。当采样到由 11 到到 00 的负跳变时,启动接收的负跳变时,启动接收器,接收的值是器,接收的值是 33次采样中至少两次相同的值,以保证可次采样中至少两次相同的值,以保证可靠无误。当检测到起始位有效时,开始接收一帧的其余信靠无误。当检测到起始位有效时,开始接收一帧的其余信息。一帧信息包含息。一帧信息包含 1010 位,即一位起始位、八位数据位位,即一位起始位、八位数据位(( 先低位后高位先低位后高位 )) 和一个停止位“和一个停止位“ 1”1” 。使用方式。使用方式 11 接收接收时,必须同时满足以下两个条件:即时,必须同时满足以下两个条件:即 RI=0RI=0 和停止位为和停止位为 11或或 SM2=0SM2=0 ,若满足条件则接收数据进入,若满足条件则接收数据进入 SBUFSBUF ,停止位,停止位进入进入 RB8RB8 ,并置中断请求标志,并置中断请求标志 RIRI 为为 11 。若上述两个条件。若上述两个条件不满足,则接收数据丢失,不再恢复。这时将重新检测不满足,则接收数据丢失,不再恢复。这时将重新检测 RRxDxD 上上 11 到到 00 的负跳变,以接收下一帧数据。中断标志也的负跳变,以接收下一帧数据。中断标志也必须由用户在中断服务程序中清零。必须由用户在中断服务程序中清零。

串行口的工作方式 2

(2) (2) 方式方式 22 接收接收 当串行口置为方式当串行口置为方式 22 ,且,且 REN=1REN=1 时,串行口以方式时,串行口以方式 22 接接收数据。方式收数据。方式 22 的接收与方式的接收与方式 11 基本相似。数据由基本相似。数据由 RxDRxD端输入,接收端输入,接收 1111 位信息,其中,一位起始位位信息,其中,一位起始位 (0)(0) 、八位、八位数据位数据位 ((先低位后高位先低位后高位 )) 、一位附加可控位、一位附加可控位 (1(1 或或 0)0) 和一和一位停止位“位停止位“ 1”1” 。当采样到。当采样到 RxDRxD 端由端由 11 到到 00 的负跳变,的负跳变,并判断起始位有效后,便开始接收一帧信息,当接收器接并判断起始位有效后,便开始接收一帧信息,当接收器接收到第收到第 99 位数据后,当位数据后,当 RI=0RI=0且且 SM2=0SM2=0 或接收到的第或接收到的第 99位数据为位数据为 11 时,将收到的数据送入时,将收到的数据送入 SBUF(SBUF( 接收数据缓冲接收数据缓冲器器 )) ,第,第 99 位数据送入位数据送入 RB8RB8 ,并将,并将 RIRI 置置 11 ;若以上两个;若以上两个条件不满足,接收信息丢失。条件不满足,接收信息丢失。 若附加的第若附加的第 99 位为奇偶校验位,在接收中断服务程序中应位为奇偶校验位,在接收中断服务程序中应作检验。作检验。

串行通信的波特率 串行口的通信波特率恰到好处地反映了串串行口的通信波特率恰到好处地反映了串行传输数据的速率。通信波特率的选用,行传输数据的速率。通信波特率的选用,不仅和所选通信设备、传输距离有关,还不仅和所选通信设备、传输距离有关,还受传输线状况所制约。用户应根据实际需受传输线状况所制约。用户应根据实际需要加以正确选用。要加以正确选用。1. 1. 方式方式 00 下的波特率下的波特率 在方式在方式 00 下,串行口通信的波特率是固定下,串行口通信的波特率是固定

的,其值为的,其值为 ffosc/12(osc/12(ffoscosc 为主机频率为主机频率 )) 。。

串行通信的波特率

2. 2. 方式方式 22 下的波特率下的波特率 在方式在方式 22 下,通信波特率为下,通信波特率为 ffosc/32osc/32 或或 ffosc/64osc/64 。。用户可以根据用户可以根据 PCONPCON 中中 SMODSMOD 位的状态来驱使位的状态来驱使串行口在哪个波特率下工作。选定公式为:串行口在哪个波特率下工作。选定公式为:

这就是说,若这就是说,若 SMOD=0SMOD=0 ,则所选波特率为,则所选波特率为 ffosc/osc/6464 ;若;若 SMOD=1SMOD=1 ,则波特率为,则波特率为 ffosc/32osc/32 。。

SMOD

osc

264

f波特率

串行通信的波特率3. 3. 方式方式 11 或方式或方式 33 下的波特率下的波特率 在这两种方式下,串行口波特率是由定时器的溢出率决定在这两种方式下,串行口波特率是由定时器的溢出率决定的,因而波特率也是可变的。相应公式为:的,因而波特率也是可变的。相应公式为: 定时器定时器 T1T1溢出率的计算公式为:溢出率的计算公式为: 式中,式中, KK为定时器为定时器 T1T1 的位数,它和定时器的位数,它和定时器 T1T1 的设定方的设定方式有关。若定时器式有关。若定时器 T1T1 为方式为方式 00 ,则,则 KK=13=13 ;若定时器;若定时器 T1T1为方式为方式 11 ,则,则 KK=16=16 ;若定时器;若定时器 T1T1 为方式为方式 22 或或 33 ,则,则 KK==88 。。

串行通信的应用举例 例一:例一: PCPC 机发一个字符给单片机,单片机机发一个字符给单片机,单片机收到后即在个位、十位数码管上显示,同收到后即在个位、十位数码管上显示,同时将其回送给时将其回送给 PCPC 机,其中,单片机收机,其中,单片机收 PCPC发来的信号用串口中断方式,单片机发给发来的信号用串口中断方式,单片机发给 PP

CC 机时则采用查询方式机时则采用查询方式 源程序如下:源程序如下: #include <REG51.H>#include <REG51.H> #define uchar unsigned char#define uchar unsigned char #define uint unsigned int#define uint unsigned int

串行通信的应用举例 uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0

x6f};x6f}; uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7};uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7}; /*************************************************************//*************************************************************/ uchar code as[]=" Receving Data:\0";uchar code as[]=" Receving Data:\0"; uchar a=0x30,b;uchar a=0x30,b; //****************************************************//**************************************************** void init(void)void init(void) {{

TMOD=0x20;TMOD=0x20; TH1=0xfd;TH1=0xfd; TL1=0xfd;TL1=0xfd; SCON=0x50;SCON=0x50; TR1=1;TR1=1; ES=1;ES=1; EA=1;EA=1; }} //**********************//**********************

串行通信的应用举例 void delay(uint k)void delay(uint k) {{ uint data i,j;uint data i,j; for(i=0;i<k;i++)for(i=0;i<k;i++) {{ for(j=0;j<121;j++){;}for(j=0;j<121;j++){;} }} }} void main(void)void main(void) {{ uchar i;uchar i; init();init();

串行通信的应用举例 while(1)while(1) {{ P0=SEG7[(a-0x30)/10];P0=SEG7[(a-0x30)/10]; P2=ACT[1];P2=ACT[1]; delay(1);delay(1); P0=SEG7[(a-0x30)%10];P0=SEG7[(a-0x30)%10]; P2=ACT[0];P2=ACT[0]; delay(1);delay(1); if(RI)if(RI) {{ RI=0;i=0;RI=0;i=0; while(as[i]!='\0'){SBUF=as[i];while(!TI);TI=0;i++;}while(as[i]!='\0'){SBUF=as[i];while(!TI);TI=0;i++;} SBUF=b;while(!TI);TI=0;SBUF=b;while(!TI);TI=0; EA=1;EA=1; }} }} }} //*****************************************//***************************************** void serial_serve(void) interrupt 4void serial_serve(void) interrupt 4 {{ a=SBUF;a=SBUF; b=a;b=a; EA=0;EA=0; }}

串行通信的应用举例 例二:例二: PCPC 机发控制指令给单片机,单片机收到后即控机发控制指令给单片机,单片机收到后即控制制 D0-D7D0-D7 这这 88 个发光二极管的亮、灭,同时收到的指个发光二极管的亮、灭,同时收到的指令参数在个位、百位数码管上进行显示(数码管显示发令参数在个位、百位数码管上进行显示(数码管显示发光管的亮光管的亮、灭、灭 11 代表亮,代表亮, 00 代表灭代表灭 源程序如下:源程序如下: #include <REG51.H>#include <REG51.H> #define uchar unsigned char#define uchar unsigned char #define uint unsigned int#define uint unsigned int uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6

d,0x7d,0x07,0x7f,0x6f};d,0x7d,0x07,0x7f,0x6f}; uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7};uchar code ACT[4]={0xfe,0xfd,0xfb,0xf7};

串行通信的应用举例 sbit D0=P1^0;sbit D0=P1^0; sbit D1=P1^1;sbit D1=P1^1; sbit D2=P1^2;sbit D2=P1^2; sbit D3=P1^3;sbit D3=P1^3; sbit D4=P1^4;sbit D4=P1^4; sbit D5=P1^5;sbit D5=P1^5; sbit D6=P1^6;sbit D6=P1^6; sbit D7=P1^7;sbit D7=P1^7; #define ON 0#define ON 0 #define OFF 1#define OFF 1 uchar a[2];uchar a[2]; uchar cnt;uchar cnt; bit outflag;bit outflag; void delay(uint k)void delay(uint k) {{ uint data i,j;uint data i,j; for(i=0;i<k;i++)for(i=0;i<k;i++) {{ for(j=0;j<121;j++){;}for(j=0;j<121;j++){;} }} }} void init(void)void init(void) {{ TMOD=0x20;TMOD=0x20; TH1=0xfd;TH1=0xfd; TL1=0xfd;TL1=0xfd; SCON=0x50;SCON=0x50; TR1=1;TR1=1; ES=1;ES=1; EA=1;EA=1; }}

串行通信的应用举例 void main(void)void main(void) {{ init();init(); while(1)while(1) {{ P0=SEG7[a[0]];P2=ACT[2];delay(1);P0=SEG7[a[0]];P2=ACT[2];delay(1); P0=SEG7[a[1]];P2=ACT[0];delay(1);P0=SEG7[a[1]];P2=ACT[0];delay(1); if(outflag==1)if(outflag==1) {{ switch(a[0])switch(a[0]) {{ case 1:if(a[1]==1)D0=ON;else D0=OFF;break;case 1:if(a[1]==1)D0=ON;else D0=OFF;break; case 2:if(a[1]==1)D1=ON;else D1=OFF;break;case 2:if(a[1]==1)D1=ON;else D1=OFF;break; case 3:if(a[1]==1)D2=ON;else D2=OFF;break;case 3:if(a[1]==1)D2=ON;else D2=OFF;break; case 4:if(a[1]==1)D3=ON;else D3=OFF;break;case 4:if(a[1]==1)D3=ON;else D3=OFF;break; case 5:if(a[1]==1)D4=ON;else D4=OFF;break;case 5:if(a[1]==1)D4=ON;else D4=OFF;break; case 6:if(a[1]==1)D5=ON;else D5=OFF;break;case 6:if(a[1]==1)D5=ON;else D5=OFF;break; case 7:if(a[1]==1)D6=ON;else D6=OFF;break;case 7:if(a[1]==1)D6=ON;else D6=OFF;break; case 8:if(a[1]==1)D7=ON;else D7=OFF;break;case 8:if(a[1]==1)D7=ON;else D7=OFF;break; default:break;default:break; }} outflag=0;outflag=0; }} }} }}

串行通信的应用举例 void serial_serve(void) interrupt 4void serial_serve(void) interrupt 4 {{ uchar temp;uchar temp; RI=0;RI=0; EA=0;EA=0; temp=SBUF;temp=SBUF; switch(cnt)switch(cnt) {{ case 0:if(temp=='#')cnt=1;else outflag=0;break;case 0:if(temp=='#')cnt=1;else outflag=0;break; case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else case 1:if((temp>0x30)&&(temp<0x39)){a[0]=temp-0x30;cnt=2;}else

outflag=0;break;outflag=0;break; case 2:if(temp=='(')cnt=3;else outflag=0;break;case 2:if(temp=='(')cnt=3;else outflag=0;break; case 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}elscase 3:if((temp>=0x30)&&(temp<=0x38)){a[1]=temp-0x30;cnt=4;}els

e outflag=0;break;e outflag=0;break; case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break;case 4:if(temp==')'){cnt=0;outflag=1;}else outflag=0;break; default:break;default:break; }} EA=1;EA=1; }}