版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8051内部资源,常熟理工学院 物理与电子工程学院 2011.4,Chap8 8051内部资源,8.1 外部中断:INT0、INT1 8.2 定时/计数器:T0、T1 8.3 串行口:RXD、TXD,8.1 外部中断,8051外部中断,中断 中断源 中断优先级 中断嵌套,8051外部中断,中断:当CPU正处理某项事务时,若外界或内部发生紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。(堆栈) 中断源:向CPU提出中断请求的源称为中断源 外部跳变信号(下降延) 外部低电平等 (0),8051外部中断
2、,中断优先级:当几个中断源同时请求中断时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。 中断嵌套:当CPU正在处理一个优先级低的中断请求的时,如果发生另一个优先级比它高的中断请求,CPU能暂停当前处理的中断,转去处理优先级高的中断请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。,8051中断,8051单片机有 5个中断源 2个中断优先级(2级中断嵌套),优先级可通过编程实现 IE(中断允许寄存器):中断源的中断请求是否能得到响应,受IE的控制;
3、IP(中断优先级寄存器):各个中断源的优先级可由IP的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。,8051中断源,8051五个中断源 INT0中断(P3.2) T0中断 (P3.4) INT1中断(P3.3) T1中断 (P3.5) 串行中断(P3.0、P3.1),8051中断入口(ROM)地址和优先级,8051 INT0中断机理,当INT0引脚输入如下信号: 下降沿(IT0=1)或 低电平(IT0=0) CPU自动(硬件)产生中断标志(IE0=1),此时 若INT0中断允许(使能EX0=1,EA=1),则CPU立即停止当前程序,跳转到INT0对应的中
4、断入口(ROM保留地址0 x0003)执行中断服务程序(中断服务程序后CPU自动对中断标志清零:IE0=0),待INT0中断服务程序执行完毕后再回原执行程序处; 若若INT0中断未允许,则程序不能跳转到INT0中断入口,不执行中断服务程序(中断标志IE0不能自动清0)。 问提:中断标志IE0的产生与中断使能是否有关?,INT0中断方式执行流程,#include reg51.h unsigned char i=0; /*int0中断服务程序*/ void INT0_ISR(void) interrupt 0 delay(200); if((P3 /等待中断 ,INT0 查询方式,void mai
5、n(void) IT0=1; /EX0=1;EA=1; while(1) /查询方式1: if(IE0= =1) IE0=0;/手动清中断标志 /P1=+I; _- P2=LED_segbufi P0=LED_biti I+; If(I=6) I=0 delay(500); ,void main(void) while(1) /查询方式2: while(IE0= =0) ; /等待INT0外部中断 IE0=0; /手动清中断标志 / ,8051中断系统,与中断有关的SFR,注:*表示可以位寻址,TCON:定时计数器控制寄存器,TF1、TF0 :T1、T0溢出标志 TR1、TR0 :T1、T0启
6、动控制位(TR=1:启动定时器) IE1、IE0 :INT1、INT0中断标志 IT1、IT0 :INT1、INT0触发方式控制位(IT=1:下降沿触发,IT=0:低电平触发) TF1、TF0、IE1、IE0都具有自动清零功能。,SCON:串行口控制寄存器,SM0 SM1串行模式选择 SM2 多机通讯允许位:方式0时,此位应该为0;模式1时,当接收到停止位时,该位将置位;方式2或方式3时,当接收的第9位数据为1时,将置位 REN 串行接收允许位 TB8 在模式2和模式3中,将被发送数据的第9位 RB8:在方式0中,该位不起作用;在方式1中该位为接收数据的停止位;在方式2和方式3 中为接收数据的
7、第9 位 TI 串行发送结束标志,由软件清零 RI 串行接收结束标志,由软件清零,IE:中断允许寄存器,EA: 使能标志位。 1:所有中断使能;0:禁止所有中断 ET2:T2中断使能 ES: 串行通信中断使能 ET1:T1中断使能 EX1:INT1中断使能 ET0:T0中断使能 EX0:INT0中断使能,IP:中断优先级寄存器,- 保留 - 保留 PT2:T2中断优先级 PS: 串行通信中断优先级 PT1:T1中断优先级 PX1:INT1优先级 PT0:T0中断优先级 PX0:INT0优先级,与中断有关的各位,PX0、PT0、PX1、PT1、PS EX0、ET0、EX1、ET1、ES、EA I
8、T0、IT1 TR0、TR1 IE0、 IE1 、TF0、TF1、 TI 、RI 以上各位可位寻址,且均为高电平有效,8051外部中断编程示例,#include reg51.h /C51 中断程序框架 /*int0中断服务程序*/ void INT0_ISR (void) interrupt 0 using 0 /中断服务程序 / /*主函数*/ void main (void) IT0=1; EX0 = 1; EA = 1; / 打开中断源 while (1) ; /等待中断 ,中断服务函数与寄存器的定义,为了满足在C语言源程序中直接编写中断服务程序的要求,C51编译器对函数的定义进行了扩展
9、,增加了一个扩展关键字interrupt。它是函数定义时的一个选项,加上这个选项即可将一个函数定义成中断服务函数。 定义格式为: 函数类型 函数名(形式参数表) interrupt n using n ,中断服务函数与寄存器的定义,函数类型 函数名(形式参数表) interrupt n using n 关键字interrupt后面的n是中断号,n的范围为031。编译器从8n+3处产生中断向向量,具体的中断号n和中断向量取决于8051单片机芯片型号,常用中断源和中断向量如表所示。,中断服务函数与寄存器的定义,工作寄存器:8051片内RAM中有4个工作寄存器组,每个寄存器组中含8个工作寄存器(R0
10、R7)。 C51编译器扩展了一个关键字using,专门用来选择8051单片机的工作寄存器组。 在定义一个函数时,using后面的n是一个03的常数,分别表示4个功能完全一样的工作寄存器组。 在定义一个函数时,using是一个选项,若缺省编译器自动分配一个寄存器组作绝对寄存器组访问。需要注意的是,关键字using和interrupt的后面都不允许跟带运算符的表达式。,中断服务函数与寄存器的定义,void INT0_ISR(void) interrupt 0 void TIMER0_ISR(void) interrupt 1 void INT1_ISR(void) interrupt 2 void
11、 TIMER1_ISR(void) interrupt 3 void UART_ISR(void) interrupt 4 ,中断服务函数与寄存器的定义_ Keil C51命令,DEFINE BUTTON(定义按钮)命令 定义:DEFINE BUTTON “按钮名”,“命令” 在Debug-Function Editor(Open Ini File)中定义外中断按钮: define button INT0(P3.2) , PORT3=PORT30 x04 define button T0(P3.4) , PORT3=PORT30 x10 define button INT1(P3.3) , P
12、ORT3=PORT30 x08 define button T1(P3.5) , PORT3=PORT30 x20 每按钮一次对P3.2取反 删除:KILL BUTTON n define button “clr drtr”,”dptr=0” kill button 1,中断服务函数与寄存器的定义_ Keil C51命令,EVAL EVAL (1/256) 0 x00 EVAL (256/256) 0 xFF PORT3 0 xFF ex0_isr_counter 询问变量的值,中断如何扩充1,定时器中断作为外部中断使用 把8051的T1 、T0用作对外部脉冲计数方式。每当P3.4(T0)或P
13、3.3(T1)引脚上发生负跳变时, T1 和T0的计数器加1。利用这个特性,可以把P3.4和P3.3引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。,中断如何扩充1,定时器中断作为外部中断使用(软件) 定时器T1对外部计数 /*TH1、TL1采用16进制赋值*/ void int0(void) interrupt 3 /*中断服务程序*/ void main(void) TMOD=(TMOD /*TL1=-1%256; */ while(1) ; ,中断如何扩充2,中断和查询结合的方式,中断如何扩充2,#include sbit LED_A=P10; sbit LED_B=
14、P11; sbit LED_C=P12; sbit IA=P13; sbit IB=P14; sbit IC=P15;,中断如何扩充2,void main(void) IT0=1;IT1=1; EX0=1;EX1=1; EA=1; LED_A=0;LED_B=0;LED_C=0; IA=1;IB=1;IC=1; while(1); ,中断如何扩充2,void int0(void) interrupt 0 LED_A=0;LED_B=0;LED_C=0; IE1=0; EX1=1; void int1(void) interrupt 2 EX1=0; if(IA=0) LED_A=1; else
15、 if(IB=0) LED_B=1; else if(IC=0) LED_C=1; ,中断如何扩充3,利用硬件扩充多个中断源 采用一个8/3优先编码器74LS148,把多个中断源信号作为一个中断效果很好。 I7-I0优先级逐步降低 GS为标志位:判断是否有有效输入,中断如何扩充3,软件设计思路 #include unsigned char status; bit flag; void int1(void) interrupt 2 using 2 flag=1; /*设置标志*/ status=P1; /*存状态*/ ,中断如何扩充3,软件设计思路 void main(void) PX1=1;
16、/*置INT1高优先级中断*/ EX1=1; EA=1; /*INT1开中断,CPU开中断*/ while(1) if(flag) /*有中断*/ switch(status) /*根据中断源分支*/ case 0: break; /*处理0*/ case 1: break; /*处理1*/ case 2: break; case 3: break; default:; flag=0; ,8.2 定时器,问题提出,void delay(unsigned char n) unsigned char i; for(i=0;in;i+) ; ,void delay(unsigned int n) u
17、nsigned int i; for(i=0;in;i+) ; ,问题提出(fosc=11.0592MHz),y1=32.82+17.34*x1(us) y2=41.79+26.01*x2(uS),8051 定时/计数器,8051单片机内部有2个16位可编程的定时计数器,即T0和T1(8052提供3个,这第三个称为T2)。,什么是内部定时、外部计数? 8051计数器的计数方式?递增、溢出,8051 定时/计数器,定时器/计数器结构框图,内部定时:输入的时钟脉冲由晶振的输出经12分频后得到; 外部计数:接相应的外部输入引脚T0(P3.4)或T1(P3.5)。在这种情况下,当检测到输入引脚上的下降
18、沿(电平由高跳变到低)时,计数器就加1。,8051 定时/计数器工作机理,定时器:对机器周期计数,即n12/fosc 计数器:对T0引脚上的脉冲计数 定义定时器(T0)工作方式: 13位、 16位、8位 设置T0定时初使值,若为16位定时方式,则定时初值可为0(定时最大)65535(定时最小)。举n=50000,则计数初值应为65536-50000=15536=0 x3CB0,需对TH0、TL0赋计数初值: TH0=0 x3C;TL0=0 xB0; TH0=(65536-50000)/256; TL0= (65536-50000)%256;,8051 定时/计数器工作机理,手工启动定时器(TR
19、0=1)后,T0开始对机器周期计数(硬件对TH0、TL0构成的16位计数器递增计数);当计至TH0=0 xff,TL0=0 xff后,再计一次则定时器产生溢出(溢出标志TF0=1): 此时 若T0中断允许(使能ET0=1,EA=1),则CPU立即停止当前程序,跳转到T0对应的中断入口(ROM保留地址0 x000B)执行中断服务程序(中断服务程序后CPU自动对溢出标志清零:TF0=0),待T0中断服务程序执行完毕后再回原执行程序处; void TIMER0_ISR(void) interrupt 1 /定时器0中断服务程序 若T0中断未允许,则程序不能跳转到T0中断入口,不执行中断服务程序(中断
20、标志此时TF0不能自动清0)。,8051定时/计数器工作机理,8051 定时/计数器机理,进入定时器中断服务程序后,必须重新对TH0、TL0赋初值(之前硬件已把TH0、TL0修改了): void TIMER0_ISR(void)interrupt 1 TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; / void TIMER0_ISR(void)interrupt 1 / TH0=(65536-COUNT)/256; TL0=(65536-COUNT)%256; 问题:以上两种赋初值方式哪种更好?,8051 定时/计数器中断方式编程,#define C
21、OUNT 50000,void main(void) TMOD=0 x0; /定时/计数器方式定义 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /定时/计数器赋初值 ET0=1; EA=1; /定时器0中断允许 TR0=1; /定时器0定时开始 while(1); /等待定时/计数器中断溢出(TF0) ,void TIMER0_ISR(void) interrupt 1 using 1 /进入中断服务程序后,CPU自动清TF0溢出标志位 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /重新赋计
22、数值 /中断服务程序 ,8051 定时/计数器查询方式编程,/中断方式 #define COUNT 50000 void TIMER0_ISR(void) interrupt 1 /进入后,CPU自动清TF0标志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / void main(void) TMOD=0 x0; TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; ET0=1; EA=1; TR0=1; while(1) ; ,/查询方式 #define COUNT 50000 /*void TIM
23、ER0_ISR(void) interrupt 1 /进入后,CPU自动清TF0标志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / */ void main(void) TMOD=0 x0; TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; /ET0=1; EA=1; TR0=1; while(1) /添加查询语句; ,8051 定时/计数器查询方式编程,/查询方式 #define COUNT 50000 void main(void) TMOD=0 x0; TH0= (65536-COUNT)
24、/256; TL0= (65536-COUNT)%256; /ET0=1; EA=1; TR0=1;,while(1) /定时/计数器查询方式1 if(TF0= =1) TF0=0; /手工清溢出标志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / ,while(1) /定时/计数器查询方式2 while(!TF0); /定时等待 TF0=0; /手工清溢出标志 TH0= (65536-COUNT)/256; TL0= (65536-COUNT)%256; / ,8051定时器工作原理,将定时/计数初使值载入TH0,TL0 启动定时/计数器
25、TR0=1 定时/计数器溢出CPU自动置位溢出标志TF0,8051 内部定时示例,例1:设单片机fosc=12MHz,要求在P1.0引脚上输出周期为2ms的方波。,分析: 用T0实现,采用中断方式 机器周期:T=1us 计数值:每隔1ms进入一次T0中断,中断服务程序对P1_0取反。因此计数值n=1ms/1us=1000次 TH0=(65536-1000)/256; TL0=(65536-1000)%256;,8051 内部定时示例,例1:设单片机fosc=12MHz,要求在P1.0引脚上输出周期为2ms的方波。 程序基本框架,8051 内部定时示例,例1:设单片机fosc=12MHz,要求在
26、P1.0引脚上输出周期为2ms的方波。,定时器主函数初使化 TMOD方式定义(T0、16位内部定时方式) 确定计数初值TH0、TL0 T0中断使能 T0启动,void main (void) TMOD=0 x?; TH0=(65536-1000)/256; TL0=(65536-1000)%256; ET0=1; EA=1; TR0=1; while (1); ,8051 内部定时示例,例1:设单片机fosc=12MHz,要求在P1.0引脚上输出周期为2ms的方波。,定时器中断服务程序 重新赋计数初值TH0、TL0 对P1_0取反,void TIMER0_ISR (void) interrup
27、t 1 TH0=(65536-1000)/256; TL0=(65536-1000)%256; P1_0=P1_0; ,8051 内部定时示例,例1:设单片机fosc=12MHz,要求在P1.0引脚上输出周期为2ms的方波。参考程序见P172,如何用查询方式实现?,8051 内部定时示例,例2:设单片机fosc=12MHz,要求在P1.0引脚上输出周期为2ms,占空比为75的矩形波。在例1基础上应作何修改?,8051 内部定时示例,例2:设单片机fosc=12MHz,要求在P1.0引脚上输出周期为2ms,占空比为75的矩形波。在例1基础上应作何修改?,8051 内部定时示例,例3:设单片机fo
28、sc=12MHz,要求在P1.0引脚上输出周期为2S的方波。在例1基础上应作何修改?,8051 内部定时示例,例4:循环点亮红、绿、黄灯,时间间隔为1秒。,8051 外部计数器应用示例,例1:外部中断扩充,8051 外部计数器应用示例,例2:高速公路车数统计与显示模块设计 例3:简易频率计设计,8051 定时/计数器应用示例,对外部脉冲计数时要注意对外部脉冲消抖,按键时存在抖动,必须消抖:硬件、软件法,8051 定时/计数器应用示例,硬件消抖(采用基本RS触发器),8051 定时/计数器应用示例,软件消抖(延时采样),void TIMER0_ISR(void) interrupt 1 dela
29、y(100); if(P3_4= =1) return; /*判别是否为有效T0中断,以抗干扰*/ /*中断服务程序*/ ,8051 定时/计数器,定时计数器有四种工作方式。其工作方式由两个SFR决定 定时方式寄存器:TMOD 定时控制器:TCON,8051 定时/计数器,TMOD:定时器方式寄存器,8051 定时/计数器,TMOD:定时器方式寄存器 GATE:门控信号 1:LINT#*TR, C/T启动受双重控制 0:L=1, C/T的启动仅受TR0或TR1控制,与INT无关 CT#:计数器、定时器选择位 1:计数器(对T0:P3.4、T1:P3.5外部脉冲计数) 0:定时器(对内部机器周期
30、计数) M1、M0:工作方式选择位,8051 定时/计数器,M1和M0:工作方式选择位,8051 定时/计数器,方式0 (M1M000):13位,TH(高8位),TL(低5位),满计数值213; C/T#=0 内部定时; C/T#=1 外部计数。 C/T#启动后立即加1计数,当13位计数满时,TH向高位进位,此进位将使TF=1(中断溢出标志),即产生中断请求。若C/T允许中断(ET0、ET1=1、EA=1),则响应中断,执行中断服务程序。当CPU转向中断服务程序时,TF=0(自动清0),8051 定时/计数器,方式1(M1M001):16位,由TH和TL寄存器各提供8位,满计数值为216。 方
31、式2(M1M010):8位可自动重载的C/T#,满计数值为28。 在方式0和方式1中,当计数满后,若要进行下一次定时计数,须用软件向TH和TL重装预置计数初值。方式2中TH和TL被当作两个8位计数器,计数过程中,TH寄存8位初值并保持不变,由TL进行8位计数。计数溢出时,除产生溢出中断请求外,还自动将TH中初值重装到TL,即重装载。除此之外,方式2也同方式0。 方式3(略),8051 定时/计数器,定时器计数器的初始化及其步骤 使用8051的T0、T1前,应对它进行编程初始化,主要是对TCON和TMOD编程;计算和装载计数初值(TH、TL)。 一般完成以下几个步骤: TMOD:确定C/T#工作
32、方式 TH、TL:计算计数初值,并装载TH、TL IE:中断方式时,需打开中断使能 TCON:启动定时器计数器(TRl、TR0),8051 定时/计数器,说明以下语句功能 TMOD=0 x10; TMOD=(TMOD,8051 定时/计数器,定时器初值的计算 在内部定时方式下, T0、T1对内部机器周期计数,若fosc=6MHz,一个机器周期为12/fosc=2us,所以 方式0 13位定时器最大定时间隔=2132us=16.384ms 方式1 16位定时器最大定时间隔=2162us=131.072ms 方式2 8位定时器最大定时间隔 =28 2us=512us 例:若使T0、T1工作在方式1
33、,要求定时1ms,求计数初值。设计数初值为x,则有: (216x)2us=1000us x=216500=0FEOCH 因此,TH,TL可置500,8051 定时/计数器,定时计数器的应用实例 例1 :设fosc=6MHz,要求在P1.0脚上输出周期为2ms的方波。 解:采用定时器T0的方式1编程 要求定时间隔1ms,每次时间到P1.0取反。机器周期=12fosc=2us 计数次数n=1000us2us500 由于计数器递增计数,为得到500个计数之后的定时器溢出,必须给定时器置初值65536500。,8051 定时/计数器,用查询方式在P1.0引脚上产生周期为2ms的方波 #include
34、sbit P1_0=P10; void main(void) TMOD=0 x01; /*定时器0方式1 */ TR0=1; /*启动T0 */ for(;) TH0= (655361000)/256; /*装载计数初值*/ TL0= (655361000)256; do while(!TF0); /*查询等待TF0置位*/ P1_0=!P1_0; /*定时时间到P1.0反相 */ TF0=0; /*软件清TF0 */ ,8051 定时/计数器,用中断方式在P1.0引脚上产生周期为2ms的方波 #include sbit P1_0=P10; void T0(void) interrupt 1
35、using 1 /*T0中断服务程序入口*/ P1_0=!P1_0; /*P1.0取反*/ TH0= (65536500)/256; /*计数初值重载*/ TL0=(65536500)256; void main(void) TMOD=0 x01; /*TC0工作在定时器方式l*/ TH0=(65536500)/256; /*计数初值*/ TL0=(65536500)256; ET0=1; EA=1; /*中断使能*/ TR0=1; /*启动T0*/ while(1); ,8051 定时/计数器,中断扩充:内部定时器T0用作外中断 void T0 (void) interrupt 1 /*中断
36、服务程序*/ void main (void) TMOD = 0 x66; /*T0用作计数器,采用方式2具有自动装载功能*/ ET0 = 1; EA = 1; TH0=0 xFF; TL0=0 xFF; TR0 = 1; while (1); define button Toggle T0 (P3.4) , PORT3 = 0 x10,8.3 串行口,PC机RS232串口,RS232串口是每台计算机的必要配备,通常PC含有COM1、COM2。 一般计算机 COM1:9 Pin COM2:25 Pin 新一代的计算机均为9 Pin。 RS232通讯端口。在计算机上的RS232均是公头,即使是2
37、5 Pin也是公头,注意与 打印机端口(25 Pin)区分。,PC机串口地址,RS232串口,RS232串口引脚功能,RS232(DB9与DB25对比),9 Pin与25 Pin的关系,8051串口,8051有一个可编程的全双工串口。用于串行通信的UART(通用异步接收发送) 。 TXD端发送数据; RXD端接收数据。 串口可实现短距离(10m)机间通信。 RS232C和PC机进行通信时可使用驱动芯片(MAX232) 。,8051串口,对应有两个缓冲器SBUF。(共用一个地址),接收缓冲器。 接收:b=SBUF;,发送缓冲器; 发送:SBUF=a;,8051串口,8051有接收结束标志(RI:
38、receive interrupt)和发送结束标志(TI:transfer interrupt);该标志为高电平有效,且必须手工清0(RI=0、TI=0)。 串口的编程可采用中断方式或查询方式 采用查询方式编程时,可设置最长等待时间,以确保其它程序正常运行 8051串口中断程序格式: void UART_ISR(void) interrupt 4,串口通信,三线制,交叉线,串口通信分类,同步( synchronous ) 异步( asynchronous ),串口通信格式(异步),111位起始位(0)9位数据位(低位在前)1位停止位(1) 非传输时保持“1” 如图发送数据为:0 xCB,串口通
39、信格式,TTL电平(有效距离1m) RS232电平(有效距离10m) RS485电平(有效距离5km ),RS232逻辑电平的定义,1:15V3V 0: 3V15V 与TTL、CMOS逻辑有区别,因此必须对其进行电平转换,TTL-RS232电平比较(0 x35),TTLRS232电平转换,TTLRS232电平转换电路,串口通信方式,串口通信方式 点对点 PC机与MCU(PC与智能仪表间的通信) MCU与MCU 点对多:多机通信,串口通信模式,上位机主动发 发单字节指令 发多字节指令 定长字节指令: 起始字节:0 xAA 控制数据地址:0 x01 控制数据 和校验:控制数据的和 结束字节:0 x
40、55 不定长字节指令 结束标志chr$(13)+chr$(10),串口通信模式-单字节发送,单字节通信,上位机主动 上位机程序 串口通信工具:scomm32 自己编程: 控件实现(VB) API函数实现(VC) 下位机程序 接收:中断方式 发送:查询方式,PC机串口通信实现,两种方式实现 控件MSCOMM32.OCX 应用程序接口函数:API(OpenFile(),PC机串口通信(MSCOMM32.OCX),首先为工程添加MSCOMM32.ocx等控件 添加如下代码:包括串口初始化,发送、接收等操作 Private Sub Form_Load() If MSComm1.PortOpen The
41、n MSComm1.PortOpen = False 关闭串口 MSComm1.CommPort = 1 设置串口1 MSComm1.Settings = 9600,N,8,1 设置串口波特率 MSComm1.InputMode = comInputModeBinary 设置串口通信模式-二进制模式 MSComm1.InputLen = 1 设置每次从输入缓冲区取出的字节数 If MSComm1.PortOpen = False Then MSComm1.PortOpen = True 打开串口 End Sub,PC机串口通信(MSCOMM32.OCX),Public Sub Command1
42、_Click() Dim ao(0 To 0) As Byte Dim av As Variant Dim ai(1 To 4) As Byte 存放数据的窗体级变量,因为得到的数据尚需进一步处理 Dim tt As Long Dim count As Integer MSComm1.InBufferCount = 0 清输入/输出缓冲区 MSComm1.OutBufferCount = 0 ao(0) = int(val(Text1.text) 取出待发送的数据 MSComm1.Output = ao() 串口发送数据 tt = GetTickCount 利用API函数取得系统时间 Do 等
43、待输入缓冲区数据=1或延时3秒钟结束 Loop Until MSComm1.InBufferCount = 1 Or GetTickCount - tt 3000 If MSComm1.InBufferCount =1 Then 如果输入缓冲区有1字节的数据,则取出数据并处理 av = MSComm1.Input 从输入缓冲区取出数据 ai(1) = av(0) Text2.Text = ai(1) Exit Sub Else MsgBox “请检查” + “电源、串口连线、波特率设置后重试!”, vbOKOnly + vbCritical, “串口错误:” 串口通信失败提示信息 End If
44、 End Sub,PC机串口通信(MSCOMM32.OCX),新建标准模块,在标准模块中添加 Declare Function GetTickCount Lib kernel32 () As Long,串口通信注意点,为了确保发送的数据都能被准确接收: 格式统一: 统一单字节发送与接收的格式(起始位数据位停止位) 多字节发送时,应先制定双方的通信协议。 波特率统一:(最大:115200bps) 统一发送与接收的速率(波特率(bps:bit per second):每秒钟发送的位数);波特率可用内部时钟T1或T2(8052)获得;典型波特率:9600bps。 通信时应设置最长等待时间,8051串
45、口中断机理,执行串口发送指令SBUF=a;通过TXD口发送串行数据,发送结束后CPU自动产生发送结束标志(TI=1);此时若串行中断使能(ES=1,EA=1) ,则程序立即停止当前程序,跳转置中断号为4的串行口中断入口地址(0 x0023),执行中断服务程序void UART_ISR(void) interrupt 4 ,CPU不具有自动清零功能; 同样,若串口在RXD引脚接收到数据,硬件自动产生接收结束标志(RI=1),若此时若串行中断使能(ES=1,EA=1),则程序立即停止当前程序,跳转置中断号为4的串行口中断入口地址(0 x0023),执行中断服务程序void UART_ISR(voi
46、d) interrupt 4 ,CPU不具有自动清零功能,可通过b=SBUF;指令取出暂存在数据缓冲区内的数据。 为什么串口中断不具有硬件自动清中断标志功能? 因为接收与发送结束都能进入同一中断,因此在不具有自动清标志功能,需加判断标志语句。,8051串口中断机理,串口中断使能:ES、EA 串行发送与接收结束会进入同一中断服务程序 void UART(void) interrupt 4 因此,若采用中断方式,在中断服务程序中必须先判别中断是发送还是接收中断,以便进一步处理。(SBUF=a;bSBUF;),8051串口相关寄存器,串口初始化 数据格式设置 SCON 波特率设置 TMOD TH1、
47、TL1 PCON TR1 ES、EA 串口发送与接收 SBUF RI、TI,8051串口初始化(格式设置),SCON:串行口控制寄存器,波特率(bps):每秒钟传输的位数。方式1、3必须借助于T1 10位通信:1位起始位(0)8位数据位1位停止位(1) T1溢出率1 / T1定时时间,8051串口初始化(格式设置),SM2:多机通信使能控制位(方式2,3); REN(Receive Enable)串行接收允许位; TB8(Transmit Bit 8)在方式2、3中,将被发送数据的第9位 (奇偶校验位等); RB8(Receive Bit 8第9位) 在方式0中,该位不起作用; 在方式1中该位
48、为接收数据的停止位; 在方式2、3中为接收数据的第9位。 TI、RI发送/接收结束标志位,软件(手工)清零;,8051串口工作方式,方式0: 移位寄存器输入输出方式。数据通过RXD输入出,TXD输出移位脉冲CP。该方式下,收发数据为8位,低位在前。波特率固定为fosc12,发送:SBUF=a; (发送条件:TI = 0,8位输出结束时TI=1) 接收:b=SBUF; (接收条件: REN=1 / 11010000 PCON=0 x00; TMOD=(TMOD ,8051串口数据发送与接收,发送数据 SBUF=a; /发送数据 while(TI=0); /等待发送(结束标志) TI=0; /手工
49、清发送标志 接收数据 while(RI=0); /等待接收(结束标志) RI=0; /手工清接收标志 b=SBUF; /接收数据,8051串口通信框架(中断方式),void UART_ISR(void) interrupt 4 unsigned 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
50、(1); /等待串口中断 ,问题,为什么8051单片机常用11.0592MHz的晶振? 串口通信时应注意些什么问题? 8051单片机串口通信有几种方式?各种方式有何异同?,8051串口通信实验,8051单片机发送实验 单片机连续发送0 x35,用示波器观察AT89S51 TXD(P3.1)和MAX232 T1OUT(MAX232第14脚)信号,画出波形分析并比较两波形; 8051单片机接收实验 PC机借助sscom32发送任意数据(a),单片机接收后回复数据(a+1); PC机发送实验 用VB自编串口发送程序以实现实验2。 注:10位通信格式,9600bps,如何设置最长等待时间?,temp_
51、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; /接收数据,8051串口通信小结,初始化步骤 使用串口前,应对它进行初始化。 设置产生波特率的T1(TMOD、TH1、TL1、ET1、EA、TR1); 串行口控制(SCON、PCON); 中断控制(ES、EA)。具体步骤如下: 确定串行口控制编程SCON; 确定Tl工作方式编程TMOD寄存器; 计算T1初值装载TH
52、l、TLl; 启动T1编程TCON中的TRl位; 串行口在中断(查询方式除外)方式下,需开CPU和源中断编程IE寄存器。(是否有必要使ET11?),8051串行口示例1,unsigned char data110=M,C,S,-,5,1,0 x0d,0 x0a,0 x00; void main() unsigned char i; sbuf_init(); while(1) i=0; while( data1i!=0 x00) SBUF=data1i; while(TI=0); TI=0; i+; ,8051串行口示例2,8051与PC机通信程序(查询方式) unsigned char com
53、municate(unsigned char c) switch(c) case 0 x41: proc1(); return(0 x42); break; case 0 x42: proc2(); return(0 x43); break; case 0 x43: proc3(); return(0 x44); break; default:; void main(void) while(1) while(RI=0); RI=0; a1=SBUF; /MCU接收数据 b1=communicate(a1); /MCU处理数据 SBUF=b1; while(TI=0); TI=0; /MCU发送
54、数据 ,8051 点对点通信,8051机间通信的C编程,双机通信也称点对点通信,可用于MCU和MCU间通信,也用于MCU与PC间通信。 在较大规模的测控系统中,一般采用分布式控制。 上位机进行管理。 下位机完成各种各样的检测控制。,8051 点对点通信,上位机实现:编辑、查询、统计、报表打印等管理功能,下位机实现:控制、数据采集等检测控制功能,8051 点对点通信,通信双方的约定:发送机:SYSTEM1 ,接收机:SYSTEM2 A先送 “AA”信号,B收到后应答“BB”,表示B同意接收。当A收到“BB”后,开始发送数据,每发送一次求“校验和”,假定数据块长度为16个字节,数据缓冲区为buf,数据块发送完后马上发送“校验和” B接收数据并将其转贮到数据缓冲区buf每接收到一个数据便计算一次“校验和”,当收齐一个数据块后,再接收A发来的校验和,并将它与B求出的校验和比较。 若两者相等,接收正确,B机回答0 x00; 若两者不等,接收不正确,B机回答0 xFF,请求重发。 A收到0 x00的回答后,结束发送。若收到的答复非
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年陕西省榆林市子洲县下册期末教育调研评估八年级数学试题 含答案
- 2026年辽宁省凌源市高二生物下册期末考试模拟卷(历年真题)附答案
- 2026年福建省永安市高二生物下册期末考试测试卷含完整答案(夺冠)
- 2025年江苏省丹阳市高二生物下册期末考试测试卷附完整答案(必刷)
- 2026年辽宁省庄河市高二生物下册期末考试测试卷含答案【综合卷】
- 2025年云南省香格里拉市高二生物下册期末考试模拟卷完美版附答案
- 2026年甘肃省玉门市高二生物下册期末考试测试卷(名校卷)附答案
- 2026年江苏省兴化市高二生物下册期末考试试卷及完整答案【考点梳理】
- 2026年湖南省武冈市高二生物下册期末考试检测卷含答案(B卷)
- 2025年浙江省瑞安市高二生物下册期末考试模拟卷【网校专用】附答案
- 2026年关于入党测试题及答案
- 2026新五年级下册《数学期末冲刺计算专项练习》
- 公安院校公安专业招生政治考察表下载
- 2026年国家统一法律职业资格考试客观题真题及解析
- 2024北师大版小学三年级数学下册全册教案
- 【《基于多光谱分析的电器设备局部放电诊断方法分析综述》10000字】
- 2025年黑龙江省公务员考试真题及答案解析言语理解
- 2026年高考新高考II卷英语考试试卷及答案
- 20S515 钢筋混凝土及砖砌排水检查井
- 体外诊断试剂基础知识培训
- 广西三支一扶2026年真题
评论
0/150
提交评论