谁能给我一段用单片机C语言超声波测距的程序,是让单片机输出一个40KHZ的方波脉冲 AT89S52,接发P1.0(1)

 我来答
匿名用户
2011-05-24
展开全部
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCM_Data P0
#define Busy 0x80
sbit RemPin = P3^2;
sbit TxPin = P3^4;
uint length = 0;
uchar flag = 0;

sbit Ceshi1 = P1^2;
sbit Ceshi2 = P1^3;
sbit Ceshi3 = P1^4;
sbit Ceshi4 = P1^5;
sbit P1_0 = P1^0;
sbit P1_1 = P1^1;

sbit P2_0 = P2^0;
sbit P2_1 = P2^1;
sbit P2_2 = P2^2;
sbit P2_3 = P2^3;
sbit P2_4 = P2^4;
sbit P2_5 = P2^5;

void DelayMs(uint Ms)
{
uint i,TempCyc;
for(i=0;i<Ms;i++)
{
TempCyc = 250;
while(TempCyc--);
}
}

void delay25us_40KHz(unsigned char us)
{
while(us--)
{
TxPin = 0;
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();
TxPin = 1;
_nop_();_nop_();
_nop_();_nop_();
}
TxPin = 1;
}

void init0int() interrupt 0
{
uint timer_us = 0;
TR0=0;
timer_us = TH0*256+TL0;
if(timer_us>190)timer_us=timer_us-180;

length = ((unsigned long)(340)*timer_us)/2000;
flag = 0;
EA = 0;
}
/*===========================================================================
超出测量时间
=============================================================================*/
void timer0int (void) interrupt 1
{
TR0=0;
length = 0;
flag = 1;
EA = 0;
}

/*===========================================================================
主程序
=============================================================================*/
void main(void)
{
EX0 = 1; //允许总中断中断,使能 INT0 外部中断
ET0 = 1; //接受timer0中断
TMOD=0x11; //设定T0为16位时器,设定T1为16位时器
Ceshi1=0;Ceshi2=0;
P2=0x00;
while(1)
{
if(length>3800) {Ceshi4=0;Ceshi3=0;Ceshi2=0;Ceshi1=0 ;}
if((length<=3800)&&(length>3000)) {Ceshi4=0;Ceshi3=0;Ceshi2=0;Ceshi1=1 ;}
if((length<=3000)&&(length>2000)) {Ceshi4=0;Ceshi3=0;Ceshi2=1;Ceshi1=0 ;}
if((length<=2000)&&(length>1000)) {Ceshi4=0;Ceshi3=0;Ceshi2=1;Ceshi1=1 ;}
if((length<=1000)&&(length>0)) {Ceshi4=0;Ceshi3=1;Ceshi2=0;Ceshi1=0 ;}
if(length==0){Ceshi1=0;Ceshi2=0;Ceshi4=0;Ceshi3=0;}
TH0=0x00;
TL0=0x00;
TR0=1; //启动定时器0
EA = 1; //允许所有中断
delay25us_40KHz(15); //发出脉冲信号
DelayMs(200);
if(P1_0==1) P2_0=1;
if(P1_1==1) P2_1=1;
if(P1_0==0) P2_0=0;
if(P1_1==0) P2_1=0;
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==0&&Ceshi1==0) {P2_5=0;P2_4=0;P2_3=0;P2_2=0;}
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==0&&Ceshi1==1) {P2_5=0;P2_4=0;P2_3=0;P2_2=1;}
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==1&&Ceshi1==0) {P2_5=0;P2_4=0;P2_3=1;P2_2=0;}
if(Ceshi4==0&&Ceshi3==0&&Ceshi2==1&&Ceshi1==1) {P2_5=0;P2_4=0;P2_3=1;P2_2=1;}
if(Ceshi4==0&&Ceshi3==1&&Ceshi2==0&&Ceshi1==0) {P2_5=0;P2_4=1;P2_3=0;P2_2=0;}

}
}

//length就是测量的长度。。。。之前写的程序,你看一下,有什么问题再问我。
追问
我的也这样的 就是发射信号太弱 输出来的不起作用 能不能帮我啊  就是发射信号那里老是解决不了  谢啦啊  谢啦啊  最好越详细越好  我是初学者
追答
这个程序我用过啊,没有问题啊,发射信号太弱?硬件的问题?
赛尔福知心科技
2011-05-30
知道答主
回答量:2
采纳率:0%
帮助的人:0
展开全部
/********************************************/
//Program Name : 超声波测距仪
//Dedigned by : sc.Dai
//Date : 2007.4.10
/********************************************/
#include <reg52.h>
#include "intrins.h"
#include "12864LCDdriver.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long int
#define V=173
sbit CSOut=P1^0;
sbit Start=P1^4;

ulong TIME;
uchar DISTANCE;
uchar code discode[11]={'0','1','2','3','4','5','6','7','8','9',' '};
ulong data disnum[5];
bit data ReceiveOK=0;
bit data TOut;
bit data FLAG;

/*-----------------------------------------------------------*/
//延时函数
/*-----------------------------------------------------------*/
void delay2(uchar x)
{
uchar a,b;
for(a=0;a<x;a++)
for(b=0;b<255;b++);
}

/*-----------------------------------------------------------*/
//初始化
/*-----------------------------------------------------------*/
void init(void)
{
lcd_init();//LCD初始化,开机调用一次
TMOD=0x01;//T0定时器方式1
IT0=0;//INT0负边沿触发
IP=0x01;//INT0高优先级
EA=1;//开总中断
}

/*-----------------------------------------------------------*/
//超声波发射函数
/*-----------------------------------------------------------*/
void CCOut(void)
{
TR0=1;
//40KHz
CSOut=0;//1
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
CSOut=1;//2
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
CSOut=0;//3
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
CSOut=1;//4
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
CSOut=0;//5
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
CSOut=1;//6
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
CSOut=0;//7
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
CSOut=1;//8
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
CSOut=0;//9
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
CSOut=1;//10
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();
CSOut=0;//11
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
CSOut=1;//12
}

/*-----------------------------------------------------------*/
//数据处理函数
/*-----------------------------------------------------------*/
void DataProcess(void)
{
ulong time=0;
TIME=TH0;
TIME=(TIME<<8)|TL0;
TIME*=173;//距离
TIME=TIME/10000;//单位:CM
disnum[0]=(uchar)TIME%10; //个位
disnum[4]=TIME/10;
disnum[1]=(uchar)disnum[4]%10;//十位
disnum[4]=disnum[4]/10;
disnum[2]=(uchar)disnum[4]%10;//百位
disnum[4]=disnum[4]/10;
disnum[3]=(uchar)disnum[4]%10;//千位
}
/*-----------------------------------------------------------*/
//超时处理函数 T0
/*-----------------------------------------------------------*/
void TimeOut(void) interrupt 1
{
TR0=0;
ET0=0;
EX0=0;
ReceiveOK=0;
TOut=1;
}

/*-----------------------------------------------------------*/
//超声波接收处理函数
/*-----------------------------------------------------------*/
void Receive(void) interrupt 0
{
TR0=0;
EX0=0;
ET0=0;
ReceiveOK=1; //设定接收成功标志
TOut=0; //清除超时标志
}

/*-----------------------------------------------------------*/
//测量结果显示函数
/*-----------------------------------------------------------*/
void LCDDisplay(void)
{
lcd_home();
lcd_writestr(0,0," 超声波测距仪 ");
lcd_writestr(1,0,"********");
lcd_writestr(2,0,"当前被测距离为:");
lcd_writestr(3,0," 厘米 ");
lcd_writechar(discode[disnum[3]],discode[disnum[2]],discode[disnum[1]],discode[disnum[0]]);
}

/*-----------------------------------------------------------*/
//出错提示函数
/*-----------------------------------------------------------*/
void ErrorDisplay(void)
{
lcd_home();
lcd_writestr(0,0," 超声波测距仪 ");
lcd_writestr(1,0,"********");
lcd_writestr(2,0,"未收到回波信号,");
lcd_writestr(3,0,"请缩短测量距离!");
}

/*-----------------------------------------------------------*/
//预备好提示函数
/*-----------------------------------------------------------*/
void ReadyDis(void)
{
lcd_home();
lcd_writestr(0,0," 超声波测距仪 ");
lcd_writestr(1,0,"********");
lcd_writestr(2,0," 已准备好 ");
lcd_writestr(3,0," 等待测量 ");
}

/*-----------------------------------------------------------*/
//主函数
/*-----------------------------------------------------------*/
void main(void)
{
uchar ct;
init(); //初始化
ReadyDis();
while(1)
{
if(Start==0)
{
delay2(50);
if(Start==0) FLAG=1;
}

if(FLAG==1) //启动测量一次
{
TH0=0x00;
TL0=0x00;
TIME=0x00;
ET0=1;
CCOut();
ct=100;
while(--ct);
EX0=1;
while(TOut==0)
{
if(ReceiveOK==1) //接收成功
{
DataProcess(); //数据处理
LCDDisplay(); //LCD显示
ReceiveOK=0; //清除接收成功标志
goto aa;
}
}
if(TOut==1)
{
TOut=0;
ErrorDisplay(); //超时,错误提示
}
aa: FLAG=0; //清除定时标志,等待下一次测量
}
}
}

/*------------------------------end of the program----------------------------------*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gaim352
2011-05-26 · TA获得超过1377个赞
知道小有建树答主
回答量:914
采纳率:0%
帮助的人:0
展开全部

我刚做成功一个超声波测距仪,能测5米,顶部有点乱只要幅度不大就没有很大影响,如果你想放大后波形还是比较规则建议用一个简单的RC滤波就可以了,20106接收的波形不好也没有关系,只要能检测到有接收到发射超声波的信号就可以了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
kk2614755
2011-05-24 · TA获得超过109个赞
知道答主
回答量:374
采纳率:0%
帮助的人:94.3万
展开全部
这个简单, 500块钱 帮你完成全套, 单片机程序没问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式