北京网站建设及推广招聘,网站建设大纲,商业网站策划方案,网站资源整合与建设目录
T1工作在方式2时
T0工作在方式3时
四种工作方式的总结
定时计数器对输入信号的要求
定时计数器对的编程的一个要求
关于初值计算的问题
4种工作方式的最大定时时间的大小
关于编程方式的问题
实例分析
实例1
实例2 T1工作在方式2时
51单片机#xff0c;有两个…目录
T1工作在方式2时
T0工作在方式3时
四种工作方式的总结
定时计数器对输入信号的要求
定时计数器对的编程的一个要求
关于初值计算的问题
4种工作方式的最大定时时间的大小
关于编程方式的问题
实例分析
实例1
实例2 T1工作在方式2时
51单片机有两个16位的定时计数器是T0和T1。上面我们介绍了的方式0和方式1的两种工作方式分别对应的是13位定时计数器方式和16位定时计数器方式。 我们开始介绍方式2。 方式2又叫做常数自动重装入。在工作的一个等效的图是这样的一种形式以定时计数器T1为例。 我们大家可以看到基本控制位跟刚才我们所介绍的方式1和方式0是一样的C/T这一位用来控制是定时器还是计数器方式。gate位是门控位。TR1是这个定时计数器的启动位。
跟方式0和方式1的不同之处就是在这儿 这里参与计数的是一个八位的单元对于T1来说是把这个T1这个16位的定时计数器放初值单元分成了两个一个是TL1一个是TH1其中参与计数的是TL1这个单元所能记录的数据的大小就是从0到FF这样的256数。然后当记录的数值超过FF就会发生溢出发生溢出的时候会指位TF1。
在跟方式0和方式1的特点不同之处就是在TL1发生溢出的同时会把T1自动的把TH1的数放入到TL1当中去这个又叫做常数自动重转入也就是说当一个定时计数器工作在方式2工作在这种常数自动重装入方式时相当于是一个八位的定时计数器这个八位定时器有一个特点就是每当溢出之后计数初值是由硬件自动的把TH当中的内容给写入到TL当中去。计数初值是由硬件自动来写入的这是的一个特点。
下面就是一个方式2正常在工作的时候的一个流程图就是正常有脉冲技术脉冲经过的时候TL的值加1。 如果要是说当TL值在记录的过程当中没有超过255这个数就相当于是没有溢出始终是循环有计数值就要加1有计数值加1当产生溢出的时候是把1赋值给TF位就是产生这个溢出标志位同时是把TH的内容再写入到TL当中去这样的话在T当中就得到了一个初始值。 在这里我们要强调一点对于方式0和方式1来说在正常工作的时候记录的数据达到溢出比如说从0000开始记当我记到FFFF然后又有一个数来的时候那是从FFFF变成0000这叫溢出一旦溢出之后在定时计数器的初值寄存器当中放的就是0也就是说第一次计数可以在你所设定的那个初值的基础上开始计数。 当第一次计数溢出之后第二次计数将是从0000这个初始值开始计数。 对于我们来说有的很多时候这样做是不可以的比如说你要产生一个周期非常稳定的一个方波希望这个周期的高低电平都保持一个固定的时间换句话说产生这个方波的定时计数器的初值都是一个固定的值这样的话记录时间长度才能够保持一致。 如果要是你使用的是13位或者是16位的定时计数器的话每一次在产生溢出之后都需要重新的写入的初值有这样的两条指令重新写初值的指令而对于方式2的话就不需要每一次溢出的时候是由硬件自动的把TH中的内容给写入到TL当中你只要把TH当中存放的就是你所需要产生的那段定时时间的常数只要这样做就可以保证产生一个周期比较稳定的这样的一个信号。
这种工作方式方式2可以省去用户软件中重新装入常数的这个程序当定时计数器的这个初值寄存器产生溢出之后对于方式2来说就不需要你再手工的去写初值就硬件自动的赋予初值而对方式0方式1需要手工写初值这样的话如果你采用方式2的话就省去了重新写入初值的这样的程序会使得这个定时时间更加精确可以产生比较稳定的周期比较稳定的这样的一个方波信号产生一个就是定时时间非常精度比较高的这样的一个时间信号。 比如说我们在波特律发生器当中就要采用方式2让这个定时器产生一个稳定的一个波特率。 波特率是在串行通讯当中所需要使用到的一个定义主要是指的是串行通讯的时候每秒钟所发送的位数一般我们要求串行通讯的时候每秒钟发送的这个位数是有一个比较稳定的非常固定的这样的一个速率发送的话对于发送方和接收方才能够可靠的实现双机通讯所以要求这个时间是精度比较高一般我们是让定时器工作在方式2作为波特律发射器来使用。
T0工作在方式3时
下面再看一下工作于方式3。 只有定时计数器T0才有工作方式3当T0工作于方式3的时候是把内部分成了两个8位的定时计数器TL0和TH0就是TL0在方式3下自己自动分解成两个8位的定时计数器其中TL0仍然使用T0的状态控制位C/T位GATE位TR0位和INT0位这些仍然使用原先T0的这些资源。而TH0被固定的作为一个8位的定时器来使用并且使用定时器T1的两个控制位TR1和TF1同时占用定时计数器T1的中断源也就是说当T0如果工作在方式3的话相当于是把T0分解成了两个8位的定时计数器其中TL0低8位占用了原先T0的所有资源而TH0这个8位定时计数器是只能工作在定时器方式下同时占用了原先T1的那些启动位和的中断标志位。 这就是T0工作的方式三而T1是不能工作在方式三的如果在设置这个命令字的时候让T1进入到了方式三等效就是T1是停止工作不会工作了在T0工作在方式三的时候我们可以设置让T1进入到方式0方式1方式,2这些都可以。
大家看一下这就是工作在方式3的T0的等效的一个逻辑图。 大家可以看到在T0工作在方式3的时候是分解成了一个低8位的一个定时计数器占用了原先的T0的所有的资源所有的资源包括的这个门控位包括的启动位以及包括的中断源等等这些都被所占用了。 TH这个8位的定时计数器就是只能作为定时器使用只能对机器周期计数。 同时使用到了T1的两个资源一个是启动位另一个就是中断源这就是工作在方式3的T0。 我们再看当T0工作在方式3的时候T1可以工作在什么样的一个状态可以工作在方式0是一个13位的定时计数器也可以工作在方式1作为一个16位的定时计数器来使用也可以工作在方式2作为一个8位的定时计数器来使用。 大家要注意到当T0工作在方式3的时候T1不论是工作在方式0还是方式1方式2都缺失了两个控制位一个是TR位另一个就是TF位也就是说什么时候启动这个是无法控制的这无法控制的启停另一个就是无法知道什么时候溢出一般我们在这时候都是让这个T1工作在自动的这种工作方式下这时候T1就是自动处于一个工作方式周而复始的会产生这种溢出信号。即一般当T0工作在方式3的时候我们一般让T1工作在方式2这种八位常数自动重装入方式下作为波特律发生器来使用所以下面接着是串行口。 其实其它的都可以作为波特利发生器使用但是方式2是最为灵活的最为准确的一种方式。刚才我们已经介绍过了8倍长数自动重装入所产生的定时时间精度是最高的。 四种工作方式的总结
下面就对这个定时计数器的四种工作方式做一个简单的总结。 方式0是一个13位的定时计数器大家要注意到的是TL就是T1或者是T0当中的低8位只有5位参与计数高8位同时参与计数所以是构成一个13位的定时计数器。
方式1是一个16位的定时计数器使用和方式0是完全相同的只不过是参与计数的T0这个寄存器当中参与计数的位数不同一个是13位一个是16位。 方式2是一个常数自动重装入的八位定时计数器特点就是可以把计数常数/计数初值是由硬件自动的装入进来的每一次溢出之后硬件自动的把TH中的内容装入到TL当中使得这个八位定时计数器能够在一个固定的初值的基础上参与计数那这样的话能够产生一个时间比较准确的一个定时。
方式3是T0分成两个独立的八位计数器其中TL0是作为定时计数器来使用TH0是只能作为定时器来使用。TL0的控制使用了原先T0 TH0占用了原先T1的那些控制位TR1和TF1同时还占用了定时器T1的中断源。此时T0工作在方式3的时候T1可以工作在方式0~方式2溢出的时候这种溢出信号自动的送到了串行口经常是作为串行口的波特律发生器来使用在T1作为波特率发生器使用的时候是可以工作在方式0方式一方式二都可以但是最好的一种工作方式是让T1工作在方式2这时候的波特率是最为稳定的。
定时计数器对输入信号的要求
下面我们来看一个定时计数器对输入信号的要求。 作为一个定时计数器来说一方面可以对内部的一个机器周期计数另一方面可以对一个管角上所来的一个脉冲信号进行计数。 我们首先看一下当定时计数器工作于定时器方式的时候因为是对内部的时钟信号对内部的机器周期计数每一个机器周期计数值加1比如说我如果采用一个12兆的晶振的话机器周期就是一微秒也就一味着每一微秒的这个计数值会加1。 由于定时的精度是取决于输入脉冲的周期的所以要想提高这种定时期的分辨率就必须选用频率比较高的晶振才可以对于51来说最高的晶振就是12兆除非是你选用一些特殊的型号才可以。 这一点我们在学数字电路的时候有过印象如果要想记录的时间更加准确的话产生一个时间非常准的这样的一个信号的话就要求时钟源频率越高时间的分辨率才越高比如说如果对一个两秒钟这样的一个信号进行计数的话那时间分辨率就是两秒就是2秒之内就无法区分出来。定时时间的精度是与时钟源的精度有关的。 对于51单片机来说定时器的精度就取决于了这个外界的这个晶振的频率外界晶振的频率是每个机器周期加1的。
下面我们看如果要是工作于计数器方式的话是怎样的一个工作过程。 当定数计数器作为计数器使用的时候计数脉冲是来自外部的输入引脚T0或者是T1当输入信号产生从1~0的这种下调沿的时候计数值会增1也就是说计数器是对外部引脚的一个脉冲信号计数所记录的是这个引脚上所出现的下调沿的个数。 这个51单片机是如何判断这个引脚上出现了一个下调沿是每个机器周期对这个引脚的电平信号进行一次采样每个机器周期对这个电平信号采样一次当这个机器周期采样得到的电平是高电平而下一个机器周期样得到电平是低电平的话它认为在这个过程当中引脚上出现了一个下调沿就会使得内部的计数器的值加1。
由此大家可以看到51工作在计数器方式的时候对这个外部输入引脚的电平是有要求的第一个要求就是必须要高低电平的持续时间必须大于一个机器周期因为只有大于一个机器周期的话51单片机才能够可靠的识别出这个引脚的电平状态因为每一个机周期只采样一次只有当这个电频信号持续的时间大于一个机器周期的话才能够被51单片机所识别出来。 正是因为有了这样的一个要求如果我要是选用的是一个6兆频率的这样的一个晶体的话允许输入脉冲的频率是多少是250K赫兹如果选用的是12兆频率晶体的话允许输入的最高的外部脉冲就是500K赫兹为什么是这样
大家看一下如果你选用的是一个12兆晶振的话一个机器周期就是1微秒对外部的技术脉冲的要求是什么高电平持续时间要大于1微秒低电平持续时间也要大于1微秒这样的话这个脉冲的频率是多少高电平1微秒低电平1微秒这个脉冲的周期就是2微秒。 周期是2微秒对应的频率是多少就是500K赫兹也就是说对于当你单片机所使用的晶振是12MHz的话作为计数器使用的时候所能记录的最高的这个脉冲的频率是500K赫兹。
这个就是我们所画的一个简单的一个示意图在这个图当中大家可以看到作为计数器使用的时候要求这个高低电平的持续的时间必须是大于一个机器周期这样的话这个高低电平信号才能够被51单片机可靠的识别出来从而才能够判断出什么时候出现了这个下降沿才能保证计数器能够可靠的工作不会发生定脉冲的事件。 定时计数器对的编程的一个要求
下面我们看一下定时计数器对的编程的一个要求如何使用这个定时计数器。
首先要对进行初始化根据要求给方式寄存器TMOD送一个方式控制字以设定定时器的工作方式。 你让这个定时计数器工作在什么方式是8位的16位的还是13位的就是要确定工作方式。
根据需要给TH和TL当中送初值就是作为一个定时器使用的话你需要定时时间是多长 就需要从一个初值开始记录能够产生这个定时时间就是要写有一个初值的问题。根据需要给中断允许寄存器IE送中断控制字以开放相应的中断也可以用查询的方式来响应这个定时器。 第三步是什么你已经写完初值了然后你就可以让它工作了紧接着你要知道这个定时计数器工作之后你如何来判断这个定时时间到了就是记录的数据到达你所设的个数如何来判断的问题。一方面作为这种定时器的响应可以用中断来作为的一个响应。 中断系统我们在后面要说要讲到这个中断系统在这里只是给大家简单介绍一下。 专门有一个中断源是定时计数器所使用的这样一个中断源如果你用一个中断处理子程序来处理这个定时计数器的这个溢出这个事件的话就要求你首先要开放这个中断源要允许中断。其次要把你的中断子程序写入到固定的中断入口那个位置上去就这两个要求希望大家在这里就是要有一个印象就是如果你要是用一个中断来作为这种定时器溢出事件的响应的话你怎么样来编写这个中断子程序就中断子程序有对中断子程序有什么样的要求第一个要求就是说你要开放中断要允许这个中断第二个就是说要把这个中断处理子程序放入到固定的位置上去就这两个要求。 或者是你可以通过查询的方法来作为这个定时计数器溢出的一个响应事件所谓的查询方式就是可以查询这个TF标志位因为在前面的介绍当中大家都知道说对于一个定时计数器一旦开始启动之后开始计数当发生溢出的时候TF位会有一个标志会被置1只要我在编程当中可以判断这个TF位的状态如果TF位是高电平那就表示这个定时计数器已经到了到溢出已经记录的时间到了那可以调用我的这个处理子程序处理程序去处理去响应这个定时计数器溢出的时间。
最后就是给TCON这个命令寄存器当中送启动位让它启动就是TR位给置1就开始启动就开始计数了。 这就是定时计数器使用的编程的一个步骤就首先要确定的工作方式是8位16位还是13位第二个是根据你的定时时间的长度确定的初值第三个是编写一段程序这段程序是作为定时计数器溢出事件的一个响应的一个程序第四个是启动的定时计数器让开始计数。
关于初值计算的问题
下面我们看一下关于初值计算的问题在前面给大家说过工作在51的定时计数器是一个加计数加计数每一次当发生溢出的时候才会有一个明确的标志明确的标志就是TF未被置1这样的话就存在一个问题就是我需要记录的时间长度如何换算成的计数初值的问题是从一定初值开始记才能够得到你的那个计数的时间长度。
我们看一下有这样的一个计算公式希望大家能够给记录下来以后在使用当中可以直接写这个公式。 如果作为一个计数器来使用的话计数器的初值应该是如何的
设计数的模值为M这个M就是指的是8位计数器16位计数器还是13位计数器如果是8位计数器的话模值就是2的8次方16位就是2的16次方以此类推。
所需要的计数值是C我需要记C个数的话计数初值是多少我们一般应该写的计数初值是如果是T/C的话应该等于是M-C。 什么意思你比如说我让这个定时计数器工作在八位方式我现在去需要记录250个数你写初值的时候可以把250这个数直接写入到的初值计数器当中吗就是写入到这个TH当中去吗很显然是不行的因为你如果要是把250写入到了这个初值计数器当中记录多少个数将会卖溢出记录6个250在250的基础上开始记251、 252当记录到255再来一个脉冲的时候变成00255对应的是FF再来一个又变成00会产生溢出也就是说如果你把你需要的计数值写入到初始计数器当中的话你得不到你所需要的那个时间长度因为是一个加计数。 在这里通过这个公式计算大家都知道如果你需要记录250个数据的话250个脉冲的话记录250个脉冲的话所写的初值T/C这个位置应该放多少应该是模值是2的八次方就是让定时计数器工作在八位方之下的话模值是2的八次方减掉你所需要记录的这250个数T/C应该等于是6也就是说你应该在这个初值寄存器当中就是T0T1在的这个存放初值这个寄存器里放的是6这个数而不能说是放250这个数这就是你需要记录的计数值和你写入到初值计算器当中的计数值是不一样的那不一样有一个换算就通过这个公式可以直接的换算出来根据你的定时计数器的位数根据你所需要的计数值可以换算出的数值来就是采用这样一个公式。
同样的看一下如果要是让定时计数器工作在定时器方式的话初值应该如何计算 设定时计数器的模值为M需要的定时时间为T定时器的初值T等于什么T/C等于的是M减去大T除小T大T是定时时间小T是你的机器周期要除以一下这个机器周期这个换算的过程大家可以对照计数器的数值可以看一下它们两个有相同之处。
大家在使用的时候就是完全可以根据这两个公式来直接计算出的初值那就不需要再手工的去其采用其方法去换算就不用了这个公式用起来还是比较方便的这是关于初值的计算的问题给了大家两个公式可以直接根据你的定时计数器工作的位数根据你所需要的定时和计数的这个长度然后计算出的这个初值来。
4种工作方式的最大定时时间的大小
下面我们再看一下几种工作方式的最大定时时间的大小是多少 如果要是定时器的初值为0的时候这时候的定时时间是最大的因为将是从0开始一直记录到满为止这个计数时间定时和计数时间是最长的。 如果要是外接的晶振是12MHz的话几种方式下最大的定时间是多少
如果要是对应的是一个方式0的话所能够产生的最大定时时间是8.192ms方式0是一个13位的这样的一个接定时计数器。
方式一的话实际上工作在16位方式下最多得到的时间长度可以达到65.536ms。 方式2方式3都是一个八位的定时计数器方式所能够达到的最大时间是0.256ms。
把这个告诉大家主要的一个目的就是根据你的定时时间长度可以确定我让这个定时计数器工作在什么方式下你比如说我现在如果产想产生一个30ms的这样的一个是定时时间的话很显然你只能让定时计数器工作在方式1只能工作在方式1。 如果你要是让这个定时计数器产生一个0.1ms这样的一个定时时间的话那你既可以让工作方式1也可以工作方式0也可以工作方式二、方式三都可以这个就是说是你确定工作方式的一个依据。 这几个数据就是在外界晶振为12MHz的时候所能够达到的最大时间实际上计算是比较简单的外界晶振12兆表示一个机器周期是1微秒对于方式一来说定时计数器的位数是16位的最大记录时间就是2的16次方乘以1微秒2的16次方对应的就是65536然后再乘以1微秒对应的时间就变成了这个65.36ms。就是这么计算出来的其的都是以此类推。
下面我们再看一个初始计算的例子比如说现在外界晶振是12MHz我现在需要产生的这个定时时间是2ms希望大家来计算一下我这个定时计数器的初值是多少
对于方式二和方式三来说就是这个八位的定时计数器所能够产生的最大时间刚才领大家算了一下看了一下是0.256ms很显然这个是不满足要求的我要产生一个2ms的信号你这个工作在8位方式最多才是0.256ms这是不能够使用的。 再看一下方式0的时候这是可以的最大时间是大于2ms最大是8ms多所以的计数初值是多少是2的13次方方式0是一个13位的定时计数期所以的模值是2的13次方然后减去定时时间长度是2ms除以机器周期机器周期是1微秒外接晶振为12兆的时候机器周期是1微秒所以初值的公式就可以写成2的13次方减去2微秒除以1微秒最后等于的是6192。换算16进制数是1830H写成初值的形式写的是C1H和10H高八位放的是C1低8位放的是10。 这块就是提醒大家注意的一点当工作在13位方式下是低八位寄存器当中只有5位参与基数。高8位当中是8位都参与计数所以你得到的这个16进制数在放的时候你要会放。把低五位放完之后低八位当中的高三位是不管的接着往高八位当中放数据最后把这个1830给换算过来才可以比如说在这里这个1830这对应的是00018是10003是0011然后最后一个0是0000。
这是1830这个16进制数我们放取的时候是低五位取过来就变成10000然后在剩下的8位1100 0001给写入到高八位这个寄存器当中对应的正好是这样的这八位正好是C1然后低5位是10000写入到寄存器当中后高三位是无关位我们给写成0。最后对应的这个初值就是C110。 注意就是在工作的13位方式的时候大家计算所得到的这样的一个16位的初值在往这个数值寄存器当中写的时候不能把这个16位的数值直接写进去还要再进行一下变换是写成低5位和高8位的形式然后给写进去才行。 如果要是工作在16位方式下就比较简单了。计数初值是2的16次方减去2ms除以1微秒最后等于6336。转换成16进制就是F830写初值的时候就可以直接写高8位写的是F8低8位写的是30H这就可以了。 由此可见大家应该明白就是定时计数器工作的时候实际上方式一应该是时间比较长的时候让定时计数器直接工作在16位方式下是比较经济比较合算的因为这时候无论是你的初值的计算还是你初值的这个直接的书写往定寄存器当中写这个初值都是比较方便的比较简单的而13位相对比较麻烦一下计算出来的值和往初值寄存器当中所写的是还要再进行一次变换这一点要注意就是16位的和8位的使用起来是最灵活的13位是一个过渡阶段这个13位的定时计数器主要是51单片机为了和48系列单片机相兼容所保留的这样的一种工作方式。
这就是的关于初值计算的一些问题。
关于编程方式的问题
下面再看一下关于编程方式的问题。
一种编程方式是可以采用查询的方式程序一直检测这个TF位因为定时计数器一旦工作之后我们唯一能够判断定时计数器工作状态就是通过TF位这是一个唯一的一个窗口TF位所指示的就是是否溢出这样的一个信息所以我们在编程序的时候就可以在程序当中指令当中就专门就有这样的一条指令就是查询TF位。如果TF位为1的话表示定时时间已经到了在如果你要是采用这种查询方式就是我靠我指令去查询TF位从而判断定时计数器是否溢出。 如果用这种方法的话要注意的是在编程当中要及时的对TF位进行清零因为TF位是定时计数器如果溢出是由硬件置1的而如果要是用你人为的用编写的一段程序就是非中断方式去响应的话去作为的一个处理程序的话需要你在程序当中有清除TF位的指令这种方法又叫做硬件置1软件清零。在后面我们再讲标志位的时候有一些标志位就是有这样的一个要求就是有是硬件置1的但是需要你的响应程序通过一条指令就是通过软件去清理。 第二种方式就是说采用中断的方式来作为的响应这个是相对比较简单你只要把这个定时计数器的中断给开放了允许响应这个中断事件就可以了是不是开放的中断然后把你的处理这个定时计数器事件的这段程序放入规定位置这个规定位置就是指的是的中断入口这个位置CPU在运行的时候当如果要是定时计数器真的溢出了会自动的调用这段中断子程序去处理这个事件去响应这个事件。如果要是用采用这种中断的方法作为定时计数器溢出的响应的处理程序的话这个TF位就不再需要你用指令去对清零了它的特性就是硬件置1硬件清零在进入中断的时候是由硬件自动的清除TF位所以我们应该说就是用中断作为这个定时计数器的一个响应应该是相对比较简单的无论使用还是它的编程都是比较简单的。
这是的两种编程方式无论是查询还是中断我们在后面的例子当中都要给大家有所介绍。 实例分析
实例1
下面我们看一个第一个例子就是一个方式0的一个应用。
现在要求选用T1让工作在方式0产生一个500微秒的定时在P1.1输出周期为1ms的方波p1.1是P1口的第1引脚我要求在p1.1这个引脚上输出一个周期是1ms的方波高电平500微秒低电平500微秒这样的一个方波。这个单片机的晶振是6MHz。 当使用到T1的时候有一点就是提醒大家注意的这时候我们没有用到T0大家给T0在写这个命令寄存器的时候你不要任意的去写不要让T0比如说一个误操作让T0工作在方式3了在前面所说的就是方式寄存器如果要是控制设成工作方式3的话T0是分解成两个8位的定时计数器某些资源T1就无法用了我们说了T1的启动位、停止位启动位和溢出标志位被T0所使用了。所以如果在没有使用到T0的时候千万不要让T0进入到方式3这是一个原则。 禁止进入方式3一般给设成方式0就是如果我使用到的是T1这个定时计数器的话大家对T0如何处理一定要让T0设一个默认值是方式0而不要让写成方式3。
下面看一下初值的计算在这里你看我们的题目的要求告诉你的工作方式了那剩下的就是看一下的技术初值应该是多少。 计数初值应该等于的是2的13次方方式0嘛对应的是一个13位的定时计数期然后减掉计数的定时时间是500每秒再除以机器周期6MHz晶振下其周期是2微秒最后得到的计数的常数是计数的初值是7942。7942对应的16进制数是1F06。 然后把这个1F06这个16位的数给写成低5位和高8位的形式就把低五位摘出来放到一个寄存器当中然后再取前八位取出来放到高8位寄存器当中所对应的一个16位的寄存器的初值是F806。
这点要注意就是到13位这块大家计算得到的初值和实际写入到初值寄存器当中的值中间是需要变换一下这一点大家要注意对于一个初学者建议大家直接使用16位的定时计数器就不要使用这个13位的。
下面看一下如何对进行编程。 这是它的主程序
PS以下是用汇编语言作为一个讲解示例学C语言的伙伴只需了解它的程序逻辑即可不用纠结某些符号所代表的意思。 对于我们在前面的介绍当中说过了首先要设工作方式现在让T1是工作在方式0。
我们看一下工作方式寄存器TMOD。 在写的时候大家需要记录测量外部脉冲的宽度吗不需要所以门控位为0。 门控位一定是在需要测量外部脉冲宽度的时候使用门控位其它的情况下都不使用门控位所以这位为0。
然后再看C/T这一位T1是工作在定时器方式所以这一位为0如果1的话就表示计数器方式.
然后看工作方式M1、M0因为我现在就要求工作的方式0所以这两位写的是0 0。 对于T0没有使用到T0这个定时计数器可以都写成0在前面说过了对于没有使用到的定时计数器把的所有位数都写成0就可以了。 这样的话大家可以判断一下这个TMOD这个寄存的命令字是什么是0000 0000所以我们直接写的是MOV TMOD#0这是的命令字。 在这里才是我们所学的这个51单片机当中就给SFR写命令字这是第一个第一个命令字是TMOD。 第二个看就是我要写初值刚才我们的计算已经计算清楚了拉上去看看我们算出来的是F806所以要写的是MOV TL1低8位放的是什么是06H高八位当中放的是什么MOV TH1放的是0F8H这个0是由于是书写16位的一个规范。#号后面如果这个立即数的首位是介于A到F之间的话要求前面再最加一个0再追加一个0所以是0F8H。 这是写完初值了下面该干什么了
确定的工作方式确定的初值应该是启动让它开始工作了。
启动定时计数器直接使用的是SETB因为TR1如果置1的话就意味着启动这个定时计数器T1TR0是T0的启动控制位。在后面如果我们用到T0的话应该是SET TR0就是启动T0在这里。因为使用到的是T1所以执行的是SET TR1这样的一个指令。 下面再看启动之后我们在前面介绍功能部件的时候说过就是由这个SFR自动的去控制管理这个定时计数器的工作了而CPU根本就不需要理会CUP继续执行你的指令就可以了。在这里我们在这个编程当中是采用一种查询的方法来判断定时计数器是否溢出用查询的方法来判断的。所以这块CPU在执行的时候采用了这样一条指令JBC TF1, PF0。 JBC指令是为操作指令当中的一个它的指令的含义就是把后面这一位的信息拿过来判断一下是否为1。等于1吗如果要是等于1的话则转移同时把这一位清0。
在介绍JBC指令的时候说过是非常有用的一条指令主要功能就是把后面的一位取出来判断是否为1如果是为1的话则转移同时把这一位的信息清零。如果要是定时计数器时间到了TF1将被置1。
现在我把TF1拿过来之后开始判断是否为1很显然刚开始程序运行的时候没有到这500每秒时间所以应该是为零的如果是为零的话将顺序执行进行下来执行的是SJMP Loop跳转指令又跳转回来了接着又执行JBC TF1, PF0又取出PF0接着来判断的话这个这两条指令的一个含义就是什么让这个程序循环在等待始终是取TF1这一位来判断如果是0的话表明定时时间没到就回过头来再取TF1再判断然后再取再判断这样直到TF1这一位为1为止。TF1这位为1意味着什么意味着定时时间到了500位秒到了。 如果要是说这时候这个定时时间到了的话TF1位被置1发生长期跳转跳转到PF这个位置来所以就是跳转到了这条指令这跳转到这条指令 这在这里你看是如何做的是MOV TL1, #06H接着MOV TH1 #0F8H这两条指令是干什么用的叫重新写初值。 刚才我们说过了如果要是让这个定时计数器产生一个周期的这样的一个信号的话那就存在着我再次对写入初值的问题。除非是你让这个定时计数器工作在8位常数自动重装入方式下每一次溢出这个计数初值是自动写入的由硬件自动写入的工作在方式0和方式1都需要你在指令当中给写入再次写入数值在这里就是当发生溢出的时候通过JBC指令及时的把这个TF位的信息给清零了同时要把这个计数初值再重新的写入到这个TL1和TH1当中去写入的仍然是F806就是还让再产生一个500微秒这样的一个时间长度。 然后接着是CPL P1.1CPL是一个取反指令对P1.1取反这块就是我们在前面的硬件结构当中介绍的时候说过对于P1口来说上电复位之后初始状态是1都是高电平。也就是说P1.1上电复位之后就是高电平。当程序这个定时计数器启动之后执行到这一条的时候就到500每秒的时候对它取反从高电平变成了低电平变成低电平之后AJMP loop循环回来又循环回来了循环回来之后接着取TF1这一位JBC只能接着取T1这位判断是否为1。 很显然在刚开始第一次循环回来的时候这个TF位肯定是为0没到500微秒当到500微秒的时候怎么样程序又执行下来再把的初值重新写一遍然后又取反取反的结果就是让又变成了高电平这样的话这个低电平持续时间是多长时间是500微秒。 然后变成高电平之后再过500微秒之后又变成了低电平然后这个时间也是500微秒从而得到了一个周期是1ms这样的一个方波信号。 在这里大家应该注意到这个我在这个定时计数器的应用当中我是采用查询的方法。 始终在主程序当中有一个判断指令,取出这个TF位然后进行判断也就是说通过指令取这个TF位来判断是否为1这个叫做查询的方法来作为定时计数器溢出的一个处理程序。
如果要是采用这种方式的话要注意及时的对TF位进行清零置1是发生在定时计数器的溢出时刻只有在软件当中及时的清零才能够捕捉到下一次的溢出时刻这是要注意的就是如果采用的是查询的方法来作为定时计数器溢出的响应的处理程序的话那要及时的对TF位清零在这里是通过JBC指令既判断什么时候为1了然后又可以及时的清零采用的是这个指令来完成的。 第二个大家要注意的是如果要是定时计数器工作在非方式2的工作方式下也就是说工作在不是8位乘数自动冲撞入这种方式下的时候方式0方式1等等工作在这些方式下大家要注意及时进行及时的写初值。 在第一次启动之前你一定是给写入初值然后启动了当溢出之后如果你还想产生刚才所设定的长的定时时间的话那就要求在第一次溢出之后再次的把那个计数数值通过指令给写进来这样的话才能够产生一个你所需要的那个定时时间就是关于初值的再次写入的问题这是需要注意的只要你不是工作在这个方式2的话都存在着一个初值重新写入的问题。
实例2
下面再看再看一个例子在这里是让T0是工作在计数器方式然后T1工作在定时器方式同时都是工作在方式二方式二是我们在定时计数器使用当中经常使用到的一种工作方式就是一个是方式一一个是方式二这两个是工经常使用的我们看一下工作在方式二的情况。 T0工作在计数器方式然后T1工作在定时器方式。我们再看一下这个题目要求从P3.4引脚P3.4是T0引脚输入低频脉冲作为一个计数器使用嘛那就要求输入一个低频脉冲要求该脉冲每发生一次跳变由p1.0输出一个500微秒的负脉冲。 然后与此同时p1.1输出一个宽度为1ms的正脉冲晶振6MHz。什么意思
就是T0是工作在一个计数器方式T0外接的引脚如果有出现了一个计数脉冲的话就要求p1.0输出一个500微秒的一个负脉冲。然后P1.1这个引脚输出一个一毫秒的一个正脉冲。
也就是每当我T0这个引脚就是P3.4这个引脚输入一个脉冲的话那就在p1.0和P1.1这两个引脚上就分别出现一个正脉冲和一个负脉冲这是我们题目的要求。 我们设的时候就是要求是T0工作在计数器方式嘛所以就设T0为计数器方式而且工作在方式二初值我们给设成FF设成FF有一个好处只要有一个脉冲的话就会溢出。
我就可以判断出来什么时候溢出因为你如果要是初值给设成的是F0的话T0这个引脚来一个脉冲你根本无法判断出来什么时候来一个脉冲F0变成F1溢出标志位不会被置1只有发生溢出的时候这个溢出标志位才会被注销。 所以我现在想每当这个引脚来一个脉冲我就能够识别出来能够判断出来如果要达到这个目的的话就要求你让这个计数的初值是FF这样的话每当有一个脉冲就是加1就变成00嘛就要产生溢出嘛。 然后当外部输入一个脉冲的时候计数器加1产生溢出使得TF01引起CPU的T0中断。
用中断来作为这个计数器的一个响应然后中断服务程序内是对定时器T1设初值用T1工作在这个方式2给设一个初值让T1产生这个规定的这个500微秒这样的一个脉冲产生这个500微秒的定时从而在这个P1.1和P1.0这个引脚上得到这个正负脉冲。
本节先讲到这儿下节继续
如有问题课可评论区留言或者私信谢谢