单片机与嵌入式系统第五章单片机:定时器王浩副教授中南大学信息科学与工程学院第章定时器及应用本章内容SingleChipMicrocomputer单片机定时器/计数器的结构定时器控制定时器工作模式定时器基本概念定时器初始化数字电路中的计数器时钟溢出初始值计数器单片机定时器/计数器的结构CPU_____INT1(P3.3)_____INT0(P3.2)中断TCON(88H)T1(P3.5)定时器T1定时器T0TH1TL1TH0TL0TMOD(89H)溢出启动(8DH)(8BH)(8CH)(8AH)7070启动内部总线溢出工作方式工作方式T0(P3.4)7700定时器控制工作模式寄存器TMOD控制寄存器TCON工作模式寄存器TMOD注:TMOD不能位寻址,只能用字节方式进行设置GATEC/TM1M0GATEM1C/TM0定时器T1定时器T0D7D6D5D4D3D2D1D0TMOD(89H)TMOD各位定义及具体的意义操作模式控制位M0、M1M1M0工作方式功能说明00方式013位计数器01方式116位计数器10方式2自动再装入8位计数器11方式3定时器0:分成两个8位计数器定时器1:停止计数控制寄存器TCONTF1TR1TF0TR0IE1IE0IT1IT0TCON(88H)8FH8EH8DH8CH8BH8AH89H88HTCON各位定义及具体的意义定时器工作模式M1M0工作方式功能说明00方式013位计数器01方式116位计数器10方式2自动再装入8位计数器11方式3定时器0:分成两个8位计数器定时器1:停止计数模式01208192120时钟周期初值)(时钟周期初值)(TTMT模式112065536120时钟周期初值)(时钟周期初值)(TTMT模式2120256120时钟周期初值)(时钟周期初值)(TTMT模式3120256120(:TL0时钟周期初值)(时钟周期初值)TLTLM120256120:TH0时钟周期初值)(时钟周期初值)(THTHM定时器初始化过程1、确定并设定定时器工作模式TMOD2、设置定时/计数器初值TH0、TL0或TH1、TL13、开启定时器中断IE:ET0(ET1)和EA4、启动定时器TCON:TR0(TR1)注:如果采用查询方式控制定时器还需要判断TF0(TF1)应用举例用定时器1方式0在P1.0上产生周期为2S的方波。晶振频率为12MHz。1、最大定时时间:8192×1s=8.192ms2、选定定时T=5ms3、X=3192=C78H=00001100,01111000B4、C78H=01100011,11000BT0初值=01100011,00011000B=6318HTH1=63H,TL1=18H12)819212时钟周期(时钟周期)(XXMT#includereg51.hsbitP1_0=P1^0;main(){unsignedchari=200;TMOD=0x00;//设定工作模式为0TH1=0x63;//根据计算设定计数器初值TL1=0x18;TR1=1;//启动定时器while(1){if(TF1==1)//判断定时溢出标志{TH1=0x63;//设定计数器初值TL1=0x18;TF1=0;//清除标志位i=i-1;if(i==0)//判断是否计满200次,即定时1秒{i=200;P1_0=!P1_0;//将P1.0电平翻转}}}}程序(查询方式--C)程序(查询方式--汇编)ORG0000HAJMPMAINORG0100HMAIN:MOVR3,#200;置5ms计数循环初值MOVTMOD,#00H;设定时器1为方式0MOVTH1,#63H;置定时器初值MOVTL1,#18HSETBTR1;启动T1LP1:JBCTF1,LP2;查询计数溢出SJMPLP1;未到5ms继续计数LP2:MOVTH1,#63H;重新置定时器初值MOVTL1,#18HDJNZR3,LP1;未到1s继续循环CPLP1.0MOVR3,#200SJMPLP1;重新计数程序(中断方式—C)#includereg51.hsbitP1_0=P1^0;unsignedchari=200;main(){TMOD=0x00;TH1=0x63;TL1=0x18;TR1=1;IE=0x88;while(1){}}voidintT1()interrupt3//T1定时中断处理函数{TH1=0x63;//定时器中断时间间隔5msTL1=0x18;i=i-1;if(i==0){i=200;P1_0=!P1_0;}}程序(中断方式—汇编)ORG0000HLJMPMAINORG001BHLJMPZDT1ORG0100HMAIN:MOVR3,#200;置5ms计数循环初值MOVTMOD,#00H;设定时器1为方式0MOVTH1,#63H;置定时器初值MOVTL1,#18HMOVIE,#88H;开启定时器1中断SETBTR1;启动T1LP1:SJMPLP1;未到5ms继续计数ZDT1:MOVTH1,#63H;重新置定时器初值MOVTL1,#18HDJNZR3,EXIT;未到1s继续循环CPLP1.0MOVR3,#200EXIT:RETI;退出中断