关于单片机中断程序的定时器0和定时器1

关于单片机中断程序的定时器0和定时器1,第1张

首先,你所说的两种赋值方法,实际上是一种,就是就是寄存器的高8为位个低8位赋值。你说的第二种(TH0=(65536-50000)/256)所赋的值是经过计算(=(65536-50000)/256)得到的,你知道定时计数器的工作原理就清楚了。

其次,赋值大小要根据你的晶振以及单片机工作模式确定机器周期,然后才能确定需要赋多大的值,110592MHz的晶振能产生与时钟周期更吻合的波形,12MHz的更利于计算,如果需要更精确的时钟,建议使用时钟芯片。TH0=(65536-50000)/256、TL0=(65536-50000)%256的中断时间为50毫秒(单片机全速运行,晶振12MHz),这只是一种估计的赋值,时间误差很大。

如果觉得手工计算很麻烦,可以使用工具帮忙,只要选择你的参数就能出结果,见附件。

最后,如果你不想计算,给你枚举一些:

晶振:110592MHz,单片机模式:12T

20毫秒:TH0 = 0xB8;TL0 = 0x00;

30毫秒:TH0 = 0x94; TL0 = 0x00;

50毫秒:TH0 = 0x4C; TL0 = 0x00;

晶振:12MHz,单片机模式:12T

20毫秒:TH0 = 0xB1;TL0 = 0xE0;

30毫秒:TH0 = 0x8A;TL0 = 0xD0;

50毫秒:TH0 = 0x3C; TL0 = 0xB0;

1、中断是一个很高明的办法,没有中断时只会顺序执行主程序中的语句。

2、定时器有自己的时钟,打开定时器后,一边顺序执行主程序的语句时,一边定时器在计时。当计到设定的值后,需要产生中断,然后暂停主程序语句,转到中断程序中执行的命令。执行完命令后返回到主程序的顺序语句中。然后知道下一次中断来临,再次产生中断。

3、要让其能产生中断,就必须开中断。这就像一个控制开关,不把开关打开,灯怎么会亮。

再次重新启动。

用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;

TH0=(65536-初值)%256;

TL0=(65536-初值)/256;

将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:

机器周期=12/1210^6=1us(微秒)

定时初值=(110^-3)/(110^-6)=1000;

所以:TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;

定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(120MHz)

你好,因为是手机,所以无法贴出程序,但是你的要求很容易实现,我先给你点提示,自己先做一下,不行再回复我。首先呢,定义两个全局变量,以作十与个并赋值为0,然后编写一个独立键盘函数,分别用于判断SB1~4,若SB1==0,TR0=1,若SB2==0,TR0=0,若SB3==0,SHI,若SB4==0,FEN。主要功能就这样,当然这个并不完美,需要你自己去添加一些功能,然后再编写中断函数。希望我的回答能帮助到你。

这个和代码顺序有关系:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

while (1)

{

if (flag1s == 1) //判断1秒定时标志

{

flag1s = 0; //1秒定时标志清零

sec--; //秒计数自减1这里是先减一,后面再送显示

//将sec按十进制位从低到高依次提取到buf数组中

buf[0] = sec%10;

buf[1] = sec/10%10;

buf[2] = sec/100%10;

buf[3] = sec/1000%10;

buf[4] = sec/10000%10;

buf[5] = sec/100000%10;

//从最高为开始,遇到0不显示,遇到非0退出循环

}

}

如果初值要改为999999,代码可以改成如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

while (1)

{

if (flag1s == 1) //判断1秒定时标志

{

flag1s = 0; //1秒定时标志清零

// sec--; //秒计数自减1屏蔽

//将sec按十进制位从低到高依次提取到buf数组中

buf[0] = sec%10;

buf[1] = sec/10%10;

buf[2] = sec/100%10;

buf[3] = sec/1000%10;

buf[4] = sec/10000%10;

buf[5] = sec/100000%10;

sec--; //秒计数自减1这里是先送显示,后面再减一

//从最高为开始,遇到0不显示,遇到非0退出循环

}

}

代码如下:

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

void main()

{

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

  TH0=(65536-45872)/256;//装初值110582晶振定时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的P34和对应T1的P35,主要用来检测片外来的脉冲。而引脚18和19则对应着晶振的输入脉冲,脉冲的频率和周期为

F = f/12 = 110592M/12 = 09216MHZ      T = 1/F = 1085us

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

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

以上就是关于关于单片机中断程序的定时器0和定时器1全部的内容,包括:关于单片机中断程序的定时器0和定时器1、定时器中断开启程序就不运行了、51单片机定时器中断程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9453356.html

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

发表评论

登录后才能评论

评论列表(0条)

保存