发布网友 发布时间:2022-04-25 18:19
共3个回答
热心网友 时间:2023-10-03 16:09
先解释一下两张图的不同:
只是由于定时器工作模式寄存器(TMOD)的两位:[M1,M0]的设置不同,所以定时/计数的模式不同,但是结构上是无差别的。假如[M1,M0]=[0,0],则代表模式0,表示就是13位的定时/计数器,TL0只有低5位参与计数,TH0整个8位全都参与计数。假如[M1,M0]=[0,1]代表模式1,表示TL0、TH0全都参与计数。如果你是用C语言编程,而不是汇编,初始化设置的时候,就可以通过TMOD|=0x00,来选择模式0,TMOD|=0x01,来选择模式1。提醒一点最好用"|=",而不要用“=”,因为前者是 “赋值位或”因为有或运算,不会改变TMOD寄存器中原先其他已经设置好的位,但是后者是“赋值”,就会把TMOD中的其他位全都改变。
然后哦解释一下TR0在控制中断发生上的作用:
由图上结构可以看到,因为TR0通过一个“与”门,然后才(control)控制了通向计数器TL0、TH0的开关。所以如果TR0为0,“与”门不会置1的,所以就无法把通向计数器的开关打开,所以无法让计数器TL0、TH0计数,所以无法让数据溢出,所以无法让定时器控制寄存器(TCON)的TF0位置1,所以就无法触发(Interrupt)中断了。
简单说呢,上面这个图中涉及到的寄存器的控制位有:
定时器工作模式寄存器(TMOD)中的C/T,负责控制定时模式还是控制计数模式。假如C/T是0,则由内部时钟输入,此时外设T0用做定时器。假如C/T是1,则由T0 Pin (T0 管脚)输入,此时外设T0用做计数器。
定时器工作模式寄存器(TMOD)中的[M1,M0],负责控制定时器的模式为0,为1,为2,还是为3。
定时器工作模式寄存器(TMOD)中的GATE,负责决定定时器的触发是否受外部中断INT0的影响。因为GATE通过一个反相器(也就是非门)后和外部中断INT0通过“或”门形成控制流。GATE=0,经过反向,输出为1,不管INT0是0/1,都可以经过“或”门输出1。GATE=1,经过反向,输出为0,必须要INT0是1,才可以经过“或”门输出1。
额外多说点,TH0和TL0是单独的计数器,赋上初值以后,可以用来定时。定时器初始化的时候,可以用赋值语句直接赋值,比如模式1,TL0=0xff;TH0=0x06。这个是250us的计数器初值设置。怎么算的呢?
就是当外部晶振为12M的时候,单片机内部默认是12分频,可以得到单片机内部时钟频率f=12M/12=1MHz。根据频率与周期的关系,单片机的机器周期T=1/f=1/1M=1us。250us就是250个机器周期。以模式1为例,初值为多少的时候,经过250个机器周期,就可以让TH0溢出了呢?
因为使用了TL0和TH0两个8位计数器,合在一起就是16位,可以产生0~65525一共65536个数。实际上计数器要65536(2的16次幂)个数才可以溢出。16位计数器的容量是65535,包括0,一共可以表示65536个数。所以想要计数250个数以后溢出,初值=65535(容量)-250+1(这个1就代表要至少超过容量1个数,才可以溢出)。所以初值的计算也就表示为:初值=65536-250
热心网友 时间:2023-10-03 16:09
对于51单片机,设置了EA=1和ET0=1,这是定时器T0开中断,即允许T0中断。而设定TR0=1,是启动定时器开始计时/计数,TR0=0,则定时器停止计时/计数,对中断是没有影响的。不设定TR0=1,那就是TR0=0,那就是不计数。既然定时器都停止计时/计数了,也不会发生中断的,即不会中断的。举个例子吧,上课时,老师允许你提问发言,可是你都不去上课,你怎么发言?是一个道理。所以,虽然不影响中断,但却不会引起中断。
热心网友 时间:2023-10-03 16:09
不是只能计数;TR0=1,开始计时/计数,跟中断没关系;EA=Enable all所有中断使能,ET0=Enable Timer0,timer0中断使能;定时器中断是计数满了溢出后中断,TR0不开不计时没法溢出怎么中断?