单片机 c语言中的定时中断函数,在mian函数TH0和TL0有了初始化,为什么在中断函数timer0中又要初始化??

作者&投稿:梅倩 (若有异议请与网页底部的电邮联系)
51单片机定时器中断为什么在主函数进来赋一次初值,进入中断之后又赋一次初值?有什么作用吗~

主函数中是初始化,中断服务程序中赋值,是因为溢出申请中断时,寄存器的值已经为0了,必须重新赋值才能保持定时时间。

这是单片机c语言中断函数的编程格式,()后面的只是告诉编译系统该函数是一个中断函数,具体的执行还是按照c语言函数的执行方式去执行。

因为定时器计数溢出时才产生中断,th0tl0全等于0。这种定时工作方式不会自动重装定时初值,所以中断子函数中要人工装载。主函数中如果省去初值,那就是从0开始计数,第一次进入中断的时间会有误差,所以不能省。

我谈谈我的看法吧:
首先,我们需要知道的是TH0和TL0寄存器在未赋值的时候都保持默认00H
其次,如果是加基数的话那么到IE开启的时候就要等待一段时间才中断(选择的模式的最大值)如果是减计数的话那么到IE开启的时候就会立即执行定时器中断(如果没有更高优先级的话),所以如果不设置初始值的话会造成一些误差,特别是在使用16位定时器的时候。其他倒是没有什么影响。
再次,楼主可以从程序上看到main()中的定时器只执行了一次而已,然而每次进入定时器都进行了赋值,所以主程序里面的赋值是否需要要根据实际情况定,如果需要大致精确的话,还是赋值比较好。

不好意思我单片机已经很久不玩了,不知道理解是否有偏差,如有请大家指证。

中断里的叫重装初值,定时器有三种模式,13位模式,8位模式(自动重装初值,就是初始化后,中断里无需给定时器高低位赋值),16位模式;13位模式和16位模式需要重装

两者都是对TH0,TL0两个寄存器中的值进行修改,去掉main中的赋值的话,他会计时65536微秒,然后进入定时器中断服务程序,在TR0=1时,定时器才开始工作。


阳曲县19333705867: 单片机 c语言中的定时中断函数,在mian函数TH0和TL0有了初始化,为什么在中断函数timer0中又要初始化?? -
謇程君佳: 因为定时器计数溢出时才产生中断,th0tl0全等于0.这种定时工作方式不会自动重装定时初值,所以中断子函数中要人工装载.主函数中如果省去初值,那就是从0开始计数,第一次进入中断的时间会有误差,所以不能省.

阳曲县19333705867: 单片机定时器C语言 -
謇程君佳: //定时器中断初始化 void init() {TMOD=0x02;//方式2TH0=6;TL0=6;EA=1;ET0=1;TR0=1; } //中断函数 void time() interrupt 1 {t++;if(t==3686) //1s到了m++,t=0;//m=2就是两秒了 } 1秒钟t就要加到3686,0.1秒t要加到多少,根据比例就算得出了,其他的也一样.时间算得出,然后在这段时间内做什么就很简单了.

阳曲县19333705867: 单片机c语言的各个中断函数模型 -
謇程君佳: 5 个中断初始化 1.外中断0 void EX0init() {EA=1;EX0=1;IT0=1;//IT0为1 时,下降沿触发,为0时低电平触发 }2.定时器T0中断// void T0init() {TMOD=1;TH0=(655536-50000)/256; //50ms定时为例TL0=(65536-50000)%256;EA=1;ET0=1;TR...

阳曲县19333705867: 单片机用C语言编写中断的范例? -
謇程君佳: 定时器溢出中断:#include<reg51.h> void timer0(void); //函数声明 void main() { P1^1 = 0; TMOD = 0x01; //定时模式 THO = 0xEE; TL0 = 0xFF; //定时时间 ET0 = 1; //中断允许EA = 1; //总中断使能 TR0 = 1; //开始计时 while(1); //等待中断 ...

阳曲县19333705867: 求教一个简单的C语言定时器中断程序 -
謇程君佳: 每中断一次,程序就会执行一次中断程序,也就是会执行“void t0_rpt() interrupt 1”这个程序

阳曲县19333705867: 单片机定时器T0100ms定时中断,怎么用C语言实现
謇程君佳: #define _1231_C_ #include "reg51.h" #include "1231.h" //sbit OE=P2^3; unsigned int SystemTime; void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑 { TH0 = 0xdb; TL0 = 0xff; // TF0 = 0; SystemTime++; } void main() { TMOD ...

阳曲县19333705867: 单片机c语言中断函数 -
謇程君佳: 这是单片机C语言中断函数的编程格式,()后面的只是告诉编译系统该函数是一个中断函数,具体的执行还是按照C语言函数的执行方式去执行.

阳曲县19333705867: 单片机 C语言 中断 -
謇程君佳: TR0是控制T0时间中断的.TR0=1,中断开启但并不是马上中断,要等寄存器加到满后才产生中断,执行中断程序.执行完中断程序内容后返回,等待下次中断.一般不会关闭中断.如果你只执行一次中断那你就得写一句TR0=0.

阳曲县19333705867: 单片机c语言中断程序 -
謇程君佳: #include <reg51.h> void init(void)//声明中断初始化 { EA=1;//中断总开关EX0=1;//开中断0开关.中断1为,EX1=1;IT1=1;//采用边沿触发,下降沿有效.IT1=0为低电平触发中断. } main() { init();调用中断初始化函数== ===主程序; } void in_0(void)interrupt 0//中断服务函数 { == ==要服务的程序 }

阳曲县19333705867: c51单片机c语言编程中定时器和中断的关系,程序如下,坐等!!! -
謇程君佳: 你的定时器中断进不了吧, 因为你没开定时器中断允许位ET0=1 另: 定时器模式设置好后TMOD=0x01, 打开定时器中断允许ET0=1, 然后TR0=1启动定时器就可以了

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网