#include"reg52.h" //頭文件包含
#include<intrins.h>
sbit LED0=P1^0; //LED燈個位定義
sbit LED1=P1^1; //LED燈十位定義
sbit LED2=P1^2; //LED燈百位定義
sbit LED3=P1^3; //LED燈千位定義
sbit LED4=P1^4; //LED燈使能
sbit Trig=P1^0; //超聲波傳感器使能引腳定義
sbit Echo=P3^2; //超聲波傳感器回波引腳定義
float time=0; //回波總時間
unsigned int distance=0; //距離(cm)
unsigned char timeH=0; //定時器1定時值高八位
unsigned char timeL=0; //定時器1定時值低八位
unsigned char counter=0; //定時器0計數值
unsigned char LedBuf[6];
unsigned char code LED_num[10]={
0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90}; //數碼管真值
bit success=0; // 回波接收成功標志
void delay(unsigned int x)// 延時程序(x=1,i=10)時延時50us
{
unsigned int i,j;
for(j=0;j<x;j++)
{
for(i=0;i<10;i++)
{
_nop_();//空指令
_nop_();
}
}
}
void display()
{
signed char i;
unsigned char buf[6];
for(i=0;i<6;i++)
{
buf[i] = (unsigned char)(distance%10);
distance /= 10;
}
for(i=5;i>=1;i--)
{
if(buf[i] == 0)
LedBuf[i] = 0xFF;
else
break;
}
for(;i>=0;i--)
{
LedBuf[i] = LED_num[buf[i]];
}
}
void main(void)
{
Trig = 0; //使能管腳初始拉低
TMOD &= 0x11;//定時器0和1設定為16位工作模式
TH0 = 0x3C; //-5000>>8 = 60
TL0 = 0xB0; //-5000%256 = 176
TR0 = 1; //開定時器0
ET0 = 1; //定時器0中斷允許
EX0 = 1; //外部中斷0允許
IT0 = 1; //外部中斷0下降沿觸發
EA = 1; //開總中斷
LED3 = 1;
LED4 = 0;
while(1)
{
if(success == 1)//判斷是否接收成功
{
distance = (time * 0.017- 10);//根據時間求出距離
success = 0;
}
display();
}
}
void LedScan()
{
static unsigned char i=0;
P0 = 0xFF;
P1 = (P1 & 0xF8) | i;
P0 = LedBuf[i];
if(i<5)
i++;
else
i = 0;
}
void Timer0int() interrupt 1 //50ms*4=0.2s,每0.2秒測一次距
{
EA = 0;
TR0 = 0;
counter++;
if(counter==4)
{
Trig = 1;
delay(1);
Trig = 0;
TH1 = 0;
TL1 = 0;
TR1 = 1;
counter = 0;
}
TH0 = 0x3C;
TL0 = 0xB0;
TR0 = 1;
EA = 1;
LedScan();
}
void exint() interrupt 0 //外部中斷0用于檢測回波下降沿
{
TR1 = 0;
timeH = TH1;
timeL = TL1;
TH1 = 0;
TL1 = 0;
time = timeH * 256 + timeL;
success = 1;
}
|