程序代码
仿真图
单片机源程序如下:
#include
#include
/*********************宏定义************************/
#define uchar unsigned char
#define uint unsigned int
/************位定义*****************************/
sbit Trig=P3^7; //超声波模块触发位
sbit LEDRED=P1^0;
sbit LEDGREEN=P1^2;
sbit speaker=P1^7;
sbit person=P1^6;
sbit TLED= P1^5;
/************全局变量声明***********************/
uint H,T; //定义全局变量,H--距离,T--时间
/***********共阴数码管段码表********************/
uchar a_code[]={ //共阴数码管编码0~9
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
/*0x77,0x7c,0x39,0x5e,0x79,
0x71*/};
/***************延时函数************************/
void delay(uint z) //*1ms延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*************超声波模块启动函数**************/
void start()
{
Trig=1; //拉高触发信号,启动超声波模块发射超声波
_nop_(); //延时10us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
Trig=0; //拉低触发信号
}
/*****************数码管显示函数*****************/
void display(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
{
P2=0xfe;
P0=a_code[a];
delay(5);
P2=0xfd;
P0=a_code[b];
delay(5);
P2=0xfb;
P0=a_code[c];
delay(5);
P2=0xf7;
P0=a_code[d];
delay(5);
}
/*****************主函数*************************/
void main()
{
Trig=0;
LEDRED=1;
LEDGREEN=1;
speaker=0;
EA=1;
TMOD=0x19;//定时器0工作模式:
/*GATE=1(由外部中断0引脚及TR0共同启动定时器0)
C/T=0(定时模式)
M1M0=01(16位定时)*/
TH1=64580/256;
TL1=65480%256;
ET1=1;
TR0=1; //启动定时器0
EX0=1; //开外部中断0
IT0=1; //外部中断0设置为下降沿触发方式
while(1)
{
start(); //调用超声波模块启动函数
display(H/1000,H%1000/100,H%1000%100/10,H%10); //调用数码管显示函数
if(person==1)
{
TLED=1;
if(H<=25)
{
LEDRED=0;
LEDGREEN=1;
TR1=1;
}
else
{
LEDRED=1;
LEDGREEN=0;
TR1=0;
}
}
else
{
TLED=0;
LEDRED=1;
LEDGREEN=1;
TR1=0;
}
}
}
/***************外部中断0函数************************
回响输出端高电平宽度测量(上升沿到来时启动定时器0开始计时,
下降沿到来进入外部中断,关闭定时器0,停止计时,计算距离
********************************************************/
void int0() interrupt 0
{
TR0=0; //关闭定时器0
EX0=0; //关闭外部中断0
T=(TH0*256+TL0);//计算超声波传输时间,CPU采用12M时钟,则计算的单位为us
TH0=0; //定时器清0
TL0=0;
H=T*0.017; //计算距离,单位cm(注意:不能用H=(T*17)/1000,这样变成取整了)
H=H+2;
TR0=1; //开启定时器0
EX0=1; //开启外部中断0
}
void time1() interrupt 3
{
TR1=0;
TH1=65480/256;
TL1=65480%256;
speaker=~speaker;
TR1=1;
}
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』