本文包含原理图、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;//接收信号失败
}
|