单片机原理与应用基于汇编、C51与混合编程第7章中断控制定时计数器与PCAPWM应用_第1页
单片机原理与应用基于汇编、C51与混合编程第7章中断控制定时计数器与PCAPWM应用_第2页
单片机原理与应用基于汇编、C51与混合编程第7章中断控制定时计数器与PCAPWM应用_第3页
单片机原理与应用基于汇编、C51与混合编程第7章中断控制定时计数器与PCAPWM应用_第4页
单片机原理与应用基于汇编、C51与混合编程第7章中断控制定时计数器与PCAPWM应用_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

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

文档简介

系统扩展设计及例题的介绍与实际应用相结合,原理图中给出了各元器件的实际应用参数。在第7-12章中的每一道例题都采用汇编、C51两种语言分别编程实现。第12章中数字显示温度计、RLC测量仪两个应用实例的电路及程序都通过了验证。2第7章中断控制、定时/计数器及PCA/PWM的应用3主要内容7.1中断的概念7.2中断系统的结构7.3中断寄存器7.4低压检测中断7.5外部中断7.6定时/计数器T0、T1的工作方式7.7定时/计数器T0、T1的应用举例7.8定时/计数器T2的工作方式及应用7.9PCA/PWM模块的结构及应用47.1中断的概念1.中断源及中断请求中断请求RETI主程序响应中断中断服务子程序返主程序继续执行主程序中断请求PC断点PC断点对于一个中断源,中断请求信号产生一次,CPU中断一次,而不能出现中断请求一次,CPU响应多次的情况,所以要求中断信号及时撤除。产生中断请求的事件,称为中断源。STC12C5A60S2单片机有10个中断源:外部中断0、定时/计数器T0、外部中断1、定时/计数器T1、串行口1(UART1)、A/D转换、串行口2(UART2)、低压检测(LVD)中断、PCA中断和SPI中断。57.1中断的概念1.中断源及中断请求

对突发事故,做出紧急处理。根据现场随时变化的各种参数、信息,做出实时监控。

CPU与外部设备并行工作,以中断方式相联系,提高工作效率。在多项外部设备同时提出中断请求情况下,CPU能根据轻重

缓急响应外设的中断请求。

中断的作用:67.1中断的概念2.中断优先权控制3.中断允许与中断屏蔽4.中断响应与中断返回当有中断请求时,如果CPU正在执行某一条指令,需要执行完当前指令后再响应中断,如果正在执行RETI,或者是访问IE、IP寄存器指令时,需要执行完当前指令后,再执行一条指令才响应中断。CPU同一时间只能响应一个中断请求。若同时来了两个或两个以上中断请求,就必须有先有后。

!!!在中断系统中,有一个总中断使能位控制所有中断是否允许,另外每个中断源还有各自的中断使能位控制该中断是否允许,只有在总的中断允许及相应中断也允许时,CPU才能响应中断。另外,当有高优先级中断正在响应时,也会屏蔽同级中断和低优先级中断。77.2中断系统的结构中断源、中断请求中断允许寄存器IE和IE287.3中断寄存器1.中断允许寄存器IEIE寄存器的地址为A8H,可进行位寻址D7D6D5D4D3D2D1D0EAELVDEADCESET1EX1ET0EX0CPU的中断允许控制位,当EA=0时,所有的中断源请求均被屏蔽;当EA=1时,允许CPU检测中断源的标志位。EA的作用使中断允许形成两级控制,即各中断源首先受EA控制,其次还受各中断源自己的中断允许控制位控制。低压检测中断允许位。当ELVD=0时,禁止低压检测中断;当ELVD=1,允许低压检测中断。A/D转换中断允许位。当EADC=0时,禁止A/D转换中断;当EADC=1时,允许A/D转换结束时中断。串行口1中断允许控制位。当ES=0时,禁止串行口1中断;当ES=1时,允许串行口1中断。定时/计数器T1溢出中断允许控制位。当ET1=0时,禁止T1中断;当ET1=1时,允许T1中断外部中断1中断允许控制位。当EX1=0时,禁止外部中断1中断;当EX1=1时,允许外部中断1中断定时/计数器T0溢出中断允许控制位。当ET0=0时,禁止T0中断;当ET0=1时,允许T0中断外部中断0中断允许控制位。当EX0=0时,禁止外部中断0中断;当EX0=1时,允许外部中断0中断97.3中断寄存器1.中断允许寄存器IE2IE2的地址为AFH,不能进行位寻址D7D6D5D4D3D2D1D0------ESPIES2SPI串行通信中断允许位。ESPI=0时,禁止SPI中断;当ESPI=1,允许SPI中断串行口2中断允许控制位。当ES2=0时,禁止串行口2中断;当ES2=1时,允许串行口2中断107.2中断系统的结构STC系列单片机复位后,IE和IE2寄存器的各位均被清0,即所有中断源均处于禁止状态,由用户程序对寄存器IE和IE2相应的位置1或清0,实现允许或禁止各中断源的中断请求。要改变IE寄存器各控制位的状态既可以用字节操作指令MOVIE,#DATA来实现,也可用位操作指令SETB或CLR实现。改变IE2寄存器的各控制位,只能用字节操作指令来实现,如:MOVIE2,#DATA。

117.2中断系统的结构127.2中断系统的结构中断优先级控制寄存器IP、IP2和IPH、IP2H137.3中断寄存器2.中断优先级控制寄存器IP、IP2和IPH、IP2HD7D6D5D4D3D2D1D0PPCAPLVDPADCPSPT1PX1PT0PX0IP寄存器的地址为B8H,可进行位寻址D7D6D5D4D3D2D1D0PPCAHPLVDHPADCHPSHPT1HPX1HPT0HPX0HIPH寄存器的地址为B7H,不能进行位寻址PPCAH、PPCA为PCA中断优先级的高、低位PLVDH、PLVD为低压检测中断优先级的高、低位PADCH、PADC为A/D转换中断优先级的高、低位PSH、PS为串行口1中断优先级的高、低位PT1H、PT1为定时/计数器1中断优先级的高、低位PX1H、PX1为外部中断1中断优先级的高、低位PT0H、PT0为定时/计数器T0中断优先级的高、低位PX0H、PX0为外部中断0中断优先级高、低位147.3中断寄存器2.中断优先级控制寄存器IP、IP2和IPH、IP2HD7D6D5D4D3D2D1D0------PSPIPS2D7D6D5D4D3D2D1D0------PSPIHPS2HIP2寄存器的地址为B5H,不能进行位寻址IP2H寄存器的地址为B6H,不能进行位寻址PSPIH,PSPI为SPI串行口中断优先级的高、低位PS2H、PS2为串行口2中断优先级的高、低位157.2中断系统的结构IPH.X、IP.X或IP2H.X、IP2.X为11时为最高优先级中断IPH.X、IP.X或IP2H.X、IP2.X为10时为2级中断IPH.X、IP.X或IP2H.X、IP2.X为01时为1级中断IPH.X、IP.X或IP2H.X、IP2.X为00时为最低优先级中断167.3中断寄存器2.中断优先级控制寄存器IP、IP2和IPH、IP2HD7D6D5D4D3D2D1D0PPCAPLVDPADCPSPT1PX1PT0PX0PPCAPLVDPADCPSPT1PX1PT0PX0------PSPIPS2------PSPIPS2上电复位后,中断优先级控制寄存器IP、IP2、IPH和IP2H中的各位均为0IP寄存器的内容可通过位操作指令或字节操作指令来改变,而IP2、IPH和IP2H寄存器的内容只能通过字节操作指令来改变。177.3中断寄存器各中断源中断优先查询次序中断查询序号中断源中断服务程序的入口地址0INT00003H1T0000BH2INT10013H3T1001BH4URAT10023H5ADC002BH6LVD0033H7PCA003BH8UART20043H9SPI004BH使用C语言编程,中断查询次序号就是中断号当几个中断源都在同一个优先级,其中的几个中断源同时产生中断请求,响应中断的次序取决于内部的查询次序。18中断处理的流程图19中断服务程序的流程图

在低优先级中断服务程序中,保护现场和恢复现场的过程,不允许高优先级的中断源中断,以免现场遭到破坏。

20以外部中断1为例,其中断服务处理程序ORG0013H;外部中断1的入口地址LJMPINT1;在中断入口处放一条长转移指令……INT1:CLREAPUSHPSWPUSHACCPUSHDPHPUSHDPL……SETBEA……;执行中断任务CLREA……POPDPLPOPDPHPOPACCPOPPSWSETBEARETI保护现场恢复现场217.4低压检测中断烧写程序时可以将P4.6引脚设置为第二复位引脚RST2,若烧写程序时没有将P4.6引脚设置为第二复位引脚RST2,P4.6为低压检测中断引脚EX_LVD----LVD_P4.6ALE_P4.5NA_P4.4----P4SW功能切换寄存器LVD_P4.6

=0时P4.6为低压检测中断引脚EX_LVDLVD_P4.6

=1时P4.6为I/O引脚227.4低压检测中断若烧写程序时没有将P4.6引脚设置为第二复位引脚RST2,P4.6为低压检测中断引脚EX_LVDD7D6D5D4D3D2D1D0SMODSMOD0LVDFPOFGF1GF0PDIDL电源控制寄存器PCONEX_LVD引脚输入的电压低于低压检测电压门槛值1.33V时,LVDF位自动置1请求中断,注意:上电复位后,电源控制寄存器PCON中的外部低压检测标志位LVDF为1,要由软件清零(注意该位不可位寻址),建议清零后,再读一次该位,若仍然为1,说明电源还未达到正常值,应再次将该位清零,直至检测到该位为0时再转入正常运行

当外部供电电压产生波动时,无法保证单片机正常工作,可以在单片机的外部低压检测中断服务程序中保存相关数据,避免掉电后数据丢失。

237.5外部中断外部中断0输入引脚外部中断1输入引脚247.5外部中断TCON寄存器的地址为88H,可进行位寻址D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0IT1:外部中断1触发方式选择位。若IT1=0,引脚输入低电平信号触发中断;若IT1=1,引脚为下降沿触发方式外部中断1请求中断标志。若外部中断1输入引脚产生外部触发信号时,硬件将IE1位置1,外部中断1设置为下降沿触发方式时,CPU响应该中断时由硬件自动将IE1位清0,如果设置为低电平触发方式,必须在程序中通过指令清0外部中断0触发方式选择位。若IT0=0,引脚输入低电平信号触发外部中断;若IT0=1,引脚为下降沿触发方式外部中断0请求中断标志。若外部中断0输入引脚产生外部触发信号时,硬件将IE0位置1,外部中断0设置为下降沿触发方式时,当CPU响应该中断时由硬件自动将IE0清0,如果设置为低电平触发方式,必须在程序中通过指令清0257.5外部中断IT0IE0IT1IE1注意:如果外部中断设置为下降沿触发方式时,必须在该外部中断输入引脚至少保持1个系统时钟周期的高电平及1个时钟周期的低电平,才能保证CPU检测到该下降沿。同样,如果外部中断为低电平触发,则须在该引脚至少保持2个系统时钟周期的低电平,这样才能保证CPU能够检测到该低电平信号。267.6定时/计数器T0、T1的工作方式定时/计数器T0和T1工作方式寄存器TMOD的地址为89HT1工作方式控制T0工作方式控制计数、定时方式的选择位。为0时,定时/计数器工作在定时方式;为1时,定时/计数器工作在计数方式,对外部T0、T1引脚输入的脉冲计数定时/计数器门控方式选择位M1、M0:定时/计数器工作方式的选择位M1M0工作方式00方式001方式110方式211方式3D7D6D5D4D3D2D1D0GATEM1M0GATEM1M027TCON寄存器的地址为88H,可进行位寻址D7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0定时/计数器T1的溢出中断标志。当T1从初值开始加1计数计满产生溢出时,由硬件使该位置1。中断响应后由内部硬件电路自动清0。定时/计数器T1的运行控制位。由软件置位或清0,置位时,定时/计数器T1开始工作;清0时,T1停止工作。定时/计数器T0的运行控制位。由软件置位或清0,置位时,定时/计数器T0开始工作;清0时,T0停止工作。定时/计数器T0的溢出中断标志。当T0从初值开始加1计数计满产生溢出时,由硬件使该位置1,中断响应后由内部硬件电路自动清0。7.6定时/计数器T0、T1的工作方式287.6定时/计数器T0、T1的工作方式7.6.1方式013位的定时/计数器的低5位13位的定时/计数器的高8位辅助寄存器AUXR的T0x12位D7D6D5D4D3D2D1D0T1x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRST0x12D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0T0和T1工作方式寄存器TMODD7D6D5D4D3D2D1D0TF1TR1TF0TR0IE1IT1IE0IT0T0和T1控制寄存器TCOND7D6D5D4D3D2D1D0GATEM1M0GATEM1M0297.6定时/计数器T0、T1的工作方式7.6.2方式116位的定时/计数器的低8位16位的定时/计数器的高8位307.6定时/计数器T0、T1的工作方式7.6.3方式2辅助寄存器AUXR的T1x12位D7D6D5D4D3D2D1D0T0x12UART_M0x6BRTRS2SMODBRTx12EXTRAMS1BRST1x12D7WAKED6D5D4D3D2D1D0PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKEBRTCLKOT1CLKOT0CLKO唤醒控制寄存器WAKE_CLKOT0、T1工作在方式2时均有可编程时钟输出功能,在该模式—P3.4、P3.5作为时钟输出引脚CLKOUT0、CLKOUT1。

当T0CLKO或T1CLKO位置1后,工作在方式2的T0或T1的溢出将对CLKOUT0或CLKOUT1引脚取反,即输出的时钟频率=T0(或T1)溢出率/2。317.6定时/计数器T0、T1的工作方式7.6.4方式3327.7定时/计数器T0、T1的应用举例在应用定时/计数器资源时,按照以下几个步骤进行:(1)确定工作方式,对方式控制寄存器TMOD赋值D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0(2)根据要求计算初值并装入寄存器THx、TLx337.7定时/计数器T0、T1的应用举例在应用定时/计数器资源时,按照以下几个步骤进行:(1)确定工作方式,对方式控制寄存器TMOD赋值(2)根据要求计算初值并装入寄存器THx、TLx实际定时时间Tc=(M-X)×Tp计数初值:X=M-(3)根据需要开放定时/计数器中断,即EA、ETx置1(4)启动定时/计数器开始工作,即TRx位置1(5)编写中断服务程序或查询处理方式程序34【例7-1】设STC12C5A60S2单片机的系统时钟频率为12MHz,利用定时/计数器T0编程实现从P3.4引脚输出周期为500μs的方波。分析:从P3.4引脚输出周期为500μs的方波,即只需P3.4每250μs取反一次。由于方式2中有时钟输出功能,fosc=12MHz时,最大的定时时间为256μs,满足250μs的定时要求,选择定时/计数器T0工作于方式2。T0x12位置0,初值X=M-=256-250=6,即TH0=TL0=06H。35WAKE_CLKOEQU8FHORG0000H LJMPMAINORG0100HMAIN:MOVSP,#0BFHMOVTMOD,#02H;T0工作在方式2ORLWAKE_CLKO,#01H;T0工作在时钟输出方式MOVTH0,#06H;给T0的高8位赋初值MOVTL0,#06H;给T0的低8位赋初值SETBTR0;定时/计数器T0开始计数SJMP$END(1)汇编程序:D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0D7D6D5D4D3D2D1D0PCAWAKEUPRXD_PIN_IET1_PIN_IET0_PIN_IELVD_WAKEBRTCLKOT1CLKOT0CLKO36(2)C51程序:#include<STC12C5A.h>/*STC12C5Axx系列单片机片内资源的头文件*/ voidmain(){ TMOD=0x02;//工作在方式2 WAKE_CLKO=(WAKE_CLKO|0x01);//时钟输出方式 TL0=0x06;//给T0装入初值 TH0=0x06; TR0=1;//启动T0计数 while(1);}37【例7-2】利用STC12C5A60S2单片机的定时/计数器T0功能,在P1.0引脚输出周期为2ms的方波,假设系统时钟频率为6MHz,编写相应的程序。分析:若要产生2ms的方波,只需要每1ms对P1.0引脚的输出取反一次,1ms的定时超过方式2的最大计数值256,故可采用方式1定时中断的方式实现。计数初值X=216-500=65036=1111111000001100B,即TH0=FEH,TL0=0CH初值计算:T0x12位为0,Tp===2μs,计数次数N===500(1) 汇编程序:38ORG0000HLJMPMAIN

ORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针

MOVTMOD,#01H;T0工作在方式1MOVTL0,#0CH;给T0装入初值MOVTH0,#0FEHSETBEA;开放总中断SETBET0;T0的溢出中断允许SETBTR0;T0开始计数SJMP$ORG000BH;T0的中断入口地址LJMPT0_INTT0_INT:MOVTL0,#0CH;重新给T0赋初值MOVTH0,#0FEHCPLP1.0;P1.0引脚取反RETI;中断返回END39(2)C51程序:#include<STC12C5A.h>//STC12C5Axx头文件sbitP1_0=P1^0;voidmain(){TMOD=0x01;//T0工作在方式1TL0=0x0C; //给T0装入初值TH0=0xFE;EA=1;//开放总中断ET0=1;//T0溢出中断允许TR0=1;//启动T0计数while(1);}voidT0_INT()interrupt1//T0中断服务程序{TL0=0xC0;//给T0置入初值TH0=0xFE;P1_0=!P1_0;}//对P1.0引脚取反

40【例7-3】设STC12C5A60S2单片机的系统时钟频率为12MHz,编程实现从P1.1引脚输出周期为1s的方波。分析:根据题目要求知,P1.1引脚的输出应每隔500ms取反一次,即定时时间为500ms。用一个定时/计数器无法实现,可用定时/计数器T1进行10ms的定时,然后用寄存器R7对10ms定时中断次数计数50次来实现。定时/计数器T1定时10ms,选择对系统时钟的12分频模式,T1x12位为0,Tc=10ms,fosc=12MHz,可知计数次数N=10000,选择方式1。初值X=216-10000=55536=D8F0H,则TH1=D8H,TL1=F0H。(1)汇编程序:41ORG0000HLJMPMAINORG001BH;T1的中断向量入口地址LJMPT1_INTORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针MOVTMOD,#10H;T1工作在方式1MOVTL1,#0F0H;给T1写入初值MOVTH1,#0D8HMOVR7,#50;利用寄存器R7计数50次SETBEA;开放总中断SETBET1;T1溢出中断允许SETBTR1;启动T1开始工作SJMP$T1_INT:MOVTL1,#0F0H;重新赋初值 MOVTH1,#0D8H42DJNZR7,NEXT;R7减1不为0,中断次数未到50次,;跳转到NEXT处返回CPLP1.1;已定时中断50次,P1.1引脚取反MOVR7,#50;重新赋给R7值50NEXT:RETIEND43(2)C51程序:#include<STC12C5A.h>/*STC12C5Axx系列单片机片头文件*/sbitP1_1=P1^1;unsignedchari=0;voidmain(){TMOD=0x10;//T1工作在方式1TL1=0xF0;//给T1装入初值TH1=0xD8;EA=1;//开放总中断ET1=1;//T1溢出中断允许TR1=1;//启动T1开始工作while(1);}44

voidT1_INT()interrupt3//T1中断服务程序{ TH1=0xD8; TL1=0xF0;//重新置入初值 i++;if(i==50) { P1_1=!P1_1;//已定时中断50次,对P1.1取反 i=0;}}45【例7-4】用T0作为计数器计数一生产流水线上的工件,每生产100个工件,发出一包装命令,包装成一箱,并记录其箱数,45100个包装命令46【例7-4】用T0作为计数器计数一生产流水线上的工件,每生产100个工件,发出一包装命令,包装成一箱,并记录其箱数,分析:根据题目要求,设单片机的系统时钟频率为12MHz,可选择T0工作在方式2的计数状态,每计数100个工件中断一次,计数初值为256-100=156=9CH,在中断服务程序中输出包装命令。D7D6D5D4D3D2D1D0GATEM1M0GATEM1M0用R4、R5组成16位箱数计数器,每中断一次,对R4、R5组成的计数器加1。显示电路及显示程序在此省略。(1)汇编程序:48ORG0000HLJMPMAINORG000BH;T0的中断入口地址LJMPT0_INT;转向中断服务程序 ORG0100HMAIN:MOVSP,#0AFH;初始化堆栈指针

SETBP1.0;P1.0为高电平MOVR5,#0;箱数计数器清“0”MOVR4,#0MOVTMOD,#6;T0工作在方式2的计数状态MOVTL0,#9CH;计数初值送计数器MOVTH0,#9CHSETBEA;CPU开放总中断SETBET0;T0溢出允许中断SETBTR0;启动T0计数

SJMP$

49T0_INT:PUSHPSW;保护现场PUSHACC

CLRP1.0;输出包装命令MOVA,R5;箱计数器加“1”ADDA,#1MOVR5,AMOVA,R4ADDCA,#0MOVR4,A......;延迟5ms,让包装命令可靠有效

SETBP1.0;包装命令结束POPACC;恢复现场POPPSWRETI;中断返回END50(2)C51程序:#include<STC12C5A.h>/*STC12C5Axx系列单片机头文件*/#include<intrins.h>//声明本征函数库unsignedintj=0;sbitP1_0=P1^0;voidmain(){P1_0=1;//P1.0为高电平TMOD=0x06;//T0工作在方式2的计数状态TL0=0x9C;//给T0置入初值TH0=0x9C;EA=1;//开放总中断ET0=1;//T0溢出中断允许TR0=1;//启动T0开始工作while(1);//等待}51voidT0_INT()interrupt1//中断服务程序{j++;

P1_0=0;//P1.0为低电平unsignedchara,b,c;for(c=4;c>0;c--)//延时5msfor(b=212;b>0;b--)for(a=140;a>0;a--)_nop_();

P1_0=1;//P1.0为高电平}52【例7-5】利用定时/计数器T1门控信号GATE功能,测量P3.3引脚上正脉冲信号的宽度(单位为μs)。INT1INT1为高时T开始计数INT1为低时T1停止计数12MHz100111闭合16位计数保存到R6R700计数值

即µs数宽度≤65ms53(1)汇编程序:ORG0000HLJMPMAIN ;跳到主程序入口ORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针SPMOVTMOD,#90H;方式1,GATE、TR1控制T1MOVTL1,#00H ;计数器初值为0MOVTH1,#00HWAITL:JBP3.3,WAITL ;若P3.3引脚为高电平,则等待,SETBTR1 ;当P3.3引脚为低电平时,置位TR1WAITH:JNBP3.3,WAITH ;等待P3.3引脚变高电平WAITHL:JBP3.3,WAITHL;等待P3.3引脚的下降沿CLRTR1 ;下降沿到来,关闭定时/计数器T1MOVR6,TH1;测量结束,读取数据MOVR7,TL1SJMP$END54(2)C51程序:#include<STC12C5A.h>//STC12C5Axx系列单片机头文件sbitP3_3=P3^3;unsignedinttemp=0;voidmain(){TMOD=0x90;//T1工作在方式1

TH1=0x00;//计数器初值为0TL1=0x00;while(P3_3==1);//P3.3为高电平时,等待TR1=1; //P3.3为低电平时,启动T1工作while(P3_3==0);//P3.3为低电平时,等待while(P3_3==1);//P3.3为高电平时,等待TR1=0;//P3.3出现下降沿时,T1停止工作temp=TH1;//读出定时/计数器T1的值temp=(temp<<8)|TL1;while(1);}557.9PCA/PWM模块的结构及应用在STC12Cxx、STC15Fxx等各系列单片机中,没有定时/计数器T2,而是增加了2-4路可编程计数器阵列(PCA)模块每个PCA模块均可以设置为4种工作模式:边沿触发捕获、时钟输出、软件定时及脉宽调制(PWM)输出本节主要以具有2路可编程计数器阵列的STC12C5A60S2单片机为例介绍PCA/PWM模块567.9.1PCA/PWM模块的结构由CL、CH两个8位寄存器组成PCA单元电路内的两个模块共用一个16位的定时/计数器(CH和CL)作为公共时间基准

577.9.2PCA16位定时/计数器由CL、CH两个8位寄存器组成,其地址分别为0E9H、0F9HPCA方式寄存器CMOD设定其工作方式PCA控制寄存器CCON控制其工作587.9.2PCA16位定时/计数器由CL、CH两个8位寄存器组成,其地址分别为0E9H、0F9HPCA方式寄存器CMOD设定其工作方式PCA控制寄存器CCON控制其工作CIDL:空闲模式下是否停止PCA计数的控制位CIDL=0空闲模式下PCA计数器继续工作CIDL=1空闲模式下PCA计数器停止工作PCA计数器溢出中断使能位ECF=0禁止计数器溢出中断ECF=1允许计数器溢出中断PCA计数器的时钟来源由CPS2、CPS1、CPS0三位控制单片机是否处于空闲模式597.9.2PCA16位定时/计数器由CL、CH两个8位寄存器组成,其地址分别为0E9H、0F9HPCA方式寄存器CMOD设定其工作方式PCA控制寄存器CCON控制其工作单片机是否处于空闲模式PCA计数器溢出中断标志位PCA计数器启动控制位CCF1、CCF0:PCA模块1及模块0的中断标志位607.9.2PCA16位定时/计数器1.PCA工作方式寄存器CMOD地址为D9H计数器的时钟来源CPS2CPS1CPS0计数器的时钟源000fosc/12(系统时钟12分频)001fosc/2010定时/计数器T0的溢出脉冲011ECI(P1.2)引脚输入的外部时钟100fosc101fosc/4110fosc/6111fosc/82.PCA控制寄存器CCON地址为D8H,可以进行位寻址617.9.3PCA/PWM各个模块的特殊功能寄存器1.PCA各模块的工作方式寄存器CCAPM0和CCAPM1地址分别为DAH和DBH627.9.3PCA/PWM各个模块的特殊功能寄存器D7D6D5D4D3D2D1D0-ECOMnCAPPnCAPNnMATnTOGnPWMnECFFn比较器允许/禁止控制位,ECOMn=1时有效1.PCA各模块的工作方式寄存器CCAPM0和CCAPM1地址分别为DAH和DBH上升沿捕获允许/禁止控制位,CAPPn=1时允许下降沿捕获允许/禁止控制位,CAPNn=1时允许匹配允许/禁止控制位,MATn=1时允许反转允许/禁止控制位,TOGn=1时允许脉冲宽度调制允许/禁止位,PWMn=1时允许模块n中断使能位,ECFFn=1时,允许模块n的CCFn标志位被置1后产生中断。637.9.3PCA/PWM各个模块的特殊功能寄存器2.PCA各模块的比较/捕获寄存器—CCAPnL(低位字节)CCAPnH(高位字节)地址分别为:CCAP0L:EAH;CCAP0H:FAH;CCAP1L:EBH;CCAP1H:FBH647.9.3PCA/PWM各个模块的特殊功能寄存器3.PCA模块中PWM方式辅助寄存器PCA_PWM0和PCA_PWM1地址分别为F2H和F3H657.9.3PCA/PWM各个模块的特殊功能寄存器3.PCA模块中PWM方式辅助寄存器PCA_PWM0和PCA_PWM1地址分别为F2H和F3HD7D6D5D4D3D2D1D0------EPCnHEPCnL在PWM方式下,与CCAPnH组成9位数,EPCnH为最高位在PWM方式下,与CCAPnL组成9位数,EPCnL为最高位由CL、CH两个8位寄存器PCA方式寄存器CMODPCA控制寄存器CCON工作方式寄存器:CCAPM0和CCAPM1比较/捕获寄存器CCAPnL和CCAPnHPWM方式辅助寄存器PCA_PWM0和PCA_PWM1677.9.4PCA/PWM模块的工作方式及应用1.捕获方式11100000可在中断服务程序中判断哪一个模块产生了中断,注意中断标志位必须由软件清零68【例7-7】采用STC12C5A60S2单片机PCA的捕获方式测量低频矩形波的周期及占空比,假设系统时钟频率为12MHz。PCA的模块0输入引脚P1.3作为信号输入端刚开始测量时为高电平,需要等待检测到为低电平时需要继续等待PULSE_W1EQU51H;保存CH值PULSE_W2EQU52H;保存CL值;脉宽计时PULSE_T1EQU54H;保存CH值PULSE_T2EQU55H;保存CL值;周期计时如果脉宽大于CH、CL的最大计时周期该怎么办?PULSE_W0EQU50H;脉宽计时最高字节PULSE_T0EQU53H;周期计时最高字节69(1)汇编程序:CCONEQU0D8H;PCA控制寄存器CMODEQU0D9H;PCA模式寄存器CLEQU0E9H;PCA定时/计数器的低8位CHEQU0F9H;PCA定时/计数器的高8位CCAPM0EQU0DAH;PCA模块0的模式寄存器CCAP0LEQU0EAH;PCA模块0的捕获寄存器低8位CCAP0HEQU0FAH;PCA模块0的捕获寄存器的高8位CRBITCCON.6;PCA定时控制位CFBITCCON.7;PCA溢出标志位CCF0BITCCON.0;PCA模块0的中断标志位70PULSE_W0EQU50H;脉宽计时的最高字节PULSE_W1EQU51HPULSE_W2EQU52H;脉宽计时的最低字节PULSE_T0EQU53H;周期计时的最高字节PULSE_T1EQU54HPULSE_T2EQU55H;周期计时的最低字节ORG0000HLJMPMAINORG003BH;PCA中断入口地址LJMPPCA_INT71ORG0100HMAIN:MOVSP,#0BFH;初始化堆栈指针CLRAMOVCL,A;PCA计数寄存器清0MOVCH,AMOVPULSE_W0,AMOVPULSE_T0,AMOVCCON,A;初始化PCA控制寄存器MOVCMOD,#01H;系统时钟的12分频为PCA时钟源,;允许PCA计数器溢出中断MOVCCAPM0,#31H;允许上升沿、下降沿捕获中断SETBP1.3NOP;等待P1.3引脚输出稳定NOPNOPNOPD7D6D5D4D3D2D1D0CFCR----CCF1CCF0D7D6D5D4D3D2D1D0CIDL---CPS2CPS1CPS0ECFD7D6D5D4D3D2D1D0-ECOMnCAPPnCAPNnMATnTOGnPWMnECCFn72WAIT1:JBP1.3,WAIT1;若P1.3引脚处在高电平,则等待低电平WAIT2:JNBP1.3,WAIT2;若P1.3引脚为低,则等待上升沿SETBCR;上升沿到来,启动16位定时/计数器工作CLRCF;清中断标志CLRCCF0NOPSETBEA;开放总中断SJMP$73PCA_INT:PUSHPSWCLRCF;清溢出中断标志JNBP1.3,PLUSET;P1.3引脚为低PLUSET:INCPULSE_T0;周期高字节加1CAP_CCF0:JNBCCF0,EXIT;无边沿触发,退出CLRCCF0;清边沿触发中断标志JBP1.3,CAP_UP;上升沿捕获,结束MOVPULSE_W2,CCAP0L;是下降沿捕获,MOVPULSE_W1,CCAP0H;脉宽计时读出LJMPEXITJNBCF,CAP_CCF0;如果不是计数器溢出,则转移INCPULSE_W0;为高,脉宽高字节加1CAP_UP:CLRCR;一个周期检测结束,计数器停止工作MOVPULSE_T2,CCAP0L;将一个周期宽度读出来MOVPULSE_T1,CCAP0H74……;计算部分略EXIT:POPPSWRETIEND75(2)C51程序:#include<STC12C5A.h>//STC12C5Axx系列单片机头文件#include<intrins.h>//声明本征函数库#defineucharunsignedcharsbitP1_3=P1^3;ucharPULSE_W0,PULSE_W1,PULSE_W2,PULSE_T0,PULSE_T1,PULSE_T2;voidmain(){CL=0x00;//计数器初值复位CH=0x00;CCON=0x00;CMOD=0x01;//选择时钟源为12分频,允许计数溢出中断CCAPM0=0x31;//允许上升沿、下降沿捕获中断76P1_3=1;_nop_();//等待P1.3引脚输出稳定_nop_();_nop_();_nop_();while(P1_3==1);//若P1.3引脚为高,则等待低电平while(P1_3==0);//若P1.3引脚为低,则等待上升沿CR=1;//检测到P1.3引脚为上升沿,启动计数器工作CF=0;//清溢出中断标志CCF0=0;//清捕获中断标志_nop_();EA=1;//开放总中断while(1);}77voidPCA_INT()interrupt7{if(CF==1)//若计数器溢出{

CF=0;//清溢出标志CFif(P1_3==1)//P1.3引脚为高电平时{PULSE_W0++;//脉宽计数的最高字节加1PULSE_T0++;//周期计数的最高字节加1}elsePULSE_T0++;//P1.3引脚为低,只对周期最高字节加1}78if(CCF0==1)//若捕获中断溢出{CCF0=0;//清捕获中断标志CCF0if(P1_3==0)//检测到P1.3引脚为下降沿捕获时{PULSE_W2=CCAP0L;//读出脉冲宽度PULSE_W1=CCAP0H;}{CR=0;PULSE_T2=CCAP0L;

温馨提示

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

评论

0/150

提交评论