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

下载本文档

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

文档简介

1、二、计数器的容量从一个生活中的例程看起:一个水盆在水龙头下,水龙没关紧,水一滴滴地滴入盆中。水 滴持续落下,盆的容量是有限的,过一段时间之后,水就会逐渐变满。录音机上的计数器最 多只计到999.那么单片机中的计数器有多大的容量呢? 8031单片机中有两个计数器,分 别称之为T0和T1,这两个计数器分别是由两个8位的RAM单元组成的,即每个计数器都 是16位的计数器,最大的计数量是65536。三、定时8031中的计数器除了能作为计数之用外,还能用作时钟,时钟的用途当然很大,如打铃器, 电视机定时关机,空调定时开关等等,那么计数器是如何作为定时器来用的呢?一个闹钟,我将它定时在1个小时后闹响,换言

2、之,也能说是秒针走了(3600)次,所以时 间就转化为秒针走的次数的,也就是计数的次数了,可见,计数的次数和时间之间的确十分 相关。那么它们的关系是什么呢?那就是秒针每一次走动的时间正好是1秒。单片机定时器记数器结构 结论:只要计数脉冲的间隔相等,则计数值就代表了时间的流逝。由此,单片机中的定时器 和计数器是一个东西,只不过计数器是记录的外界发生的事情,而定时器则是由单片机供给 一个非常稳定的计数源。那么供给组定时器的是计数源是什么呢?看图1,原来就是由单片 机的晶体震荡器经过12分频后获得的一个脉冲源。晶体震荡器的频率当然很准,所以这个 计数脉冲的时间间隔也很准。问题:一个12M的晶体震荡器

3、,它供给给计数器的脉冲时间 间隔是多少呢?当然这很不难,就是12M/12等于1M,也就是1个微秒。结论:计数脉冲 的间隔与晶体震荡器有关,12M的晶体震荡器,计数脉冲的间隔是1微秒。四、溢出 让我们再来看水滴的例程,当水持续落下,盆中的水持续变满,最终有一滴水使得盆中的水 满了。这个时候如果再有一滴水落下,就会发生什么现象?水会漫出来,用个术语来讲就是 “溢出”。水溢出是流到地上,而计数器溢出后将使得TF0变为“1”。至于TF0是什么我们稍后再谈。 一旦TF0由0变成1,就是产生了变化,产生了变化就会引发事件,就象定时的时间一到, 闹钟就会响一样。至于会引发什么事件,我们下次课再介绍,现在我们

4、来研究另一个问题: 要有多少个计数脉冲才会使TF0由0变为1。五、任意定时及计数的办法刚才已研究过,计数器的容量是16位,也就是最大的计数值 到65536,因此计数计到65536就会产生溢出。这个没有问题,问题是我们现实生活中,经 常会有少于65536个计数值的要求,如包装线上,一打为12瓶,一瓶药片为100粒,怎么 样来满足这个要求呢?提示:如果是一个空的盆要1万滴水滴进去才会满,我在开始滴水之前就先放入一勺水,还 需要10000滴嘛?对了,我们采用预置数的办法,我要计100,那我就先放进65436,再来 100个脉冲,不就到了 65536 了吗。定时也是如此,每个脉冲是1微秒,则计满655

5、36个脉 冲需时65.536毫秒,但现在我只要10毫秒就能了,怎么办? 10个毫秒为10000个微秒,所 以,只要在计数器里面放进55536就能了。从上一节我们已经得知,单片机中的定时7计数器都能有多种用途,那么我怎样才能让它们 工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下, TMOD和TCON是名称,我们在写程序时就能直接用这个名称来指定它们,当然也能直接 用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译 一下而已)。用于T1用于TOGATECIT Ml

6、M0GATEC/T MlMO图 1 (TMOD)TMOD结构从图1中我们能看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于 这里面是什么意思,我们下面介绍。用于定时/计数器用于中断TF1TRITFOTROIE1IT1EOITO图 2(TCON)TCON结构从图2中我们能看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中 断(我们暂不管)。而TF1(0)我们上节课已提到了,当计数溢出后TF1(0)就由0变为 1。原来TF1(0)在这儿!那么TR0、TR1又是什么呢?看上节课的图。计数脉冲要进入计数器还真不不难,有层层关要通过,最起码,就是TR0(1)要为1,

7、开 关才能合上,脉冲才能过来。因此,TR0(1)称之为运行控制位,可用指令SETB来置位 以启动计数器/定时器运行,用指令CLR来关闭定时/计数器的工作,一切尽在自已的掌握中。单片机定时器/计数器结构定时/计数器的四种工作方式工作方式0 定时器/计数器的工作方式0称之为13位定时/计数方式。它由TL(1/0)的低5位和TH(0 /1)的8位组成13位的计数器,此时TL(1/0)的高3位未用。我们用这个图来讨论几个问题:M1M0:定时/计数器一共有四种工作方式,就是用M1M0来控制的,2位正好是四种组合。C/T:前面我们说过,定时/计数器即可作定时用也可用计数用,到底作什么用,由我们根据 需要自

8、行决定,也说是决定权在我们/使用定时器T0的模式1TH0=(65536-50000)/256; /定时器T0的高8位赋初值TL0=(65536-50000)%256; /定时器T0的低8位赋初值TR0=1;/启动定时器T0TF0=0;P0=0 xff;溢出标志位先清零/关闭LED灯while(1)/无限循环等待查询(while(TF0=1)(TF0=0;P0=P0;TH0=(65536-50000)/256; /定时器T0 的高 8 位赋初值否则会从0开始计数TL0=(65536-50000)%256; /定时器T0的低8位赋初值#include sbit p1_0=P1”0;unsigned

9、 int i;全局变量void timing(void) /晶振为 3.6864M(TMOD|=0 x01;/定时器T0,工作方式1TH0=0 xC3;TL0=0 xC7;这两个寄存器存的是计数器的计数开始的值,这两个值累加全溢出后正好是50msET0=1;/使T0中断可以溢出EA=1;/开启总中断TF0=0;/溢出位清零TR0=1;/开启T0/* 定时中断函数 */void time0_int () interrupt 1 /定时中断函数(TH0=0 xC3;TL0=0 xC7;i+;void main()(i=0;timing();while(;)(if(i=20)(p1_0=p1_0;/

10、p1.0 口状态翻转i=0;并口操作:P0外加上拉电阻定时计数器的应用定时:设置工作模式TMODGATE C/!TMl M0GATE C/!TMl M0M10013位计数器 最大计数23=8192个信号0116位计数器 最大计数.65536个信号M010118位256个信号 具有自动加载功能01计数/0定时T101计数/0定时工作模式T0启动定时器:TCONTF1 TR1 TF0 TR0定时/计数器TF1溢出标志位TR启动/停止定时/计数TR=1启动TR=0停止中断EXl IT1 EX0 IT0外部中断EX外部中断请求信号IT=0低电平IT=1下降沿(触发方式)1开中断IE寄存器设置EX1 E

11、T0 EX0TI INT1 T0 INT0EA 口口 ESET1总中断 串口中断EA=1打开中断2选择中断方式 外部中断设置IT位(选择中断1或中断0)定时中断设置 TMOD TR0=1定时器延时unsigned int count; 定义全局变量用于计时/*函数名 :DelayNms(unsigned char t)功能 :延时n毫秒输入参数:t,延时长度输出参数:无*/void DelayNms(unsigned int t)TH0=(65536-1000)/256;TL0=(65536-1000)%256;程序分割(自己定义两部分)count=t;while(count)/*函数名 :I

12、nitTimer0功能 :定时器0初始化输入参数:无输出参数:无*/void InitTimer0()TMOD |= 0 x01;/定时器0,工作方式1TH0=(65536-1000)/256;/定时 1msTL0=(65536-1000)%256;ET0 = 1;/打开定时器0中断EA = 1;/打开总中断TR0 = 1;/打开定时器0/*函数名:IsrTimer0功能:定时器0终端服务,间隔1ms将计数变量减一。输入参数:无输出参数:无*/void IsrTimer0() interrupt 1TH0=(65536-1000)/256;TL0=(65536-1000)%256;count-

13、;中断的理解中断(interrupt),从字面上理解就是被中断,被打断的意思。比如,你正在写作业,突然 有人敲门,你就要停止做作业,把作业的位置做个标记,然后去给开门,之后你根据做好的 标记,继续写作业。程序也是这样,正常情况下,cpu顺序执行main函数里面的代码,从 第一条代码到执行到最后一条代码,然后又返回到第一条代码往下执行,这样一直循环。突 然cup接到中断请求(有人敲门),cpu就暂停当前执行的代码(停止做作业),做现场保 护(把作用做标记),然后去执行中断代码(开门),执行完中断代码后,返回继续从被中 断处往下执行正常代码(开完门继续做作业)。单片机的中断源中断源就是可以打断cu

14、p正常做事的东西。单片机有5个中断源,外部中断0(INT0), 定时器0(Timer。),外部中断1(INT1),定时器1(Timerl),串口中断。外部中断(INT0和INT1):简单理解就是通过外部输入来触发中断。定时器中断(TImer0和Timer0):简单理解就是通过定时器,定时触发中断。串口中断:简单理解就是当接收到外部数据时触发中断。怎样使用中断(以外部中断0为例)。单片机有两个外部中断引脚,P3.2 (对应INT0)和P3.3 (对应INT1)。当这两个引脚出现低电平,或者下降沿时,就可以就触发单片机外部中断。第一步,中断配置3 “/*函数名:INT0_Config功能:配置单片

15、机与中断相关的硬件,让单片机能够正常检测中断和执行中断代码。输入参数:输出参数:*/ void INT0_Config(void)IT0=1;/中断触发方式,IT0=0,低电平触发,INT0=1下降沿触发(下降沿就是由高电平向低电平的跳变);EX0=1;/外部中断0的中断开关,每个中断源都有自己的中断开关。EA=1;/打开总中断,如果总中断不打开,就是其他中断开关被打开,单片机也不能执 行中断。第二步,中断服务,也就是cpu被中断后所要做的事。/*函数名 :Isr_INT0功能 :中断服务输入参数:输出参数:*/ void Isr_INT0() interrupt 0 这里的interrupt

16、表明这个函数是中断函数,后面的标号表示 是哪一个中断源产生的中断。(INT0)为0,/Timer0 为 1,INT1 为 2,Timer3,串 口中断 为4。/ Add your code here第三部主函数3 “/*函数名 :main功能 :主函数输入参数:输出参数:*/void main()INT0_Config();/调用这个函数来配置外部中断while(1)/Add your code here/CPU 一直在这里循环的执行代码,一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0,执行完成后,返回从断点处继续往下执行原理原来的代码。在51单片机内部有一个

17、CPU用来运算、控制,有四个并行I/O 口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行 I/O 口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控 制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机共有21个并且都是可寻址的列表如下:符号地址功能介绍BF0HB寄存器ACCE0H累加器PSWD0H程序状态字IPB8H中断优先级控制寄存器P3B0HP3 口锁存器IEA8H中断允许控制寄存器P2A0HP2 口锁存器SBUF99H串行口锁存器SCON98H串行口控制寄存器P190HP

18、1 口锁存器TH18DH定时器/计数器1 (高8位)TH08CH定时器/计数器1 (低8位)TL18BH定时器/计数器0 (高8位)TL08AH定时器/计数器0 (低8位)TMOD89H定时器/计数器方式控制寄存器TCON88H定时器/计数器控制寄存器DPH83H数据地址指针(高8位)DPL82H数据地址指针(低8位)SP81H堆栈指针P080HP0 口锁存器PCON87H电源控制寄存器分别说明如下:1、ACC-是累加器,通常用A表示。这是个什么东西,可不能从名字上理解,它是一个寄存器,而不是一个做加法的东西,为什 么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘

19、故 吧。它的名字特殊,身份也特殊,稍后在中篇中我们将学到指令,可以发现,所有的运算类 指令都离不开它。自身带有全零标志Z,若A=0则Z=1;若A尹0则z=0。该标志常用作 程序分枝转移的判断条件。2、B-一个寄存器。在做乘、除法时放乘数或除数,不做乘除法时,随你怎么用。3、PSW-程序状态字。这是一个很重要的东西,里面放了 CPU工作时的很多状态,借此, 我们可以了解CPU的当前状态,并作出相应的处理。它的各位功能请看下表:D7D6D5D4D3D2D1D0CYACF0RS1RS0OVP下面我们逐一介绍各位的用途CY:进位标志。8051中的运算器是一种8位的运算器,我们知道,8位运算器只能表示到

20、 0-255,如果做加法的话,两数相加可能会超过255,这样最高位就会丢失,造成运算的错 误,怎么办?最高位就进到这里来。这样就没事了。有进、借位,CY = 1;无进、借位, CY=0例:78H+97H (01111000+10010111)AC:辅助进、借位(高半字节与低半字节间的进、借位)。例:57H+3AH (01010111+00111010)F0:用户标志位,由用户(编程人员)决定什么时候用,什么时候不用。RS1、RS0:工作寄存器组选择位。这个我们已知了。0V:溢出标志位。运算结果按补码运算理解。有溢出,OV=1 ;无溢出,OV=0。什么是溢 出我们后面的章节会讲到。P:奇偶校验位

21、:它用来表示ALU运算结果中二进制数位“1的个数的奇偶性。若为奇数, 则P=1,否则为0。运算结果有奇数个1,P=1;运算结果有偶数个1,P=0。 例:某运算结果是78H (01111000),显然1的个数为偶数,所以P=0。4、 DPTR (DPH、DPL)数据指针,可以用它来访问外部数据存储器中的任一单元, 如果不用,也可以作为通用寄存器来用,由我们自已决定如何使用。分成DPL(低8位)和 DPH(高8位)两个寄存器。用来存放16位地址值,以便用间接寻址或变址寻址的方式对片 外数据RAM或程序存储器作64K字节范围内的数据操作。5、P0、P1、P2、P3-这个我们已经知道,是四个并行输入/输出口的寄存器。它里面的 内容对应着管脚的输出。6、IE-中断充许寄存器按位寻址,地址:A8HB7B6B5B4B3B2B1B0EA-ET2ESET1EX1ET0EX0EA (IE.7): EA=0时,所有中断禁止(即不产生中断)EA=1时,各中断的产生由个别的允许

温馨提示

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

评论

0/150

提交评论