liwenbao 发表于 2016-2-26 20:42

不明白为什么51

不明白为什么外部中断1能打断定时器中断0 实现减速?高手给解答下?
#include <reg52.h>
sbit LED1 = P1^0;
sbit LED2 = P1^1;
sbit DIR = P1^3;
unsigned int a;
unsigned int d;
void delay(int z)
{
   unsigned int b,c;
   for(b=z;b>0;b--)
   for(c=20;c>0;c--);                                                                          
}

void init()
{

        TMOD = 0X11; //定时器0,1。16位定时器
        TH0 = 0xa2;
        TL0 = 0xe3;       //装载初值17814.
        TR0 = 1;        //启动定时器0
        ET0 = 1;        //启动定时器0中断
       


        TH1 = 0xfd;
        TL1 = 0xe8;       //装载初值17814.
        TR1 = 1;        //启动定时器1
        ET1 = 1;        //启动定时器1中断

    IT0 = 0;//低电平触发
    EX0 = 1;//外部中断0允许
    IT1 = 0;//低电平触发
    EX1 = 1;//外部中断1允许
        EA = 1;           //开总中断
}
void main()                  
{
        init();
    while(1);        // 等待中断
}        

void waizhong0() interrupt 0 //开外部中断0加速
{

if(TF0==1)
{
   LED1 =~LED1;
   TF0=0;
   TH0 =0xb7;
   TL0 = 0x98;
}
}
void waizhong1() interrupt 2 //开外部中断1减速
{
if(TF0==1)
{
   a++;
   TF0=0;
   TH0 =0;
   TL0 = 0;
   if(a==11)
    {
    LED1 =~LED1;
        a=0;
        }
}
}               

void timer0() interrupt 1       //定时器0中断服务程序
{
TH0 = 0xa2;
TL0 = 0xe3;
LED1 = ~LED1;                               //电机脉冲
}
void timer1() interrupt 3       //定时器1中断服务程序
{
TH1 = 0xfd;
TL1 = 0xe8;
LED2 = ~LED2;                               //电机脉冲
}

liwenbao 发表于 2016-2-26 20:46

按说在定时器溢出前   能打断定时器0但是应当不能实现减速啊

火星蒙面侠 发表于 2016-2-26 20:47

到现在也没搞定单片机驱动步进电机,看来我确实不是这块料{:5_302:}

天行剑 发表于 2016-2-26 20:58

可以发下电路图么?

xiaoguilink 发表于 2016-2-26 21:03

将定时器初值的高低位各设一个全局变量,要加减速,增减该变量即可。

liwenbao 发表于 2016-2-26 21:28

天行剑 发表于 2016-2-26 20:58
可以发下电路图么?

现在 就 用的开发板的 啊等学习加调试完成才考虑做板子啊

liwenbao 发表于 2016-2-26 21:33

xiaoguilink 发表于 2016-2-26 21:03
将定时器初值的高低位各设一个全局变量,要加减速,增减该变量即可。

您帮我看看为什么   外部中断 1能打断定时器0 减速吗?做程序的时候 没注意 ,写进板子里 能按要求工作!但在检查程序的时候发现 这个是矛盾的啊!外部中断1   只能在定时器0溢出前打断啊,但应当基本不能 减速啊。可 我的 程序在板子里 能大幅度减速啊!

xiaoguilink 发表于 2016-2-26 21:45

liwenbao 发表于 2016-2-26 21:33
您帮我看看为什么   外部中断 1能打断定时器0 减速吗?做程序的时候 没注意 ,写进板子里 能按要求工作 ...
看起来,外部中断只是一个比较长的停顿而已,并没有实现加减速。定时中断程序里有固定的初值,应该间隔是不会变的。
我不是高手,稍懂一点AVR而已,51更加不懂,高手来解答。

liwenbao 发表于 2016-2-27 08:46

xiaoguilink 发表于 2016-2-26 21:45
看起来,外部中断只是一个比较长的停顿而已,并没有实现加减速。定时中断程序里有固定的初值,应该间隔是 ...

我 也 纳闷 啊!但他确实实际大幅度减速了!

xiaoguilink 发表于 2016-2-27 11:09

liwenbao 发表于 2016-2-27 08:46
我 也 纳闷 啊!但他确实实际大幅度减速了!

那问题可能出现在外部中断源上,你把外部中断的LED取反语句注释掉看看,是否程序只是一直响应外部中断。

magichero 发表于 2016-2-27 14:20

定时器响应中断后需要手动清除标志位

xiaoguilink 发表于 2016-2-27 14:24

magichero 发表于 2016-2-27 14:20
定时器响应中断后需要手动清除标志位

这个不是自动清除的吗?

liwenbao 发表于 2016-2-27 15:24

xiaoguilink 发表于 2016-2-27 11:09
那问题可能出现在外部中断源上,你把外部中断的LED取反语句注释掉看看,是否程序只是一直响应外部中断。 ...

确实 是 在 一直响应外部中断。取反取消后 按减速灯 不   闪了 电机也不转了 。

xiaoguilink 发表于 2016-2-27 15:30

liwenbao 发表于 2016-2-27 15:24
确实 是 在 一直响应外部中断。取反取消后 按减速灯 不   闪了 电机也不转了 。
...

那就是你的电路问题了,检查一下。目前来看似乎按钮有自锁功能。

liwenbao 发表于 2016-2-27 15:36

本帖最后由 liwenbao 于 2016-2-27 15:42 编辑

好像找到原因了 自己分析的啊。。把外部中断里的溢出标志位复位删除就后,就响应定时器中断0了。难道是 ,手一直按着外部中断定时器0检测溢出,比溢出标志位复位慢,还没来的急检测就给清0了。

liwenbao 发表于 2016-2-27 15:43

确认了就是这个原因把复位语句放在最后执行相当于延时一会他就按理论 出牌了响应定时器0了也基本减不了速了!

xiaoguilink 发表于 2016-2-27 16:30

刚看了一下资料,外部中断电平触发需要软件清标志位。

ll1234567 发表于 2016-2-27 20:16

xiaoguilink 发表于 2016-2-27 16:30
刚看了一下资料,外部中断电平触发需要软件清标志位。

请教一下,想用28BYJ-48步进电机做电调焦,简单测试了下,感觉扭力好小,还有震动,
请问:程序上怎么设计,可以减少震动,增加扭力?

xiaoguilink 发表于 2016-2-27 20:25

电调需要的扭矩比较小,应该够用,将驱动电流慢慢调大试试,用细分驱动可改善震动。
页: [1]
查看完整版本: 不明白为什么51