牧夫天文网

 找回密码
 加入牧夫(请注明天文爱好者,否则无法通过审核)

QQ登录

只需一步,快速开始

[DIY咨询] 不明白为什么51

[复制链接]
liwenbao 发表于 2016-2-26 20:42 | 显示全部楼层 |阅读模式 来自: 天津市 联通

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?加入牧夫(请注明天文爱好者,否则无法通过审核)

x
不明白为什么  外部中断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 | 显示全部楼层 来自: 广东省云浮市 联通
到现在也没搞定单片机驱动步进电机,看来我确实不是这块料
回复 支持 反对

使用道具 举报

天行剑 发表于 2016-2-26 20:58 | 显示全部楼层 来自: 江苏省镇江市 电信
可以发下电路图么?

点评

现在 就 用的 开发板的 啊 等学习加调试完成 才考虑做板子啊  详情 回复 发表于 2016-2-26 21:28
回复 支持 反对

使用道具 举报

xiaoguilink 发表于 2016-2-26 21:03 | 显示全部楼层 来自: 广东省肇庆市 电信
将定时器初值的高低位各设一个全局变量,要加减速,增减该变量即可。

点评

您帮我看看 为什么 外部中断 1能打断定时器0 减速吗?做程序的时候 没注意 ,写进板子里 能按要求工作!但在检查程序的时候发现 这个是矛盾的啊!外部中断1 只能在 定时器0溢出前打断啊,但应当基本不能 减速  详情 回复 发表于 2016-2-26 21:33
回复 支持 反对

使用道具 举报

 楼主| 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溢出前打断啊,但应当基本不能 减速啊。可 我的 程序在板子里 能大幅度减速啊!

点评

看起来,只是一个比较长的停顿而已,定时中断程序里有固定的初值,应该间隔是不会变的。 我不是高手,稍懂一点AVR而已,51更加不懂,高手来解答。  详情 回复 发表于 2016-2-26 21:45
回复 支持 反对

使用道具 举报

xiaoguilink 发表于 2016-2-26 21:45 | 显示全部楼层 来自: 广东省肇庆市 电信
liwenbao 发表于 2016-2-26 21:33
您帮我看看  为什么   外部中断 1能打断定时器0 减速吗?做程序的时候 没注意 ,写进板子里 能按要求工作 ...

看起来,外部中断只是一个比较长的停顿而已,并没有实现加减速。定时中断程序里有固定的初值,应该间隔是不会变的。
我不是高手,稍懂一点AVR而已,51更加不懂,高手来解答。

点评

我 也 纳闷 啊 !但他确实 实际 大幅度减速了!  详情 回复 发表于 2016-2-27 08:46
回复 支持 反对

使用道具 举报

 楼主| liwenbao 发表于 2016-2-27 08:46 | 显示全部楼层 来自: 天津市 联通
xiaoguilink 发表于 2016-2-26 21:45
看起来,外部中断只是一个比较长的停顿而已,并没有实现加减速。定时中断程序里有固定的初值,应该间隔是 ...

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

点评

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

使用道具 举报

xiaoguilink 发表于 2016-2-27 11:09 来自手机 | 显示全部楼层 来自: 广东省肇庆市 电信
liwenbao 发表于 2016-2-27 08:46
我 也 纳闷 啊  !但他确实  实际  大幅度减速了!

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

点评

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

使用道具 举报

magichero 发表于 2016-2-27 14:20 来自手机 | 显示全部楼层 来自: 北京市 联通GSM/WCDMA/LTE共用出口
定时器响应中断后需要手动清除标志位

点评

这个不是自动清除的吗?  详情 回复 发表于 2016-2-27 14:24
回复 支持 反对

使用道具 举报

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取反语句注释掉看看,是否程序只是一直响应外部中断。 ...

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

点评

那就是你的电路问题了,检查一下。目前来看似乎按钮有自锁功能。  详情 回复 发表于 2016-2-27 15:30
回复 支持 反对

使用道具 举报

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 | 显示全部楼层 来自: 广东省肇庆市 电信
刚看了一下资料,外部中断电平触发需要软件清标志位。

点评

请教一下,想用28BYJ-48步进电机做电调焦,简单测试了下,感觉扭力好小,还有震动, 请问:程序上怎么设计,可以减少震动,增加扭力?  详情 回复 发表于 2016-2-27 20:16
回复 支持 反对

使用道具 举报

ll1234567 发表于 2016-2-27 20:16 | 显示全部楼层 来自: 四川省成都市 联通
xiaoguilink 发表于 2016-2-27 16:30
刚看了一下资料,外部中断电平触发需要软件清标志位。

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

回复 支持 反对

使用道具 举报

xiaoguilink 发表于 2016-2-27 20:25 | 显示全部楼层 来自: 广东省肇庆市 电信
电调需要的扭矩比较小,应该够用,将驱动电流慢慢调大试试,用细分驱动可改善震动。
回复 支持 反对

使用道具 举报

本版积分规则

快速回复 返回顶部 返回列表