数码之家

 找回密码
 立即注册
搜索
查看: 2566|回复: 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内置的小工具计算得到的:
89C52RC.jpg

回复 支持 反对

使用道具 举报

发表于 2020-10-29 09:40:17 | 显示全部楼层
好像89c52没有16位重装载,试试这个
void InitTimer0(void)
{
    TMOD = 0x05;    //这有不同
    TH0 = 0x4C;
    TL0 = 0x00;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}

打赏

参与人数 2家元 +30 收起 理由
goyimen + 20 多谢,这就试试!
家睦 + 10 熱心助人

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

发表于 2020-10-29 13:20:23 来自手机浏览器 | 显示全部楼层
你的板子上的晶振是多大频率的?是11.0592M的?
回复 支持 反对

使用道具 举报

发表于 2020-10-29 19:40:50 | 显示全部楼层
STC下载工具里有例程,可以去看看,如果还有问题,估计就不是软件的问题了
回复 支持 反对

使用道具 举报

 楼主| 发表于 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-10-29 23:59:05 来自手机浏览器 | 显示全部楼层
那就只有考虑在程序中先赋值TH0,再赋值TL0。初始化和中断函数都改一下。

打赏

参与人数 1家元 +20 收起 理由
goyimen + 20 熱心助人

查看全部打赏

回复 支持 1 反对 0

使用道具 举报

发表于 2020-10-30 08:26:55 | 显示全部楼层
goyimen 发表于 2020-10-29 22:26
这个源码就是STC-ISP里面给的。

QQ截图20201030082735.png 我说这里

打赏

参与人数 1家元 +20 收起 理由
goyimen + 20 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-10-31 20:33:55 | 显示全部楼层
不会啊,我的测试很正常

打赏

参与人数 1家元 +10 收起 理由
goyimen + 10 歡迎探討

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-10-31 20:53:39 | 显示全部楼层
值都没问题,软件要注意,i 变量要全局变量,如果是char类型最高就255。还有判断最好不要等于,最好写成:if(i>=60)这样即便增加过量也会执行,以防万一

打赏

参与人数 1家元 +20 收起 理由
goyimen + 20 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

发表于 2020-11-1 21:26:56 | 显示全部楼层
TMODE &=0xf0...

打赏

参与人数 1家元 +20 收起 理由
goyimen + 20 熱心助人

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 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, 2024-4-21 00:04 , Processed in 0.670801 second(s), 21 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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