您好,欢迎访问三七文档
本章内容硬件部分:认识8051定时器/计数器的架构,以及其四种工作方式。指令部分:详细说明布尔运算指令。程序与实例部分:定时器的应用程序、码表程序、频率产生器程序、测频计应用程序等。一、定时器/计数器定时器/计数器T0方式控制逻辑方式寄存器TMOD工作方式TCON寄存器定时器/计数器的初始化初始化步骤1.设置TMODMOVTMOD,#XX2.给计数初值MOVTH0,#XXMOVTL0,#XX3.设置IE和IPMOVIE,#XXMOVIP,#XX4.启动定时器/计数器SETBTR0计数器初值的计算TC=M-C定时器初值的计算TC=M-T定时/T计数例若单片机时钟频率为12MHZ,请计算定时2ms所需的定时器初值采用方式0TC=213-2ms/1us=6192=1830HTH0=C1H,TL0=10H采用方式1TC=216-2ms/1us=63536=F830HTH0=F8H,TL0=30HT13T12T11T10T9T8T7T6XXXT5T4T3T2T111000001XXX10000二、布尔运算指令1.位传送指令MOVC,bit;bit→CyMOVbit,C;Cy→bit2.位置位和位清零指令CLRC;0→CyCLRbit;0→bitSETBC;1→CySETBbit;1→bit3.位运算指令ANLC,bit;CY∧(bit)→CyANLC,/bit;CY∧(/bit)→CyORLC,bit;CY∨(bit)→CyORLC,/bit;CY∨(/bit)→CyCPLC;(/C)→CYCPLbit;(/bit)→bit4位控制转移指令(1)以Cy中内容为条件的转移指令JCrel;Cy=1转移,PC+2+rel→PCJNCrel;Cy=0转移,PC+2+rel→PC(1)以位地址中内容为条件的转移指令JBbit,relJNBbit,relJBCbit,rel三、实例演练1:60s定时器(查询方式)连接电路60s定时器,每隔1s增加1,每60sD1切换一次流程图查询方式MODEEQU00H;定时器/计数器方式(Mode0)COUNTEQU5000;计数值(5ms)TIMESEQU200;重复次数DISPREGP1;七段显示器LEDREGP0.7;LED;=============使用查询方式================ORG0;程序从0地址开始START:MOVDISP,#0FFH;关闭七段显示器CLRLED;设置LED初始状态MOVTMOD,#MODE;设置定时器/计数器方式LOOP:MOVR1,#0;设置七段显示器初始数字MOVR3,#60;设置定时60秒NEXT:MOVR0,#TIMES;设置重复次数(200次)MOVA,R1;取回显示数字DAA;BCD调整MOVR1,A;存回数字MOVDISP,A;显示数字AGAIN:MOVTH0,#(8192-COUNT)/32;设置计数值MOVTL0,#(8192-COUNT).MOD.32;设置计数值SETBTR0;启动Timer0;=======================================WAIT:JBCTF0,TIMEOUT;查询是否中断JMPWAITTIMEOUT:CLRTR0;关闭定时器;------------------------------------------------------DJNZR0,AGAIN;重复200次;-------------1秒钟----------------------------------------INCR1;数字加1DJNZR3,NEXT;进行下一秒CPLLED;改变LED状态JMPLOOP;跳至LOOP形成一个循环END三、实例演练2:60s定时器(中断方式)连接电路中断程序执行60s定时,主程序执行单灯左移流程图中断方式MODEEQU10H;定时器/计数器方式(Mode1)COUNTEQU-50000;计数值TIMESEQU20;重复次数DISPREGP1;七段显示器LEDREGP0;LED;=============使用中断方式=============ORG0;程序从0地址开始JMPSTART;跳至STARTORG1BH;设置中断向量JMPTIMER1;执行中断子程序START:MOVDISP,#0FFH;关闭七段显示器SETBEA;打开中断总开关SETBET1;打开Timer1中断开关MOVTMOD,#MODE;设置定时器/计数器方式MOVSP,#70H;移开堆栈位置SETBRS0;切换到RB1寄存器组MOVR1,#0;设置七段显示器初始数字MOVR0,#0;设置已重复次数为0MOVR3,#60;设置定时60秒MOVTH1,#COUNT;设置计数值MOVTL1,#COUNT;设置计数值SETBTR1;启动Timer1;=============单灯左移(主程序功能)================CLRRS0;切换回RB0寄存器组MOVA,#0FEH;单灯左移初始值L_LOOP:MOVLED,A;输出到LEDCALLDELAY;调用延迟子程序RLA;左移JMPL_LOOP;跳至L_LOOP形成一个循环;=============主程序结束======================;=============60秒计时(中断子程序开始)=============TIMER1:PUSHPSW;储存程序状态字组寄存器PUSHA;储存ACCSETBRS0;切换到RB1CLRTR1;切换到RB1INCR0;R0+1(重复次数增加1次)CJNER0,#TIMES,AGAIN;是否已重复20次;-------------1秒钟----------------------------------------MOVA,R1;取回显示数字DAA;BCD调整MOVR1,A;存回数字MOVDISP,A;显示数字INCR1;数字加1DJNZR3,NEXT;是否已显示60秒MOVR3,#60;从头开始MOVR1,#0;从00秒开始NEXT:MOVR0,#0;重新计数下一秒钟AGAIN:MOVTH1,#COUNT;设置计数值MOVTL1,#COUNT;设置计数值SETBTR1;启动Timer1POPA;取回ACCPOPPSW;取回程序状态字组寄存器RETI;=============60秒定时(中断子程序结束)========;=============DELAY子程序开始=============DELAY:MOVR7,#200D1:MOVR6,#250DJNZR6,$DJNZR7,D1RET;=============DELAY子程序结束=============END三、实例演练3:码表连接电路INT0控制码表启动和停止定时,INT1控制码表归0流程图MODEEQU01H;定时器/计数器方式(Mode1)COUNTEQU-50000;计数值TIMESEQU20;重复次数DATASREG20H;显示数据所放置的位置START_STOPREG21H.0;启闭状态所放置的位置DISPREGP1;七段显示器;=============使用垂询方式===============ORG0;程序从0地址开始JMPSTART;跳至STARTORG03H;设置中断向量JMPSWITCH;执行SWITCH中断子程序ORG13H;设置中断向量JMPRESET;执行RESET中断子程序START:MOVDISP,#0FFH;关闭七段显示器SETBEA;打开中断总开关SETBEX0;打开INT0中断开关SETBEX1;打开INT1中断开关SETBPX1;提高INT1中断的优先等级SETBIT0;设置INT0负边沿触发SETBIT1;设置INT1负边沿触发MOVTMOD,#MODE;设置为Timer0、Mode1CLRSTART_STOP;关闭定时器MOVDATAS,#0;从0开始CLRTR0;关闭Timer0STOP:JNBSTART_STOP,$;检查是否开始计时CLRC;清除CY标志;=============1秒定时(中断子程序开始)=============NEXT:MOVR0,#TIMES;设置重复次数(20次)MOVA,DATAS;取回显示数据DAA;BCD调整MOVDATAS,A;取回显示数据MOVDISP,A;显示秒数AGAIN:MOVTH0,#COUNT;设置计数值MOVTL0,#COUNT;设置计数值SETBTR0;启动Timer0;=========================================WAIT:JBCTF0,TIMEOUT;查询是否中断JMPWAITTIMEOUT:CLRTR0;关闭定时器;-------------中断-----------------------------------------JNBSTART_STOP,STOP;检查是否继续计时DJNZR0,AGAIN;重复20次;-------------1秒钟----------------------------------------INCDATAS;数字数据增加1JMPNEXT;跳至NEXT形成循环;=========================================;=============INT0中断子程序开始(启闭)=============SWITCH:CPLSTART_STOP;切换启闭开关RETI;=============INT0中断子程序结束(启闭)=============;=============INT1中断子程序开始(归零)=============RESET:MOVDATAS,#0;清除显示数据MOVDISP,DATAS;显示数据RETI;=========INT1INT1中断子程序结束(归零)=============END三、实例演练4:频率发生器连接电路功能要求如下表S1S2S3S4OUTPUT0ⅹⅹⅹ100kHz10ⅹⅹ10kHz110ⅹ1kHz1110100Hz编程要点频率周期变化时间R0COUNT100kHz10us5us1COUNT1=510kHz100us50us1COUNT2=501kHz1000us500usTIMES1=2COUNT3=250100Hz10000us5000usTIMES2=20COUNT3=250流程图MODEEQU02H;定时器/计数器方式(Mode2)COUNT1EQU-5;计数值1COUNT2EQU-50;计数值2COUNT3EQU-250;计数值3TIMES1EQU2;重复次数1TIMES2EQU20;重复次数2OUTPUTREGP1.1;输出脉冲信号;=============使用查询方式===============ORG0;程序从0地址开始JMPSTART;跳至STARTSTART:CLROUTPUT;设置输出初始状态MOVTMOD,#MODE;设置定时器/计数器方式MOVSP,#70H;移开堆栈位置LOOP:JNBP2.0,S1;检测S1开关JNBP2.1,S2;检测S2开关JNBP2.2,S3;检测S3开关JNBP2.3,S4;检测S4开关JMPLOOP;跳至LOOP形成一个回路;=============(输出100KHz)=================S1:MOVTH0,#COUNT1;设置计数值(5)MOVTL0,#COUNT1;设置计数值(5)MOVR0,#1;执行一次计时动作CALLTIMER;执行TIMER计时子程序MOVR0,#1;执行一次计时动作CALLTIMER;执行TIMER计时子程序JMPLOOP;跳回LOOP形成一个回路;=============(输出10KHz)==================S2:MOVTH0,#COUNT2;设置计数值(50)MOVTL0,#COU
本文标题:定时器计数器的应用
链接地址:https://www.777doc.com/doc-6108848 .html