帮我解释一下单片机定时中断程序,每一条语句的详细详细含义。比如TMOD=0x11中的11是什么意思

帮我解释一下单片机定时中断程序,每一条语句的详细详细含义。比如TMOD=0x11中的11是什么意思,第1张

TMOD是一个8位的寄存器,不能位寻址,所以必须整体写入用来控制定时器模式的,低四位用来控制定时器T0,高四位控制T1。对于每个定时器的四位寄存器,低两位用来定义定时器的工作方式,方式一方式二等;第三位是功能选择位,定义计时器为定时或计数;第四位为门控位,用来决定INTx引脚输入电平的影响,可以理解为是否引入外部控制来控制定时器的启停动作。

TMOD=0x11,转为二进制就是00010001,即T0和T1的最低两位均为01,工作方式为方式1--16位定时器或计数器。第三位为0,设定T0,T1为定时器,对内部脉冲进行计数,用来折算时间。第四位也是0,说明不参考INTx引脚电平,由内部寄存器来控制定时器的启停。

TH0和TL0,是T0的初值,分别写入计时器的高八位和低八位,定时器从这个值开始进行加1计算,直到16位寄存器计满溢出则输出中断。TH1和TL1对应T1。

TR是定时器启动位,TR0和TR1分别对应T0和T1,TR=1时定时器启动,TR=0时停止。这里要注意,前面说的门控位,如果门控位为1,则定时器的启动除TR=1以外,还要求INTx引脚输入1。

ET0可以理解为T0的中断开关,只有ET0=1的时候,T0才可能输出中断。

EA则是中断的总开关,EA=0的时候,所有的中断都无效。

写的很繁琐,要是看不懂可以继续问我。

代码如下:

//实现led灯一秒亮灭闪烁

void main()

{

  TMOD=0x01//设置定时器0为工作方式1(M1 M0为01)

  TH0=(65536-45872)/256//装初值11.0582晶振定时50ms数为45872

  TL0=(65536-45872)%256

  EA=1//开总中断

  ET0=1//开定时器0中断

  TR0=1//启动定时器0

  while(1)//程序停止在这里等待中断发生

}

void T0_time() interrupt 1

{

  TMOD=0x01//重装初值

  TH0=(65536-45872)/256

  num++;//num每加一次判断一次是否到20次

  if(num==20)//如果到了20次,说明1秒时间到

      {

          num=0//num清0重新计数

          led=~led1;

      }

}

扩展资料

定时器有两种工作模式,分别为计数模式和定时模式。对Px,y的输入脉冲进行计数为计数模式。定时模式,则是对MCU的主时钟经过12分频后计数。因为主时钟是相对稳定的,所以可以通过计数值推算出计数所经过的时间。

51单片机计数器的脉冲输入脚。主要的脉冲输入脚有Px,y, 也指对应T0的P3.4和对应T1的P3.5,主要用来检测片外来的脉冲。而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为

F = f/12 = 11.0592M/12 = 0.9216MHZ      T = 1/F = 1.085us

51计数器的计数值存放于特殊功能寄存器中。T0(TL0-0x8A, TH0-0x8C), T1(TL1-0x8B, TH1-0x8D)

定时器常用作定时时钟,以实现定时检测,定时响应、定时控制,并且可以产生ms宽的脉冲信号,驱动步进电机。定时和计数的最终功能都是通过计数实现,若计数的事件源是周期固定的脉冲则可实现定时功能,否则只能实现计数功能。因此可以将定时和计数功能全由一个部件实现。

定时器1 50ms中断一次,每次中断FLAG加1

40次即为2秒,所以在定时器0中断时,要判断是0-40,40-80等时间段

定时器0中断时,要再次装入定时时间常数,但在0-40,40-80等时间段内装入的时间常数是不同的,因此beep取反的频率就不同

但由于定时器0中断10次BEEP才取反一次,所以当fre=5000050*10= 500ms才取反一次

这么低的频率对无源蜂鸣器是没有响应的

当fre=50000 0.156*10= 1.56ms取反一次,周期3.12ms 频率300多HZ,对于有源蜂鸣器响应是很困难的

所以用有源蜂鸣器演奏例程中的音乐只能呕呀嘈杂难为听了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11259248.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存