找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4861|回复: 5
收起左侧

问flag如何判断是第几个负跳变,问题多多

[复制链接]
ID:80909 发表于 2015-5-29 17:44 | 显示全部楼层 |阅读模式
电机测速:INT0采用下降沿负跳变触发方式,第一个负跳变T0开始计时另flag=0,第二个负跳变停止计时另flag=1,为一个周期的时间即转一圈的时间,然后换算为r/min.为了使显示清楚,用T1控制大约每隔0.3秒采集刷新显示一次。
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define DUAN XBYTE[0X8004]
#define WEI XBYTE[0x8002]
#define uchar unsigned char
#define uint  unsigned int
uchar tabledu[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
uchar QIAN,BAI,SHI,GE,CNT,FLAG=0;//此处falg初值为0

unsigned long T,N;
void timer1(void) interrupt 3
{
TH1=0X3C;
TL1=0XB0;
CNT--;
if(CNT==0)
{
  CNT=3;
  EX0=1;
  IE0=0;
}
}
void int0(void) interrupt 0
{


if(FLAG==1)
{
  TR0=0;
  T=TH0*256+TL0;
  N=30000000/T;
  QIAN=N/1000;
  BAI=N%1000/100;
  SHI=N%1000%100/10;
  GE=N%1000%100%10;
  FLAG=0;
  EX0=0;
}
else
{
  TR0=1;
  TH0=0;
  TL0=0;
   FLAG=1;
}
}
void delay(uint t)
{
for(;t>0;t--);

}
main()
{
CNT=3;
TMOD=0X11;
EA=1;
ET1=1;
TH1=0X3C;
TL1=0XB0;
IT0=1;
TR1=1;
TF1=0;
for(;;)
{
  WEI=1;
  DUAN=tabledu[GE];
  delay(20);
  WEI=2;
  DUAN=tabledu[SHI];
  delay(20);
  WEI=4;
  DUAN=tabledu[BAI];
  delay(20);
  WEI=8;
  DUAN=tabledu[QIAN];
  delay(20);
}
}


问题,第一个负跳变来临,INT0中断,执行else后面括号的程序,T0开始计时,怎么就i另flag=1了呢,或者第二个负跳变来临flag怎么知道??应该是第二个负跳变来临,再执行中断程序,如何知道第二个负跳变来临?不明白。想了半天了,气死我了都。还有DUAN , WEI后为啥需要延时??
回复

使用道具 举报

ID:79908 发表于 2015-5-30 07:35 | 显示全部楼层
你定义一个全局变量来计算进中断函数次数试一试
回复

使用道具 举报

ID:80909 发表于 2015-5-30 09:54 | 显示全部楼层
电子爱好者life 发表于 2015-5-30 07:35
你定义一个全局变量来计算进中断函数次数试一试

现在的问题就是,第一次负跳变中断执行,flag置0,第二次负跳变来了还要执行中断的,这个中断程序里自己怎么识别?o(︶︿︶)o 唉我是门外汉,不懂啊。程序是别人编写的运行正确。
回复

使用道具 举报

ID:79908 发表于 2015-5-30 23:14 | 显示全部楼层
找妹子 发表于 2015-5-30 09:54
现在的问题就是,第一次负跳变中断执行,flag置0,第二次负跳变来了还要执行中断的,这个中断程序里自己 ...

首先启动定时中断1,每200ms 检测打开外部中断,第一次进入外部中断执行else里的内容,并使flag=1;第二次进入外部中断执行flag=1里的内容,并关闭定时器和外部中断,这样就实现两次进入中断后不再进入外部中断了。
回复

使用道具 举报

ID:80909 发表于 2015-5-31 12:19 | 显示全部楼层
电子爱好者life 发表于 2015-5-30 23:14
首先启动定时中断1,每200ms 检测打开外部中断,第一次进入外部中断执行else里的内容,并使flag=1;第二 ...

3克油!!
回复

使用道具 举报

ID:80909 发表于 2015-5-31 14:36 | 显示全部楼层
电子爱好者life 发表于 2015-5-30 23:14
首先启动定时中断1,每200ms 检测打开外部中断,第一次进入外部中断执行else里的内容,并使flag=1;第二 ...

谢谢,这个解释我懂了这个程序。嗨哟 就是为啥DUAN、WEI分配后,必须有延时delay程序啊??
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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