简易倒车雷达装置C程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//
要求:
1、定时器采集超声波的反应时间
2、计算检测物体的距离,有效范围限定在2米
3、当物体检测小于1米时,蜂鸣器长促型的发出提示音效
4、当物体继续检测更小时,蜂鸣器依此逐渐以短急促音效提示
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit Trig=P2^6;//产生脉冲引脚,延时20us
sbit Echo=P2^7;//回波引脚
bit TimeUp=0;//定时器溢出标志位
sbit beep=P2^0;//蜂鸣器控制引脚
long Th0,Tl0;
unsigned long time0=0;
uint Measureresult=0;//测量值
void delayms(int n) //延时函数延时n/2毫秒{
int i,j;
for(i=0; i<n; i++)
for(j=0; j<55; j++);
}
void dichang()//蜂鸣器函数
{
uint i;
i = 800; //前1秒喇叭连续响
while(i>0) //向喇叭输入800HZ的方波震荡源
{
beep = 1;
delayms(1); //0.5毫秒高电平
beep= 0;
delayms(1); //0.5毫秒低电平
i--;
}
}
void diduan()
{
uint i, j;
i = 1; //喇叭间断响2秒
while(i>0)
{
j = 150; //喇叭响150毫秒
while(j>0)
{
beep= 1;
delayms(1);
beep= 0;
delayms(1);
j--;
}
delayms(100); //停100毫秒
i--;
}
}
void Measure(void)
{
uchar Del20us=0;//延时变量,在超声波脉冲引脚中产生20us 的方波
uchar EchoBack=1;//超声波返回标志位
TMOD=0x01;//定时器工作方式1:16 位,初值不能重装
Trig=0;//将超声波脉冲引脚电位拉低
Th0=0;//初始化变量值
Tl0=0;//初始化变量值
TimeUp=0;//初始化
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=0;//关定时器0
TH0=0;//赋定时器初始值高8 位为0
TL0=0;//赋定时器初始值低8 位为0
Trig=1;//拉高超声波脉冲引脚电位
for(Del20us=20;Del20us>0;Del20us--);//延时20us
Trig=0;//拉低超声波脉冲引脚电位,使之产生20us 的方波信号,使超声波模块开始工作。
while(Echo==0);//等待回波引脚变1,则开启定时器0;
TH0=0;
TL0=0;
TR0=1;//开定时器0
//使用软件查询的方式,检测超声波回波引脚,判断是否有声波返回,避免使用外部中断的
//形式,便于扩展多个超声波模块。
while(EchoBack)
{
if(Echo==0||TimeUp==1) //如果定时器溢出或者声波返回则重
启定时器0,
//并且获取当前时间和清零超声波返回标志位
{
TR0=0; //关闭定时器
Th0=TH0;
Tl0=TL0;
TR0=1;
EchoBack=0;
}
}
while(!TimeUp);//等待定时器溢出(给定超声波一个测距的时间范围)
time0=(Th0*256+Tl0);//取出定时器的值
Measureresult=((unsigned long)(344)*time0)/2000;//测量的结果单位为mm
}
void T0_time() interrupt 1 //定时器0中断服务函数
{
TimeUp=1;
}
void main()
{
while(1)
{
Measure();
if(30<Measureresult&&Measureresult<=50) diduan();
if(Measureresult>50&&Measureresult<900) dichang();
}
}。