Chap4_2 81内部资源的C编程_第1页
Chap4_2 81内部资源的C编程_第2页
Chap4_2 81内部资源的C编程_第3页
Chap4_2 81内部资源的C编程_第4页
Chap4_2 81内部资源的C编程_第5页
已阅读5页,还剩133页未读 继续免费阅读

下载本文档

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

文档简介

.,8051内部资源,常熟理工学院物理与电子工程学院2011.4,.,Chap88051内部资源,8.1外部中断:INT0、INT18.2定时/计数器:T0、T18.3串行口:RXD、TXD,.,8.1外部中断,.,8051外部中断,中断中断源中断优先级中断嵌套,.,8051外部中断,中断:当CPU正处理某项事务时,若外界或内部发生紧急事件,要求CPU暂停正在处理的工作转而去处理这个紧急事件,待处理完以后再回到原来被中断的地方,继续执行原来被中断了的程序,这样的过程称为中断。(堆栈)中断源:向CPU提出中断请求的源称为中断源外部跳变信号(下降延)外部低电平等(0),.,8051外部中断,中断优先级:当几个中断源同时请求中断时,CPU应优先响应最需紧急处理的中断请求。为此,需要规定各个中断源的优先级。在优先级高的中断请求处理完了以后。再响应优先级低的中断请求。中断嵌套:当CPU正在处理一个优先级低的中断请求的时,如果发生另一个优先级比它高的中断请求,CPU能暂停当前处理的中断,转去处理优先级高的中断请求,待处理完以后,再回到原来正在处理的低级中断程序,这种高级中断源能中断低级中断源的中断处理称为中断嵌套。,.,8051中断,8051单片机有5个中断源2个中断优先级(2级中断嵌套),优先级可通过编程实现IE(中断允许寄存器):中断源的中断请求是否能得到响应,受IE的控制;IP(中断优先级寄存器):各个中断源的优先级可由IP的各位来确定;同一优先级中的各中断源同时请求中断时,由内部的查询逻辑来确定响应的次序。,.,8051中断源,8051五个中断源INT0中断(P3.2)T0中断(P3.4)INT1中断(P3.3)T1中断(P3.5)串行中断(P3.0、P3.1),.,8051中断入口(ROM)地址和优先级,.,8051INT0中断机理,当INT0引脚输入如下信号:下降沿(IT0=1)或低电平(IT0=0)CPU自动(硬件)产生中断标志(IE0=1),此时若INT0中断允许(使能EX0=1,EA=1),则CPU立即停止当前程序,跳转到INT0对应的中断入口(ROM保留地址0 x0003)执行中断服务程序(中断服务程序后CPU自动对中断标志清零:IE0=0),待INT0中断服务程序执行完毕后再回原执行程序处;若若INT0中断未允许,则程序不能跳转到INT0中断入口,不执行中断服务程序(中断标志IE0不能自动清0)。问提:中断标志IE0的产生与中断使能是否有关?,.,INT0中断方式执行流程,#includereg51.hunsignedchari=0;/*int0中断服务程序*/voidINT0_ISR(void)interrupt0delay(200);if((P3/等待中断,.,INT0查询方式,voidmain(void)IT0=1;/EX0=1;EA=1;while(1)/查询方式1:if(IE0=1)IE0=0;/手动清中断标志/P1=+I;_-P2=LED_segbufiP0=LED_bitiI+;If(I=6)I=0delay(500);,voidmain(void)while(1)/查询方式2:while(IE0=0);/等待INT0外部中断IE0=0;/手动清中断标志/,.,8051中断系统,.,与中断有关的SFR,注:*表示可以位寻址,.,TCON:定时计数器控制寄存器,TF1、TF0:T1、T0溢出标志TR1、TR0:T1、T0启动控制位(TR=1:启动定时器)IE1、IE0:INT1、INT0中断标志IT1、IT0:INT1、INT0触发方式控制位(IT=1:下降沿触发,IT=0:低电平触发)TF1、TF0、IE1、IE0都具有自动清零功能。,.,SCON:串行口控制寄存器,SM0SM1串行模式选择SM2多机通讯允许位:方式0时,此位应该为0;模式1时,当接收到停止位时,该位将置位;方式2或方式3时,当接收的第9位数据为1时,将置位REN串行接收允许位TB8在模式2和模式3中,将被发送数据的第9位RB8:在方式0中,该位不起作用;在方式1中该位为接收数据的停止位;在方式2和方式3中为接收数据的第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、PSEX0、ET0、EX1、ET1、ES、EAIT0、IT1TR0、TR1IE0、IE1、TF0、TF1、TI、RI以上各位可位寻址,且均为高电平有效,.,8051外部中断编程示例,#includereg51.h/C51中断程序框架/*int0中断服务程序*/voidINT0_ISR(void)interrupt0using0/中断服务程序/*主函数*/voidmain(void)IT0=1;EX0=1;EA=1;/打开中断源while(1);/等待中断,.,中断服务函数与寄存器的定义,为了满足在C语言源程序中直接编写中断服务程序的要求,C51编译器对函数的定义进行了扩展,增加了一个扩展关键字interrupt。它是函数定义时的一个选项,加上这个选项即可将一个函数定义成中断服务函数。定义格式为:函数类型函数名(形式参数表)interruptnusingn,.,中断服务函数与寄存器的定义,函数类型函数名(形式参数表)interruptnusingn关键字interrupt后面的n是中断号,n的范围为031。编译器从8n+3处产生中断向向量,具体的中断号n和中断向量取决于8051单片机芯片型号,常用中断源和中断向量如表所示。,.,中断服务函数与寄存器的定义,工作寄存器:8051片内RAM中有4个工作寄存器组,每个寄存器组中含8个工作寄存器(R0R7)。C51编译器扩展了一个关键字using,专门用来选择8051单片机的工作寄存器组。在定义一个函数时,using后面的n是一个03的常数,分别表示4个功能完全一样的工作寄存器组。在定义一个函数时,using是一个选项,若缺省编译器自动分配一个寄存器组作绝对寄存器组访问。需要注意的是,关键字using和interrupt的后面都不允许跟带运算符的表达式。,.,中断服务函数与寄存器的定义,voidINT0_ISR(void)interrupt0voidTIMER0_ISR(void)interrupt1voidINT1_ISR(void)interrupt2voidTIMER1_ISR(void)interrupt3voidUART_ISR(void)interrupt4,.,中断服务函数与寄存器的定义_KeilC51命令,DEFINEBUTTON(定义按钮)命令定义:DEFINEBUTTON“按钮名”,“命令”在Debug-FunctionEditor(OpenIniFile)中定义外中断按钮:definebuttonINT0(P3.2),PORT3=PORT30 x04definebuttonT0(P3.4),PORT3=PORT30 x10definebuttonINT1(P3.3),PORT3=PORT30 x08definebuttonT1(P3.5),PORT3=PORT30 x20每按钮一次对P3.2取反删除:KILLBUTTONndefinebutton“clrdrtr”,”dptr=0”killbutton1,.,中断服务函数与寄存器的定义_KeilC51命令,EVALEVAL(1/256)0 x00EVAL(256/256)0 xFFPORT30 xFFex0_isr_counter询问变量的值,.,中断如何扩充1,定时器中断作为外部中断使用把8051的T1、T0用作对外部脉冲计数方式。每当P3.4(T0)或P3.3(T1)引脚上发生负跳变时,T1和T0的计数器加1。利用这个特性,可以把P3.4和P3.3引脚作为外部中断请求输入线,而定时器的溢出中断作为外部中断请求标志。,.,中断如何扩充1,定时器中断作为外部中断使用(软件)定时器T1对外部计数/*TH1、TL1采用16进制赋值*/voidint0(void)interrupt3/*中断服务程序*/voidmain(void)TMOD=(TMOD/*TL1=-1%256;*/while(1);,.,中断如何扩充2,中断和查询结合的方式,.,中断如何扩充2,#includesbitLED_A=P10;sbitLED_B=P11;sbitLED_C=P12;sbitIA=P13;sbitIB=P14;sbitIC=P15;,.,中断如何扩充2,voidmain(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,voidint0(void)interrupt0LED_A=0;LED_B=0;LED_C=0;IE1=0;EX1=1;voidint1(void)interrupt2EX1=0;if(IA=0)LED_A=1;elseif(IB=0)LED_B=1;elseif(IC=0)LED_C=1;,.,中断如何扩充3,利用硬件扩充多个中断源采用一个8/3优先编码器74LS148,把多个中断源信号作为一个中断效果很好。I7-I0优先级逐步降低GS为标志位:判断是否有有效输入,.,中断如何扩充3,软件设计思路#includeunsignedcharstatus;bitflag;voidint1(void)interrupt2using2flag=1;/*设置标志*/status=P1;/*存状态*/,.,中断如何扩充3,软件设计思路voidmain(void)PX1=1;/*置INT1高优先级中断*/EX1=1;EA=1;/*INT1开中断,CPU开中断*/while(1)if(flag)/*有中断*/switch(status)/*根据中断源分支*/case0:break;/*处理0*/case1:break;/*处理1*/case2:break;case3:break;default:;flag=0;,.,8.2定时器,.,问题提出,voiddelay(unsignedcharn)unsignedchari;for(i=0;i=1OrGetTickCount-tt3000IfMSComm1.InBufferCount=1Then如果输入缓冲区有1字节的数据,则取出数据并处理av=MSComm1.Input从输入缓冲区取出数据ai(1)=av(0)Text2.Text=ai(1)ExitSubElseMsgBox“请检查”+“电源、串口连线、波特率设置后重试!”,vbOKOnly+vbCritical,“串口错误:”串口通信失败提示信息EndIfEndSub,.,PC机串口通信(MSCOMM32.OCX),新建标准模块,在标准模块中添加DeclareFunctionGetTickCountLibkernel32()AsLong,.,串口通信注意点,为了确保发送的数据都能被准确接收:格式统一:统一单字节发送与接收的格式(起始位数据位停止位)多字节发送时,应先制定双方的通信协议。波特率统一:(最大:115200bps)统一发送与接收的速率(波特率(bps:bitpersecond):每秒钟发送的位数);波特率可用内部时钟T1或T2(8052)获得;典型波特率:9600bps。通信时应设置最长等待时间,.,8051串口中断机理,执行串口发送指令SBUF=a;通过TXD口发送串行数据,发送结束后CPU自动产生发送结束标志(TI=1);此时若串行中断使能(ES=1,EA=1),则程序立即停止当前程序,跳转置中断号为4的串行口中断入口地址(0 x0023),执行中断服务程序voidUART_ISR(void)interrupt4,CPU不具有自动清零功能;同样,若串口在RXD引脚接收到数据,硬件自动产生接收结束标志(RI=1),若此时若串行中断使能(ES=1,EA=1),则程序立即停止当前程序,跳转置中断号为4的串行口中断入口地址(0 x0023),执行中断服务程序voidUART_ISR(void)interrupt4,CPU不具有自动清零功能,可通过b=SBUF;指令取出暂存在数据缓冲区内的数据。为什么串口中断不具有硬件自动清中断标志功能?因为接收与发送结束都能进入同一中断,因此在不具有自动清标志功能,需加判断标志语句。,.,8051串口中断机理,串口中断使能:ES、EA串行发送与接收结束会进入同一中断服务程序voidUART(void)interrupt4因此,若采用中断方式,在中断服务程序中必须先判别中断是发送还是接收中断,以便进一步处理。(SBUF=a;bSBUF;),.,8051串口通信,串口初始化数据格式设置SCON波特率设置TMODTH1、TL1PCONTR1ES、EA串口发送与接收SBUFRI、TI,.,8051串口初始化(格式设置),SCON:串行口控制寄存器,波特率(bps):每秒钟传输的位数。方式1、3必须借助于T110位通信:1位起始位(0)8位数据位1位停止位(1)T1溢出率1/T1定时时间,.,8051串口初始化(格式设置),SM2:多机通信使能控制位(方式2,3);REN(ReceiveEnable)串行接收允许位;TB8(TransmitBit8)在方式2、3中,将被发送数据的第9位(奇偶校验位等);RB8(ReceiveBit8第9位)在方式0中,该位不起作用;在方式1中该位为接收数据的停止位;在方式2、3中为接收数据的第9位。TI、RI发送/接收结束标志位,软件(手工)清零;,.,8051串口工作方式,方式0:移位寄存器输入输出方式。数据通过RXD输入出,TXD输出移位脉冲CP。该方式下,收发数据为8位,低位在前。波特率固定为fosc12,发送:SBUF=a;(发送条件:TI=0,8位输出结束时TI=1)接收:b=SBUF;(接收条件:REN=1/11010000PCON=0 x00;TMOD=(TMOD,.,8051串口数据发送与接收,发送数据SBUF=a;/发送数据while(TI=0);/等待发送(结束标志)TI=0;/手工清发送标志接收数据while(RI=0);/等待接收(结束标志)RI=0;/手工清接收标志b=SBUF;/接收数据,.,8051串口通信框架(中断方式),voidUART_ISR(void)interrupt4unsignedchara;if(RI=1)/若接收到数据a=SBUF;/保存接收的数据RI=0;/手工清接收结束标志SBUF=a+1;/串口发送回复数据while(TI=0);/等待发送结束TI=0;/手工清发送标志,voidmain(void)init_sbuf();/串口初使化ES=1;/串口中断使能EA=1;while(1);/等待串口中断,.,作业,为什么8051单片机常用11.0592MHz的晶振?串口通信时应注意些什么问题?8051单片机串口通信有几种方式?各种方式有何异同?,.,8051串口通信实验,8051单片机发送实验单片机连续发送0 x35,用示波器观察AT89S51TXD(P3.1)和MAX232T1OUT(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;/接收数据,.,8051串口通信小结,初始化步骤使用串口前,应对它进行初始化。设置产生波特率的T1(TMOD、TH1、TL1、ET1、EA、TR1);串行口控制(SCON、PCON);中断控制(ES、EA)。具体步骤如下:确定串行口控制编程SCON;确定Tl工作方式编程TMOD寄存器;计算T1初值装载THl、TLl;启动T1编程TCON中的TRl位;串行口在中断(查询方式除外)方式下,需开CPU和源中断编程IE寄存器。(是否有必要使ET11?),.,8051串行口示例1,unsignedchardata110=M,C,S,-,5,1,0 x0d,0 x0a,0 x00;voidmain()unsignedchari;sbuf_init();while(1)i=0;while(data1i!=0 x00)SBUF=data1i;while(TI=0);TI=0;i+;,.,8051串行口示例2,8051与PC机通信程序(查询方式)unsignedcharcommunicate(unsignedcharc)switch(c)case0 x41:proc1();return(0 x42);break;case0 x42:proc2();return(0 x43);break;case0 x43:proc3();return(0 x44);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点对点通信,8051机间通信的C编程,双机通信也称点对点通信,可用于MCU和MCU间通信,也用于MCU与PC间通信。在较大规模的测控系统中,一般采用分布式控制。上位机进行管理。下位机完成各种各样的检测控制。,.,8051点对点通信,上位机实现:编辑、查询、统计、报表打印等管理功能,下位机实现:控制、数据采集等检测控制功能,.,8051点对点通信,通信双方的约定:发送机:SYSTEM1,接收机:SYSTEM2A先送“AA”信号,B收到后应答“BB”,表示B同意接收。当A收到“BB”后,开始发送数据,每发送一次求“校验和”,假定数据块长度为16个字节,数据缓冲区为buf,数据块发送完后马上发送“校验和”B接收数据并将其转贮到数据缓冲区buf每接收到一个数据便计算一次“校验和”,当收齐一个数据块后,再接收A发来的校验和,并将它与B求出的校验和比较。若两者相等,接收正确,B机回答0 x00;若两者不等,接收不正确,B机回答0 xFF,请求重发。A收到0 x00的回答后,结束发送。若收到的答复非零,则将数据再重发一次。双方波特率为9600bps(fosc110592MHz),,.,8051点对点通信,串口通信初使化:波特率:1200bpsBaud=2SMOD(T1溢出率/32)方式:10位异步传输方式,voidsbuf_init(void)PCON=0 x00;SCON=0 x50;TMOD=(TMOD,.,8051点对点通信_发送,voidsend(ucharidata*d)uchari;doSBUF=0 xAA;while(TI=0);TI=0;while(RI=0);RI=0;while(SBUF!=0 xBB);dopf=0;for(i=0;i16;i+)pf+=di;SBUF=di;while(TI=0);TI=0;SBUF=pf;while(TI=0);TI=0;while(RI=0);RI=0;while(SBUF!=0);,.,8051点对点通信_接收,voidreceive(ucharidata*d)uchari;dowhile(RI=0);RI=0;while(SBUF!=0 xAA);SBUF=0 xBB;while(TI=0);TI=0;while(1)pf=0;for(i=0;i16;i+)while(RI=0);RI=0;di=SBUF;pf+=di;while(RI=0);RI=0;if(SBUF=pf)SBUF=0 x00;break;elseSBUF=0 xFF;while(TI=0);TI=0;,.,8051点对点通信,主程序main()#defineTR1voidmain(void)sbuf_init();if(TR=0)send(buf);elsereceive(buf);对于点对点通信双方,可编制含有初始化函数、发送函数、接收函数的程序。

温馨提示

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

评论

0/150

提交评论