第4章80C51的定时/计数器与中断系统思考题与习题[思考题与习题]1.80C51单片机的定时/计数器的定时和计数两种功能各有什么特点?脉冲源不同2.当定时/计数器的加1计数器计满溢出时,溢出标志位TF1由硬件自动置1,简述对该标志位的两种处理方法。查询软件清除和中断硬件自动清除3.当定时/计数器工作于方式0时,晶振频率为12MHz,请计算最小定时时间、最大定时时间、最小计数值和最大计数值。最小计数值为1,最小定时时间为1us最大计数值位213,最大计数时间为8.19ms4.80C51单片机的定时/计数器四种工作方式各有什么特点?5.当定时/计数器T0用作方式3时,定时/计数器T1可以工作在何种方式下?0、1、2,如何控制T1的开启和关闭?设置工作方式6.硬件定时与软件定时的最大区别是什么?不占用CPU7.根据定时/计数器0方式1逻辑结构图,分析门控位GATE取不同值时,启动定时器的工作过程。8.用方式0设计两个不同频率的方波,P1.0输出频率为200Hz,P1.1输出频率为100Hz,晶振频率12MHz。ORG0000HSTART:MOVTMOD,#00H;(主程序开始)定时器T1工作方式0CLRP1.0;设置方波的起始状态CLRP1.1MOVR2,#0MOVTL1,#0CHMOVTH1,#0F0H;送初值,保证定时时间为500usSETBTR1;启动定时器LOOP:JNBTF1,$;查询是否溢出,等待500us定时到CLRTF1;清溢出标志,以便下次判断MOVTL1,#0CH;溢出处理MOVTH1,#0F0H;再送计数初值,保证定时时间始终为500usINCR2CJNER2,#5,LOOPMOVR2,#0CPLP1.0;改变P1.0的状态JNBP1.0,LOOPCPLP1.1;P1.0的上升沿,改变P1.1的状态SJMPLOOP;产生连续的方波END5ms10ms解:①TMOD初始化:GATE=0,C/T=0,M1M0=00B②计算定时500us初值:方式0:X=213-500=7692=1E0CH=1111000001100B9.P1.0输出脉冲宽度调制(PWM)信号,即脉冲频率为2kHz、占空比为7:10的矩形波,晶振频率12MHz。查询方式:ORG0000HSTART:MOVTMOD,#10H;(主程序开始)定时器T1工作方式1CLRP1.0;设置方波的起始状态MOVTL1,#0A1HMOVTH1,#0FEH;送初值,保证定时时间为350usSETBP1.0SETBTR1;启动定时器LOOP:JNBTF1,$;查询是否溢出,CLRTF1;清溢出标志,以便下次判断JNBP1.0,N0;现在为低电平时,150us定时到,转移MOVTL1,#69H;溢出处理MOVTH1,#0FFH;再送计数初值,保证定时时间始终为150usSJMPN1N0:MOVTL1,#0A1H;溢出处理MOVTH1,#0FEH;再送计数初值,保证定时时间始终为350usN1:CPLP1.0;改变P1.0的状态SJMPLOOP;产生连续的7:10的矩形波END方式1:X=216-t/T=216-1/2000*30%*12*106/12=FF69H方式1:X=216-t/T=216-1/2000*70%*12*106/12=FEA1H解:①TMOD初始化:GATE=0,C/T=0,M1M0=10B②计算初值:方式2:X=28–t(fosc/12)=256-125(12/12)=83HORG0000HSTART:MOVTMOD,#02H;定时器T0工作方式2CLRP1.0;设置方波的起始状态MOVTL0,#83H;送计数初值,MOVTH0,#83H;保证定时时间始终为125μsSETBTR0;启动定时器LOP:JBCTF0,$;等待125μs定时到JNBP3.0,L0;P3.0=0JNBP3.1,L1;P3.1=0,P3.0=1,产生1kHz方波CPLP1.0;P3.1=1,P3.0=1,产生4kHz方波SJMPLOP;产生连续的方波L0:JNBP3.1,L2;P3.1=0,P3.0=0,产生0.5kHz方波;P3.1=1,P3.0=0,P1.0产生2kHz方波CPL00H;改变00H的状态;00H,产生4kHz方波JNB00H,LOPCPLP1.0;00H位的上升沿,改变P1.0的状态,产生2kHz方波SJMPLOP;产生连续的方波10.两只开关分别接入P3.0、P3.1,在开关信号4种不同的组合逻辑状态,使P1.0分别输出频率0.5kHz、1kHz、2kHz、4kHz的方波,晶振频率为12MHz。查询方式。250μs解:①TMOD初始化:GATE=0,C/T=0,M1M0=10B②计算初值:方式2:X=28–t(fosc/12)=256-125(12/12)=83H10.两只开关分别接入P3.0、P3.1,在开关信号4种不同的组合逻辑状态,使P1.0分别输出频率0.5kHz、1kHz、2kHz、4kHz的方波,晶振频率为12MHz。查询方式。L1:;P3.1=0,P3.0=1,产生1kHz方波CPL01H;改变01H的状态;01H产生4kHz方波JNB01H,LOPCPL02H;改变02H的状态;02H,产生2kHz方波JNB02H,LOPCPLP1.0;02H位的上升沿,改变P1.0的状态产生1kHz方波SJMPLOPL2:;P3.1=0,P3.0=0,产生0.5kHz方波CPL03H;改变03H的状态;03H产生4kHz方波JNB03H,LOPCPL04H;改变04H的状态;04H,产生2kHz方波JNB04H,LOPCPL05H;改变05H的状态;05H产生1kHz方波JNB05H,LOPCPLP1.0;05H位的上升沿,改变P1.0的状态产生0.5kHz方波SJMPLOPEND250μs11.有一组高电平脉冲的宽度在50~100ms之间,利用定时器0测量脉冲的宽度,结果存放到片内RAM区以50H单元为首地址的单元中,晶振频率12MHz。参照【例4-5】ORG0000HLJMPMAINORG0100HMAIN:MOVR0,#50H;数据存储单元首地址MOVTMOD,#09H;置定时器1为方式1MOVTH0,#0FCH;定时1msMOVTL0,#18HJBP3.2,$;查询低电平SETBTR1;准备启动定时器1LP0:JNBP3.2,$;高电平到,启动定时器1LP1:JBCTF0,LP2JBP3.2,LP1INCR0;低电平到,停止定时器1,存储单元地址加1SJMPLP0;低电平到,停止定时器1LP2:INC@R0;存储溢出次数加1msMOVTH0,#0FCH;定时1msMOVTL0,#18HSJMPLP1方式1:X=216-t/T=216-1000/1=FC18HINT1INT1为高时T1开始计数INT1为低时T1停止计数宽度12.什么是中断?中断系统的功能和特点有哪些?13.8051单片机的中断源有几个?自然优先级是如何排列的?5int0、t0、int1、t1、TX$RX14.外部中断触发方式有几种?它们的特点是什么?15.中断处理过程包括几个阶段?16.请简述中断响应的过程。17.外部中断请求撤销时要注意哪些事项?18.中断系统的初始化一般包括哪些内容?19.扩展外部中断源的方法有几种?中断程序结构框架解:因方式2是8位计数器,其最大定时时间为:256×1s=256s,为实现1s延时,可选择定时时间为200s,再循环5000次。定时时间选定后,可确定计数值为200,则定时器0的初值为:X=M计数值=256200=56。采用定时器0,方式2工作,因此,TMOD=02H。ORG0000HMOVTMOD,#02H;置定时器0为方式2MOVTH1,#56;置定时器初值MOVTL1,#56CLRP1.0MAIN:MOVR5,#50;置20ms计数循环初值MOVR6,#100;置200s计数循环初值SETBTR1;启动定时器SETBP1.0LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;无溢出则继续计数LP2:DJNZR6,LP1;未到20ms继续循环MOVR6,#64HCLRP1.0DJNZR5,LP1;未到1s继续循环SJMPMAIN20.利用定时/计数器T0从P1.0输出周期为1s,脉宽为20ms的正脉冲信号,晶振频率为12MHz。试设计程序。参照【例4-6】1s21.要求从P1.1引脚输出1000Hz方波,晶振频率为12MHz。试设计程序。1msORG0000HAJMPSTART;跳转主程序ORG001BHLJMPPITO1;跳转中断服务程序ORG0100HSTART:MOVSP,#60H;堆栈初始化MOVTMOD,#10H;(主程序开始)定时器T1工作方式1MOVTH1,#0FEH;设置计数初值MOVTL1,#0CHCLRP1.0;设置方波的起始状态SETBEA;开中断SETBET1SETBTR1;启动定时器SJMP$;等待中断PITO1:MOVTL1,#0CHMOVTH1,#0FEH;再送计数初值,保证定时时间始终为0.5msCPLP1.0;输出方波RETI;中断返回END方式1:X=216-t/T=216-500/1=FE0CH22、试用定时/计数器T1对外部事件计数。要求每计数100,就将T1改成定时方式,控制P1.7输出一个脉宽为10ms的正脉冲,然后又转为计数方式,如此反复循环。设晶振频率为12MHz。方式1计数:TMOD=01010000BX=216–n=216-100=FF9CH方式1定时:TMOD=00010000BX=216-t/T=216-10000/1=D8F0HORG0000HLP0:MOVTMOD,#50H;置定时器1为方式1计数MOVTH1,#0FFH;置定计数100初值MOVTL1,#9CHCLRP1.7SETBTR1;启动定时器LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;无溢出则继续计数LP2:MOVTMOD,#10H;置定时器1为方式1定时MOVTH1,#0D8H;置定时器10ms初值MOVTL1,#0F0HSETBP1.7LP3:JBCTF1,LP0;查询定时溢出SJMPLP3;无溢出则继续计数23.利用定时/计数器T0产生定时时钟,由P1口控制8个指示灯。编一个程序,使8个指示灯依次一个一个闪动,闪动频率为20次/秒(8个灯依次亮一遍为一个周期)。参照【例4-3】X=216–t(fosc/12)=65536-6250(12/12)=3036=E796Hsft62501601812011ORG0100HMOVA,#01H;置第一个LED亮LOOP0:MOVP1,AMOVTMOD,#01H;T0工作于方式1MOVTH0,#0E7H;置定时器初值MOVTL0,#96H;定时6.25msSETBTR0;启动T0LOOP1:JBCTF0,LOOP2;6.25ms到转L002,并清TF0SJMPLOOP1LOOP2:RLASJMPLOOP024.若晶振频率为12MHz,如何用T0来测量20ms~1s之间的方波周期?又如何测量频率为0.5MHz左右的脉冲频率?参照【例4-5】ORG0000HLJMPMAINORG0100HMAIN:MOVDPTR,#0;方波周期数据存储单元清零MOVTMOD,#09H;置定时器0为方式1门控MOVTH0,#0FEH;定时500usMOVTL0,#0CHJBP3.2,$;查询低电平SETBTR0;准备启动定时器1LP0:JNBP3.2,$;高电平到,启动定时器1LP1:JBCTF0,LP2JBP3.2,LP1SJMPLP0;低电平到,停止定时器1LP2:INCDPTR;存储溢出次数加1MOVTH0,#0FEH;定时500usMOVTL0,#0CHSJMPLP1方式1:X=216-t/T=216-500/1=FE0CHINT1INT1为高时T1开始计数INT1为低时T1停止计数宽度