超声波测距报警c程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//*头文件*//
#ifndef _CSB_H_
#define _CSB_H_
#include
#include
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned long uint32;
typedef char int8;
typedef int int16;
uint8 code num[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xa7,0xa1,0x86,0x8e,
0xFF,0xBF,0xfc,0xf8,
0xf0 };
uint8 buf[4]={0,0,0,0};//数据缓冲
uint16 baojin =700; //报警距离
uint16 baojin0 = 40; //报警距离
uint16 baojin1 = 20; //报警距离
uint16 time = 0;
uint32 S = 0; //距离
uint16 timer;
bit flag = 0; //接收信号标志
//数码管定义//
sbit ADDR0 = P1^0; ///38译码器地址
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4; //使能
//超声波定义//
sbit RX = P2^0; //trig脚
sbit TX = P2^1; //Echo
//蜂鸣器定义//
sbit BUZZ = P1^6;
void delay(uint16 n);
#endif
//*c文件*//
#include "csb.h"
void delay(uint16 n)//延时
{
while (n--);
}
void timer_init()//定时器初始化
{
TMOD = 0x01;
TH0 = 0;
TL0 = 0;
TR0 = 1;
ET0 = 1;
TMOD &= 0x0F;
TMOD |= 0x10;
TH1 = 0xF8;
TL1 = 0x30;
TR1 = 1;
ET1 = 1;
EA = 1;
}
//数码管刷新//
void led_refresh()
{
static uint8 j=0;
ENLED = 1; //消隐
switch(j)
{
case 0:ADDR0 = 0;
ADDR1 = 0;
ADDR2 = 0;
P0 = num[buf[0]];
break;
case 1:ADDR0 = 1;
ADDR1 = 0;
ADDR2 = 0;
P0 = num[buf[1]];
break;
case 2:ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 0;
P0 = num[buf[2]];
break;
case 3:ADDR0 = 0;
ADDR1 = 1;
ADDR2 = 1;
P0 = num[buf[3]];
break;
}
ENLED = 0;
if (j >= 4) //4个数码管循环显示
j = 0;
else
j++;
}
//报警程序//
void warning()
{
uint16 i;
for(i=0;i<300;i++) //喇叭发声的时间循环,改变大小可以 改变发声时间长短
{
delay(30); //参数决定发声的频率,估算值
BUZZ = !BUZZ;
}
BUZZ = 1; //喇叭停止工作,间歇的时间,可更改
delay(2000);
}
//超声波计算//
void count()
{
time = TH0*256+TL0;
TH0 = 0;
TL0 = 0;
S = time*1.87/100; //转换成厘米1.87是音速的二分之一
if((S>=700)||flag ==1) //测试成功超出范围
{
flag = 0; //测试失败
buf[0]=17; // 显示“-”
buf[1]=17; // 显示“-”
buf[2]=17; // 显示“-”
}
else
{
buf[0] = S%10; //个位
buf[1] = S/10%10; //十位
buf[2] = S/100%10; //百位
if(buf[2]==0) //如果百位等于0
{
buf[2]=16; //不显示
if(buf[1]==0) //如果十位等于0
{
buf[1]=16; //不显示
}
}
}
if(S
buf[3]=18; //绿灯亮
if(S
warning();// 开始报警
buf[3]=19; //黄灯亮
}
if(S
warning(); //开始报警
buf[3]=20; //红灯亮
}
}
else
{
buf[3]=16;//关闭红绿灯
}
}
void zd0() interrupt 1
{
flag = 1;
}
void main()
{
ENLED = 0;
ADDR3 = 1;
P0=0xFF;
timer_init();
while(1)
{
while(!RX); //当RX为零时等待
TR0=1; //开启计数
while(RX);
TR0 = 0; //当RX为1计数并等待
count();
}
}
void ZD1() interrupt 3
{
TH1=0xf8;
TL1=0x30;
led_refresh(); //数码管刷新
timer++;
if(timer>=400)
{
timer=0;
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
}