数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 2889|回复: 14

[C51] 89C52RC定时器的疑问

[复制链接]
发表于 2020-10-29 08:33:43 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
刚学单片机,最近做个89C52RC的定时器试验有点不太明白,就是装载的定时器初值和实际时间不一致,大家帮解释一下谢谢!代码如下:

//======================定时器初始化
void init() //50毫秒@11.0592MHz
{
  TMOD=0x01; //设置定时器模式

  TL0=0x00;         //设置定时器初值
  TH0=0x4C;  //设置定时器初值  

  TF0=0;
  TR0=1;
  ET0=1;
  EA=1;

}

//===========================定时器中断
void time0() interrupt 1
{
    TL0=0x00;   
    TH0=0x4C;   

    i++;
    if (i==60)  //50ms*60=3000ms=3s,实际测试i==100时(50ms*100=5000ms=5s)也就才相当于1秒,理论计算不应该是5秒吗?
    {
        i=0;
        K1=~K1;  //K1是一个继电器,用于测试定时器延时时间效果
    }
}

 楼主| 发表于 2020-10-29 08:36:10 | 显示全部楼层
定时器初值是用STC-ISP内置的小工具计算得到的:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 12:02:21 | 显示全部楼层
89609x 发表于 2020-10-29 09:40
好像89c52没有16位重装载,试试这个
void InitTimer0(void)
{

试了一下,还是跟原来一样,延时时间并没有改变,估计不是这个原因:handshake:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 22:24:44 | 显示全部楼层
fair2017 发表于 2020-10-29 13:20
你的板子上的晶振是多大频率的?是11.0592M的?

是的,11.0592M。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-29 22:26:11 | 显示全部楼层
本帖最后由 goyimen 于 2020-10-29 22:27 编辑
ploestar 发表于 2020-10-29 19:40
STC下载工具里有例程,可以去看看,如果还有问题,估计就不是软件的问题了

这个源码就是STC-ISP里面给的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 09:34:19 | 显示全部楼层
感谢各位朋友,问题找到了,是因为后面还有个串口初始化,赋值时没注意将前面的定时器TMOD的值给改了,后来将串口的赋值“TMOD=”改为“TMOD|=”,这样就不会互相影响了。
真是粗心害死人,一个小问题搞了好几天才找到原因:sweat:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-2 09:37:59 | 显示全部楼层
水表君 发表于 2020-10-31 20:53
值都没问题,软件要注意,i 变量要全局变量,如果是char类型最高就255。还有判断最好不要等于,最好写成:if ...

判断最好不要等于,最好写成:if(i>=60)这样即便增加过量也会执行,以防万一

非常赞的经验,感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-26 12:59 , Processed in 0.202801 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表