电机测速: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后为啥需要延时??
|