電機測速: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后為啥需要延時??
|