打印

51单片机定时器初值可以设为变量吗

[复制链接]
4487|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
日暮惜乔|  楼主 | 2013-1-14 20:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dirtwillfly| | 2013-1-14 21:48 | 只看该作者
你把a宏定义成一个固定的值,编译起来就快了。
带变量的定时器初值设置TH0=(65536-a)/256和TL0=(65536-a)%256

定值的定时器初值设置TH0=(65536-1000)/256和TL0=(65536-1000)%256
编译时间会差很多的。
带变量要首先进行计算才行,这样就会多花费很多时间

使用特权

评论回复
板凳
jrcsh| | 2013-1-14 23:34 | 只看该作者
可以。

因当是初始时用这个时间,时间还是要的,只是下次使用时不用在运算的时间了

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
日暮惜乔 + 1 赞一个!
地板
日暮惜乔|  楼主 | 2013-1-15 13:57 | 只看该作者
dirtwillfly 发表于 2013-1-14 21:48
你把a宏定义成一个固定的值,编译起来就快了。
带变量的定时器初值设置TH0=(65536-a)/256和TL0=(65536-a)%2 ...

我是要驱动步进电机,用定时器给脉冲,用delay()的话主函数全用来执行它了,而且电机加速度越来越快,请问还有其他办法解决吗???还请指点

使用特权

评论回复
5
日暮惜乔|  楼主 | 2013-1-15 14:01 | 只看该作者
jrcsh 发表于 2013-1-14 23:34
可以。

因当是初始时用这个时间,时间还是要的,只是下次使用时不用在运算的时间了 ...

有办法即设变量,还能执行速度快吗

使用特权

评论回复
6
jrcsh| | 2013-1-15 15:27 | 只看该作者
电机加速度~~~很慢的, 不管是用中断还是用 软延时都可以应付。   什么定时器中断比较好协调资源的使用,  

你可以事先把加减速的表作出来, 使用时代入到定时器

使用特权

评论回复
7
日暮惜乔|  楼主 | 2013-1-15 18:39 | 只看该作者
jrcsh 发表于 2013-1-15 15:27
电机加速度~~~很慢的, 不管是用中断还是用 软延时都可以应付。   什么定时器中断比较好协调资源的使用,  
...

void Timer0_ISR() interrupt 1
{
        TH0=(65536-cycle)/256;
        TL0=(65536-cycle)%256;
        num--;
        if(num==0)
        {
                num=100;
                if(cycle>30)
                {
                        cycle--;
                }
        }
        clk=~clk;
}
电机转的很慢,你的意思是把cycle设一个数组吗?

使用特权

评论回复
8
日暮惜乔|  楼主 | 2013-1-15 18:45 | 只看该作者
日暮惜乔 发表于 2013-1-15 18:39
void Timer0_ISR() interrupt 1
{
        TH0=(65536-cycle)/256;

能说的具体点吗?这个问题困扰了很久,,不解决就没办法就行下一步

使用特权

评论回复
9
lemenade| | 2013-1-15 19:10 | 只看该作者
跟着学习一下。

使用特权

评论回复
10
jrcsh| | 2013-1-15 19:51 | 只看该作者
本帖最后由 jrcsh 于 2013-1-15 20:00 编辑



void Timer0_ISR() interrupt 1
{
      
TL0 = aaa;                //设置定时初值
TF0 = 0;                //清除TF0标志

        TR0 = 1;                //定时器0开始计时
        TH0 =bbb;                //设置定时初值
       num--;
        if(num==0)
        {                                num=100;
                if(cycle>30)
                {

                          ccc=1; //-----------标记
                           cycle--;
                }
        }
        clk=~clk;
}

main()
{
aaa=(65536-cycle)/256;
bbb=(65536-cycle)%256;
ccc=0;
TH0=aaa;
TL0=bbb;
while(1)
{
if(ccc==1)
{
aaa=(65536-cycle)/256;
bbb=(65536-cycle)%256;

ccc=0;
}
}
}

使用特权

评论回复
11
jrcsh| | 2013-1-15 20:07 | 只看该作者
  熟悉了整个过程之后, 还可以把这个程序在优化得简单


从你的加速方法来看看, 也就是定时器的 TL0  减1 的操作,知道了最终于的操作就可以把哪个计算公式用完后扔了, 只要进行减一操作就好了


void Timer0_ISR() interrupt 1
{
TL0 = aaa;                //设置定时初值
TF0 = 0;                //清除TF0标志
TR0 = 1;                //定时器0开始计时
TH0 =bbb;                //设置定时初值
num--;
if(num==0)
{
   num=100;
if(cycle>30)
{
   cycle--;
   aaa--;                }
        }
        clk=~clk;
}

main()
{
aaa=(65536-cycle)/256;
bbb=(65536-cycle)%256;

TH0=aaa;
TL0=bbb;
while(1)
{


}//w1
}//ma








使用特权

评论回复
12
jrcsh| | 2013-1-15 20:08 | 只看该作者
你的电机速度上不去  定时的时间长了

使用特权

评论回复
13
日暮惜乔|  楼主 | 2013-1-21 15:34 | 只看该作者
jrcsh 发表于 2013-1-15 20:07
熟悉了整个过程之后, 还可以把这个程序在优化得简单

问题解决啦!!非常感谢您!!:)

使用特权

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

本版积分规则

5

主题

19

帖子

0

粉丝