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

[复制链接]
3806|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小软件生成的。
 楼主| laocuo1142 发表于 2014-8-11 17:49 | 显示全部楼层
ayb_ice 发表于 2014-8-11 17:25
程序不全,看不出来问题

重设初值要放在前面

全部程序太长,估计看下来比较够呛!这部分我感觉没什么问题啊
peter_wjp 发表于 2014-8-11 23:50 | 显示全部楼层
laocuo1142 发表于 2014-8-11 17:44
我就是在IO里进行测试,是我的10ms,变成了1.2ms,是不是我设置独立波特率的时候把定时器设置成1T模式了 ...

敢问LZ用STC的哪一款单片机?为什么不使用自动重装的定时器呢?
 楼主| laocuo1142 发表于 2014-8-12 08:52 | 显示全部楼层
peter_wjp 发表于 2014-8-11 23:50
敢问LZ用STC的哪一款单片机?为什么不使用自动重装的定时器呢?

STC11L32XE,自动重装的区间太小了,做不了10ms延时吧!我用的方式1
 楼主| laocuo1142 发表于 2014-8-12 09:33 | 显示全部楼层
晕,设置定时器T1的时候,把TMOD的值设置成0x20了,那T0就成了方式0了,唉。。。
kerby81 发表于 2014-8-12 11:25 | 显示全部楼层
测试的时候有没有设置晶振频率啊
gx_huang 发表于 2014-8-12 11:44 | 显示全部楼层
先不看别的,赋值语句放后面就不对。
也不需要关闭TR0呀。
peter_wjp 发表于 2014-8-12 13:34 | 显示全部楼层
laocuo1142 发表于 2014-8-12 08:52
STC11L32XE,自动重装的区间太小了,做不了10ms延时吧!我用的方式1

可以用计数器中断计数方式,
用手动重装的要在进入中断第一时间就要重新放初值,不然之前的程序会浪费时间的,而且在定时器中断内也没有必要关闭定时器中断,定时器中断不像串口之类的中断需要手动清零。
chenyu988 发表于 2014-8-18 14:59 | 显示全部楼层
u1s定义的是什么类型?
if(u1s>=6000)  ?
coody 发表于 2014-8-18 16:44 | 显示全部楼层
TXcount的定义 要加私有声明,或者定义成全局变量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1296

主题

6239

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部