




已阅读5页,还剩116页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 在测控系统中 常常需要有实时时钟和计数器 以实现定时控制以及对外界事件进行计数 传统8051系列单片机有二个16位定时 计数器 它们是定时 计数器0 定时 计数器1 STC89C52单片机在此基础上增加一个16位定时 计数器2 它们简称为 T0 T1和T2 2 本章主要内容 定时器 计数器的组成与功能 工作模式和工作方式 以及与其相关的4个特殊功能寄存器TMOD TCON T2CON T2MOD各位的定义及其编程 最后介绍定时器 计数器的编程及应用实例 6 1STC89C52单片机定时器 计数器的组成6 2定时 计数器0和16 3定时 计数器2 3 STC89C52定时 计数器由T0 T1 T2和看门狗定时器WDT CONTR组成 T0由特殊功能寄存器TH0 TL0构成 T1由特殊功能寄存器TH1 TL1构成 T2由特殊功能寄存器TH2 TL2和RXAP2H RCAP2L构成 6 1STC89C52定时器 计数器的组成 4 6 2定时 计数器0和1 STC89C51RC RD 系列单片机的定时 计数器0和1 与传统8051的定时 计数器完全兼容 当定时器1作波特率发生器时 定时器0可以当两个8位定时器使用 6 2 1定时器 计数器0和1的相关寄存器6 2 2定时 计数器0和1的四种工作方式6 2 3定时 计数器0或1的应用 5 STC89C51RC RD 系列单片机内部设置的两个16位定时器 计数器0和1都具有定时和计数两种工作模式 在特殊功能寄存器TMOD中有一位控制位来选择T0或T1为定时器还是计数器 定时器或计数器的核心部件是一个加法计数器 其本质是对脉冲进行计数 只是计数脉冲来源不同 如果计数脉冲来源于系统时钟 则为定时方式 此时定时 计数器每12个时钟或每6个时钟得到一个计数脉冲 计数值加1 如果计数脉冲来自单片机外部引脚 T0为P3 4 T1为P3 5 则为计数方式 每来一个计数脉冲加1 6 当定时器 计数器工作在定时模式时 可在烧录用户程序时在STC ISP编程器中设置如图4 12是系统时钟 12还是系统时钟 6后让T0和T1进行计数 当定时 计数器工作在计数模式时 对外部计数脉冲计数不分频 图4 12计数脉冲倍速设置 6 7 结论 单片机中的定时器和计数器是一个东西 只不过计数器用来记录外界发生的事情 而定时器则是由单片机提供的一个非常稳定的计数源 8 综上所述 我们已知定时器 计数器是一种可编程部件 所以在其开始工作之前 CPU必须将一些命令 控制字 写入定时器 计数器 这个过程称为定时器 计数器的初始化 当CPU用软件给定时器设置了某种工作方式之后 定时器就会按设定的工作方式独立运行 不再占用CPU的操作时间 除非定时器计数溢出 才可能中断CPU当前操作 6 2 1定时器 计数器0和1的相关寄存器 STC89C52单片机与定时 计数器0和1的相关寄存器见表6 2所示 表6 2定时器 计数器的0和1相关寄存器 10 GATE C T M 1 0 M GATE C T 1 M 0 M 控制T 1 控制T 0 89H 和T类同 0 1 M 0 M 00 01 10 11 方式 方式013位 方式116位 方式2自动重装 方式3适用T0 0 1 定时器模式 计数器模式 0 1 与INT无关 0 0 与INT有关 1 定时 计数器工作模式寄存器TMOD 89H M1M0 方式选择位 GATE 门控位 11 GATE 0 若TR1 1 允许计数 若TR1 0 禁止计数 返回 12 由于在不同方式下计数器位数不同 因而最大计数值 量程 也不同 方式0 M 213 8192方式1 M 216 65536方式2 M 28 256方式3 T0定时器分成两个8位计数器 两个M均256 T1停止计数 返回 13 TR1 0 运行控制位 2 定时 计数器控制寄存器TCON 88H TF1 0 溢出标志位 14 定时器 计数器的初始化 初始化的步骤如下 确定工作方式 对TMOD赋值置定时或计数的初值 可直接写入TH0 1 TL0 1 根据需要开放定时器 计数器的中断启动定时器 计数器 当实现了启动要求之后 定时器就按规定的工作方式和初值开始计数或定时 15 因为定时器 计数器是作 加1 计数 并在计满溢出时产生中断 初值X可以这样计算 X M 计数值 计数次数 例1 在6MHZ主频下 要求产生1ms的定时 计算初值分析 因为定时器每 加1 一次所需的时间为2 s 如果要产生1ms的定时 需加500次 500即为计数值 方式1下工作 初值X M 计数值 65536 500 FE0CH例2 计100个外部脉冲 产生中断请求 计数初值xx M 100 16 若Fosc 12MHz 在P1 0输出周期为400us方波 定时 计数器工作方式2 问计数初值为多少 初始化程序 机器周期 12 Fosc 1us 256 X 1us 200usX 56 38H P1 0 MOVTMOD 02H SETBET0SETBEA MOVTL0 38HMOVTH0 38HSETBTR0 17 6 2 2定时 计数器0和1的四种工作方式 由上节可知 通过对TMOD中的M1M0的设置 可以选择四种工作方式 也就是每个定时器可构成4种电路结构模式 在模式0 1和2 T0和T1的工作方式相同 在模式3 两个定时器的方式不同 下面以T1为例 分述各种工作方式的特点和用法 1 方式0 2 方式1 3 方式2 这种工作方式可省去用户软件中重装常数的程序 并可产生相当精度的定时时间 4 方式3 该方式只适用于定时器T0 T0被拆成两个独立的8位计数器TH0和TL0 TH0不能作为外部计数模式 22 T0工作在方式3下T1的各种工作方式 T0工作在方式3时 T1可定为方式0 方式1和方式2 用来作为串行口的波特率发生器 或不需要中断的场合 定时器T1处于方式3时相当于TR1 0 停止计数 T1运行的控制条件只有2个 即C T和M1 M0 23 6 2 3定时 计数器0或1的应用 定时 计数器的应用编程主要需考虑 根据应用要求 通过程序初始化 正确设置控制字 正确计算计数初值 编写中断服务程序 适时设置控制位等 通常情况下 设置顺序大致如下 工作方式控制字 TMOD T2CON 的设置 计数初值的计算并装入THx TLx RCAP2H RCAP2L 中断允许位ETx EA的设置 使主机开放中断 启 停位TRx设置 24 51系列单片机T0或T1是属于加法计数器 因此就不能直接将实际的计数值作为计数初值送入计数寄存器THx TLx中 而必须将实际计数值以28 213 216为模求补 以其补码作为计数初值设置THx和TLx 设 实际计数值为X 计数器长度为n n 8 13 16 则应装入计数器THx和TLx的计数初值为2n X 式中2n为取模值 例如 工作方式0 以213为模 工作方式1 以216为模等 计数初值 X 补 2n X 25 定时模式 是对机器周期计数 而机器周期与选定主频密切相关 因此 需要根据应用系统选定的主频来确定机器周期值 现以主频为6MHz为例 则机器周期为 注意 对于传统51系列单片机 式 1 中分子取值为12 而对于STC89C52单片机 式 1 中分子取值是根据计数脉冲倍速设置来定 参见教材图4 12 若单片机选12T 则式 1 分子为12 若选6T 则式 1 分子为6 若没有特别提出 书中STC89C52单片机都选12T模式 26 实际定时时间Tc x Tp式中Tp为机器周期 Tc为所需定时时间 x为所需计数次数 主频和Tc一般是已知值 在求得Tp后就可求得所需计数值x 再求x的补码 即求得定时的计数初值 x 补 2n x例如 设定时时间为2ms 机器周期Tp为2 s 可求得定时计数次数为 设选用工作方式1 n 16 则应设置的定时计数初值为 x 补 2n x 216 x 65536 1000 64536 FC18H 则将其分解成两个8位十六进制数 低8位18H装入TLx 高8位FCH装入THx中 工作方式0 1 2的最大计数次数分别为8192 65536和256 对外部事件计数模式 只需根据实际计数次数求补后变换成两个16进制码即可 27 6 2 3定时 计数器0或1的应用 1 方式0 1的应用 例6 1 设STC89C52单片机系统时钟频率fCLK为6MHZ 要在P1 0引脚上输出1个周期为2毫秒 占空比为50 的方波信号 P1 0 图6 7P1 0引脚输出波形 解 1 计算初值 单片机工作在12T模式1机器周期 2 s 2 10 6s T0工作方式0定时1ms计数次数为 选择工作方式0 n 13 定时计数初值 x 补 213 500 7692 1E0CHX 1111000001100B则TH0 F0H TL0 0CH 29 2 初始化程序 工作方式控制字 TMOD T2CON 的设置 TMOD 00H 定时方式0计数初值的计算并装入THx TLx RCAP2H RCAP2L TH0 F0H TL0 0CH中断允许位ETx EA的设置 使主机开放中断 ET0 1 EA 1 启 停位TRx设置 TR0 1 30 方法一 中断方式 ORG0000HLJMPMAINORG000BHLJMPT0PORG0100HMAIN MOVSP 60H 设置堆栈指针MOVTMOD 00H T0为定时 方式0 门控GATE0 0MOVTL0 0CH 装载计数初值MOVTH0 0F0HSETBTR0 启动定时器0计数SETBET0 允许定时器0中断SETBEA 允许CPU中断HERE AJMPHERE 踏步等待 31 中断服务子程序 T0P MOVTL0 0CH 重装载计数初值MOVTH0 0FEHCPLP1 0 P1 0输出求反RETIEND KeiluVision4 32 方法二 软件查询 解 1 计算初值 机器周期 2 s 2 10 6s T0工作方式1计数初值 x 补 65036 FEOCH则TH0 0FEH TL0 0CH 33 ORG0000HSTART MOVSP 60H 设置堆栈区MOVTMOD 01H T0定时方式1门控GATE0 0SETBTR0 启动定时器0计数L1 MOVTH0 0FEH 装载计数初值MOVTL0 0CHLOOP1 JNBTF0 LOOP1 判计数溢出 没有 踏步等待CLRTF0 溢出 清溢出标志位CPLP1 0 P1 0输出求反SJMPL1END 34 中断方式 C51编程 includesbitP10 P1 0 voidmain SP 0X60 设置堆栈指针 TMOD 0 x1 定时器0 定时 工作方式1 门控GATE0 0 TL0 0 x0c 装载计数初值 TH0 0 xfe TR0 1 启动定时器0计数 ET0 1 允许定时器0中断 EA 1 允许CPU中断 while 1 35 voidtimer0int void interrupt1 TL0 0 x0c 重装载计数初值 TH0 0 xfe P10 P10 P1 0输出求反 36 例6 2 设STC89C52单片机系统时钟频率fCLK为6MHZ 请编出利用定时 计数器T0在P1 1引脚上产生周期为2秒 占空比为50 的方波信号的程序1 主程序任务 1 设定T0工作方式1 单片机工作在12T模式 则机器周期为2 s 最大定时 216 2 s 131 072ms 1s 2 定时常数的设定 TC 216 100ms 2 s 15536 3CB0H每隔100ms中断一次 中断10次为1s即 TH0应装3CH TL0应装B0H 37 3 中断管理 允许T0中断 开放总中断即 IE应装10000010B 4 启动定时器T0 SETBTR0 5 设置软件计数器初值 如使用R7 即R7应装0AH 6 动态停机 SJMP 38 2 中断服务程序任务 1 恢复T0常数 2 软件计数器减1 3 判断软件计数器是否为0 为0时 改变P1 1状态 并恢复软件计数器初值 不为0时中断返回 39 主程序 ORG0000HAJMPMAINORG000BHAJMPTOINTORG0030HMAIN MOVSP 60HMOVTMOD 01H 程序总清单 40 MOVTH0 3CH MOVTL0 0B0H MOVIE 82H SETBTR0 MOVR7 0AH HERE SJMPHERE 41 中断服务子程序TOINT MOVTL0 0B0HMOVTH0 3CHDJNZR7 NEXTCPLP1 1MOVR7 0AHNEXT RETIEND KeiluVision4 42 C程序清单 文件名 6 2 C include defineucharunsignedcharucharCOUNT 0 sbitP11 P1 1 voidmain SP 0 x60 设置堆栈指针 TMOD 0 x1 设置T0为定时 工作方式1 GATE0 0 TL0 0 xb0 装载定时计数初值 100ms TH0 0 x3c IE 0 x82 定时计数溢出中断允许 CPU中断允许 TR0 1 启动定时器0计数 COUNT 0 xa 软件计数初值 10 while 1 踏步等待中断 43 voidtimer0int void interrupt1 定时器0中断函数 TL0 0 x0b TH0 0 x3c 重新装载定时计数初值 switch COUNT 判断定时1S吗 case0 P11 P11 COUNT 0 xa break 1S定时到 P1 1输出求反 default COUNT COUNT 1 break 没到1S 软件计数值减1 44 方式2的应用 例6 3 将T0 P3 4 引脚上发生负跳变信号作为P1 0引脚产生方波的启动信号 要求P1 0脚上输出周期为1ms的方波 如图6 5所示 系统时钟6MHz 图6 5负跳变触发输出一个周期为1ms的方波 45 T0方式2计数 计数初值 TH0 0FFH TL0 0FFHT1方式2定时 定时初值 46 方法一 中断方式 ORG0000HLJMPMAIN 跳向主程序MAINORG000BH T0的中断入口LJMPT0XINT T0中断服务程序ORG001BH T1的中断入口LJMPT1TIME T1中断服务程序 47 ORG0030H 主程序入口MAIN MOVSP 60H 设堆栈区MOVTMOD 26H T0方式2计数 T1方式2定时MOVTL0 0FFH T0置初值 计1个脉冲MOVTH0 0FFHSETBET0 允许T0中断 48 MOVTL1 06H T1置初值MOVTH1 06HSETBET1 允许T1产生定时中断SETBEA 总中断允许SETBTR0 启动T0计数HERE AJMPHERE 49 T0中断服务子程序 T0XINT CLRTR0 停止T0计数SETBTR1 启动T1定时RETI T1中断服务子程序 T1TIME CPLP1 0 P1 0取反RETIEND KeiluVision4 50 方法二 C程序清单 includesbitP10 P1 0 voidmain SP 0X60 设堆栈指针 TMOD 0 x26 T0方式2计数 T1方式2定时 TL0 0 xff T0设置计数初值 计1个脉冲 TH0 0 xff 51 TL1 0 x06 T1设置定时初值 TH1 0 x06 ET0 1 允许T0中断 ET1 1 允许T1中断 EA 1 允许总中断 TR0 1 启动T0计数 while 1 踏步等待中断 52 计数器0中断服务子程序 voidtimer0 xint void interrupt1 TR0 0 禁止计数器0计数 TR1 1 启动定时器1 定时器1中断服务子程序 voidtimer1Tint void interrupt3 P10 P10 P1 0输出求反 53 例6 4 假设某STC89C52应用系统的2个外部中断源已被占用 设置定时器T1工作在方式0 作波特率发生器用 现要求增加1个外部中断源 并控制P1 0引脚输出1个频率5KHz 周期为200us 的方波 fosc 12MHZ 方式3的应用 例题6 4图定时器P1 0输出的方波信号 54 T0工作方式3 初值计算 TL0计一个脉冲TL0 0FFHTH0定时100 s 定时初值 TH0 9CHORG0000HLJMPMAINORG000BH TL0中断入口地址LJMPTL0INT 跳向TL0中断服务子程序 ORG001BH TH0占用T1的中断资源LJMPTH0INT 跳向TH0中断服务子程序 55 ORG0100H 主程序入口MAIN MOVTMOD 07H T0方式3 T1方式0定时MOVTL0 0FFH 设置TL0计数初值MOVTH0 9CH 设置TH0定时初值SETBTR0 启动T0计数MOVIE 8AH 设置各中断允许 CPU允许HERE AJMPHERE 循环等待 56 TL0INT MOVTL0 0FFH 重装TL0计数初值SETBTR1 启动TH0定时RETITH0INT MOVTH0 9CH 重装TH0定时初值CPLP1 0 P1 0输出求反RETIEND KeiluVision4 57 查询方式 includesbitP10 P1 0 voidtimer1int void voidmain TMOD 0 x07 TL0 0 xff TH0 0 xa2 TR0 1 P10 1 while 1 if TF0 TL0 0 xff TR1 1 TF0 0 if TF1 timer1int TF1 0 voidtimer1int TH0 0 xa2 重装初值影响精度 修正值为A2H P10 P10 KeiluVision4 58 门控位GATE的应用 例6 5 门控GATE1使定时 计数器T1启动计数受控 当GATE1为1 TR1为1时 只有引脚输入高电平 T1才被允许计数 故可测引脚P3 3上正脉冲宽度 机器周期数 解 门控为1 定时器启动计数受外部输入电平的影响 可测外部输入脉冲宽度 被测脉冲输入P3 3 T1为定时方式 59 TR1 1 返回 图6 6 60 设计思路 1 建立被测脉冲 设置定时 计数器0定时 工作方式2 门控GATE0 0 定时溢出使P3 0引脚求反 从而输出周期为1ms方波作为被测脉冲 P3 0输出信号连接到P3 3引脚 61 2 测量方法 采用查询方式来测量P3 3引脚输入正脉冲宽度 设置定时 计数器1为定时工作方式1 GATE1 1 则利用 P3 3 引脚和TR1信号控制定时器1计数 启 停 当GATE1 1时 1且TR1 1 启动定时器1计数 若 0 或者TR1 0 禁止定时器计数 如图6 6所示 将计数器的TH1计数值送P2口 TL1计数值送P1口显示 62 3 计数初值的计算 计算定时器0工作方式2时 T0计数初值为 定时 计数器1设置为定时工作方式1 计片内脉冲 从0开始计数 初值为0000H 即TH1 00H TL1 00H 63 方法一 查询方式的汇编程序ORG0000HRESET AJMPMAIN 复位入口转主程序ORG000BHCPLP3 0RETIORG0030H 主程序入口MAIN MOVSP 60HMOVTMOD 92H T0方式2定时 T1为方式1定时 门控为1MOVTL1 00HMOVTH1 00HMOVTL0 06HMOVTH0 06HSETBTR0SETBET0SETBEA 64 LOOP0 JBP3 3 LOOP0 等待为低电平SETBTR1 如为低电平 设置TR1 1LOOP1 JNBP3 3 LOOP1 等待升高电平LOOP2 JBP3 3 LOOP2 1 启动T1计数 CLRTR1 0 停止T1计数CLRTR0MOVP2 TH1 T1计数值送显示器MOVP1 TL1AJMPLOOP0END KeiluVision4 65 执行以上程序 使引脚上出现的正脉冲宽度以机器周期数的形式显示在数码管上值 TH0 00H TL0 FBH 则脉冲宽度TW FBH 2 s 502 s 理论值为500 s 66 中断方式从图6 6中知 外部中断1引脚P3 3第一次下降沿信号 产生第一次中断触发 在中断服务程序中设置TR1 1 由于此时不能启动定时器1工作 当脉冲信号出现P3 3上升沿时 自动启动定时器1计数 而当脉冲信号出现P3 3第2次下降沿 即降为0 自动停止定时器1计数 则在中断服务程序中使TR1 0 从启动T1计数到停止T1计数所记录的计数值乘以机器周期值就是正脉冲的宽度 67 方法二 中断方式ORG0000HRESET AJMPMAIN 复位入口地址 转主程序ORG000BHAJMPT0TIMEORG0013HAJMPINT1INTORG0030H 主程序入口地址MAIN MOVSP 60H 设置堆栈指针 68 MOVTMOD 92H T1为方式1定时 GATE1 1 T0方式2定时MOVTL1 00H 设置T1定时初值MOVTH1 00HMOVTL0 06H 设置T0定时初值MOVTH0 06HSETBTR0 启动T0计数SETBET0 允许T0中断SETBIT1 设置外部中断1下降沿触发中断SETBEX1 允许外部中断1的中断请求SETBEA 允许CPU总中断CLR00H 设置中断标志 该位为0 中断一次 为1中断2次LOOP0 MOVP2 TH1 T1计数值送显示器MOVP1 TL1AJMPLOOP0 69 T0TIME CPLP3 0 P3 0输出求反RETIINT1INT JB00H INT12 第2次中断 是 转INT12SETBTR1 第1次 启动定时器1计数SETB00H 建立中断标志RETIINT12 CLRTR1 第2次中断 禁止定时器计数RETIEND 70 方法三 C51程序 includesbitP30 P3 0 sbitflag PSW 5 voidmain SP 0X60 TMOD 0 x92 TL0 0 x06 TH0 0 x06 TL1 0 x0 TH1 0 x0 71 TR0 1 IT1 1 IE 0 x86 flag 0 while 1 P2 TH1 P1 TL1 72 voidtimer0int void interrupt1 P30 P30 voidint1int void interrupt2 if flag 0 TR1 1 flag 1 elseTR1 0 KeiluVision4 73 执行以上程序 使引脚上出现的正脉冲宽度以机器周期数的形式显示在数码管上值 TH0 00H TL0 F9H 则脉冲宽度为 TW F9H 2 s 249 2 s 498 s 理论值为500 s 74 6 3定时 计数器2 定时 计数器2是一个16加法 或减法 计数器 通过设置特殊功能寄存器T2CON中的位可将其设置为定时器或计数器 设置特殊功能寄存器T2MOD中的DCEN位可将其作为加法 向上 计数器或减法 向下 计数器 6 3 1与定时器 计数器2相关的寄存器6 3 2定时 计数器2的三种工作方式6 3 3定时 计数器2应用 75 6 3 1与定时器 计数器2相关的寄存器 与T2相关的寄存器见表6 5所示 T2控制寄存器T2CON与模式寄存器T2MOD相应位配置来确定T2用于定时还是计数模式 T2的工作方式 T2的启停和中断触发方式 TL2和TH2用于装载T2的计数值 RCAP2L和RCAP2H用于装载捕获值或重新装载值 76 表6 5与定时 计数器2相关的寄存器 返回 77 1 T2MOD寄存器是定时器 计数器2的模式寄存器 字节地址为C9H 不可位寻址 特殊功能寄存器T2MOD的格式如表6 6所示 表6 6特殊寄存器T2MOD格式 T2OE 定时 计数器2时钟输出使能位 当T2OE 1的时候 允许时钟输出到P1 0 DCEN 定时 计数器2的向下计数使能位 DCEN 1时 定时 计数器2向下计数 否则向上计数 返回 返回97 78 2 T2CON寄存器是T2控制寄存器 用于设置T2工作模式 定时或计数 T2的三种工作方式 捕获 重新装载 波特率发生器 字节地址为C8H 可位寻址 特殊功能寄存器T2CON的格式如表6 7所示 表6 7特殊寄存器T2CON格式 79 1 T2的捕获 重装载标志 只能通过软件的置位或清除 1且EXEN2 1时 T2EX引脚 P1 1 负跳变产生捕获 0且EXEN2 0时 定时器2溢出或T2EX引脚 P1 1 负跳变都可使定时器2自动重装载 若RCLK 1或TCLK 1时 控制位不起作用的 定时器被强制为溢出时自动重装载模式 2 定时 计数器2的模式选择位 只能通过软件的置位或清除 0 定时 计数器2为内部定时模式 1 定时 计数器2为外部计数模式 下降沿触发 80 3 TR2 定时 计数器2的启动控制标志 TR2 1 启动T2计数 TR2 0 停止T2计数 4 EXEN2 T2的外部使能标志 用来选择定时 计数器工作方式 只能通过软件的置位或清除 EXEN2 0 禁止外部时钟触发T2 T2EX引脚 P1 1 负跳变对T2不起作用 EXEN2 1且T2未用作串行口波特率发生器时 允许外部时钟触发T2 即T2EX P1 1 引脚负跳变产生捕获或重装 并置位EXF2 申请中断 81 5 TCLK 串行口发送时钟标志 只能通过软件的置位或清除 TCLK 1 将T2溢出脉冲作为串行口模式1或模式3的发送时钟 TCLK 0 将T1溢出脉冲作为串行口模式1或模式3的发送时钟 6 RCLK 串行口接收时钟标志 只能通过软件的置位或清除 RCLK 1 将T2溢出脉冲作为串行口模式1或模式3的接收时钟 RCLK 0 将T1溢出脉冲作为串行口模式1或模式3的接收时钟 82 7 EXF2 T2的捕获或重装的标志 必须用软件清0 当EXEN2 1且T2EX引脚 P1 1 负跳变产生T2的捕获或重装时 EXF2置位 当T2中断允许时 EXF2 1将使CPU进入中断服务子程序 即EXF2只能当T2EX引脚 P1 1 负跳变且EXEN2 1时才能触发中断 使EXF2 1 在递增或递减计数器模式 DCEN 1 中 EXF2不会引起中断 8 TF2 T2溢出标志位 T2溢出时置位 并申请中断 只能用软件清除 但T2作为波特率发生器使用的时候 即RCLK 1或TCLK 1 T2溢出时不对TF2置位 83 6 3 2定时 计数器2的三种工作方式 T2和T0或T1有所区别 T2工作方式由特殊功能寄存器T2CON来设定如表6 8所示 T2的三种工作方式是 自动重装初值的16位定时 计数器 捕获事件和波特率发生器 84 T2的3种工作方式设定见表6 8所示 表6 8定时 计数器2的三种工作方式 85 1 自动重装方式 当定时器2工作于自动重装载方式时 可通过C T2 配置为定时器或计数器 并且可编程控制向上或向下计数 计数方向通过特殊功能寄存器T2MOD 见表6 6 的DCEN位来选择的 DCEN置为 0 定时器2默认为向上计数 当DCEN置位 1 时 则定时器2通过T2EX引脚来确定向上计数还是向下计数 见图6 8 86 1 当DCEN 0时见图6 7所示 定时器2自动设置为向上计数 在这种方式下 T2CON中的EXEN2控制位有两种选择 若EXEN2 0 定时器2为向上计数至0FFFFH溢出 置位TF2激活中断 同时把16位计数寄存器RCAP2H和RCAP2L重装载 RCAP2H和RCAP2L的值可由软件预置 若EXEN2 1 定时器2的16位重装载由溢出或外部输入端T2EX从1至0的负跳变触发 这个脉冲使EXF2置位 如果中断允许 同样产生中断 87 2 当DCEN 1时 如图6 8所示 定时器T2向上或向下计数 在这种模式下 T2EX引脚控制着计数的方向 T2EX上的一个逻辑1使得T2递增计数 计到0FFFFH溢出 并置位TF2 若中断允许 还将产生中断 定时器的溢出也使得RCAP2H和RCAP2L中的16位值重新加载到TH2和TL2中 T2EX上的一个逻辑0使得T2递减计数 当TH2和TL2计数到等于RCAP2H和RCAP2L中的值的时候 计数器下溢 置位TF2 并将0FFFFH值加载到TH2和TL2中 T2上溢或下溢 外部中断标志位EXF2被锁死 在这种工作模式下 EXF2不能触发中断 88 2 捕获方式 在捕获方式下 通过T2CON控制位EXEN2来选择两种选项 1 当EXEN2 0 此时 T2是一个16位定时器还是计数器由T2CON中来选择 溢出时置位TF2标志 若T2中断允许 ET2 1 将会引起中断 如图6 9所示 89 2 当EXEN2 1 T2仍是一个16位定时器或计数器 但增加一个功能 外部输入T2EX引脚 P1 1 1至0的负跳变将使得TH2和TL2中的值分别捕捉到RCAP2H和RCAP2L中 T2EX的跳变会引起T2CON中的EXF2置位 捕捉模式如图6 9所示 在该方式中 TH2和TL2无重新装载值 当T2EX引脚产生捕获事件时 计数器仍以T2引脚 P1 0 脉冲或振荡频率1 12 或1 6 计数 注意 EXF2像TF2一样会引起中断 EXF2中断向量与定时器2溢出中断地址相同002BH 在T2中断服务程序中可以通过查询TF2和EXF2来确定引起中断的事件 90 3 波特率发生器通过设置T2CON 见表6 7 中的TCLK或RCLK可选择T1或T2作为串行口波特率发生器 当TCLK 0时 定时器T1作为串行口发送波特率发生器 当TCLK 1时 定时器T2作为串行口发送波特率发生器 RCLK对串行口接收波特率有同样作用 通过对TCLK RCLK的设置 串行口能够得到不同来源的发送和接收的波特率 波特率一个通过定时器T1产生 另一个通过定时器T2产生 91 如图6 10所示为T2工作于波特率发生器模式逻辑结构图 该工作模式与自动重装模式相似 当T2溢出时 波特率发生器模式使得T2的寄存器用RCAP2H和RCAP2L中的16位数值重新装载 寄存器RCAP2H和RCAP2L值由软件预置 92 1 T2配置为计数方式时 外部时钟信号由T2引脚引入 当工作于方式1或方式3时 波特率由下面公式确定 方式1和方式3的波特率 定时器T2溢出率 16 2 T2可配置为定时方式 在多数应用情况下 一般配置成定时模式 0 T2作为波特率发生器与作为定时器操作有所不同 作为定时器时 它会在每个机器周期递增 1 6或1 12晶振频率 然而 T2作为波特率发生器 它的波特率计算公式如下 式中 n 16 6时钟模式 或n 32 12时钟模式 RCAP2H RCAP2L 是RCAP2H和RCAP2L寄存器内容 为16位无符号整数 93 T2作为波特率发生器如图6 10所示 只有在T2CON中RCLK 1或TCLK 1时 波特率工作方式才有效 在波特率发生器工作方式中 TH2的溢出并不置位TF2 也不产生中断 即使T2作为串行口波特率发生器 也不要禁止T2中断 如果EXEN2 T2外部使能标志 被置位 T2EX引脚上1到0的负跳变 则会置位EXF2 T2外部中断标志位 但不会使 RCAP2H RCAP2L 重装载到 TH2 TL2 中 注意 当T2作为波特率发生器 T2EX可以作为一个附加的外部中断源使用 94 4 可编程时钟输出STC89C51RC RD 系列单片机 可设定T2通过P1 0引脚输出时钟 P1 0引脚除作为通用I O外 还有两个功能可供选用 用于T2的外部计数输入T2时钟信号输出 占空比为50 如图6 11为时钟信号输出和外部事件计数方式的示意图 当工作频率为16MHz时 时钟输出频率范围为61Hz到4MHz 95 当设置T2为时钟发生器时 即 T2CON 1 为0 T2OE T2MOD 1 为1 必须由TR2 T2CON 2 启动或停止定时器 时钟输出频率取决于晶振频率和定时器2捕捉寄存器 RCAP2H RCAP2L 的重新装载值 如公式所示 其中 n 2 6时钟 机器周期 n 4 12时钟 机器周期 96 6 3 3定时 计数器2应用自动重装方式 例6 6 设STC89C52单片机系统时钟频率fCLK为12MHZ 使用定时 计数器T2工作方式于自动重装方式 请编写程序使得在P1 6引脚上输出周期为2毫秒占空比为50 的方波信号 知识点 与定时 计数器2相关的特殊功能寄存器T2MOD T2CON IE IP IPH各位物理意义 定时 计数器T2入口地址 定时 计数器T2工作方式确定 97 设计步骤 1 求定时初值N 设置定时 计数器T2为16位自动重装载方式 工作模式为定时 我们选择向上计数 即DCEN 0 取EXEN2 0 定时器T2为向上计数至0FFFFH溢出 置位TF2激活中断 TF2需软件清零 x 补 216 1ms 1 s 65536 1000 64536 FC18H 2 确定特殊功能寄存器T2CON T2MOD IE IP IPH值T2CON 04H 自动重装载 0 定时 0 启动T2工作TR2 1 T2MOD 00H 向上计数DCEN 0 T2时钟输出不使能 即T2OE 0 IE A0H 允许T2中断请求 即ET2 1 总中断允许 即EA 1 IP 20H 设置PT2 1 其它位为0 IPH 20H 设置PT2H 1 其余位为0 即PT2HPT2 11 设置定时 计数器2中断优先级为第4级 98 3 确定定时 计数器2中断服务子程序入口地址为002BH 4 编写主程序和中断服务子程序2 程序清单 1 汇编语言程序清单T2CONEQU0C8H 定义T2CON寄存器字节地址为C8HT2MODEQU0C9H 定义T2MOD寄存器地址为C9HTF2EQUT2CON 7 定义定时 计数器2计数溢出标志位ET2EQUIE 5 定义定时 计数器2中断允许标志位RCAP2LEQU0CAH 定义RCAP2L寄存器字节地址为CAHRCAP2HEQU0CBH 定义RCAP2H寄存器字节地址为CBHTL2EQU0CCH 定义TL2寄存器字节地址为CCHTH2EQU0CDH 定义TH2寄存器字节地址为CDHIPHEQU0B7H 定义IPH寄存器字节地址为B7H 99 ORG0000HAJMPMAINORG002BH 定时 计数器2中断入口地址LJMPPT2INTORG0100HMAIN MOVSP 60H 设置堆栈区MOVT2MOD 00H 置T2向上计数且时钟输出不使能MOVT2CON 04H 置T2自动重装载定时且启动T2MOVTH2 0FCH 装载定时器2的定时初值MOVTL2 18H 100 MOVRCAP2L 18H MOVRCAP2H 0FCHMOVIE 0A0H 允许T2中断 EA允许MOVIP 20H 置T2为第4级中断优先级MOVIPH 20HSETBP1 6 预置P1 6 1HERE SJMPHERE 踏步等待中断 101 PT2INT CLRTF2 清计数溢出标志CPLP1 6 P1 6输出求反RETIEND KeiluVision4 102 2 C语言程序清单 includesbitP16 P1 6 定义位变量P16 sfrT2MOD 0 xC9 定义特殊功能寄存器T2MOD SfrIPH 0 xB7 定义特殊功能寄存器IPH voidmain 主函数 SP 0X60 设置堆栈指针 T2MOD 0 x00 设置定时器2向上计数且时钟输出不使能 T2CON 0 x04 设置定时器2自动重装载 定时且启动T2计数TL2 0 x18 TH2 0 xfc 装载定时器2的定时初值 RCAP2H 0 xfc RCAP2L 0 x18 装载定时器2的定时初值 103 IE 0 xa0 允许T2中断请求 总中断允许 IP 0 x20 IPH 0 x20 设置T2为第4级中断优先级 while 1 踏步等待中断 voidtimer1int void interrupt5 TF2 0 清定时溢出标志 P16 P16 P1 6输出求反 104 捕获方式 例6 7 设STC89C52单片机系统时钟频率为12MHZ T2工作方式为捕获方式 将捕获的计数值低8位送P3口 高8位送P2口 我们用频率仪和示波器观察P1 1引脚捕获脉冲频率值和波形 电路仿真图如例题6 7图所示 105 设计步骤 据题意知T2工作方式为捕获方式 T2CON中EXEN2选择两种选项 此处选择EXEN2 1 即外部捕获 选定时模式选择向上计数 即DCEN 0捕获脉冲 是利用T0定时工作方式1 使P1 5输出周期为2ms的方波 该方波接入到P1 1引脚作为捕获脉冲 1 求定时初值N 为了捕获P1 1引脚脉冲频率值 利用P1 1引脚负跳变触发定时器T2外部中断 第一次中断时 启动定时器T2开始计数 此时定时器T2的最初计数值为0 即TH2 00H TL2 00H 而此时捕获值RCAP2L 00H RCAP2H 00H 到第二次中断时 禁止定时器T2计数 此时捕获寄存器内容就是记录机器周期个数 可求出输出脉冲频率值 T0选择定时工作方式1 输出周期为2ms方波 则定时器0的初值 即TH0 0FCH TL0 18H 106 T2采用外部捕获 则T2CON 09H T2选择的是向上计数 则T2MOD 00H允许T2中断请求 允许总中断 则IE A0H T0工作方式1 定时 门控GATE0 0则TMOD 01H 例题6 7软件由四部分组成 主程序 显示子程序 定时器0中断服务子程序和定时器2中断服务子程序 107 3 程序清单 1 汇编语言T2CONEQU0C8HT2MODEQU0C9HCPEQUT2CON 0TR2EQUT2CON 2EXEN2EQUT2CON 3EXF2EQUT2CON 6TF2EQUT2CON 7ET2EQUIE 5RCAP2LEQU0CAHRCAP2HEQU0CBHTL2EQU0CCHTH2EQU0CDHI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-湖南-湖南垃圾清扫与处理工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-湖北-湖北家禽饲养员三级(高级工)历年参考题库含答案解析
- 工业互联网平台漏洞扫描技术在金融行业的风险防控报告
- 2025-2030中国端氨基聚醚行业应用趋势及竞争格局预测报告
- 2025年事业单位工勤技能-河北-河北计算机文字录入处理员一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河北-河北堤灌维护工二级(技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-河北-河北假肢制作装配工一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-江西-江西殡葬服务工二级(技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西理疗技术员四级(中级工)历年参考题库典型考点含答案解析
- 2025年事业单位工勤技能-广西-广西堤灌维护工三级(高级工)历年参考题库典型考点含答案解析
- (2025年标准)委托他人要账协议书
- 2025-2030中国青少年无人机教育课程体系构建与创新能力培养研究
- 煤矿安全规程新旧版本对照表格版
- 2025山东“才聚齐鲁成就未来”水发集团高校毕业招聘241人笔试参考题库附带答案详解(10套)
- 中学2025年秋季第一学期开学工作方案
- 儿童急救流程
- GB 11122-2025柴油机油
- 私募薪酬管理办法
- 经营废钢管理办法
- 药品经营企业讲课课件
- 广东省深圳市海韵中学2026届中考押题语文预测卷含解析
评论
0/150
提交评论