《Chap428051内部资源的C编程.4PPT优秀课件》由会员分享,可在线阅读,更多相关《Chap428051内部资源的C编程.4PPT优秀课件(138页珍藏版)》请在金锄头文库上搜索。
1、8051内部资源常熟理工学院物理与电子工程学院2011.4Chap8 8051内部资源8.1 外部中断:INT0、INT18.2 定时/计数器:T0、T18.3 串行口:RXD、TXD8.1 外部中断8051外部中断中断中断中断源中断源中断优先级中断优先级中断嵌套中断嵌套8051外部中断中断:中断:当当CPUCPU正处理某项事务时,若外界或内部发生紧正处理某项事务时,若外界或内部发生紧急事件,要求急事件,要求CPUCPU暂停正在处理的工作转而去处理这个暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了
2、的程序,这样的过程称为中断。继续执行原来被中断了的程序,这样的过程称为中断。(堆栈)(堆栈) 中断源中断源:向:向CPUCPU提出中断请求的源称为中断源提出中断请求的源称为中断源外部跳变信号(下降延)外部跳变信号(下降延)外部低电平等外部低电平等 (0 0)8051外部中断中断优先级中断优先级: :当几个中断源同时请求中断时,当几个中断源同时请求中断时,CPUCPU应优应优先响应最需紧急处理的中断请求。为此,需要规定各先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级。在优先级高的中断请求处理完了个中断源的优先级。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。以后。再
3、响应优先级低的中断请求。中断嵌套中断嵌套: :当当CPUCPU正在处理一个优先级低的中断请求的正在处理一个优先级低的中断请求的时,如果发生另一个优先级比它高的中断请求,时,如果发生另一个优先级比它高的中断请求,CPUCPU能能暂停当前处理的中断,转去处理优先级高的中断请求,暂停当前处理的中断,转去处理优先级高的中断请求,待处理完以后,再回到原来正在处理的低级中断程序,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中这种高级中断源能中断低级中断源的中断处理称为中断嵌套。断嵌套。 8051中断中断80518051单片机有单片机有5 5个个中断源中断源2
4、 2个个中断优先级中断优先级(2(2级级中断嵌套中断嵌套),),优先级可通过编程实现优先级可通过编程实现IEIE(中断允许寄存器):中断源的中断请求是否能得到(中断允许寄存器):中断源的中断请求是否能得到响应,受响应,受IEIE的控制;的控制;IPIP(中断优先级寄存器):各个中断源的优先级可由(中断优先级寄存器):各个中断源的优先级可由IPIP的各位来确定;同一优先级中的各中断源同时请求中断的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。时,由内部的查询逻辑来确定响应的次序。 80518051中断源中断源80518051五个中断源五个中断源INT0INT
5、0中断(中断(P3.2P3.2)T0T0中断中断 (P3.4P3.4)INT1INT1中断(中断(P3.3P3.3)T1T1中断中断 (P3.5P3.5)串行中断(串行中断(P3.0P3.0、P3.1P3.1)8051中断入口(中断入口(ROM)地址和优先级)地址和优先级中断源中断源中断号中断号(n n)中断入口地址中断入口地址(8n+38n+3)中断优先级中断优先级INT0INT0中断中断0 00003H0003H高高低低T0T0中断中断1 1000BH000BHINT1INT1中断中断2 20013H0013HT1T1中断中断3 3001BH001BH串行口中断串行口中断4 40023H0
6、023HT2T2中断中断5 5002BH002BH8051 INT0中断机理当当INT0INT0引脚输入如下信号:引脚输入如下信号:下降沿(下降沿(IT0=1IT0=1)或)或低电平(低电平(IT0=0IT0=0)CPUCPU自动(硬件)产生中断标志自动(硬件)产生中断标志(IE0=1IE0=1)此时此时若若INT0INT0中断允许(使能中断允许(使能EX0=1EX0=1,EA=1EA=1),则),则CPUCPU立即停止当前程序,立即停止当前程序,跳转到跳转到INT0INT0对应的中断入口(对应的中断入口(ROMROM保留地址保留地址0x00030x0003)执行中断服务程)执行中断服务程序(
7、中断服务程序后序(中断服务程序后CPUCPU自动对中断标志清零:自动对中断标志清零:IE0=0IE0=0),待),待INT0INT0中中断服务程序执行完毕后再回原执行程序处;断服务程序执行完毕后再回原执行程序处;若若若若INT0INT0中断未允许,则程序不能跳转到中断未允许,则程序不能跳转到INT0INT0中断入口,不执行中中断入口,不执行中断服务程序(中断标志断服务程序(中断标志IE0IE0不能自动清不能自动清0 0)。)。问提:中断标志问提:中断标志IE0IE0的产生与中断使能是否有关?的产生与中断使能是否有关?INT0中断方式执行流程中断方式执行流程#includereg51.hunsi
8、gnedchari=0;/*int0中断服务程序中断服务程序*/voidINT0_ISR(void)interrupt0delay(200);if((P3&0x02)=0x00)P1=+i;/*主函数主函数*/voidmain(void)IT0=1;/下降延中断下降延中断EX0=1;/int0中断使能中断使能EA=1;/总中断使能总中断使能while(1);/等待中断等待中断主程序主程序中断响应中断响应初始化中断初始化中断等待中断等待中断中断服务程序中断服务程序返回中断返回中断自动清中断标志自动清中断标志INT0 查询方式void main(void)void main(void) IT0=1
9、; IT0=1; /EX0=1;EA=1;/EX0=1;EA=1;while(1)while(1) /查询方式查询方式1 1:if(IE0= =1)if(IE0= =1) IE0=0;/ IE0=0;/手动清中断标志手动清中断标志 /P1=+I;/P1=+I; _-_-P2=LED_segbufiP2=LED_segbufiP0=LED_bitiP0=LED_bitiI+;I+;If(I=6)If(I=6)I=0I=0delay(500);delay(500); void main(void)void main(void) while(1)while(1) /查询方式查询方式2 2:while
10、(IE0= =0)while(IE0= =0) ; /; /等待等待INT0INT0外部中断外部中断 IE0=0; /IE0=0; /手动清中断标志手动清中断标志/ 80518051中断系统中断系统与中断有关的与中断有关的SFR注注:*:*表示可以位寻址表示可以位寻址SFRD7D6D5D4D3D2D1D0地址地址*IP-PT2PSPT1PX1PT0PX0B8H*IEEA-ET2ESET1EX1ET0EX0A8HTMODGATEC/T#M1M0GATEC/T#M1M089H*TCONTF1TR1TF0TR0IE1IT1IE0IT088HSCONSM0SM1SM2RENTB8RB8TIRI98HP
11、CONSMOD-87HTCON:定时计数器控制寄存器定时计数器控制寄存器TF1TF1、TF0 TF0 :T1T1、T0T0溢出标志溢出标志 TR1TR1、TR0 TR0 :T1T1、T0T0启动控制位(启动控制位(TR=1:TR=1:启动定时器)启动定时器) IE1IE1、IE0 IE0 :INT1INT1、INT0INT0中断标志中断标志IT1IT1、IT0 IT0 :INT1INT1、INT0INT0触发方式控制位(触发方式控制位(IT=1:IT=1:下降沿触发,下降沿触发,IT=0IT=0:低电平触发):低电平触发)TF1TF1、TF0TF0、IE1IE1、IE0IE0都具有自动清零功能
12、。都具有自动清零功能。D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0SCON:串行口控制寄存器串行口控制寄存器SM0 SM1SM0 SM1串行模式选择串行模式选择SM2 SM2 多机通讯允许位:方式多机通讯允许位:方式0 0时时, ,此位应该为此位应该为0 0;模式;模式1 1时时, ,当接收到停止位时当接收到停止位时, ,该位将置位;方式该位将置位;方式2 2或方式或方式3 3时时, ,当接收的第当接收的第9 9位数据为位数据为1 1时时, ,将置位将置位REN REN 串行接收允许位串行接收允许位TB8 TB8 在模式在模式2 2和模式和模式3 3中中,
13、,将被发送数据的第将被发送数据的第9 9位位RB8RB8:在方式:在方式0 0中中, ,该位不起作用;在方式该位不起作用;在方式1 1中该位为接中该位为接收数据的停止位;在方式收数据的停止位;在方式2 2和方式和方式3 3 中为接收数据的第中为接收数据的第9 9 位位TI TI 串行发送结束标志,由串行发送结束标志,由软件软件清零清零RI RI 串行接收结束标志,由串行接收结束标志,由软件软件清零清零D7D6D5D4D3D2D1D0SM0SM0SM1SM1SM2SM2RENRENTB8TB8RB8RB8TITIRIRIIE:中断允许寄存器中断允许寄存器EAEA: 使能标志位。使能标志位。 1:
14、1:所有中断使能;所有中断使能;0:0:禁止所有中断禁止所有中断ET2ET2:T2T2中断使能中断使能ESES: 串行通信中断使能串行通信中断使能ET1ET1:T1T1中断使能中断使能EX1EX1:INT1INT1中断使能中断使能ET0ET0:T0T0中断使能中断使能EX0EX0:INT0INT0中断使能中断使能D7D7D6D6D5D5D4D4D3D3D2D2D1D1D0D0EAEA- -ET2ET2ESESET1ET1EX1EX1ET0ET0EX0EX0IP:中断优先级寄存器中断优先级寄存器- - 保留保留- - 保留保留PT2PT2:T2T2中断优先级中断优先级PSPS: 串行通信中断优先
15、级串行通信中断优先级PT1PT1:T1T1中断优先级中断优先级PX1PX1:INT1INT1优先级优先级PT0PT0:T0T0中断优先级中断优先级PX0PX0:INT0INT0优先级优先级D7D7D6D6D5D5D4D4D3D3D2D2D1D1D0D0- - - -PT2PT2PSPSPT1PT1PX1PX1PT0PT0PX0PX0与中断有关的各位PX0PX0、PT0PT0、PX1PX1、PT1PT1、PSPSEX0EX0、ET0ET0、EX1EX1、ET1ET1、ESES、EAEAIT0IT0、IT1IT1TR0TR0、TR1TR1IE0IE0、 IE1 IE1 、TF0TF0、TF1TF1
16、、 TI TI 、RIRI以上各位可位寻址,且均为高电平有效以上各位可位寻址,且均为高电平有效8051外部中断编程示例#includereg51.h/C51中断程序框架中断程序框架/*int0中断服务程序中断服务程序*/voidINT0_ISR(void)interrupt0using0/中断服务程序中断服务程序/*主函数主函数*/voidmain(void)IT0=1;EX0=1;EA=1;/打开中断源打开中断源while(1);/等待中断等待中断中断服务函数与寄存器的定义中断服务函数与寄存器的定义为为了了满满足足在在C C语语言言源源程程序序中中直直接接编编写写中中断断服服务务程程序序的的
17、要要求求,C51C51编编译译器器对对函函数数的的定定义义进进行行了了扩扩展展,增增加加了了一一个个扩扩展展关关键键字字interruptinterrupt。它它是是函函数数定定义义时时的的一一个个选选项项,加上这个选项即可将一个函数定义成中断服务函数。加上这个选项即可将一个函数定义成中断服务函数。定义格式为:定义格式为: 函数类型函数类型 函数名(形式参数表)函数名(形式参数表) interrupt n using n interrupt n using n 中断服务函数与寄存器的定义中断服务函数与寄存器的定义函数类型函数类型 函数名(形式参数表)函数名(形式参数表) interrupt n
18、 using n interrupt n using n 关键字关键字interruptinterrupt后面的后面的n n是中断号,是中断号,n n的范围为的范围为0 03131。编译器从。编译器从8n+38n+3处产生中断向向量,具体的中断号处产生中断向向量,具体的中断号n n和中断向量取决于和中断向量取决于80518051单单片机芯片型号,常用中断源和中断向量如表所示。片机芯片型号,常用中断源和中断向量如表所示。 中断号中断号n n中断源中断源中断向量中断向量8n+38n+30 0INT0INT00003H0003H1 1T0T0000BH000BH2 2INT1INT10013H001
19、3H3 3T1T1001BH001BH4 4串行口串行口0023H0023H中断服务函数与寄存器的定义中断服务函数与寄存器的定义工作寄存器:工作寄存器:80518051片内片内RAMRAM中有中有4 4个工作寄存器组,每个寄存器组个工作寄存器组,每个寄存器组中含中含8 8个工作寄存器(个工作寄存器(R0R0R7R7)。)。C51C51编译器扩展了一个关键字编译器扩展了一个关键字usingusing,专门用来选择,专门用来选择80518051单片机的单片机的工作寄存器组。工作寄存器组。在定义一个函数时,在定义一个函数时,usingusing后面的后面的n n是一个是一个0 03 3的常数,分别表
20、示的常数,分别表示4 4个功能完全一样的工作寄存器组。个功能完全一样的工作寄存器组。在定义一个函数时,在定义一个函数时,usingusing是一个选项,若缺省编译器自动分配一是一个选项,若缺省编译器自动分配一个寄存器组作绝对寄存器组访问。需要注意的是,关键字个寄存器组作绝对寄存器组访问。需要注意的是,关键字usingusing和和interruptinterrupt的后面都不允许跟带运算符的表达式的后面都不允许跟带运算符的表达式。中断服务函数与寄存器的定义中断服务函数与寄存器的定义voidINT0_ISR(void)interrupt0voidTIMER0_ISR(void)interrupt
21、1voidINT1_ISR(void)interrupt2voidTIMER1_ISR(void)interrupt3voidUART_ISR(void)interrupt4 中断服务函数与寄存器的定义中断服务函数与寄存器的定义_ KeilC51命令命令DEFINE BUTTONDEFINE BUTTON(定义按钮)命令(定义按钮)命令定义定义:DEFINE BUTTON DEFINE BUTTON “按钮名按钮名”,“命令命令” 在在Debug-Function Debug-Function EditorEditor(Open Open Ini Ini FileFile)中中定定义义外外中中
22、断断按钮:按钮: define button INT0(P3.2) , PORT3=PORT30x04define button INT0(P3.2) , PORT3=PORT30x04 define button T0(P3.4) , PORT3=PORT30x10 define button T0(P3.4) , PORT3=PORT30x10 define button INT1(P3.3) , PORT3=PORT30x08 define button INT1(P3.3) , PORT3=PORT30x08 define button T1(P3.5) , PORT3=PORT30x
23、20 define button T1(P3.5) , PORT3=PORT30x20 每按钮一次对每按钮一次对P3.2P3.2取反取反删除删除:KILL BUTTON nKILL BUTTON n define button define button “clr drtrclr drtr”, ,”dptr=0dptr=0” kill button 1 kill button 1 中断服务函数与寄存器的定义中断服务函数与寄存器的定义_ KeilC51命令命令EVALEVALEVAL EVAL (1/2561/256) 0x000x00EVAL EVAL (256/256256/256) 0xF
24、F0xFFPORT3 0xFFPORT3 0xFFex0_isr_counter ex0_isr_counter 询问变量的值询问变量的值中断如何扩充中断如何扩充1 1定时器中断作为外部中断使用定时器中断作为外部中断使用 把把80518051的的T1 T1 、T0T0用作对外部脉冲计数方式。每当用作对外部脉冲计数方式。每当P3.4P3.4(T0T0)或)或P3.3P3.3(T1T1)引脚上发生负跳变时,)引脚上发生负跳变时, T1 T1 和和T0T0的计数器加的计数器加1 1。利用这个。利用这个特性,可以把特性,可以把P3.4P3.4和和P3.3P3.3引脚作为外部中断请求输入线,而定时器引脚
25、作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。的溢出中断作为外部中断请求标志。 T0(P3.4)Vcc中断如何扩充中断如何扩充1 1定时器中断作为外部中断使用(软件)定时器中断作为外部中断使用(软件) 定时器定时器T1T1对外部计数对外部计数/*TH1/*TH1、TL1TL1采用采用1616进制赋值进制赋值* */ /void int0(void) interrupt 3void int0(void) interrupt 3 /*/*中断服务程序中断服务程序* */ / void main(void)void main(void) TMOD= TMOD=(TMOD&0x0f)
26、|0x60;TMOD&0x0f)|0x60; ET1=1; EA=1; TR1=1; ET1=1; EA=1; TR1=1; TH1=0xFF; /*TH1=-1/256-1 TH1=0xFF; /*TH1=-1/256-1; * */ / TL1=0xFF; /*TL1=-1%256 TL1=0xFF; /*TL1=-1%256; * */ / while(1) while(1) ;T1(P3.2)中断如何扩充中断如何扩充2 2中断和查询结合的方式中断和查询结合的方式中断如何扩充中断如何扩充2 2#include #include sbit LED_A=P10;sbit LED_A=P10;
27、sbit LED_B=P11;sbit LED_B=P11;sbit LED_C=P12;sbit LED_C=P12;sbit IA=P13;sbit IA=P13;sbit IB=P14;sbit IB=P14;sbit IC=P15;sbit IC=P15;中断如何扩充中断如何扩充2 2void main(void)void main(void) IT0=1; IT0=1; IT1=1;IT1=1;EX0=1;EX0=1; EX1=1;EX1=1;EA=1;EA=1;LED_A=0;LED_B=0;LED_C=0;LED_A=0;LED_B=0;LED_C=0;IA=1;IB=1;IC=
28、1;IA=1;IB=1;IC=1;while(1);while(1); 中断如何扩充中断如何扩充2 2void int0(void) interrupt 0void int0(void) interrupt 0 LED_A=0;LED_B=0;LED_C=0; LED_A=0;LED_B=0;LED_C=0;IE1=0;IE1=0;EX1=1;EX1=1; void int1(void) interrupt 2void int1(void) interrupt 2 EX1=0; EX1=0; if(IA=0) LED_A=1;if(IA=0) LED_A=1;else if(IB=0) LED
29、_B=1;else if(IB=0) LED_B=1;else if(IC=0) LED_C=1;else if(IC=0) LED_C=1; 中断如何扩充中断如何扩充3 3利用硬件扩充多个中断源利用硬件扩充多个中断源采用一个采用一个8/38/3优先编码器优先编码器74LS14874LS148,把多个中断源信号作为一个中断效果,把多个中断源信号作为一个中断效果很好。很好。 I7-I0I7-I0优先级逐步降低优先级逐步降低GSGS为标志位:判断是否有有效输入为标志位:判断是否有有效输入中断如何扩充中断如何扩充3 3软件设计思路软件设计思路#include #include unsigned ch
30、ar status;unsigned char status;bit flag;bit flag;void int1void int1(voidvoid) interrupt 2 using 2 interrupt 2 using 2 flag=1; /* flag=1; /*设置标志设置标志* */ / status=P1; /* status=P1; /*存状态存状态* */ / 中断如何扩充中断如何扩充3 3软件设计思路软件设计思路void main(void)void main(void) PX1=1; /* PX1=1; /*置置INT1INT1高优先级中断高优先级中断* */ /
31、EX1=1; EA=1 EX1=1; EA=1; /*INT1/*INT1开中断,开中断,CPUCPU开中断开中断* */ / while(1) while(1) if(flag) /* if(flag) /*有中断有中断* */ / switch(status) /* switch(status) /*根据中断源分支根据中断源分支* */ / case 0: break; /* case 0: break; /*处理处理0*/0*/ case 1: break; /* case 1: break; /*处理处理1*/1*/ case 2: break; case 2: break; case
32、 3: break; case 3: break; default:; default:; flag=0; flag=0; 8.2 8.2 定时器定时器问题提出void delay(unsigned char n)unsigned char i;for(i=0;in;i+);void delay(unsigned int n)unsigned int i;for(i=0;in;i+);问题提出(fosc=11.0592MHz)y1=32.82+17.34*y1(us)y2=41.79+26.01*x2(uS)8051定时定时/计数器计数器80518051单片机内部有单片机内部有2 2个个161
33、6位可编程的定时位可编程的定时计数器,即计数器,即T0T0和和T1(8052T1(8052提供提供3 3个,这个,这第三个称为第三个称为T2)T2)。什么是内部定时、外部计数?什么是内部定时、外部计数?80518051计数器的计数方式?递增、溢出计数器的计数方式?递增、溢出8051定时定时/计数器计数器定时器定时器/ /计数器结构框图计数器结构框图内部定时:输入的时钟脉冲由晶振的输出经内部定时:输入的时钟脉冲由晶振的输出经1212分频后得到;分频后得到;外部计数:接相应的外部输入引脚外部计数:接相应的外部输入引脚T0(P3.4)T0(P3.4)或或T1(P3.5)T1(P3.5)。在这种。在这
34、种情况下,当检测到输入引脚上的下降沿(电平由高跳变到低)时,情况下,当检测到输入引脚上的下降沿(电平由高跳变到低)时,计数器就加计数器就加1 1。8051定时定时/ /计数器工作机理计数器工作机理定时器:对机器周期计数,即定时器:对机器周期计数,即n12/foscn12/fosc计数器:对计数器:对T0T0引脚上的脉冲计数引脚上的脉冲计数定义定时器(定义定时器(T0T0)工作方式:)工作方式:1313位、位、 1616位、位、8 8位位设置设置T0T0定时初使值,若为定时初使值,若为1616位定时方式,则定时初值可为位定时方式,则定时初值可为0 0(定时最大)(定时最大)6553565535(
35、定时最小)。举(定时最小)。举n=50000,n=50000,则计数初值应为则计数初值应为65536-65536-50000=15536=0x3CB0,50000=15536=0x3CB0,需对需对TH0TH0、TL0TL0赋计数初值:赋计数初值:TH0=0x3C;TL0=0xB0;TH0=0x3C;TL0=0xB0;TH0=(65536-50000)/256; TL0= (65536-50000)%256;TH0=(65536-50000)/256; TL0= (65536-50000)%256;8051定时定时/ /计数器工作机理计数器工作机理手工启动定时器(手工启动定时器(TR0=1TR
36、0=1)后,)后,T0T0开始对机器周期计数(硬件对开始对机器周期计数(硬件对TH0TH0、TL0TL0构成的构成的1616位计数器位计数器递增递增计数);当计至计数);当计至TH0=0xffTH0=0xff,TL0=0xffTL0=0xff后,后,再计一次则定时器产生溢出(溢出标志再计一次则定时器产生溢出(溢出标志TF0=1TF0=1):):此时此时若若T0T0中断允许(使能中断允许(使能ET0=1ET0=1,EA=1EA=1),则),则CPUCPU立即停止当前程序,立即停止当前程序,跳转到跳转到T0T0对应的中断入口(对应的中断入口(ROMROM保留地址保留地址0x000B0x000B)执
37、行中断服务)执行中断服务程序(中断服务程序后程序(中断服务程序后CPUCPU自动对溢出标志清零:自动对溢出标志清零:TF0=0TF0=0),待),待T0T0中断服务程序执行完毕后再回原执行程序处;中断服务程序执行完毕后再回原执行程序处;void TIMER0_ISR(void) interrupt 1 void TIMER0_ISR(void) interrupt 1 / /定时器定时器0 0中断服务程序中断服务程序 若若T0T0中断未允许,则程序不能跳转到中断未允许,则程序不能跳转到T0T0中断入口,不执行中断服中断入口,不执行中断服务程序(中断标志此时务程序(中断标志此时TF0TF0不能自
38、动清不能自动清0 0)。)。8051定时/ /计数器计数器工作机理机理8051定时定时/ /计数器机理计数器机理进入定时器中断服务程序后,必须重新对进入定时器中断服务程序后,必须重新对TH0TH0、TL0TL0赋初值(之前硬件赋初值(之前硬件已把已把TH0TH0、TL0TL0修改了):修改了):void TIMER0_ISR(void)interrupt 1void TIMER0_ISR(void)interrupt 1 TH0=(65536-COUNT)/256;TH0=(65536-COUNT)/256;TL0=(65536-COUNT)%256;TL0=(65536-COUNT)%256
39、;/ void TIMER0_ISR(void)interrupt 1void TIMER0_ISR(void)interrupt 1 / TH0=(65536-COUNT)/256;TH0=(65536-COUNT)/256;TL0=(65536-COUNT)%256;TL0=(65536-COUNT)%256; 问题:以上两种赋初值方式哪种更好?问题:以上两种赋初值方式哪种更好?8051定时定时/ /计数器中断方式编程计数器中断方式编程#define COUNT 50000#define COUNT 50000void main(void)void main(void) TMOD=0x0
40、TMOD=0x0; /定时定时/ /计数器方式定义计数器方式定义 TH0= (65536-COUNT)/256;TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / TL0= (65536-COUNT)%256; /定时定时/ /计数器赋初值计数器赋初值 ET0=1; EA=1; /ET0=1; EA=1; /定时器定时器0 0中断允许中断允许 TR0=1; /TR0=1; /定时器定时器0 0定时开始定时开始 while(1); /while(1); /等待定时等待定时/ /计数器中断溢出计数器中断溢出(TF0)(TF0) void TIMER0
41、_ISR(void) interrupt 1 using 1void TIMER0_ISR(void) interrupt 1 using 1 / /进入中断服务程序后,进入中断服务程序后,CPUCPU自动清自动清TF0TF0溢出标志位溢出标志位 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /重新赋计数值重新赋计数值 /中断服务程序中断服务程序 8051定时定时/ /计数器查询方式编程计数器查询方式编程/中断方式中断方式#define COUNT
42、 50000#define COUNT 50000void TIMER0_ISR(void) interrupt 1void TIMER0_ISR(void) interrupt 1 / /进入后,进入后,CPUCPU自动清自动清TF0TF0标志标志 TH0= (65536-COUNT)/256; TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; / / void main(void)void main(void) TMOD=0x0 TMOD=0x0; TH0= (65536-COUNT)/256;T
43、H0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; ET0=1; EA=1; ET0=1; EA=1; TR0=1; TR0=1; while(1) ; while(1) ; /查询方式查询方式#define COUNT 50000#define COUNT 50000/*/*void TIMER0_ISR(void) interrupt 1void TIMER0_ISR(void) interrupt 1 / /进入后,进入后,CPUCPU自动清自动清TF0TF0标志标志 TH0= (65536-COU
44、NT)/256; TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; / / */*/void main(void)void main(void) TMOD=0x0 TMOD=0x0; TH0= (65536-COUNT)/256;TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; /ET0=1; EA=1; ET0=1; EA=1; TR0=1; TR0=1; while(1) while(1) /添加查询语句
45、添加查询语句; 8051定时定时/ /计数器查询方式编程计数器查询方式编程/查询方式查询方式#define COUNT 50000#define COUNT 50000void main(void)void main(void) TMOD=0x0 TMOD=0x0; TH0= (65536-COUNT)/256;TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; /ET0=1; EA=1; ET0=1; EA=1; TR0=1; TR0=1; while(1)while(1) /定时定时/ /计数器查询
46、方式计数器查询方式1 1if(TF0= =1)if(TF0= =1) TF0=0; /TF0=0; /手工清溢出标志手工清溢出标志 TH0= (65536-COUNT)/256;TH0= (65536-COUNT)/256;TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; / while(1)while(1) /定时定时/ /计数器查询方式计数器查询方式2 2while(!TF0); /while(!TF0); /定时等待定时等待TF0=0; /TF0=0; /手工清溢出标志手工清溢出标志TH0= (65536-COUNT)/256;TH0= (6
47、5536-COUNT)/256;TL0= (65536-COUNT)%256; TL0= (65536-COUNT)%256; / 8051定时器工作原理将定时将定时/ /计数初使值载入计数初使值载入TH0TH0,TL0TL0启动定时启动定时/ /计数器计数器 TR0=1TR0=1定时定时/ /计数器溢出计数器溢出CPUCPU自动置位溢出标志自动置位溢出标志TF0TF08051 内部定时示例例例1 1:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引引脚上输出周期为脚上输出周期为2ms2ms的方波。的方波。分析:分析:用用T0T0实现,采用中断方式实
48、现,采用中断方式机器周期:机器周期:T=1usT=1us计数值:每隔计数值:每隔1ms1ms进入一次进入一次T0T0中断,中断服务程序对中断,中断服务程序对P1_0P1_0取反。因此计数值取反。因此计数值n=1ms/1us=1000n=1ms/1us=1000次次TH0=(65536-1000)/256;TH0=(65536-1000)/256;TL0=(65536-1000)%256;TL0=(65536-1000)%256;8051 内部定时示例例例1 1:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引脚上输出周期为引脚上输出周期为2ms2ms
49、的方波。的方波。程序基本框架程序基本框架#includereg51.hsbitP1_0=P10;voidTIMER0_ISR(void)interrupt1voidmain(void)while(1);8051 内部定时示例例例1 1:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引引脚上输出周期为脚上输出周期为2ms2ms的方波。的方波。定时器主函数初使化定时器主函数初使化TMODTMOD方式定义(方式定义(T0T0、1616位内部定时方式)位内部定时方式)确定计数初值确定计数初值TH0TH0、TL0TL0T0T0中断使能中断使能T0T0启动启动等
50、待等待T0T0定时中断定时中断voidmain(void)TMOD=0x?;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;EA=1;TR0=1;while(1);8051 内部定时示例例例1 1:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引引脚上输出周期为脚上输出周期为2ms2ms的方波。的方波。定时器中断服务程序定时器中断服务程序重新赋计数初值重新赋计数初值TH0TH0、TL0TL0对对P1_0P1_0取反取反voidTIMER0_ISR(void)interrupt1TH0=(65536-10
51、00)/256;TL0=(65536-1000)%256;P1_0=P1_0;8051 内部定时示例例例1 1:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引脚上输出周引脚上输出周期为期为2ms2ms的方波。参考程序见的方波。参考程序见P172P172#includereg51.hsbitP1_0=P10;voidTIMER0_ISR(void)interrupt1TH0=(65536-1000)/256;TL0=(65536-1000)%256;P1_0=P1_0;voidmain(void)TMOD=0x?;TH0=(65536-1000)/2
52、56;TL0=(65536-1000)%256;ET0=1;EA=1;TR0=1;while(1);如何用查询方式实现?如何用查询方式实现?8051 内部定时示例例例2 2:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引脚上输出周期为引脚上输出周期为2ms2ms,占空比为,占空比为7575的矩形波。在例的矩形波。在例1 1基础上应作何修改?基础上应作何修改?#includereg51.hsbitP1_0=P10;voidTIMER0_ISR(void)interrupt1TH0=(65536-1000)/256;TL0=(65536-1000)%2
53、56;P1_0=P1_0;voidmain(void)TMOD=0x?;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;EA=1;TR0=1;while(1);8051 内部定时示例例例2 2:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引脚上输出周期为引脚上输出周期为2ms2ms,占空比为,占空比为7575的矩形波。在例的矩形波。在例1 1基础上应作何修改?基础上应作何修改?#includereg51.hsbitP1_0=P10;unsignedchari=0;voidTIMER0_ISR(void
54、)interrupt1TH0=(65536-500)/256;TL0=(65536-500)%256;i+;if(i=3)P1_0=0;if(i=4)P1_0=1;i=0;voidmain(void)TMOD=0x?;TH0=(65536-500)/256;TL0=(65536-500)%256;ET0=1;EA=1;TR0=1;while(1);#includereg51.h“#defineCOUNT500sbitP1_0=P10;unsignedchari=0;voidTIMER0_ISR(void)interrupt1TH0=(65536-COUNT)/256;TL0=(65536-CO
55、UNT)%256;i+;if(i=3)P1_0=0;if(i=4)P1_0=1;i=0;voidmain(void)TMOD=0x?;TH0=(65536-COUNT)/256;TL0=(65536-COUNT)%256;ET0=1;EA=1;TR0=1;while(1);8051 内部定时示例例例3 3:设单片机:设单片机fosc=12MHzfosc=12MHz,要求在,要求在P1.0P1.0引脚上输出周期为引脚上输出周期为2S2S的的方波。在例方波。在例1 1基础上应作何修改?基础上应作何修改?#includereg51.hsbitP1_0=P10;voidTIMER0_ISR(void)
56、interrupt1TH0=(65536-1000)/256;TL0=(65536-1000)%256;P1_0=P1_0;voidmain(void)TMOD=0x?;TH0=(65536-1000)/256;TL0=(65536-1000)%256;ET0=1;EA=1;TR0=1;while(1);8051 内部定时示例例4:循环点亮红、绿、黄灯,时间间隔为1秒。8051外部计数器应用示例外部计数器应用示例例例1:外部中断扩充:外部中断扩充T0(P3.4)VccvoidTIMER0_ISR(void)interrupt1TH0=0xff;TL0=0xff;/中断服务程序中断服务程序voi
57、dmain(void)TMOD=0x?;/T0外部计数方式外部计数方式TH0=0xff;TL0=0xff;ET0=1;EA=1;TR0=1;while(1);8051外部计数器应用示例外部计数器应用示例例2:高速公路车数统计与显示模块设计例3:简易频率计设计8051定时定时/计数器应用示例计数器应用示例对外部脉冲计数时要注意对外部脉冲消抖对外部脉冲计数时要注意对外部脉冲消抖T0(P3.4)Vcc按键时存在抖动,必须消抖:硬件、软件法按键时存在抖动,必须消抖:硬件、软件法8051定时定时/计数器应用示例计数器应用示例硬件消抖(采用基本硬件消抖(采用基本RSRS触发器)触发器)8051定时定时/计
58、数器应用示例计数器应用示例软件消抖(延时采样)软件消抖(延时采样)T0(P3.4)Vccvoid TIMER0_ISR(void) interrupt 1void TIMER0_ISR(void) interrupt 1 delay(100);delay(100); if(P3_4= =1) return; /* if(P3_4= =1) return; /*判别是否为有效判别是否为有效T0T0中断,以抗干扰中断,以抗干扰* */ / /* /*中断服务程序中断服务程序* */ / 8051定时定时/计数器计数器定时计数器有四种工作方式。其工作方式由两个定时计数器有四种工作方式。其工作方式由两
59、个SFRSFR决定决定定时方式寄存器:定时方式寄存器:TMODTMOD定时控制器:定时控制器:TCONTCONSFRSFRD7D7D6D6D5D5D4D4D3D3D2D2D1D1D0D0TMODTMODGATEGATEC/T#C/T#M1M1M0M0GATEGATEC/T#C/T#M1M1M0M0TCONTCONTF1TF1TR1TR1TF0TF0TR0TR0IE1IE1IT1IT1IE0IE0IT0IT08051定时定时/计数器计数器TMODTMOD:定时器方式寄存器:定时器方式寄存器SFRSFRD7D7D6D6D5D5D4D4D3D3D2D2D1D1D0D0TMODTMODGATEGATE
60、C/T#C/T#M1M1M0M0GATEGATEC/T#C/T#M1M1M0M0T1T1工作方式工作方式T0T0工作方式工作方式8051定时定时/计数器计数器TMODTMOD:定时器方式寄存器:定时器方式寄存器GATEGATE:门控信号:门控信号1 1:L LINT#*TRINT#*TR, C/TC/T启动受双重控制启动受双重控制0 0:L L=1, C/T=1, C/T的启动仅受的启动仅受TR0TR0或或TR1TR1控制,与控制,与INTINT无关无关C CT#T#:计数器、定时器选择位:计数器、定时器选择位 1 1:计数器(对:计数器(对T0T0:P3.4P3.4、T1T1:P3.5P3.
61、5外部脉冲计数)外部脉冲计数) 0 0:定时器(对内部机器周期计数):定时器(对内部机器周期计数)M1M1、M0M0:工作方式选择位:工作方式选择位8051定时定时/计数器计数器M1M1和和M0M0:工作方式选择位:工作方式选择位定时计数器工作方式定时计数器工作方式M1M1M0M0方式方式功功 能能0 00 00 01313位定时器位定时器/ /计数器,计数器,TLTL存低存低5 5位,位,THTH存高存高8 8位位0 01 11 11616位定时器位定时器/ /计数器计数器1 10 02 2常数自动载入的常数自动载入的8 8位定时器位定时器/ /计数器计数器1 11 13 3仅适用于仅适用于
62、T0T0,两个,两个8 8位定时器位定时器/ /计数器计数器8051定时定时/计数器计数器方式方式0 0 (M1M0M1M00000):):1313位位,TH,TH(高(高8 8位),位),TLTL(低(低5 5位)位), ,满计数值满计数值213213;C/T#=0 C/T#=0 内部定时;内部定时;C/T#=1 C/T#=1 外部计数。外部计数。C/T#C/T#启动后立即加启动后立即加1 1计数,当计数,当1313位计数满时,位计数满时,THTH向高向高位进位,此进位将使位进位,此进位将使TF=1TF=1(中断溢出标志),即产生(中断溢出标志),即产生中断请求。若中断请求。若C/TC/T允
63、许中断(允许中断(ET0ET0、ET1=1ET1=1、EA=1EA=1),),则响应中断,执行中断服务程序。当则响应中断,执行中断服务程序。当CPUCPU转向中断服转向中断服务程序时,务程序时,TF=0(TF=0(自动清自动清0)0)8051定时定时/计数器计数器方式方式1 1(M1M0M1M00101):):1616位,由位,由THTH和和TLTL寄存器各提供寄存器各提供8 8位,位,满计数值为满计数值为216216。方式方式2 2(M1M0M1M01010):):8 8位可自动重载的位可自动重载的C/T#C/T#,满计数值为,满计数值为2828。在方式在方式0 0和方式和方式1 1中,当计
64、数满后,若要进行下一次定中,当计数满后,若要进行下一次定时计数,须用软件向时计数,须用软件向THTH和和TLTL重装预置计数初值。方重装预置计数初值。方式式2 2中中THTH和和TLTL被当作两个被当作两个8 8位计数器,计数过程中,位计数器,计数过程中,THTH寄存寄存8 8位初值并保持不变,由位初值并保持不变,由TLTL进行进行8 8位计数。计数溢位计数。计数溢出时,除产生溢出中断请求外,还自动将出时,除产生溢出中断请求外,还自动将THTH中初值重中初值重装到装到TLTL,即重装载。除此之外,方式,即重装载。除此之外,方式2 2也同方式也同方式0 0。方式方式3 3(略)(略)8051定时
65、定时/计数器计数器定时器计数器的初始化及其步骤定时器计数器的初始化及其步骤使用使用80518051的的T0T0、T1T1前,应对它进行编程初始化,主要是对前,应对它进行编程初始化,主要是对TCONTCON和和TMODTMOD编程;计算和装载计数初值(编程;计算和装载计数初值(THTH、TLTL)。)。一般完成以下几个步骤:一般完成以下几个步骤:TMODTMOD:确定:确定C/T#C/T#工作方式工作方式THTH、TLTL:计算计数初值,并装载:计算计数初值,并装载THTH、TLTLIEIE:中断方式时,需打开中断使能:中断方式时,需打开中断使能TCONTCON:启动定时器计数器(:启动定时器计
66、数器(TRlTRl、TR0TR0)8051定时定时/计数器计数器说明以下语句功能说明以下语句功能TMOD=0x10;TMOD=0x10;TMOD=(TMOD&0x0f)|0x10;TMOD=(TMOD&0x0f)|0x10;8051定时定时/计数器计数器定时器初值的计算定时器初值的计算在内部定时方式下,在内部定时方式下, T0T0、T1T1对内部机器周期计数,若对内部机器周期计数,若fosc=6MHzfosc=6MHz,一个机器周期为,一个机器周期为12/fosc=2us,12/fosc=2us,所以所以方式方式0 130 13位定时器最大定时间隔位定时器最大定时间隔=2132us=16.38
67、4ms=2132us=16.384ms方式方式1 161 16位定时器最大定时间隔位定时器最大定时间隔=2162us=131.072ms=2162us=131.072ms方式方式2 82 8位定时器最大定时间隔位定时器最大定时间隔 =28 2us=512us=28 2us=512us例:若使例:若使T0T0、T1T1工作在方式工作在方式1 1,要求定时,要求定时1ms1ms,求计数初值。设计,求计数初值。设计数初值为数初值为x x,则有:,则有: (216(216x)2us=1000usx)2us=1000us x=216 x=216500=0FEOCH500=0FEOCH 因此,因此,THT
68、H,TLTL可置可置5005008051定时定时/计数器计数器定时计数器的应用实例定时计数器的应用实例例例1 1 :设:设fosc=6MHzfosc=6MHz,要求在,要求在P1.0P1.0脚上输出周期为脚上输出周期为2ms2ms的方波。的方波。解:采用定时器解:采用定时器T0T0的方式的方式1 1编程编程要求定时间隔要求定时间隔1ms1ms,每次时间到,每次时间到P1.0P1.0取反。机器周期取反。机器周期=12=12fosc=2usfosc=2us计数次数计数次数n=1000usn=1000us2us2us500500由于计数器递增计数,为得到由于计数器递增计数,为得到500500个计数之
69、后的定时器溢出,必须给个计数之后的定时器溢出,必须给定时器置初值定时器置初值6553665536500500。CPUP1.08051定时定时/计数器计数器用查询方式在用查询方式在P1.0P1.0引脚上产生周期为引脚上产生周期为2ms2ms的方波的方波#include #include sbit P1_0=P10;sbit P1_0=P10;void main(void)void main(void) TMOD=0x01; /* TMOD=0x01; /*定时器定时器0 0方式方式1 */1 */ TR0=1; /* TR0=1; /*启动启动T0 */T0 */ for(;) for(;) T
70、H0= TH0= (655366553610001000)/256; /*/256; /*装载计数初值装载计数初值* */ / TL0= TL0= (655366553610001000)256; 256; do while(!TF0); /* do while(!TF0); /*查询等待查询等待TF0TF0置位置位* */ / P1_0=!P1_0; /* P1_0=!P1_0; /*定时时间到定时时间到P1.0P1.0反相反相 * */ / TF0=0; /* TF0=0; /*软件清软件清TF0 */TF0 */ 8051定时定时/计数器计数器用中断方式在用中断方式在P1.0P1.0引脚
71、上产生周期为引脚上产生周期为2ms2ms的方波的方波#include #include sbit P1_0=P10;sbit P1_0=P10;void T0(void) interrupt 1 using 1 /*T0void T0(void) interrupt 1 using 1 /*T0中断服务程序入口中断服务程序入口* */ / P1_0=!P1_0; /*P1.0 P1_0=!P1_0; /*P1.0取反取反* */ / TH0= TH0= (6553665536500500)/256; /*/256; /*计数初值重载计数初值重载* */ / TL0= TL0=(65536655
72、36500500)256; 256; void main(void)void main(void) TMOD=0x01; /*T TMOD=0x01; /*TC0C0工作在定时器方式工作在定时器方式l*/l*/ TH0= TH0=(6553665536500500)/256; /*/256; /*计数初值计数初值* */ / TL0= TL0=(6553665536500500)256; 256; ET0=1; EA=1; /* ET0=1; EA=1; /*中断使能中断使能* */ / TR0=1; /* TR0=1; /*启动启动T0*/T0*/ while(1); while(1); 8
73、051定时定时/计数器计数器中断扩充:内部定时器中断扩充:内部定时器T0T0用作外中断用作外中断void T0 (void) interrupt 1 void T0 (void) interrupt 1 /* /*中断服务程序中断服务程序* */ /void main (void) void main (void) TMOD = 0x66; /*T0 TMOD = 0x66; /*T0用作计数器,采用方式用作计数器,采用方式2 2具有自动装载功能具有自动装载功能* */ / ET0 = 1; EA = 1; ET0 = 1; EA = 1; TH0=0xFF; TL0=0xFF; TH0=0x
74、FF; TL0=0xFF; TR0 = 1; TR0 = 1; while (1) while (1);define button Toggle T0 (P3.4) , PORT3 = 0x10define button Toggle T0 (P3.4) , PORT3 = 0x108.3 串行口PC机机RS232串口串口 RS232RS232串口是每台计算机的必要配备,通常串口是每台计算机的必要配备,通常PCPC含有含有COM1COM1、COM2COM2。一般计算机一般计算机COM1COM1:9 Pin9 PinCOM2COM2:25 Pin25 Pin新一代的计算机均为新一代的计算机均为9
75、 Pin9 Pin。RS232RS232通讯端口。在计算机上的通讯端口。在计算机上的RS232RS232均是公头,即使是均是公头,即使是25 25 PinPin也是公头,注意与也是公头,注意与 打印机端口(打印机端口(25 Pin25 Pin)区分。)区分。PC机串口地址标准串口地址串口号串口地址中断号COM13F82COM22F81COM33E84COM42E83RS232串口RS232串口引脚功能脚脚 位位(PinPin)简简 写写功功 能能1 1CDCD载波侦测载波侦测(Carrier Detect)(Carrier Detect)2 2RXDRXD接收字符接收字符(Receive)(R
76、eceive)3 3TXDTXD传送字符传送字符(Transmit)(Transmit)4 4DTRDTR数据端备妥数据端备妥(Data Terminal Ready)(Data Terminal Ready)5 5GNDGND地线地线(Ground)(Ground)6 6DSRDSR数据备妥数据备妥(Data Set Ready)(Data Set Ready)7 7RTSRTS要求传送要求传送(Request To Send)(Request To Send)8 8CTSCTS清除以传送清除以传送(C1ear To Send)(C1ear To Send)9 9RIRI响铃侦测响铃侦测(R
77、ing Indicator)(Ring Indicator)RS232(DB9与DB25对比)9 Pin与25 Pin的关系80518051串口串口80518051有一个可编程的全双工串口。用有一个可编程的全双工串口。用于串行通信的于串行通信的UART(UART(通用异步接收通用异步接收发送发送) ) 。TXDTXD端发送数据;端发送数据;RXDRXD端接收数据。端接收数据。串口可实现短距离(串口可实现短距离(10m10m)机间通信。)机间通信。 RS232CRS232C和和PCPC机进行通信时可使用驱动机进行通信时可使用驱动芯片芯片(MAX232) (MAX232) 。(P3.0)RXD(P
78、3.1)TXD805180518051串口串口对应有两个缓冲器对应有两个缓冲器SBUFSBUF。(共用一个地址)。(共用一个地址)接收缓冲器。接收缓冲器。接收:b=SBUF;发送缓冲器;发送缓冲器;发送:SBUF=a;8051串口8051有接收结束标志(RI:receive interrupt)和发送结束标志(TI:transfer interrupt);该标志为高电平有效,且必须手工清0(RI=0、TI=0)。串口的编程可采用中断方式或查询方式采用查询方式编程时,可设置最长等待时间,以确保其它程序正常运行8051串口中断程序格式:void UART_ISR(void) interrupt 4
79、串口通信三线制,交叉线串口通信分类同步( synchronous )异步( asynchronous )串口通信格式(异步)111位起始位(位起始位(0)9位数据位(低位在前)位数据位(低位在前)1位停止位(位停止位(1)非传输时保持非传输时保持“1”如图发送数据为:如图发送数据为:0xCB串口通信格式TTL电平(有效距离电平(有效距离1m)RS232电平(有效距离电平(有效距离10m)RS485电平(有效距离电平(有效距离5km)RS232逻辑电平的定义1:15V3V0:3V15V与与TTL、CMOS逻辑有区别,因此必须对其进行电平转换逻辑有区别,因此必须对其进行电平转换TTL-RS232电
80、平比较(0x35)TTLRS232电平转换TTLRS232电平转换电路串口通信方式串口通信方式串口通信方式串口通信方式点对点点对点PCPC机与机与MCUMCU(PCPC与智能仪表间的通信)与智能仪表间的通信)MCUMCU与与MCUMCU点对多:多机通信点对多:多机通信串口通信模式上位机主动发发单字节指令发多字节指令定长字节指令:起始字节:0xAA控制数据地址:0x01控制数据和校验:控制数据的和结束字节:0x55不定长字节指令结束标志chr$(13)+chr$(10)串口通信模式-单字节发送单字节通信,上位机主动上位机程序串口通信工具:scomm32自己编程:控件实现(VB)API函数实现(V
81、C)下位机程序接收:中断方式发送:查询方式PC机串口通信实现两种方式实现控件MSCOMM32.OCX应用程序接口函数:API(OpenFile()PC机串口通信(MSCOMM32.OCX)首先为工程添加MSCOMM32.ocx等控件添加如下代码:包括串口初始化,发送、接收等操作Private Sub Form_Load() If MSComm1.PortOpen Then MSComm1.PortOpen = False 关闭串口 MSComm1.CommPort = 1 设置串口1 MSComm1.Settings = 9600,N,8,1 设置串口波特率 MSComm1.InputMode
82、 = comInputModeBinary 设置串口通信模式-二进制模式 MSComm1.InputLen = 1 设置每次从输入缓冲区取出的字节数 If MSComm1.PortOpen = False Then MSComm1.PortOpen = True 打开串口End SubPC机串口通信(MSCOMM32.OCX)Public Sub Command1_Click() Dim ao(0 To 0) As Byte Dim av As Variant Dim ai(1 To 4) As Byte 存放数据的窗体级变量,因为得到的数据尚需进一步处理 Dim tt As Long Dim
83、 count As Integer MSComm1.InBufferCount = 0 清输入/输出缓冲区 MSComm1.OutBufferCount = 0 ao(0) = int(val(Text1.text) 取出待发送的数据 MSComm1.Output = ao() 串口发送数据 tt = GetTickCount 利用API函数取得系统时间 Do 等待输入缓冲区数据=1或延时3秒钟结束 Loop Until MSComm1.InBufferCount = 1 Or GetTickCount - tt 3000 If MSComm1.InBufferCount =1 Then 如果
84、输入缓冲区有1字节的数据,则取出数据并处理 av = MSComm1.Input 从输入缓冲区取出数据 ai(1) = av(0) Text2.Text = ai(1) Exit Sub Else MsgBox “请检查” + “电源、串口连线、波特率设置后重试!”, vbOKOnly + vbCritical, “串口错误:” 串口通信失败提示信息 End If End SubPC机串口通信(MSCOMM32.OCX)新建标准模块,在标准模块中添加Declare Function GetTickCount Lib kernel32 () As Long串口通信注意点为了确保发送的数据都能被准
85、确接收:格式统一:统一单字节发送与接收的格式(起始位数据位停止位)多字节发送时,应先制定双方的通信协议。波特率统一:(最大:115200bps)统一发送与接收的速率(波特率(bps:bit per second):每秒钟发送的位数);波特率可用内部时钟T1或T2(8052)获得;典型波特率:9600bps。通信时应设置最长等待时间8051串口中断机理执行串口发送指令执行串口发送指令SBUF=aSBUF=a;通过;通过TXDTXD口发送串行数据,发送结束后口发送串行数据,发送结束后CPUCPU自动产生发送结束标志(自动产生发送结束标志(TI=1TI=1);此时若串行中断使能();此时若串行中断使
86、能(ES=1ES=1,EA=1EA=1) ,则程序立即停止当前程序,跳转置中断号为,则程序立即停止当前程序,跳转置中断号为4 4的串行口中的串行口中断入口地址(断入口地址(0x00230x0023),执行中断服务程序),执行中断服务程序void UART_ISR(void) void UART_ISR(void) interrupt 4 ,CPUinterrupt 4 ,CPU不具有自动清零功能;不具有自动清零功能;同样,若串口在同样,若串口在RXDRXD引脚接收到数据,硬件自动产生接收结束标志引脚接收到数据,硬件自动产生接收结束标志(RI=1RI=1),若此时若串行中断使能(),若此时若串行
87、中断使能(ES=1ES=1,EA=1EA=1),则程序立即停),则程序立即停止当前程序,跳转置中断号为止当前程序,跳转置中断号为4 4的串行口中断入口地址(的串行口中断入口地址(0x00230x0023),),执行中断服务程序执行中断服务程序void UART_ISR(void) interrupt 4 ,CPUvoid UART_ISR(void) interrupt 4 ,CPU不具有不具有自动清零功能,可通过自动清零功能,可通过b=SBUFb=SBUF;指令取出暂存在数据缓冲区内的数;指令取出暂存在数据缓冲区内的数据。据。为什么串口中断不具有硬件自动清中断标志功能?为什么串口中断不具有硬
88、件自动清中断标志功能?因为接收与发送结束都能进入同一中断,因此在不具有自动清标志因为接收与发送结束都能进入同一中断,因此在不具有自动清标志功能,需加判断标志语句。功能,需加判断标志语句。 8051串口中断机理串口中断使能:串口中断使能:ESES、EAEA串行发送与接收结束会进入同一中断服务程序串行发送与接收结束会进入同一中断服务程序void UART(void) interrupt 4 void UART(void) interrupt 4 因此因此, ,若采用中断方式,在中断服务程序中必须先判别中断是若采用中断方式,在中断服务程序中必须先判别中断是发送还是接收中断,以便进一步处理。(发送还是
89、接收中断,以便进一步处理。(SBUF=a;bSBUF=a;bSBUF;SBUF;)8051串口通信串口初始化数据格式设置SCON波特率设置TMODTH1、TL1PCONTR1ES、EA串口发送与接收SBUFRI、TI8051串口初始化(格式设置)串口初始化(格式设置)SCONSCON:串行口控制寄存器:串行口控制寄存器SM0SM0SM1SM1SM2SM2RENRENTB8TB8RB8RB8TITIRIRISM0SM0SM1SM1方式方式说说 明明波特率(波特率(bpsbps)0 00 00 0同步移位寄存器同步移位寄存器foscfosc12120 01 11 11010位异步收发位异步收发Ba
90、ud=2SMOD(T1Baud=2SMOD(T1溢出率溢出率/32)/32)1 10 02 21111位异步收发位异步收发Baud=2SMODfoscBaud=2SMODfosc64641 11 13 31111位异步收发位异步收发Baud=2SMOD(T1Baud=2SMOD(T1溢出率溢出率/32)/32)波特率(波特率(bps)bps):每秒钟传输的位数。方式:每秒钟传输的位数。方式1 1、3 3必须借助于必须借助于T1T11010位通信:位通信:1 1位起始位(位起始位(0 0)8 8位数据位位数据位1 1位停止位(位停止位(1 1)T1T1溢出率溢出率1 / T11 / T1定时时间
91、定时时间8051串口初始化(格式设置)串口初始化(格式设置)SM2SM2:多机通信使能控制位:多机通信使能控制位( (方式方式2 2,3)3);RENREN(Receive EnableReceive Enable)串行接收允许位;)串行接收允许位;TB8TB8(Transmit Bit 8Transmit Bit 8)在方式)在方式2 2、3 3中中, ,将被发送数据的将被发送数据的第第9 9位位 (奇偶校验位等);(奇偶校验位等);RB8RB8(Receive Bit 8Receive Bit 8第第9 9位)位) 在方式在方式0 0中中, ,该位不起作用;该位不起作用;在方式在方式1 1
92、中该位为接收数据的停止位;中该位为接收数据的停止位;在方式在方式2 2、3 3中为接收数据的第中为接收数据的第9 9位。位。TITI、RIRI发送发送/ /接收结束标志位,接收结束标志位,软件(手工)软件(手工)清零;清零;SM0SM0SM1SM1SM2SM2RENRENTB8TB8RB8RB8TITIRIRI8051串口工作方式串口工作方式方式0: 移位寄存器输入输出方式。数据通过RXD输入出,TXD输出移位脉冲CP。该方式下,收发数据为8位,低位在前。波特率固定为fosc12发送:SBUF=a; (发送条件:TI = 0,8位输出结束时TI=1)接收:b=SBUF; (接收条件: REN=
93、1&RI= =0,结束时RI1)发送与接收结束标志必须手工清0:TI0;RI0;方式0 主要用于IO扩展的场合。(74LS164)8051串口工作方式串口工作方式方式1:10位异步方式。10位1位起始位(0)+8位数据位+1位停止位(1)。其中起始位和停止位在发送时自动插入。发送:SBUFa;发送条件:TI0,发送完TI1。接收:bSBUF;接收条件:REN=l&RI=0&(SM2=0|RB8=1)10位通信方式下,若接收有效,将接收到的8位数据装入SBUF中,并将停止位(1)装入RB8中;发送与接收结束标志必须手工清0:TI0;RI0;方式1的波特率可变,计算公式:Baud=2SMOD(T1
94、的溢出率)32SMOD为PCON的最高位;T1的溢出率:1/T1定时时间,T1 方式可为 0、1、28051串口工作方式串口工作方式方式2、3:相同:都是11位异步方式。11位1位起始位(0)+9位数据位+1位停止位(1)。其中第9位数据放在TB8、RB8中,发送前可通过软件对TB8赋值(奇偶校验位等)。它们的操作过程完全一样。不同:波特率可变否方式2 Baud=2SMODfosc64方式3 Baud=2SMOD(T1溢出率/32) ( 同方式1)发送:SBUFa;发送条件:TI0,第9位数据(TB8)输出之后,置位TI1。接收:bSBUF;接收前提:REN=1&RI=0&(SM2=0|RB8
95、=1);则将已接收的数据装入SBUF和RB8,并置位RI;8051第9位可作为数据的奇偶校验位、多机通信中的地址、数据标志位等。8051串口初始化(波特率设置)串口初始化(波特率设置)PCON(电源控制寄存器)SMOD:波特率增倍位方式1、3 Baud=2SMOD(T1溢出率/32)方式2 Baud=2SMODfosc64 PCONSMODSMOD- - - - - - - -8051串口初始化(波特率设置)串口初始化(波特率设置)串口波特率计算串口波特率计算方式方式2:Baud=2SMODfosc64(固定)(固定)当当SMOD=0时:时:Baud=fsoc/64当当SMOD=1时:时:Ba
96、ud=fsoc/32例:若例:若fosc=6MHz,SMOD=1,则则Baud6000000/32=187.5kbps若若fosc=12MHz,SMOD=0,则则Baud12000000/64=187.5kbps若若fosc=12MHz,SMOD=1,则则Baud12000000/32=375kbps串行口方式串行口方式2波特率波特率串口串口方式方式波特率波特率(bps)fosc6MHzfosc12MHzfosc11.0592MHzSMODTMODTH1SMODTMODTH1SMODTMODTH1方式方式2375K1187.5K108051串口初始化(波特率设置)串口初始化(波特率设置)方式方
97、式1、3波特率计算波特率计算方式方式1、3:Baud=2SMOD(T1溢出率溢出率/32)若定时时间常数为若定时时间常数为n,则,则T1定时时间定时时间n(12/fosc)T1溢出率溢出率1/T1定时时间定时时间fosc/(12*n)Baud2SMODfosc/(12*n*32)2SMODfosc/(384*n)当当SMOD=0时:时:Baud=fsoc/(384*n)当当SMOD=1时:时:Baud=fsoc/(192*n)例:若例:若fosc=11.0592MHz,SMOD=0,n=3(TH1=FDH)则则Baud11.0592106/(384*3)=9600bps例:若例:若fosc=1
98、2MHz,SMOD=1,n=13(TH1=F3H)则则Baud12106/(192*13)=4800bps方式方式1、3波特率波特率串口串口方式方式波特波特率率fosc6MHzfosc12MHzfosc11.0592MHzSMODTMODTH1SMODTMODTH1SMODTMODTH1方式方式2、39.6K020FDH4.8K120F3H020FAH8051串口初始化(波特率设置)串口初始化(波特率设置)串口串口方式方式波特率波特率fosc6MHzfosc12MHzfosc11.0592MHzSMODTMODTH1SMODTMODTH1SMODTMODTH1方式方式01MHz方式方式2375
99、K1187.5K10方式方式1或或方式方式362.5K120FFH19.2K120FDH9.6K020FDH4.8K120F3H020FAH2.4K120F3H020F3H020F4H1.2K120E6H020E6H020E8H600120CCH020CCH020D0H300020CCH02098H020A0H137.51201DH0201DH0202EH11002072H010FEEB010FEFF串口初使化fosc=11.0582Mhz,11位异步通信方式,波特率9600bps,试写出串口初使化语句。Baud=2SMOD(T1溢出率溢出率/32)令令SMOD=0,则,则9600=1/(n*
100、12/fosc*32)所以所以n=3T1:采用方式:采用方式2(8位自动载入)位自动载入)voidsbuf_init(void)SCON=0xd0;/11010000PCON=0x00;TMOD=(TMOD&0x0f)|0x20;TH1=0xfd;TL1=0xfd;TR1=1;8051串口数据发送与接收发送数据SBUF=a; /发送数据while(TI=0); /等待发送(结束标志)TI=0; /手工清发送标志接收数据while(RI=0); /等待接收(结束标志)RI=0; /手工清接收标志b=SBUF; /接收数据8051串口通信框架(中断方式)void UART_ISR(void) in
101、terrupt 4unsigned char a;if(RI=1) /若接收到数据a=SBUF; /保存接收的数据RI=0; /手工清接收结束标志SBUF=a+1; /串口发送回复数据while(TI=0); /等待发送结束TI=0; /手工清发送标志void main(void)init_sbuf(); /串口初使化ES=1; /串口中断使能EA=1;while(1); /等待串口中断作业为什么8051单片机常用11.0592MHz的晶振?串口通信时应注意些什么问题?8051单片机串口通信有几种方式?各种方式有何异同?8051串口通信实验8051单片机发送实验单片机连续发送0x35,用示波器
102、观察AT89S51 TXD(P3.1)和MAX232 T1OUT(MAX232第14脚)信号,画出波形分析并比较两波形;8051单片机接收实验PC机借助sscom32发送任意数据(a),单片机接收后回复数据(a+1);PC机发送实验用VB自编串口发送程序以实现实验2。注:10位通信格式,9600bps如何设置最长等待时间?temp_time=TH0*256+TL0;while(RI=0)if(TH0*256+TL0)-temp_time=1000|(temp_time-TH0*256+TL0)=65536-1000)break; /等待接收(结束标志)RI=0; /手工清接收标志b=SBUF;
103、 /接收数据8051串口通信小结串口通信小结初始化步骤初始化步骤使用串口前,应对它进行初始化。使用串口前,应对它进行初始化。设置产生波特率的设置产生波特率的T1(TMOD、TH1、TL1、ET1、EA、TR1););串行口控制(串行口控制(SCON、PCON););中断控制(中断控制(ES、EA)。具体步骤如下:)。具体步骤如下:确定串行口控制编程确定串行口控制编程SCON;确定确定Tl工作方式编程工作方式编程TMOD寄存器;寄存器;计算计算T1初值装载初值装载THl、TLl;启动启动T1编程编程TCON中的中的TRl位;位;串行口在串行口在中断中断(查询方式除外)(查询方式除外)方式下,需开
104、方式下,需开CPU和源中断和源中断编程编程IE寄存器。(寄存器。(是否有必要使是否有必要使ET11?)8051串行口示例串行口示例1unsignedchardata110=M,C,S,-,5,1,0x0d,0x0a,0x00;voidmain()unsignedchari;sbuf_init();while(1)i=0;while(data1i!=0x00)SBUF=data1i;while(TI=0);TI=0;i+;8051串行口示例串行口示例28051与与PC机通信程序机通信程序(查询方式)(查询方式)unsignedcharcommunicate(unsignedcharc)switc
105、h(c)case0x41:proc1();return(0x42);break;case0x42:proc2();return(0x43);break;case0x43:proc3();return(0x44);break;default:;voidmain(void)while(1)while(RI=0);RI=0;a1=SBUF;/MCU接收数据接收数据b1=communicate(a1);/MCU处理数据处理数据SBUF=b1;while(TI=0);TI=0;/MCU发送数据发送数据8051点对点通信点对点通信80518051机间通信的机间通信的C C编程编程TXDTXDRXDRXD8
106、0518051T2inT2inR2outR2outT2outT2outR2inR2in11 1011 1010 910 97 87 88 78 7TXDTXDRXDRXD80518051T2inT2inR2outR2outT2outT2outR2inR2in10 1110 119 109 10MAX232AMAX232AMAX232AMAX232ASYSTEM1SYSTEM1SYSTEM2SYSTEM2双机通信也称点对点通信,可用于MCU和MCU间通信,也用于MCU与PC间通信。在较大规模的测控系统中,一般采用分布式控制。上位机进行管理。下位机完成各种各样的检测控制。8051点对点通信点对点通
107、信上位机实现:编辑、查询、统计、报表打印等管理功能下位机实现:控制、数据采集等检测控制功能8051点对点通信点对点通信通信双方的约定:发送机:通信双方的约定:发送机:SYSTEM1 SYSTEM1 ,接收机:,接收机:SYSTEM2 SYSTEM2 A A先送先送 “AAAA”信号,信号,B B收到后应答收到后应答“BBBB”,表示,表示B B同意接收。当同意接收。当A A收到收到“BBBB”后,开始发送数据,每发送一次求后,开始发送数据,每发送一次求“校验和校验和”,假,假定数据块长度为定数据块长度为1616个字节,数据缓冲区为个字节,数据缓冲区为bufbuf,数据块发送完后,数据块发送完后
108、马上发送马上发送“校验和校验和” B B接收数据并将其转贮到数据缓冲区接收数据并将其转贮到数据缓冲区bufbuf每接收到一个数据便每接收到一个数据便计算一次计算一次“校验和校验和”,当收齐一个数据块后,再接收,当收齐一个数据块后,再接收A A发来的校发来的校验和,并将它与验和,并将它与B B求出的校验和比较。求出的校验和比较。若两者相等,接收正确,若两者相等,接收正确,B B机回答机回答0x000x00;若两者不等,接收不正确,若两者不等,接收不正确,B B机回答机回答0xFF0xFF,请求重发。,请求重发。 A A收到收到0x000x00的回答后,结束发送。若收到的答复非零,则将数据的回答后
109、,结束发送。若收到的答复非零,则将数据再重发一次。双方波特率为再重发一次。双方波特率为9600bps9600bps(foscfosc11110592MHz0592MHz),8051点对点通信点对点通信串口通信初使化:串口通信初使化:波特率:波特率:1200bps 1200bps Baud=2SMOD(T1Baud=2SMOD(T1溢出率溢出率/32)/32)方式:方式:1010位异步传输方式位异步传输方式void sbuf_init(void)void sbuf_init(void) PCON=0x00; PCON=0x00; SCON=0x50; SCON=0x50; TMOD=(TMOD&
110、0x0f)|0x20; TMOD=(TMOD&0x0f)|0x20; TH1=0xfd; TH1=0xfd; TL1=0xfd; TL1=0xfd; TR1=1; TR1=1; 8051点对点通信点对点通信_发送发送void send(uchar idata *d)void send(uchar idata *d) uchar i; uchar i; do do SBUF=0xAA;while(TI=0);TI=0; SBUF=0xAA;while(TI=0);TI=0; while(RI=0);RI=0; while(RI=0);RI=0; while(SBUF!=0xBB); while(
111、SBUF!=0xBB); do do pf=0; pf=0; for(i=0;i16;i+) for(i=0;i16;i+) pf+=di; pf+=di; SBUF=di; while(TI=0); TI=0; SBUF=di; while(TI=0); TI=0; SBUF=pf;while(TI=0); TI=0; SBUF=pf;while(TI=0); TI=0; while(RI= =0); RI=0; while(RI= =0); RI=0; while(SBUF!=0); while(SBUF!=0); 设置设置bpsbps、启动、启动T1T1设置串口工作方式设置串口工作方式发
112、送请求发送请求“0xAA0xAA”B B允许发送?允许发送?指针初始化校验指针初始化校验和清零和清零发送字节数据并发送字节数据并求校验和求校验和数据已发送完?数据已发送完?发送校验和发送校验和B B接收正确?接收正确?返回返回NoNoNoNoNoNo8051点对点通信点对点通信_接收接收void receive(uchar idata *d)void receive(uchar idata *d) uchar i; uchar i; do while(RI= =0); RI=0; do while(RI= =0); RI=0; while(SBUF!=0xAA); while(SBUF!=0x
113、AA); SBUF=0xBB;while(TI= =0); TI=0; SBUF=0xBB;while(TI= =0); TI=0; while(1) while(1) pf=0; pf=0; for(i=0;i16;i+) for(i=0;i16;i+) while(RI=0); RI=0;di=SBUF; while(RI=0); RI=0;di=SBUF; pf+=di; pf+=di; while(RI= =0); RI=0; while(RI= =0); RI=0; if(SBUF= =pf) if(SBUF= =pf) SBUF=0x00; break; SBUF=0x00; br
114、eak; else else SBUF=0xFF;while(TI=0);TI=0;SBUF=0xFF;while(TI=0);TI=0; B B机接收数据机接收数据设置设置bpsbps、启动、启动T1T1设置传口工作方式设置传口工作方式等待等待A A机联络机联络发送应答信号发送应答信号“0xBB0xBB”A A机请求发送?机请求发送?指针初始化、校验和清零指针初始化、校验和清零接收字节数据并求校验和接收字节数据并求校验和A A、B B机校验和比较机校验和比较数据块收齐了吗?数据块收齐了吗?发出错误标志发出错误标志“0xFF0xFF”接收正确?接收正确?返回返回NoNoNoNoNoNoYesY
115、es8051点对点通信点对点通信主程序主程序main()main()#define TR 1 #define TR 1 void main(void)void main(void) sbuf_init(); sbuf_init(); if(TR= =0) send(buf); if(TR= =0) send(buf); else receive(buf); else receive(buf); 对于点对点通信双方,可编制含有初始化函数、发送函数、接收函对于点对点通信双方,可编制含有初始化函数、发送函数、接收函数的程序。在主函数中设置数的程序。在主函数中设置TRTR常量,根据常量的值决定使用发送
116、函常量,根据常量的值决定使用发送函数还是接收函数。这样点对点通信的双方都可运行同一程序。数还是接收函数。这样点对点通信的双方都可运行同一程序。 #define TR 1 /*#define TR 1 /*接收端接收端* */ /8051点对多通信(多机通信)点对多通信(多机通信)多机通信多机通信主从式结构:单片机多机系统常采用总线型主从式多机主从式结构:单片机多机系统常采用总线型主从式多机系统所谓主从式,即在数个单片机中,有一个是主机,系统所谓主从式,即在数个单片机中,有一个是主机,其余为从机,从机要服从主机的调度、支配。其余为从机,从机要服从主机的调度、支配。80518051单片单片机的串行
117、口方式机的串行口方式2 2、方式、方式3 3很适合这种主从式的通信结构。很适合这种主从式的通信结构。在多机系统中,通常采用在多机系统中,通常采用RS422RS422或或RS485RS485串行标准总线进串行标准总线进行数据传输。行数据传输。 8051多机通信多机通信置位所有从机的置位所有从机的SM2(SM2=1)SM2(SM2=1),使之处于监听地址状态。,使之处于监听地址状态。1 1:只有接收到第:只有接收到第9 9位位(RB8)(RB8)为为1 1,RIRI才置位。才置位。O O:接收到字符,:接收到字符,RIRI就置位就置位主机先发送一帧地址信息,其中主机先发送一帧地址信息,其中8 8位
118、地址,第位地址,第9 9位为地址数据信息的标志位,位为地址数据信息的标志位,1:1:该帧为地址信息该帧为地址信息, 0:, 0:该帧为数据信息。该帧为数据信息。 从机接收到地址帧后,从机接收到地址帧后,各自各自将接收到地址与本从机地址比较。将接收到地址与本从机地址比较。地址相符的从机,使地址相符的从机,使SM2SM20 0,以接收主机随后发来的所有信息;,以接收主机随后发来的所有信息;地址不符的从机,仍保持地址不符的从机,仍保持SM2SM21 1,对主机随后发来的数据不予理睬,直至发送新,对主机随后发来的数据不予理睬,直至发送新的地址帧;的地址帧; 当从机发送数据结束后,发送一帧校验和,并置第
119、当从机发送数据结束后,发送一帧校验和,并置第9 9位位(TB8)(TB8)为为1 1,作为从机数,作为从机数据传送结束标志。据传送结束标志。主机接收数据时先判断数据结束标志主机接收数据时先判断数据结束标志(RB8)(RB8)若若RB8RB80 0,则将数据保存到缓冲区,并准备接收下帧信息,则将数据保存到缓冲区,并准备接收下帧信息 若若RB8RB81 1,表示数据传送结束,并比较此帧校验和。,表示数据传送结束,并比较此帧校验和。若正确,则回送正确信号若正确,则回送正确信号0x000x00,此信号令该从机复位,此信号令该从机复位( (即重新等待地址帧即重新等待地址帧) )若校验和出错,则发送若校验
120、和出错,则发送0xFF0xFF,令该从机重发数据。,令该从机重发数据。8051多机通信多机通信若主机向从机发送数据,从机比较地址相符后相符的从机令SM2=0,同时把本站地址发回主机。作为应答之后才能收到主机发送来的数据。其它从机继续监听地址(SM2=1),无法收到数据。主机收到从机的应答地址后,确认地址是否相符。如果地址不符,发复位命令(FF并使TB81);如果地址相符,则TB8=0,开始发送数据。 从机收到复位命令(FFH)后回到监听地址状态(SM21)。串口取电经典电路两例串口取电经典电路两例RS485 通信RS485 通信-光隔离电路RS485 通信-光隔离电路串口复习串口编程初始化(格式、波特率)。波特率119200bps?发送、接收串口编程方式查询中断示波器使用(时间、峰峰值、零电平位置)