6167|9

52

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

51单片机定时器的时间设置问题 [复制链接]

我想问一下,在 Keil 的C语言开发中,为51单片机进行开发时,如何使用定时器中断的设置问题。
我的程序是这样的:

  1. #include
  2. sbit LED=P1^2;

  3. void Init_Timer1(void)
  4. {
  5. TMOD |= 0x10;                             
  6. TH1=0x00;
  7. TL1=0x00;
  8. EA=1;
  9. ET1=1;
  10. TR1=1;  
  11. }

  12. main()
  13. {
  14. Init_Timer1();
  15. while(1);
  16. }

  17. void Timer1_isr(void) interrupt 3 using 1
  18. {
  19. TH1=0x00;
  20. TL1=0x00;
  21. LED=~LED;
  22. }
复制代码

我想问一下,用的是11.0592MHZ的晶震,该如何设置才是每隔1毫秒触发一次Timer1_isr过程?
如果我用24.000MHZ的晶震,又该如何设置每隔1毫秒触发一次Timer1_isr过程呢?

最新回复

内部计数器用作定时器时,是对机器周期计数。每个机器周期的长度是12个振荡器周期。因为实验系统的晶振是11.0592MHz,所以定时常数的设置可按以下方法计算: 机器周期=12÷11.0592MHz=1.0857μS (65536-定时常数)*1.0857μS=50mS 定时常数=4C00H   详情 回复 发表于 2009-8-14 23:40
点赞 关注

回复
举报

60

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
有一个公式,具体是什么  不好意思 记不起来了,书本里有  去查下吧
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
不要使用11.059的晶振,要准确使用12M的比较合适。

这个单片机定时器是向向生长的。

一般情况下是

初始化模式
初始化初值

即可,这个例子很多啊,

你现在
TH1=0x00;
TL1=0x00;

定时器满就会产生一次中断,你现在把这个初值改大点就慢慢了解了。

楼主,这个书还是买几本的。马忠梅吧出过一本不错的书,貌似是北航出版社的。

去找来看看,一切问题解决。

现在不做单片机了,只能提醒这个了。

哈哈
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
社区生日: 2003-06-17 |生日:1978-02-27 所在城市: 中国 广西 柳州市 技术专长: 软件开发,图形设计,网站开发,研究我未知的技术 开发工具: EVB,EVC,KEIL 8.0,VB6.0,VC6.0,记事本


呜呜,我也是广西的,嘿嘿。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
谢谢提点,但是我想知道如何设置能达到比较准确的2000微秒,能不能告知一下。
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

6
 
12M的好像这样设置是2毫秒
TL0=0x15;               
TH0=0xB8;

那11.0592M的呢?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

7
 
0xB815=46357,65536-46357=19179,如果指令周期是12M/12=1us则定时器每19179*1us溢出一次(19.179ms).对高速51(一个指令周期=4时钟),则时间为4794.75us
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
=========================================================
1. 晶振为11.0592M,每计数一次用时12/11.0592M=1.085us
2. TMOD取0x10,即模式1——16位计数器(0~65535)
3. 计时2ms,则2ms/1.085us=1843,故TH0=(65536-1843)/256,TL0=(65536-1843)%256
=========================================================
综上所述:
#include
sbit LED=P1^2;

void Init_Timer1(void)
{
TMOD |= 0x10;                 
TH1=(65536-1843)/256;
TL1=(65536-1843)%256;
EA=1;
ET1=1;
TR1=1;  
}

main()
{
Init_Timer1();
while(1);
}

void Timer1_isr(void) interrupt 3 using 1
{
TH1=(65536-1843)/256;
TL1=(65536-1843)%256;
LED=~LED;
}
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

9
 
非常感谢
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
内部计数器用作定时器时,是对机器周期计数。每个机器周期的长度是12个振荡器周期。因为实验系统的晶振是11.0592MHz,所以定时常数的设置可按以下方法计算:
机器周期=12÷11.0592MHz=1.0857μS
(65536-定时常数)*1.0857μS=50mS
定时常数=4C00H
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表