单片机高手给点拨下,定时器这个不太理解,定时器初始化有几种方法啊??比如说定时1毫秒

/*
* 时钟部分的配置参数
*/
#define XTAL_FREQ (11059200UL) //外部振荡器频率
#define SYS_MCLK (XTAL_FREQ/12) //系统主时钟频率,即(1/CPU机器周期)

/* Timer1定时1ms */
TL1 = (uint8)((65535 - SYS_MCLK/1000) + 28);
TH1 = (uint8)(((65535 - SYS_MCLK/1000) + 28) >> 8);

第一种12 * (65536- x)/11059200 = 0.001;那么TH1 = 0XFC; TL0 = 0X67;

第二种:TH0 = (65535 - 1000)/256;
TL0 = (65535 - 1000)%256;
还有别的方法没??

51 单片机中定时器,是个 16 位的加法计数器。
其内容是 0000H ~ FFFFH,即:0 ~ 65535。
每隔一个机器周期,加一次一。加到 65536,就会溢出,产生中断。

在外部振荡器频率 = 11.0592 MHz 时,机器周期=1085.06944...us。
要想定时 1000us,这就有点困难了。

在外部振荡器频率 = 12 MHz 时,机器周期=1us。
要想定时 1000us,就可以设初始值为:65536 - 1000 = 64536。

分成高、低八位后,写入 THx、TLx,即可。

求出:初始值、分成高低八位,可以人工计算,那么,程序就是:
TH1 = 0XFC;
TL0 = 0X67;
也可以由编译软件来算,程序中,写出公式,这就是:
TH0 = (65535 - 1000)/256;
TL0 = (65535 - 1000)%256;
-------
又因为,中断响应,是不会及时发生的,通常,都会迟到 3 ~ 8 个机器周期。
用 C 语言编程,会耽误更多吧。
所以,定时时间,应该缩短一些,定时才准确。
因此,才有+ 28 的算法。

加上这个数之后,初始值,就大了一些,更接近 65536,定时时间,就短了。
这是个经验数据。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-02-05
你将具体的数形成的表达式写入C语言的程序时,编译器在编译的时候会把表达式计算出来,然后编译到程序中,所以这两个是一种方法。
第2个回答  2013-02-05
定时器初始化的 设置方法,其实就是一种,你所说的二种,
只是 第一 先计算出结果 ,
后一种是 直接 用了计算公式(注这个公式是用12MHz晶振)才是 1mS ,
用11.0592MHz 就大于 1 mS 了。
所以 要得到 精确计时精度,还是要计算正确 定时器初始值。
第3个回答  2013-02-05
这不是一种方法么?
定时器使用步骤
(1)根据需要选择定时器的模式(考虑定时最大定时时长和某些固定用途和功能),写入相应寄存器。
(2)根据你要定时的长短和时钟频率计算初值,写入TH,TL
(3)看看是否需要定时器中断,按需要配置
(4)启动定时器

定时器其实就是计数频率固定的计数器
第4个回答  2013-02-05
你是卖学习板得吗

单片机高手给点拨下,定时器这个不太理解,定时器初始化有几种方法啊...
每隔一个机器周期,加一次一。加到 65536,就会溢出,产生中断。在外部振荡器频率 = 11.0592 MHz 时,机器周期=1085.06944...us。要想定时 1000us,这就有点困难了。在外部振荡器频率 = 12 MHz 时,机器周期=1us。要想定时 1000us,就可以设初始值为:65536 - 1000 = 64536。分成高、低八...

关于51单片机定时\/计数器装入初值的问题
这个有什么看不懂得呢 第一种 是吧十进制化成十六机制的方法 第二种呢 就是单纯的十进制 这样跟你说吧 因为th0只有一个字节 那就只能放下8位2进制 于是第一种表示就是把一个大于一个字节小于两个字节的数据转化成两个字节高八位和第八位的分离形式 第二种就简单了 0x9c就是65536-100的十六...

单片机 定时器初值计算
这个没有办法编程的时候直接变,因为如果单片机的晶振频率一变定时器定的时间就会发生变化,而且定时器有八位的和十六位的计算方式都不同,不过你可以去下载51单片机定时器自动计算的小软件,很好用。

单片机技术,这条题不会,那个高手教教!
你可以把定时器T1设置在工作方式1,定时初值设置65536-5000,高字节给TH1,低字节忒TL1.这样每次定时器1出发中断那就是5000×0.2us=1ms。那要到2ms的方波,需要1毫秒的低电平,1毫秒的高电平。这样的话,你就在中断服务程序中只写一条语句:P1.0=~P1.0;这样的话,就可以输出2ms的方波。希望...

找个单片机高手帮我做下题目
正确,设置定时器0,定时器1为高优先权即可。(2)外部中断0,定时器1,外部中断1,定时器0,串行口中断 。不可能,同优先级时定时器0为最高优先级,而且外部中断1级别比定时器1高。4、找书对着抄。5、(1)0000H:复位程序由此开始执行。(2)0003H:外中断0入口。(3)000BH:定时器0入口。...

求单片机高手帮忙详细解释下程序 特别是中断那
这是定时器到时产生中断后的处理过程。先看C100us+1(即低位字段)是否为0,不为0即jnz(jump not zero)就跳转至Goon处,否则就将C100us(即高位字段)减一,然后执行Goon。Goon:dec C100us+1 mov a, C100us orl a, C100us+1 jnz Exit ; 100us 记数器不为0, 返回 mov ...

51单片机程序定时器怎么这么不准确啊,求高手指点!
MOV TL0(0x8A),#0xFC 看出差别了吧?使用-780时给T0赋值0xFDF4,使用第三种方式赋值为0xFDFC,这两个数字相近,所以结果基本正确。但是使用-516时赋值的0xFEFC,这差别就大了,结果就是不正确。一般建议用TH0=(65536-516)\/256 ;TL0=(65536-516)%256;这种方式,保证不出问题。

单片机常用的三种定时方法
4 方法4 假如定时周期不确定,只知道定时器重装载值存放在寄存器R3、R2中,中断子程序如下:MOV A,#05H ;3个机器周期装载TL1,2个周期提前 ADD A,TL1 ADD A,R2 MOV TL1,A MOV A,R3 ;处理高位字节 ADDC A,TH1 MOV TH1,A DEC TL1 ;恢复提前了的2个机器周期 ……此法适用于定时...

单片机高手帮忙解答哈,初学者来请教,帮我解答一下问题
1、T1作为波特率发生器只能工作在方式2(即自动重装载模式),你所说的两个模式是不一个概念,一个是定时器工作模式,一个是串口工作模式。2、SMOD当然也可以设为1,为1时波特率加倍。

...器0和定时器一进行定时啊? (请各位高手指点下,完整解决问题者再加...
定时,也不需要用两个定时器呀。用T0定时,T1控制波特率,一般就够用了。你看电子时钟:时时:分分:秒秒。秒,是1秒加一次一;分,是60秒加一次一;时,是3600秒加一次一。可能还有定时打铃的时刻等等。这么多事,用一个T0定时就都解决了。

相似回答