打印

为什么单独测试定时器是10ms,放到我的整个程序就变成了1.2

[复制链接]
2885|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laocuo1142|  楼主 | 2014-8-11 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
为什么单独测试定时器是10ms,放到我的整个程序就变成了1.2,大家有没有遇到过,是什么影响了定时器?
/*定时器中断*/
void T0_service(void) interrupt 1
{
        unsigned int TXcount=0;             //定时器计时
    TF0=0;
    TR0=0;                              //关中断
    --u10ms;
    u1s++;
//    JINYIN=!JINYIN;                   //测试用,到这里就成了1.2ms了,怎么回事?
    if(u1s>=6000)                       //一分钟定时
    {
        JINYIN=!JINYIN;
        u1s=0;
        TXcount++;
        if(TXcount>=TxTime)
        {       
            fcycle=1;
            TXcount=0;   
        }           
    }
    if(u10ms==0)
    {
        f10ms=1;
    }
    TH0=0xDB;                           //重新赋初值
    TL0=0xFF;
    TR0=1;                              //开中断   
}
/*定时器初始化*/
void T0_init()
{
    TMOD=0x01;                          //设置定时器0为工作方式1
    TH0=0xDB;                           //重装初始值(65535-9216)=56319,10ms,DBFF
    TL0=0xFF;
    ET0=1;                              //允许定时中断
    TR0=0;                              //启动定时中断
}
STC的片子,中断都用上了,这是定时器部分的程序,我单独测试定时器,是10ms,放进去就成了1.2ms,用示波器检查了,有没有遇到过的?那里干扰了定时器吗?

相关帖子

沙发
ayb_ice| | 2014-8-11 17:25 | 只看该作者
程序不全,看不出来问题

重设初值要放在前面

使用特权

评论回复
板凳
淼淼森森| | 2014-8-11 17:27 | 只看该作者
中断处理中的那部分程序占用了时间,
TH0=0xDB;                           //重新赋初值
    TL0=0xFF;
    TR0=1;                              //开中断
这几句语句之前处理占用的时间你可以用IO测一下用了多长时间

使用特权

评论回复
地板
laocuo1142|  楼主 | 2014-8-11 17:44 | 只看该作者
淼淼森森 发表于 2014-8-11 17:27
中断处理中的那部分程序占用了时间,
TH0=0xDB;                           //重新赋初值
    TL0=0xFF;

我就是在IO里进行测试,是我的10ms,变成了1.2ms,是不是我设置独立波特率的时候把定时器设置成1T模式了!!!
void Uart485_init(void)                            //9600bps@11.0592MHz
{
        PCON &= 0x7f;                                //波特率不倍速
        SCON = 0x50;                                //8位数据,可变波特率
        BRT = 0xFD;                                    //设定独立波特率发生器重装值
        AUXR &= 0xfd;                                //独立波特率发生器时钟为Fosc/12,即12T
        AUXR |= 0x01;                                //串口1选择独立波特率发生器为波特率发生器
        AUXR |= 0x10;                                //启动独立波特率发生器
    AUXR1=0x80;                         //串口P1
    ES=1;
//    EA=1;
}
这个初始化是直接用STC小软件生成的。

使用特权

评论回复
5
laocuo1142|  楼主 | 2014-8-11 17:49 | 只看该作者
ayb_ice 发表于 2014-8-11 17:25
程序不全,看不出来问题

重设初值要放在前面

全部程序太长,估计看下来比较够呛!这部分我感觉没什么问题啊

使用特权

评论回复
6
peter_wjp| | 2014-8-11 23:50 | 只看该作者
laocuo1142 发表于 2014-8-11 17:44
我就是在IO里进行测试,是我的10ms,变成了1.2ms,是不是我设置独立波特率的时候把定时器设置成1T模式了 ...

敢问LZ用STC的哪一款单片机?为什么不使用自动重装的定时器呢?

使用特权

评论回复
7
laocuo1142|  楼主 | 2014-8-12 08:52 | 只看该作者
peter_wjp 发表于 2014-8-11 23:50
敢问LZ用STC的哪一款单片机?为什么不使用自动重装的定时器呢?

STC11L32XE,自动重装的区间太小了,做不了10ms延时吧!我用的方式1

使用特权

评论回复
8
laocuo1142|  楼主 | 2014-8-12 09:33 | 只看该作者
晕,设置定时器T1的时候,把TMOD的值设置成0x20了,那T0就成了方式0了,唉。。。

使用特权

评论回复
9
kerby81| | 2014-8-12 11:25 | 只看该作者
测试的时候有没有设置晶振频率啊

使用特权

评论回复
10
gx_huang| | 2014-8-12 11:44 | 只看该作者
先不看别的,赋值语句放后面就不对。
也不需要关闭TR0呀。

使用特权

评论回复
11
peter_wjp| | 2014-8-12 13:34 | 只看该作者
laocuo1142 发表于 2014-8-12 08:52
STC11L32XE,自动重装的区间太小了,做不了10ms延时吧!我用的方式1

可以用计数器中断计数方式,
用手动重装的要在进入中断第一时间就要重新放初值,不然之前的程序会浪费时间的,而且在定时器中断内也没有必要关闭定时器中断,定时器中断不像串口之类的中断需要手动清零。

使用特权

评论回复
12
chenyu988| | 2014-8-18 14:59 | 只看该作者
u1s定义的是什么类型?
if(u1s>=6000)  ?

使用特权

评论回复
13
coody| | 2014-8-18 16:44 | 只看该作者
TXcount的定义 要加私有声明,或者定义成全局变量

使用特权

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

本版积分规则

1193

主题

5225

帖子

12

粉丝