#include <REG52.h>
#define uchar unsigned char
#define uint unsigned int
#define soundspeed 17 // 17cm/ms 速度一半 使计算快速
uchar code datebit[]={0x7f,0xbf,0xdf,0xef};//,0xef,0xdf,0xbf,0x7f};
uchar code tvdate[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c};
sbit ZHD=P3^4;
sbit en555=P3^0;
sbit BY1=P3^3;
sbit shb=P3^6;
unsigned long t=0,count=0,distance=0;
unsigned char disdat[4];
unsigned char flag_t0=0; //TO中断次数
unsigned char flag_t1=0; //T1中断次数
bit flag_f=0; //flag_f=0近距离测试 flag_f=1远距离测试
int time;
//延时函数
void send()//开始发送超声波
{
en555=1; //发射超声波
TR1=1; //T1开始计时控制发送超声波的时间
TH0=TL0=0;
}
void stop() //停止测试
{
//en555=0;
TR0=0;
TR1=0;
EX0=0;
flag_t0=0;
//shb=0; //失败灯亮
ZHD=1; //成功的灯灭
}
void int0(void)interrupt 0
{
//en555=0;
TR0=0; //关闭T0
shb=1; //完成灯灭
t=TL0+TH0*256;//+65535*flag_t0;
ZHD=0; //接收到灯亮
EX0=0; //接收到一次中断 关闭
}
void time0(void)interrupt 1
{
TH0=TL0=0;
flag_t0++;
/*if(flag_t0==1&&flag_f==0)//2个655536US没有中断 启动远距离测试模式
{
flag_f=1; //测试一次失败
stop(); //先暂时停止
send(); //重新启动
}*/
if(flag_t0==5)//超出测试范围 停止.
{
stop(); //停止测试
flag_f=0; //一次失败标志清零 准备下一次测试
shb=0; //失败灯亮
}
}
void time1(void)interrupt 3
{
if(flag_f==0) //近距离测试
{
flag_t1++;
if(flag_t1==1)
{
//TR0=1;
//TH1=TL1=100;
}
if(flag_t1==2)
{
en555=0;
TR0=1;
TH1=TL1=5;
}
if(flag_t1==3)
{
EX0=1; //定时1ms以后打开接收中断,跳过余波干扰
flag_t1=0;
TR1=0; //关闭定时T1
}
}
/*if(flag_f==1) //远距离测试(第一次测试失败在启动)
{
flag_t1++;
if(flag_t1==1)
{
TR0=1;
}
if(flag_t1==10)
{
en555=0; //远距离测试发送2ms时间的脉冲波
}
if(flag_t1==18)
{
EX0=1; //定时3ms以后打开接收中断,跳过余波干扰
TR1=0; //关闭定时T1
flag_t1=0;
}
}*/
}
void delay10ms(void) //延时程序
{
unsigned char i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
key() //按键判断程序
{
if(BY1==0) //判断是否按下键盘
{
delay10ms(); //延时,软件去干扰
if(BY1==0) //确认按键按下
{
send();//发送超声波
}
while(BY1==0);//按键锁定,每按一次count只加1.
}
}
void delay(time)
{
unsigned char i,j;
for(j=0;j<time;j++)
for(i=0;i<250;i++);
}
display(void)
{ unsigned char k;
distance=t*soundspeed;//此处T单位是ns;soundspeed单位是厘米(17cm/ms);distance值是实际值的1000倍
//distance=distance*100; //将单位转换成厘米
disdat[0]=distance/100000;//flag/1000;//
disdat[1]=distance%100000/10000;//flag%1000/100;//
disdat[2]=distance%10000/1000;//flag%100/10;//
disdat[3]=distance%1000/100;//flag%10;//
for(k=0;k<4;k++)
{
if(k==2) P0=tvdate[disdat[k]]|0x80;//加小数点
else
P0=tvdate[disdat[k]];
P2=datebit[k];
delay(10);
}
}
main()
{
TMOD=0x21; //T1都工作在方式2 T0工作在方式1 定时方式
// IT0=1; IT1=1;
IE=IE|0x8A; //允许T1 T0中断
TH0=TL0=0;
TH1=TL1=5; //250US中断一次
en555=0;
//TR0=1;
while(1)
{
display();
key();
}
}
chao_shen_bo_ce_jv.rar_超声波
版权申诉
183 浏览量
2022-09-24
12:49:12
上传
评论
收藏 2KB RAR 举报
邓凌佳
- 粉丝: 66
- 资源: 1万+
最新资源
- gzip-1.12-3.1.x86-64.rpm
- student_manager.py
- stomp.js用于uniapp实现socket连接
- 网络安全相关的RSS订阅列表,这个项目记录了个人订阅的一些Hackers的博客地址,一些安全团队的博客,一些国外著名的安全新闻平
- SQLDumpSplitter3.rar
- java文字转语音示例
- (2024.3.19版本)最新全国三级(省-市-区县)行政区划表
- about edge deteetcionabout edge deteetcion
- about edge deteetcionabout edge deteetcion
- 基于java springboot高校工作室管理系统毕业设计源码+数据库,送文档
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈