找回密码
 注册会员
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版

求高人:超声波测距C51的c语言问题

[复制链接]
admin 发表于 2012-9-2 09:45:34 | 显示全部楼层 |阅读模式

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有账号?注册会员

×
麻烦高人帮看看这个C51语言对不对。。。本人小白一个。。。先谢谢了。
#include "stc89c52.h"

#include "intrins.h"

#define uchar unsigned char

#define uint unsigned int

#define maichongshu 16 //
脉冲数量

#define LED P2

#define csb_sudu 0.03315 //0
度时,声音传播速度为331.5米/秒

//
传播速度,在温度20度时的,传播速度为340米/秒,也就是,0.034CM/US

#define danwei 0.00006 //
每增加1度,传播距离增加的单位,每增加1度,传播速度增加60CM

//#define now_wendu 16 //
当前温度为16度

//#define wucha 3;//
距离误差,实际距离与测得距离的误差,主要是由于发射时延误的很小误差

#define wucha 175;//
距离误差,实际距离与测得距离的误差,主要是由于发射时延误的很小误差,这个是延时误差

float now_sudu;//
当前环境下超声波传播的速度



sbit csbout=P2^4; //
超声波发送

sbit csbin=P3^2; //
超声波接收

sbit light=P1^0; //
状态指示灯

uchar small_time3;

uint juli;//
距离数值

uchar fail=0;//
是否接收失败,0,未开始,1,失败,2,成功

uchar now_temp=29;//
当前温度



void ceju_ready();

///////////////////////////////////////////////////////////////////////////

void delay(uint t)/*
延时子程序*/

{

uint i;

while(t--)

{

for (i=0;i<100;i++)

}

}

///////////////////////////////////////////////////////////////////////////

void delay1(uint t)/*
延时子程序*/

{

while(t--);

}

/////////////////////////////////////////////

uchar getcode(uchar i)

{

uchar p;

switch (i)

{

case 0: p=0xc0; break; /* 0 */

case 1: p=0xf9; break; /* 1 */

case 2: p=0xa4; break; /* 2 */

case 3: p=0xb0; break; /* 3 */

case 4: p=0x99; break; /* 4 */

case 5: p=0x92; break; /* 5 */

case 6: p=0x82; break; /* 6 */

case 7: p=0xF8; break; /* 7 */

case 8: p=0x80; break; /* 8 */

case 9: p=0x90; break; /* 9 */

case 10: p=0x88; break; /* A */

case 11: p=0x83; break; /* B */

case 12: p=0xc6; break; /* C */

case 13: p=0xa1; break; /* D */

case 14: p=0x86; break; /* E */

case 15: p=0x8e; break; /* F */

default: break;

}

return(p);

}

///////////////////////////////////////////////////////////

void display(uint t,uchar p)//
显示函数 //显示超声波距离,

{

uchar i,j;

uchar a[4];

a[3]=t /1000;

t= t % 1000;//
求出每一个位的数

a[2]= t / 100;

t=t % 100;

a[1]=t / 10;

a[0]=t % 10;

j=0x01;

for(i=0;i<4;i++)

{

P0=getcode(a); //
显示显示每一个位

LED=LED & (~(j<<i));

if(p==0) delay1(3);//
延时

else delay(1);

LED=LED | (j<<i);

}



}

/////////////////////////////////////////////////////////

void waibu_init() //
外部中断初始化

{

EX0=1;//
开启外部中断

}

//////////////////////////////////////////////////////////////////

void time1_init(void) //

{

TMOD = 0x11;//
两个定时器一起工作

TH0=0x00;

TL0=0x00;//
仅用于定时

ET0=1;

TR0=1;

}

////////////////////////////////////////////////////////////////////////////////

void time3_init()

{

EA=1;

T2CON=0x00;//16
位计数器自动重装

TH2=0xff;

TL2=0xe9;

RCAP2H = 0xff;//
定时器2设置

RCAP2L = 0xe9;

ET2=1;//
开启定时器2中断

TR2=1;//
启动定时2

}

///////////////////////////////////////////////

void ceju_ready() //
测距开始程序

{

//uint i;

small_time3=0;

time3_init();//
定时器2初始化

time1_init();//
定时器0初始化

while(small_time3<maichongshu);



small_time3=0;

display(juli,0);

waibu_init();//
外部中断初始化

}

//////////////////////////////////////////

void get_now_sudu() //
此程序用于得出当前超声波传播速度

{

now_sudu=csb_sudu+danwei*now_temp;

}

//////////////////////////////////////////////////////////////////////////////////

void main() //
主函数

{

uint i;

P0=0xbf;

now_temp =29;//
当前温度设置为29度

get_now_sudu();//
获取当前速度

for(i=0;i<10;i++)

{

delay(100);

light=~light;



LED=~LED ;//
数码管闪烁

}

light=1;

LED=0xff;//
关闭显示屏

fail=1;//
开始发送

while(1)

{

for(i=0;i<10;i++) display(juli,1);

if(fail==1) //
如果接收失败

{

EA=0;//
关闭所有中断

EX0=0;//
关闭外部中断

ET0=0;//
关闭定时器0中断

TR0=0;//
关闭定时器0定时

for(i=0;i<10;i++) display(juli,1); //
如果接收失败,则延长一点时间

ceju_ready(); //
测距开始程序

}

else

if(fail==2) //
如果接收成功

{

EA=0;//
关闭所有中断

EX0=0;//
关闭外部中断

ET0=0;//
关闭定时器0中断

TR0=0;//
关闭定时器0定时

display(juli,0); //
如果接收失败,则延长一点时间

ceju_ready(); //
测距开始程序

}

}

}

/////////////////////////////////////////////////

void waibu_zhongduan() interrupt 0 //
外部中断0入口

{

uint a;

float result;//
结果

EA=0;//
关闭所有中断

EX0=0;//
关闭外部中断

ET0=0;//
关闭定时器0中断

TR0=0;//
关闭定时器0定时

a=TH0*0x100+TL0-wucha

result=a*now_sudu/2;

//juli=result-wucha;//
结果转换,使用得到的结果减去误差,即为当前所需结果

juli=result;//
结果转换,使用得到的结果减去误差,即为当前所需结果

fail=2;//
接收成功

light=~light;

}

/////////////////////////////////////////////

void time1_zhongduan(void) interrupt 1 //time 0

{

ET0=0;

TR0=0;

fail=1;//
接收信号失败

}

 楼主| admin 发表于 2012-9-2 09:45:39 | 显示全部楼层
[/size][size=3]/////////////////////////////////////////////

[/size][size=3]void time3_zhongduan(void) interrupt 5 //time 2

[/size][size=3]{

[/size][size=3] TF2=0;//

[/size][size=3] EXF2=0;

ET2=0;//[/size][size=3]先暂时关闭中断

[/size][size=3] TR2=0;

[/size][size=3] small_time3++;

[/size][size=3] if(small_time3<maichongshu)

[/size][size=3] {

csbout=~csbout;//[/size][size=3]超声波发射

ET2=1;//[/size][size=3]重开中断

TR2=1;//[/size][size=3]重新启动定时器2

[/size][size=3] }

[/size][size=3]}

[/size]
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

QQ|手机版|MCU资讯论坛 ( 京ICP备18035221号-2 )|网站地图

GMT+8, 2024-11-28 08:12 , Processed in 0.052583 second(s), 9 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表