|
#include <STC89C5xRC.H>
#define uint unsigned int//宏定義unsigned int
#define uchar unsigned char//宏定義unsigned char
sbit echo=P3^2;//接收
sbit trig=P3^3;//發(fā)送
sbit led=P1^0;//蜂鳴器
sbit bw=P2^0;//百位
sbit sw=P2^1;//十位
sbit gw=P2^2;//個位
sbit sfw=P2^3;//十分位
uint timeh,timel,distance,time;
uchar bai,shi,ge,shifen;
bit flag;
uchar code list[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽極數(shù)碼管不帶小數(shù)點代碼數(shù)組
uchar code listtwo[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共陽極數(shù)碼管帶小數(shù)點代碼數(shù)組
void delay(uint z)//延時z毫秒函數(shù)
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
void delay20us()//延時20微秒函數(shù)
{
uchar a;
for(a=7;a>0;a--);
}
void ini()//初始化函數(shù)
{
TMOD=0x01;//設置定時器0為16位定時器/計數(shù)器
TH0=0;//定時器0高8位清0
TL0=0;//定時器0低8位清0
flag=0;//中斷標志位置0
trig=0;//trig信號置0
EA=0;//關閉總中斷
ET0=0;//關閉定時器0中斷
EX0=0;//關閉外部中斷0中斷
}
void display(distance)//顯示函數(shù)
{
bai=distance/1000;//分離百位
shi=distance%1000/100;//分離十位
ge=distance%100/10;//分離個位
shifen=distance%10;//分離十分位
P0=list[bai];//發(fā)送百位代碼
bw=0;//顯示百位
delay(1);//延時1毫秒
bw=1;//消隱百位
P0=list[shi];//發(fā)送十位代碼
sw=0;//顯示十位
delay(1);//延時1毫秒
sw=1;//消隱十位
P0=listtwo[ge];//發(fā)送個位代碼
gw=0;//顯示個位
delay(1);//延時1毫秒
gw=1;//消隱個位
P0=list[shifen];//發(fā)送十分位代碼
sfw=0;//顯示十分位
delay(1);//延時1毫秒
sfw=1;//消隱十分位
}
void main()//主函數(shù)
{
ini();//調用初始化函數(shù) 初始化定時器,關中斷
while(1)//無限循環(huán)
{
uchar i;
echo=1;//接收端置1,準備接收echo信號 這里的這句話不太懂,置1了還怎么接收回響信號輸出的高電平?
trig=1;//發(fā)送trig信號
delay20us();//延時20微秒
trig=0;//發(fā)送trig信號完畢
while(echo==0);//等待接收echo信號,如接收到echo信號則繼續(xù)執(zhí)行
flag=0;//中斷標志位置0
TH0=0;//定時器0高8位清0
TL0=0;//定時器0低8位清0
EA=1;//打開總中斷
EX0=1;//打開外部中斷0
TR0=1;//打開定時器0
for(i=1000;i>0;i--)//循環(huán)顯示100次
{
display(distance);//調用顯示函數(shù)
}
EA=0;//關閉總中斷
EX0=0;//關閉外部中斷0中斷
TR0=0;//關閉定時器0
if(flag==1)//如果進入中斷
{
time=timeh*256+timel;//計算時間
distance=time*0.172;//計算測定距離
}
else//否則
{
distance=0;//距離為0
}
if(distance<200)
{
led=0;
}
else
{
led=1;
}
}
}
void ex0() interrupt 0//外部中斷0中斷函數(shù)
{
timeh=TH0;//把定時器0高8位裝入timeh
timel=TL0;//把定時器0低8位裝入timel
flag=1;//中斷標志位置1
EX0=0;//關閉外部中斷0中斷
TR0=0;//關閉定時器0
}
|
|