打印

求助:STC 12C5A60S2.测试出定时器真实的运行时间

[复制链接]
2890|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jrcsh|  楼主 | 2013-5-22 12:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jrcsh 于 2013-5-22 12:33 编辑

从STC 89C52 上移植到 STC12C5A60S2

本来也是简单的事,

但是 12C 的定时器 上的记时时间和理论上的或弟三方提供的都不对

按 老妖说的 12C 1T     1Mhz 下 定时器每一脉冲因当为 1us

弟三方给出现  12C 1T  1Mhz 下   是 1.5us


写了代码

定时器 0  用 16位的方式     跑约一分钟   得出来的数值

定时器0  用 8位自装的方式 跑约 一分钟 得出来的数值

都和 上边的理论值出入比较大 ,为此俺就迷茫了~~~~ 看看 12C的PDF上也没有准确的说到这个定时器怎么样算的

看了他的示例代码是 完全按 1T 的理论方法来算的

#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

/* define constants */
#define FOSC 18432000L
#define MODE1T                      //Timer clock mode, comment this line is 12T mode, uncomment is 1T mode

#ifdef MODE1T
#define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
#else
#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode
#endif

/* define SFR */
sfr AUXR = 0x8e;                    //Auxiliary register
sbit TEST_LED = P0^0;               //work LED, flash once per second

/* define variables */
WORD count;                         //1000 times counter

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1 using 1
{
    TL0 = T1MS;                     //reload timer0 low byte
    TH0 = T1MS >> 8;                //reload timer0 high byte
    if (count-- == 0)               //1ms * 1000 -> 1s
    {
        count = 1000;               //reset counter
        TEST_LED = ! TEST_LED;      //work LED flash
    }
}

//-----------------------------------------------

/* main program */
void main()
{
#ifdef MODE1T
    AUXR = 0x80;                    //timer0 work in 1T mode
#endif
    TMOD = 0x01;                    //set timer0 as mode1 (16-bit)
    TL0 = T1MS;                     //initial timer0 low byte
    TH0 = T1MS >> 8;                //initial timer0 high byte
    TR0 = 1;                        //timer0 start running
    ET0 = 1;                        //enable timer0 interrupt
    EA = 1;                         //open global interrupt switch
    count = 0;                      //initial counter

    while (1);                      //loop
}


   


#define T1MS (65536-FOSC/1000)      //1ms timer calculation method in 1T mode
#else
#define T1MS (65536-FOSC/12/1000)   //1ms timer calculation method in 12T mode





求提点   这 STC 12C  的定时器到底是多少的   , 我都怀疑他自己的代码有没验证过



相关帖子

沙发
jrcsh|  楼主 | 2013-5-22 14:28 | 只看该作者
晕了~~~这贴发到这来了

使用特权

评论回复
板凳
airwill| | 2013-5-22 15:31 | 只看该作者
既然是 IT 的芯片, 那么定时器的时钟应该也是 1T, 如果 12MHz 的晶振, 应该就是 12MHz,
当然, 如果 IC 特别兼容12T 方式( 我不确定STC12C5A60S2 有这个功能). 那么就是 1MHz

使用特权

评论回复
地板
jrcsh|  楼主 | 2013-5-22 15:38 | 只看该作者
本帖最后由 jrcsh 于 2013-5-22 15:47 编辑
airwill 发表于 2013-5-22 15:31
既然是 IT 的芯片, 那么定时器的时钟应该也是 1T, 如果 12MHz 的晶振, 应该就是 12MHz,
当然, 如果 IC 特 ...

STC  信用记录方面不良, 他们给的数据~~得包着怀疑的态度去使用。


我是得到2个数据, 但是和实际使用的结果对不都对应不上,都不接近2个数值的范围


按 老妖说的 12C 1T     1Mhz 下 定时器每一脉冲因当为 1us

弟三方给出现  12C 1T  1Mhz 下   是 1.5us


写了代码

定时器 0  用 16位的方式     跑约一分钟   得出来的数值

定时器0  用 8位自装的方式 跑约 一分钟 得出来的数值

测试出来的数值如果接近哪个小差一点也能当是程序上的误差,, 问题是差得太多了 直接就是不对路的数据,
这下我也搞不清~~~他这个 12C 1T 的速度下 到底与频率成什么关系(1M   1us?  1.5us   xuS???),这样就计算不出用了多少时间



昨晚的程序带有 5110的显示 晚上回去 写一个只有 串口通信的在测测,

使用特权

评论回复
5
airwill| | 2013-5-22 15:47 | 只看该作者
我弄糊涂了, 定时器是什么频率, 你用软件还测不出来? 要跑一分钟.
用个指示灯闪烁, 一秒钟就测出来了嘛

使用特权

评论回复
6
jrcsh|  楼主 | 2013-5-22 15:52 | 只看该作者
airwill 发表于 2013-5-22 15:47
我弄糊涂了, 定时器是什么频率, 你用软件还测不出来? 要跑一分钟.
用个指示灯闪烁, 一秒钟就测出来了嘛 ...

1S  没有时间源,靠眼睛看误差太大

我只好用60S 来分摊这一次过的误差,平均到60S 左右下去

在选择 接受一定的误差值


我需要知道 定时器每一计数占用多少时间,   

使用特权

评论回复
7
canback| | 2013-5-25 18:48 | 只看该作者
弄个示波器测下嘛。

stc的1t单片机的定时器应该是兼容12T模式的。
默认不做改变,还是系统时钟的12分频

使用特权

评论回复
8
gdszzyq| | 2013-6-7 09:56 | 只看该作者
1T模式的话就是1MHZ一个脉冲1微妙,我测试过的,如果不准备也许是晶振精度问题。如果没有示波器的话建议可以搞个比较长时间出一个脉冲,然后平均来算

使用特权

评论回复
9
gdszzyq| | 2013-6-7 10:12 | 只看该作者
看LZ的程序用的18.432MHZ的时钟,你不会用1MHZ的晶振去测吧,如果真是这样当然不准啦

使用特权

评论回复
10
jrcsh|  楼主 | 2013-6-7 13:07 | 只看该作者
gdszzyq 发表于 2013-6-7 10:12
看LZ的程序用的18.432MHZ的时钟,你不会用1MHZ的晶振去测吧,如果真是这样当然不准啦 ...

你真能想象

使用特权

评论回复
11
gdszzyq| | 2013-6-7 14:33 | 只看该作者
不好意思那当我多事了

使用特权

评论回复
12
renwocai| | 2013-6-8 20:18 | 只看该作者
楼主,示波器应该备一个

使用特权

评论回复
13
jrcsh|  楼主 | 2013-6-8 23:06 | 只看该作者
renwocai 发表于 2013-6-8 20:18
楼主,示波器应该备一个

有呵呵

使用特权

评论回复
14
logokfu| | 2013-7-30 15:44 | 只看该作者
我用的都很准哦,我测试过了的。

使用特权

评论回复
15
ggh1987| | 2018-4-13 10:58 | 只看该作者
我用的是准确的。16位方式,应该注意的是进入中断后给TH、TL重新赋值的语句也是要占用时间的。

使用特权

评论回复
16
sky9218| | 2018-4-14 09:59 | 只看该作者

有示波器,定时中断取反一个IO,测IO波形,周期还得不到!这是秒得的事情。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:以上以下纯属瞎扯,概不承认!!!!! 感谢  应试教育 培养了我的基础    感谢自己  没吧应试教作为各种借口

228

主题

2348

帖子

18

粉丝