6 定时器计数器_第1页
6 定时器计数器_第2页
6 定时器计数器_第3页
6 定时器计数器_第4页
6 定时器计数器_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

1 6定时器 计数器 定时器 计数器的结构及工作原理 定时器 计数器的工作方式 定时器 计数器的应用 2 在测量控制系统中 常需要有实时时钟和计数器 以实现定时 或延时 控制以及对外界事件进行计数 常用的定时 或延时 方法有 软件延时 硬件定时 可编程定时器 计数器 定时器 计数器的结构及工作原理 定时器 计数器 工作原理 3 80C51中有两个可编程定时器 计数器T0 T1 定时器 计数器 工作原理 4 定时器 计数器的结构 以T1工作于方式1为例 定时器和计数器是同一个部件 其核心是一个可预置初值的16位加1计数器 特殊功能寄存器TH1 TL1 对输入的脉冲进行计数 TF1 溢出标志 当计数器计到全1时 FFFFH 此时 再来一个计数脉冲 计数器清0 产生溢出 TF1由0变为1 脉冲源 运行控制电路 定时器 计数器 工作原理 一 定时器 计数器的工作原理 5 计数器的初值与计数值 初值 216 计数值X 可预置初值的加计数器 初值计数值XFFFFH1FFFEH2 0001H655350000H65536 216 定时器 计数器 工作原理 6 工作模式 计数 对输入引脚T0 P3 4 T1 P3 5 的脉冲进行计数 计数次数X 216 计数初值 定时 将时钟脉冲经12分频后的脉冲 即机器周期脉冲 作为计数的脉冲源 定时时间Tc X TM 216 初值 12 fosc即对机器周期脉冲TM进行计数 二者的主要区别在于计数脉冲的来源不同 定时器 计数器 工作原理 7 定时器 计数器的运行控制 运行控制位 门控位 定时器 计数器 工作原理 8 二 定时器 计数器的控制寄存器 1 定时器控制寄存器TCONTCON可位寻址 定时器 计数器T0溢出标志 计数器溢出时 TF0置 1 可用于软件查询或向CPU申请中断 定时器 计数器T0的运行控制位 当GATE 0时 只要TR0 1 T0就开始工作 定时器 计数器 工作原理 9 2 定时器工作方式寄存器TMOD 门控位 计数 定时选择位 1 计数 0 定时 M1M0 工作方式选择位00 方式0 13位计数器01 方式1 16位计数器10 方式2 两个8位计数器自动重装初值11 方式3 仅T0可用 定时器 计数器 工作原理 TMOD不可位寻址 10 3 方式1的应用 1 定时器 计数器的应用步骤 合理选择定时器的工作方式 计算计数初值计数 计数初值 216 计数值X定时 计数初值 216 定时时间Tc 机器周期TM 216 Tc fosc 12 编写应用程序 定时器 计数器的初始化 定义TMOD 写入定时初值 设置中断系统 启动定时器运行 定时器 计数器的中断服务程序 定时器 计数器 方式1应用 11 定时器 计数器 方式1应用 2 定时器 计数器应用举例 例 利用定时器T0定时 在P1 0引脚输出周期为1毫秒 频率为1KHz 的方波信号 fosc 6MHz 分析 按题义 就是要将P1 0的输出信号每间隔500 s翻转一次 选择T0工作于定时 方式1 定时时间为500 s TMOD 00000001B 01H 计算初值fosc 6MHz 机器周期TM 2 s要定时500 s即要计250个机器周期脉冲 初值 216 250 65286 FF06H 12 ORG0000HLJMPMAIN 转主程序ORG000BH T0中断服务程序入口地址LJMPT0 转T0中断服务程序ORG0030H 主程序MAIN MOVSP 60H 设置堆栈指针MOVTMOD 01H T0工作于定时 方式1MOVTH0 0FFHMOVTL0 06H 置定时器初值SETBEA 中断总允许SETBET0 允许T0中断SETBTR0 启动T0运行SJMP 实际应用中 这里应是其他程序 定时器 计数器 方式1应用 13 T0 MOVTL0 06H 中断服务程序 从000BH跳转 过来MOVTH0 0FFH 重新装入初值CPLP1 0 输出取反RETI 中断返回 定时器 计数器 方式1应用 14 定时器 计数器的工作方式 工作方式0 13位计数器方式 工作方式1 16位计数器方式 工作方式2 8位自动重装初值方式 工作计数器 存放初值 溢出的同时 将初值重新装入 定时器 计数器 工作方式 15 定时器 计数器 工作方式 注 Tc 定时时间TM 机器周期 16 工作方式3 仅T0可用 占用T1资源 TR1 TF1 只能作为8位定时器使用 使用T0的控制寄存器资源 定时器 计数器 工作方式 17 T0方式3下的T1工作方式 用作串行口波特率发生器 没有启动控制 设置好工作方式就开始运行 定时器 计数器 工作方式 18 工作方式2的应用 例 利用定时器T0定时 在P1 0引脚输出周期为1ms 频率为1KHz 的方波信号 fosc 6MHz 分析 选择T0工作于定时 方式2 定时时间为500 s TMOD 00000010B 02H 计算初值fosc 6MHz 机器周期TM 2 s要定时500 s即要计数250个机器周期脉冲 初值 28 250 6 06H 定时器 计数器 综合应用 定时器 计数器的综合应用 19 ORG0000HLJMPMAIN 转主程序ORG000BH T0中断服务程序入口地址LJMPT0 转T0中断服务程序ORG0030H 主程序MAIN MOVSP 60H 设置堆栈指针MOVTMOD 02H T0工作于定时 方式2MOVTL0 06H 置定时器初值MOVTH0 06H 置定时器重装初值SETBEA CPU允许中断SETBET0 允许T0中断SETBTR0 启动T0运行SJMP 实际应用中 这里应是其他程序 定时器 计数器 综合应用 20 中断服务程序 从000BH跳转过来T0 CPLP1 0 输出取反RETI 中断返回 使用方式2的好处就是它可以自动重新装入初值 定时时间比较精确 但是 定时时间短 定时器 计数器 综合应用 21 如何延长定时时间 定时器最大定时时间 方式1 Tcmax 216 TM方式2 Tcmax 28 TM 为了实现长时间的定时 如1S 我们引进软件计数器的概念 思路是这样的 先用定时器 计数器做一个500微秒的定时器 再设置一个2000次的软件计数器 每次定时时间到了以后将软件计数器中的值加1 如果软件计数器未计满2000次就直接返回 若计满2000次 中断了2000次 定时时间就延长成了500 s 2000 1S 定时器 计数器 综合应用 22 如何延长定时时间 例 假设系统时钟为6MHz 编写定时器T0产生1s定时的程序 1 选择工作方式 方式1最长可定时 131 072ms 2 计算初值 15536 3CB0HTH0 3CHTL0 B0H 3 中断10次 计数或循环 定时器 计数器 综合应用 23 如何延长定时时间 假设系统时钟为6MHz 编写定时器T0产生1s定时的程序 ORG0000HLJMPMAINORG000BHLJMPIT0ORG1000HMAIN MOVSP 60HMOVB 0AHMOVTMOD 01HMOVTL0 0BHMOVTH0 3CHSETBEASETBET0SJMP 定时器 计数器 综合应用 IT0 MOVTL0 0BHMOVTH0 3CHDJNZB LOOPCLRTR0LOOP RETI 24 如何延长定时时间 例 假设系统时钟为12MHz 要求编写采用定时器T0 工作在方式3实现1s定时的程序 1 选择工作方式 TH0只能为定时器 定时时间设为250us TL0设为计数器 可设为200 当TH0定时溢出后 用软件复位的方法在T0引脚产生一个负脉冲 此时TL0就计数一次 当TL0计数满溢出后 定时时间为250 200 50ms 这样循环20次就可以定时1s 2 计算初值 TH0初值 250 250 06HTL0初值 256 200 38HTMOD 00000111B 07H 3 循环20次 定时器 计数器 综合应用 25 如何延长定时时间 假设系统时钟为12MHz 要求编写采用定时器T0 工作在方式3实现1s定时的程序 ORG0000HLJMPMAINORG1000HMAIN MOVB 14HMOVTMOD 07HMOVTH0 06HMOVTL0 38HSETBTR0SETBTR1LOOP1 JBCTF1 LOOP2SJMPLOOP1 定时器 计数器 综合应用 LOOP2 MOVTH0 06HCLRP3 4NOPNOPSETBP3 4JBCTF0 LOOP3SJMPLOOP1LOOP3 MOVTL0 38HDJNZB LOOP1END注意 查询方式工作 即查询计数器溢出标志位 26 计数器的应用 注意 外部事件的最高计数频率为时钟频率的1 24 fosc 24 应用 例 利用T1计数 每计满12次 在P1 7输出一个正脉冲信号 选择T1工作于计数 方式2 计数值为12 TMOD 01100000B 60H 计算初值初值 256 12 244 F4H 定时器 计数器 综合应用 27 ORG0000HLJMPMAIN 转主程序ORG001BH T1中断服务程序入口地址SETBP1 7CLRP1 7 输出正脉冲ORG0030H 主程序MAIN MOVSP 60H 设置堆栈指针MOVTMOD 60H T1工作于计数 方式2MOVTL1 0F4H 置定时器初值MOVTH1 0F4H 置定时器重装初值SETBEA CPU允许中断SETBET1 允许T1中断SETBTR1 启动T1运行CLRP1 7 P1 7输出低电平SJMP 实际应用中 这里应是其他程序 定时器 计数器 综合应用 28 例 利用T0门控位检测出现在INT0引脚上的正脉冲宽度 解 先初始化T0工作于定时器方式1 初值为0 GATE设为1 测试过程如下 机器周期脉冲TM 在P3 2低电平时将TR0置 1 当P3 2变为高电平时T0开始运行 当P3 2变为低电平时T0停止 令TR0 0 此时 T0计数值 TM即为被测脉冲宽度 定时器 计数器 综合应用 29 MOVTMOD 09H T0定时 方式1 GATE 1MOVTL0 0MOVTH0 0 定时器初值W1 JBP3 2 W1 等待P3 2变为低电平SETBTR0 若P3 2变为低电平 启动计数W2 JNBP3 2 W2 等待P3 2变为高电平W3 JBP3 2 W3 P3 2高 开始计数 等P3 2变为低CLRTR0 P3 2低 停止计数TR0 0MOV70H TL0MOV71H TH0 读计数值 乘以TM即为脉冲宽度 SJMP 定时器 计数器 综合应用 00001001BINIT0P3 2 30 例 采用定时器 计数器测量频率 定时器 计数器 综合应用 f N T 被测周期信号 单片机定时器 计数器1计数N 单片机定时器 计数器0定时T 单片机机器周期信号 频率f N T 31 例 采用定时器 计数器测量频率 定时器 计数器 综合应用 32 定时器 计数器 综合应用 FMEAS MOVTMOD 52H 01010010BCLRET0CLRET1 中断禁止MOVTL1 0 Timer1清0MOVTH1 0MOVTL0 9CH Timer0置初值 100usMOVTH0 9CHMOVDPTR 03E8H 循环1000次 即定时0 1sCLRTF0SETBTR0SETBTR1 启动Timer0 Timer1FWAIT JNBTF0 FWAIT0 查询Timer0中断标志位 为0继续等待FWAIT1 DJNZDPTR FWAIT2 DPTR减1不为零 继续定时CLRTR1CLRTR0 DPTR为0 停止定时和计数MOV52H TH1MOV53H TL1 保存计数值SJMPFDISP 跳到计算和显示代码FWAIT2 CLRTF0 DPTR减1不为零 清TF0 继续定时FWAIT0 SJMPFWAIT TF0不为0 继续查询等待FDISP RET 中断查询方式可以避免中断响应处理时的误差 12MHz时f 500KHzTimer1可计数65536即655 36KHz 例 采用定时器 计数器测量频率 33 例 电子钟程序 11 0592MHz利用定时器T0定时 模拟24小时走时的电子钟 时 分 秒以BCD码形式依次存放在3CH 3BH 3AH 38H 39H作为软件计数器 选择T0工作于定时 方式2 定时时间为500 s TMOD 00000010B 02H 计算初值fosc 6MHz 机器周期TM 2 s要定时500 s即要计数250个机器周期脉冲 初值 28 250 6 06HTm 12 11059200 1 08506 uS 误差 0 1s 分钟6s 小时150s 天 定时器 计数器 综合应用 34 定时器 计数器 综合应用 流程图 主程序中断服务程序 2 200 35 MOV38H 200MOV39H 10 定时器 计数器 综合应用 ORG0000H 主程序入口LJMPCLOCK 转主程序初始化ORG000BH T0中断入口LJMPT0 转T0中断服务程序ORG0030H 主程序初始化程序CLOCK MOVSP 6FH 设栈底指针MOVTMOD 02H T0定时方式2MOVTL0 06H 定时 256 6 2 500微秒MOVTH0 06HMOV38H 00H 软件计数单元清零MOV39H 00HSETBEA 中断总允许SETBET0 允许T0中断SETBTR0 启动T0工作LOOP LCALLCZ 调用拆字子程序LCALLDISP 调用显示子程序SJMPLOOP 反复循环主流程 36 ORG0100H T0500微秒中断服务程序T0 PUSHACCPUSHPSW 保护现场INC38H 每500微秒加1MOVA 38HCJNEA 200 DONE 满0 1秒 MOV38H 0INC39H 每0 1秒加1MOVA 39HCJNEA 10 DONE 满1SMOV39H 0 DJNZ38H DONEMOV38H 200DJNZ39H DONEMOV39H 10 定时器 计数器 综合应用 37 MOVA 3AH 秒单元 按BCD码 加1ADDA 1DAAMOV3AH ACJNEA 60H DONE 满1分钟 MOV3AH 0 秒单元清零MOVA 3BH 分钟单元 按BCD码 加1ADDA 1DAAMOV3BH ACJNEA 60H DONE 满1小时 MOV3BH 0 分钟单元清零MOVA 3CH 小时单元 按BCD码 加1ADDA 1DAAMOV3CH ACJNEA 24H DONE 满24小时 MOV3CH 0 小时单元清零DONE POPPSWPOPACC 恢复现场RETI 中断返回 定时器 计数器 综合应用 38 例 将3AH单元中的压缩BCD码转换为非压缩BCD码分别存放到30H 31H单元中去 其中高位 十位 存放在31H单元 CZ1 MOVA 3AH 取压缩BCD码ANLA 0FH 保留低4位 个位 MOV30H A 送非压缩BCD码个位单元MOVA 3AH 再取原压缩BCD码ANLA 0F0H 保留高4位 十位 SWAPA 交换到低4位MOV31H A 送非压缩BCD码十位单元 编写非压缩BCD码转换为压缩BCD码的程序编写压缩BCD码转换为对应的两个ASCII码的程序编写两个0 9的ASCII码转换为对应的压缩BCD码的程序 拆字拼字典型程序例 拼字程序 拼字程序 拆字程序 拆字程序 屏蔽高四位 屏蔽低四位 39 例 将3AH单元中的压缩BCD码转换为非压缩BCD码分别存放到30H 31H单元中去 其中高位 十位 存放在31H单元 CZ MOVR0 3AH 拆字程序 R0指向压缩BCD码单元MOVR1 30H R1指向非压缩BCD码第一单元CZ1 MOVA R0 取压缩BCD码ANLA 0FH 保留低4位 个位 MOV R1 A 送非压缩BCD码个位单元INCR1 R1指向高位单元 十位 MOVA R0 再取原压缩BCD码ANLA 0F0H 保留高4位 十位 SWAPA 交换到低4位MOV R1 A 送非压缩BCD码十位单元 拆字拼字典型程序例 40 CZ MOVR0 3AH R0指向秒分时单元首地址 秒 MOVR1 30H R1指向显示缓冲单元首地址 对应于最右位 CZ1 MOVA R0 取当前压缩BCD码ANLA 0FH 保留低4位 个位 MOV R1 A 送非压缩BCD码个位单元INCR1 R1指向高位单元 十位 MOVA R0 再取原压缩BCD码ANLA 0F0H 保留高4位 十位 SWAPA 交换到低4位MOV R1 A 送非压缩BCD码十位单元INCR1 指向显缓下一个个位单元INCR0 指向下一个时间BCD码单元CJNER0 3DH CZ1 未完继续 改CJNER1 36H CZ1也可RET 子程序返回 拆字子程序 41 DISP MOVR0 30H 显示缓冲单元首地址MOVR3 01H 字位码初值 从最右位起 MOVA R3DISP1 MOVDPTR 0FEFDH 8255B口 字位码输出口 MOVX DPTR A 输出字位码MOVDPTR 0FEFCH 8255A口 字段码输出口 MOVA R0 取显示数据码ADDA TAB NPC 加TAB与NPC差值MOVCA A PC 查表得相应字段码NPC MOVX DPTR A 输出字段码LCALLD1MS 保持显示1毫秒 定时器 计数器 综合应用 显示子程序 42 INCR0 指向下一显示缓冲单元MOVA R3 取出字位码JBACC 5 DISP2 判已显示6位否RLA 未完 字位码左移1位MOVR3 A 回存新字位码SJMPDISP1 转下一位显示DISP2 RETTAB DB0C0H 0F9H 90H 0 9字段码表D1MS MOVR7 250 延时1毫秒子程序DJNZR7 RET 定时器 计数器 综合应用 显示子程序 续 43 相等 x TAB x TAB NEXTPC PC x TAB 数据表可在64K内任一处 省用DPTR 数据表应随后 44 45 例 电子钟程序 有闹钟功能 利用定时器T0定时 模拟24小时走时的电子钟 时 分 秒以BCD码形式依次存放在3CH

温馨提示

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

评论

0/150

提交评论