請問這個程序初始時,是不是一到T1的定時時間就跑到T1的中斷服務子程序里了?迷惑的是"數碼管顯示程序LED4_Display ()"也在T1的中斷服務子程序里,但這個時候不是才剛剛開始嗎(才發射超聲波),要想顯示距離,還得往后運行把測得數值的個十百千位拿出來執行LED4_Display ()讓其顯示,但往后運行的時候還怎么再進T1的中斷服務子程序里執行LED4_Display ()?
求教!
這是程序,注釋有點不全,見諒。。
#include <AT89X51.H>
#include <intrins.h>
//-----------------------------------------------------------------------------
// ??????
#define uchar unsigned char
void main (void); // 主函數
void LED4_Display (void); // LED顯示
void LED_OUT(uchar X); // LED單字節串行移位函數
void Conut(void);
unsigned char code LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A B C D E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
}; // LED字模表
sbit DIO = P1^0; //串行數據輸入
sbit RCLK = P1^1; //時鐘脈沖信號————上升沿有效
sbit SCLK = P1^2; //打入信號————上升沿有效
sbit RX=P2^1; //ECHO
sbit TX=P2^0; //TRIG
unsigned int time=0;
unsigned int timer=0;
unsigned char posit=0;
unsigned long S=0;
bit flag =0;
//-----------------------------------------------------------------------------
// 全局變量
uchar LED[4]; //用于LED顯示緩沖
//*****************************************************************************
// 主程序
//
void main (void)
{
TMOD=0x11;
TH0=0;
TL0=0;
TH1=(65536-200)/256;
TL1=(65536-200)%256;
EA=1;
ET0=1;
ET1=1;
TR1=1;
while(1)
{
while(!RX); //?RX?????
TR0=1; //????
while(RX); //?RX?1?????
TR0=0; //????
Conut(); //??
}
}
void LED4_Display (void)
{
unsigned char code *led_table; // 查表指針
uchar i;
//顯示第1位
led_table = LED_0F + LED[0];
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
RCLK = 0;
RCLK = 1;
//顯示第2位
led_table = LED_0F + LED[1];
i = *led_table;
LED_OUT(i);
LED_OUT(0x02);
RCLK = 0;
RCLK = 1;
//顯示第3位
led_table = LED_0F + LED[2];
i = *led_table;
LED_OUT(i);
LED_OUT(0x04);
RCLK = 0;
RCLK = 1;
//顯示第4位
led_table = LED_0F + LED[3];
i = *led_table;
LED_OUT(i);
LED_OUT(0x08);
RCLK = 0;
RCLK = 1;
}
void LED_OUT(uchar X)
{
uchar i;
for(i=8;i>=1;i--)
{
if (X&0x80) DIO=1; else DIO=0;
X<<=1;
SCLK = 0;
SCLK = 1;
}
}
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S= (long)(time*0.17); //計算公式
if((S>=4000)||flag==1) //大于4m或太遠
{
flag=0;
LED[0]=0; //??
LED[1]=0; //??
LED[2]=0; //??
LED[3]=0; //??
}
else //正常顯示
{
LED[3]=S%10000/1000;
LED[2]=S%1000/100;
LED[1]=S%100/10;
LED[0]=S%10/1;
}
}
/********************************************************/
void zd0() interrupt 1 //T0?????????,??????
{
flag=1; //??????
}
void int1_dis() interrupt 3
{
TH1=(65536-200)/256;
TL1=(65536-200)%256;
LED4_Display ();
timer++;
if(timer>=200)
{
timer=0;
TX=1; //800MS ??????
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
_nop_(); _nop_(); _nop_();
TX=0;
}
} |