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

作者&投稿:歹婵 (若有异议请与网页底部的电邮联系)
51单片机定时器中断程序~

再次重新启动。

用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;
TH0=(65536-初值)%256;
TL0=(65536-初值)/256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-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延时(12.0MHz)

定时器的初始化要放前面,为什么你打开外部中断的使能,却没打开定时器0的使能。
void Time0_Init() //定时器0
{
TH0=0xfe;
TL0=0x33;
TR0=1;
}

void main() //程序入口
{
TMOD=0x21; //定时器0和定时器1开启
PCON = 0x80;
SCON = 0x50;
TH1 = 0xfA; //设置波特率 9600
TL1 = 0xfA;
TR1 = 1; //启动定时器1
Time0_Init(); //调用定时0函数

ET1 =0; //这句多余了
ES = 1; //开串口中断
PS=1; //设计串行口中断优先级

ET0=1; //打开定时器中断

EA = 1; //开总中断
//IT0=0; //这句多余了
//EX0=1; //为什么要打开外部中断??

}
void SERIAL_HANDLE(void) interrupt 4 //串口中断函数,打开了中断就必须有
{....................
}
void T0_HANDLE(void) interrupt 1 //定时器0中断函数,打开了中断就必须有
{....................
}

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

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

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

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

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

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

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

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

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

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

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

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




单片机中断响应程序从哪里开始
在单片机中,中断向量表是一个预先定义好的地址区域,它存储了中断服务程序的入口地址。当单片机响应中断时,它会根据中断类型,跳转到中断向量表对应的地址,从那里开始执行中断服务程序。2. 中断响应流程:当单片机的一个外部或内部事件触发中断时,单片机会暂停当前的主程序,保存必要的上下文(如程序计数...

单片机:中断程序的入口地址有什么用
在程序运行到任何地方时,发生中断,则中断当前的程序运行,去响应中断,那么CPU自动取得中断入口地址并转入执行中断程序,同时保存当前的程序地址,当中断程序执行完后,将返回被保存的程序地址处,继续执行被中断了的程序。

为什么单片机一直执行中断程序?
1、一般来说单片机的中断发生有两个条件,一是中断标志位置位,二是中断允许,如果这两个条件都满足则进入中断,因为正常情况下中断一直是允许的,那么只能通过标志位来区分是否有中断挂起,2、如果进入中断不清除标志位,那么这一中断服务程序结束后由于标志位还是置位的并且中断是允许的,那么还会再次进入...

c51单片机中断程序中的interrupt1,2,3是由什么决定的?
interrupt X是指用的第几个中断。。1~2~3是由中断向量表决定的。也就是由单片机的中断入口地址的顺序决定的。这个是硬件决定的软件不能改变。例如外部中断0就是interrupt 0 定时器0 是interrupt 1 外部中断1是interrupt 2 定时器2是interrupt 3 串口是interrupt 4 ...

单片机中断有哪些
单片机中断是指当单片机内部或外部发生某种事件时,会打断单片机正在执行的程序,转而执行处理该事件的中断程序。这对于实现实时控制、提高系统响应速度等方面至关重要。1. 定时器中断:这是单片机中最常用的中断之一。当定时器达到预设值时,会产生一个中断信号,暂停主程序的执行,转而执行定时器中断处理...

c51单片机中断程序中的interrupt1,2,3是由什么决定的?
由中断号决定,一般计数器0是interrupt 0,定时器0是interrupt 1,接下来是计数器1,再是定时器1,再是串口,有些单片机还会有ADC,串口2,PCI等中断,具体看单片机的资料。Proteus 自从有了单片机也就有了开发系统,随着单片机的发展开发系统也在不断发展。 keil是一种先进的单片机集成开发系统。它代表...

单片机c语言中断程序
void init(void)\/\/声明中断初始化 { EA=1;\/\/中断总开关 EX0=1;\/\/开中断0开关。中断1为,EX1=1;IT1=1;\/\/采用边沿触发,下降沿有效。IT1=0为低电平触发中断。} main(){ init();调用中断初始化函数 == ===主程序;} void in_0(void)interrupt 0\/\/中断服务函数 { == ==要服务...

单片机中如果我开放了中断,但是在中断程序中关闭中断,那么中断程序中剩...
如果中断服务函数比较短小的话可能当你按下一次按键触发中断的时候中断服务函数执行了N多次而自己却不知道。总结来说,关闭中断只是关闭对中断的响应,所以是不会影响到现阶段的程序的执行,所以中断程序中剩下的程序还会执行。只是在中断关闭期间无法响应新的中断请求而已。

51单片机定时器中断程序
1*10^-3)\/(1*10^-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延时(12.0MHz)...

单片机中断程序中为什么要重新赋值?
溢出后(计数寄存器的数值会自动清0),下次中断产生也需要在15625的时候,这个时候如果是没有预先的49910,就不能达到65535的溢出条件,就不会产生中断,所以每次执行玩这个中断程序都要给计数寄存器赋值。除非你只用一次溢出中断,可以不用再赋值。 bd_myj | 发布于2012-08-05 举报| 评论 18 1 记得要保护现场 ...

洛宁县17693288729: 关于单片机中断程序的定时器0和定时器1 -
仍厚噻吗: 首先,你所说的两种赋值方法,实际上是一种,就是就是寄存器的高8为位个低8位赋值.你说的第二种(TH0=(65536-50000)/256)所赋的值是经过计算(=(65536-50000)/256)得到的,你知道定时计数器的工作原理就清楚了. 其次,赋...

洛宁县17693288729: 希望高手帮忙,说明一下单片机中定时器0和定时器1中断执行过程 -
仍厚噻吗: 定时器1 50ms中断一次,每次中断FLAG加140次即为2秒,所以在定时器0中断时,要判断是0-40,40-80等时间段 定时器0中断时,要再次装入定时时间常数,但在0-40,40-80等时间段内装入的时间常数是不同的,因此beep取反的频率就不同 但由于定时器0中断10次BEEP才取反一次,所以当fre=50000;50*10= 500ms才取反一次 这么低的频率对无源蜂鸣器是没有响应的 当fre=50000; 0.156*10= 1.56ms取反一次,周期3.12ms 频率300多HZ,对于有源蜂鸣器响应是很困难的 所以用有源蜂鸣器演奏例程中的音乐只能呕呀嘈杂难为听了

洛宁县17693288729: 单片机中断系统的中断定时计数的TR0和TR1功能各是什么?
仍厚噻吗: TR0=1是定时器0计数开始反之停止.后面的同理了.自己去查一下单片机书籍,简单的问题要学会自己解决同学.不然你永远都是被别人牵制着.

洛宁县17693288729: 求一段51单片机程序.要求外部中断0触发后,定时器0开始计时,当外部中断检测到高电平了,计时停止. -
仍厚噻吗: 今天回复得太多的问题,头晕啊 你这个题目有点问题.首先外部中断0出现低电平的时候,就产生一个中断0,可以通过中断0进行处理数据,而且必须外部中断0端子为高电平的时候才能恢复中断.那么当你按下触发时,定时器0开始工作,松开触发按键,外部中断0一直为高电平,那么就必须判定语句进行判定,电路应该是2个按键,其中一个接高电平,另外一个接低电平,但是如果低电平是中断,那么中断一结束就必须检查外部中断0引脚P3.2,既然P3.2又作为普通输入输出脚,又如何做外部中断,因此建议不用中断做,可以用2个I/O口做,例如用P1.0和P1.1 当P1.0出现低电平时,开始定时 当P1.1出现低电平时,定时结束.

洛宁县17693288729: 单片机定时器中断功能和定时器定时功能有什么区别,什么情况需要中断,什么时候不需要呢,讲好必采纳 -
仍厚噻吗: 不要被文字误导,定时器中断和定时器是一个东西,定时器使用方法基本都是中断执行任务,定时时间到执行一次任务,还有一种使用方法不使用中断,利用软件循环读取定时器溢出标识,循环读取溢出标识基本没有人在实际项目中使用的,这样使用没有任何意义,定时器中断好处,能保证定时准确时间执行任务,不会被其他任务打断,给你举个例子,单片机有两个功能按键、数码管,如果没有使用定时器,按下按键数码管就会出现抖,刷新数码管被按键打断,如果使用定时器定时1毫秒刷新一次,你按下按键都不会影响到数码管,程序在执行按键时,定时器中断程序会优先刷新码管,数码管执行完成在返回按键位置继续执行

洛宁县17693288729: 52单片机定时器1执行中断程序时定时器0进入中断后 器0执行完程序退出到主程序main中还是定器1的程序中? -
仍厚噻吗: 这个叫中断嵌套 定时器0能够中断定时器1的前提是0的优先级高于1 这时会回到的是中断1的主程序,因为定时器1也是中断的主程序 最后才回到主程序 中断一级一级嵌套

洛宁县17693288729: 51单片机中断定时 -
仍厚噻吗: 51单片机定时器T1,直接定时30秒是不行的,但是,可以定时50ms,以晶振为12M为例,时间常数是:TH1=(65536-50000)/256; TL1=(65536-50000)%256; 开中断,在中断程序中计数,每中断计一个数,计数600次,就是30秒了,对一个引脚取反,就可以高低变化了,每隔30秒一变.

洛宁县17693288729: 单片机定时器0中断 中断时间计算
仍厚噻吗: 你的定时程序没有问题,你的程序中单片机的机器周期是1us,汇编中的有些命令是一个机器周期执行一次,有的是好几个机器周期执行一次,而c语言是高于汇编的,你的c语言指令并不是1us执行一次,所以延时后用仿真软件测得时间会比你的理论实践长.

洛宁县17693288729: 怎样使用51单片机的定时器? -
仍厚噻吗: 1. 设定工作方式TMOD=..... 2. 装入初值 TH0=...TL0=....TH1=....TL1=..... 3.开启定时器中断和总中断ET0=1或ET1=1 EA=1 4.启动时器 TR0=1 TR1=1 5.写中断服务程序 其中 3和5可以没有

洛宁县17693288729: 单片机中的定时器/计数器,要实现某个功能,如何判断该使用方式0或1或2或3 -
仍厚噻吗: 方式0和方式1其实在操作上是一样的,只是方式0是13位的定时/计数器,记满值为2^13=8192,而方式1是16位的定时/计数器,计满为2^16=65536;一般情况选用方式1.方式2是8位可自重装计数器,也就是当计数溢出时,TH中初值重新装到TL中,开始第二次计数,常用于几次连续的计数下.方式3只适用于T/C0,TH0和TL0分别为两个独立的计数器,TL0可用定时也可用计数,TH0只能作定时器.

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