标题:
基于c51的超声波雷达扫描程序
[打印本页]
作者:
zm52020
时间:
2018-9-13 09:47
标题:
基于c51的超声波雷达扫描程序
不懂的咨询我
单片机源程序如下:
///////////////////////////////////////////////////////////////
//Project : 数字循环显示.c
//版本 : V1.0
//作者 : 源动力
//说明 :本函数只适用于南阳理工学院电子系51开发板。
//用法 : 直接下载到51单片机
//功能 :和超声波模块HC-SR04相连,检测距离
//接口说明:超声波接口 —51开发板
// Trig — P1^0
// Echo — P3^2
///////////////////////////////////////////////////////////////
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit D1=P2^7; //控制数码管亮灭,为低电平时灭
sbit D2=P1^7; //控制全体二极管的熄灭, 573LE使能端
sbit send=P1^0;
sbit receive=P3^2;
uchar code table[]={0x81,0x42,0x23,0x14};
uchar code table1[]={0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89};
//二进制1000等于十六进制8,此时数码管只有第1位显
uchar code table2[]={0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49};
//二进制1000等于十六进制8,此时数码管只有第2位显
uchar code table3[]={0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29};
//二进制1000等于十六进制8,此时数码管只有第3位显
uchar code table4[]={0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19};
//二进制1000等于十六进制8,此时数码管只有第4位显
uchar code table1234[]={0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9};
//二进制1111等于十六进制f;此时数码管全显
uint num,a=0;
uint outcomeH=0,outcomeL=0;
unsigned long distance_data;
uint temp_data[4];
uint succeed_flag;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=1141;y>0;y--);
}
void delay_20us()
{
uchar bt ;
for(bt=0;bt<100;bt++);
}
void ExternalInterrupt_Init()
{
//TCON=0x00; //设定外部中断触发方式为低电平触发方式 两种设置方式一样
IT0=0; //设定外部中断触发方式为低电平触发方式
}
void Timer0_Init()
{
TMOD=0x11;//设置定时器0和1为工作方式1
TH0=0;//对定时器高八位清零
TL0=0;//对定时器低八位清零
TF0=0;//定时计数器溢出标志位清零
ET0=1;//开定时器0中断
TH1=0;//对定时器高八位清零
TL1=0;//对定时器低八位清零
TF1=0;//定时计数器溢出标志位清零
ET1=1;//开定时器0中断
}
void AllInterrupt_Init()
{
IP=0x01;//外部中断0设置为高优先级,其他所有中断为低优先级
}
void UT_Init() //初始化超声波发射和接收引脚
{
send=0;
receive=0;
}
void Send()
{
send=1;
delay_20us();
send=0;
}
void conversion()
{
uint ge_data,shi_data,bai_data,qian_data;
distance_data=outcomeH;
distance_data <<=8;
distance_data=(distance_data | outcomeL);
//distance_data*=(90*12); //这是往返两个路程的时间
//distance_data现在单位为us
/*distance_data*=(170); //(340/2=170) distance_data现在单位为微米
distance_data=distance_data/1000; //distance_data现在单位为毫米 */
distance_data*=12; //因为定时器默认为12分频
distance_data/=58; //微秒的单位除以58等于厘米
qian_data=distance_data/1000;
distance_data=distance_data%1000; //取余运算
bai_data=distance_data/100 ;
distance_data=distance_data%100; //取余运算
shi_data=distance_data/10 ;
distance_data=distance_data%10; //取余运算
ge_data=distance_data;
temp_data[0]=qian_data;
temp_data[1]=bai_data;
temp_data[2]=shi_data;
temp_data[3]=ge_data;
}
void display()
{
conversion();
P0=table1[temp_data[0]];
delay(1);
P0=table2[temp_data[1]];
delay(1);
P0=table3[temp_data[2]];
delay(1);
P0=table4[temp_data[3]];
//delay(1);
}
void display1()
{
//conversion();
P0=table1[temp_data[0]];
delay(1);
P0=table2[temp_data[1]];
delay(1);
P0=table3[temp_data[2]];
delay(1);
P0=table4[temp_data[3]];
//delay(1);
}
void main()
{
succeed_flag=0;
D2=0;
D1=1;
EA=0; //先关闭总中断
UT_Init(); //初始化超声波发射和接收引脚
ExternalInterrupt_Init(); //外部中断初始化
Timer0_Init(); //初始化定时器0
AllInterrupt_Init();
while(1)
{
TR0=1;//启动定时器0
TR1=0;//关闭定时器1
EX0=0;//关闭外部中断0
EA=1;//打开总中断
if(a==2)
{
EA=0; //先关闭总中断
Send(); //发送脉冲信号
_nop_();
while(receive==0); //等待Echo回波引脚变高电平
TH1=0;//对定时器高八位清零
TL1=0;//对定时器低八位清零
TF1=0;//定时计数器溢出标志位清零
TR1=1;//启动定时器1
TR0=1;//启动定时器0
EX0=1;//打开外部中断0
EA=1;//打开总中断
//display1();
while(TH1 < 30);//等待测量的结果(可用中断实现) //当TH1=60时,则为5.733米 30则为2.913米
a=0;
}
}
}
void exter0() interrupt 1 //1为定时器0中断
{
//EA=0;
//P0=table1234[1];
TH0=0; //定时器0清零
TL0=0; //定时器0清零
TF0=0; //定时计数器溢出标志位清零
display1();
a++;
}
void dingshi1() interrupt 3 //3为定时器1中断
{
TH1=0; //定时器0清零
TL1=0; //定时器0清零
TF1=0; //定时计数器溢出标志位清零
}
void exter1() interrupt 0 //0为外部中断
{
outcomeH =TH1; //取出定时器的值
outcomeL =TL1; //取出定时器的值
succeed_flag=1; //至成功测量的标志
//TH0=0;
//TL0=0;
EX0=0;//关闭外部中断0
display();
}
复制代码
所有资料51hei提供下载:
源动力超声波传感器程序.rar
(18.89 KB, 下载次数: 11)
2018-9-13 09:46 上传
点击文件名下载附件
全部程序
下载积分: 黑币 -5
作者:
admin
时间:
2018-9-13 16:48
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1