|
#include <STC89C5xRC.H>
#define uint unsigned int//宏定义unsigned int
#define uchar unsigned char//宏定义unsigned char
sbit echo=P3^2;//接收
sbit trig=P3^3;//发送
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};//共阳极数码管不带小数点代码数组
uchar code listtwo[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极数码管带小数点代码数组
void delay(uint z)//延时z毫秒函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=123;y>0;y--);
}
void delay20us()//延时20微秒函数
{
uchar a;
for(a=7;a>0;a--);
}
void ini()//初始化函数
{
TMOD=0x01;//设置定时器0为16位定时器/计数器
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)//显示函数
{
bai=distance/1000;//分离百位
shi=distance%1000/100;//分离十位
ge=distance%100/10;//分离个位
shifen=distance%10;//分离十分位
P0=list[bai];//发送百位代码
bw=0;//显示百位
delay(1);//延时1毫秒
bw=1;//消隐百位
P0=list[shi];//发送十位代码
sw=0;//显示十位
delay(1);//延时1毫秒
sw=1;//消隐十位
P0=listtwo[ge];//发送个位代码
gw=0;//显示个位
delay(1);//延时1毫秒
gw=1;//消隐个位
P0=list[shifen];//发送十分位代码
sfw=0;//显示十分位
delay(1);//延时1毫秒
sfw=1;//消隐十分位
}
void main()//主函数
{
ini();//调用初始化函数 初始化定时器,关中断
while(1)//无限循环
{
uchar i;
echo=1;//接收端置1,准备接收echo信号 这里的这句话不太懂,置1了还怎么接收回响信号输出的高电平?
trig=1;//发送trig信号
delay20us();//延时20微秒
trig=0;//发送trig信号完毕
while(echo==0);//等待接收echo信号,如接收到echo信号则继续执行
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--)//循环显示100次
{
display(distance);//调用显示函数
}
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中断函数
{
timeh=TH0;//把定时器0高8位装入timeh
timel=TL0;//把定时器0低8位装入timel
flag=1;//中断标志位置1
EX0=0;//关闭外部中断0中断
TR0=0;//关闭定时器0
}
|
|