基于51单片机的超声波测距系统的毕业设计报告 下载本文

内容发布更新时间 : 2024/11/13 8:12:09星期一 下面是文章的全部内容请认真阅读。

中北大学毕业论文

sbit START =P1^0; //启动测距 sbit CNT =P2^5; //发射超声波 sbit CSBIN =P2^6; //返回信号 sbit BUZZER =P3^7;

/******************定时器1溢出***************************/ void timer1(void)interrupt 2 using 1

{TR1=0;}

//关闭定时器/计数器1 /*********定时器0溢出中断函数,每60MS溢出****************/ void timer0(void)interrupt 1 using 0

//定时器0

{ TH0=0x15; TL0=0xA0; //定时器0设定初值 TH1=0;

TL1=0;

//计数器1清零 sta_flag=1;

count++;

_nop_(); _nop_(); _nop_(); _nop_();

CNT=1; //先延时,后开始发送40KHz的超声波

_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();

_nop_(); //40KHZ的倒数就是25us,12个_nop_();就是24us CNT=0; //保持一段时间高电平

_nop_(); _nop_();

36

中北大学毕业论文

_nop_(); _nop_(); TR1=1; }

/***************系统初始化*************************/ void SYS_INIT() { uchar i;

for(i=0;i<29;i++) //显示清零 { num[i]=0;}

TMOD=0x11; //工作方式寄存器TMOD,设置定时器/计数器0和1均为16位定时/计数器

TH0 =0x15;

TL0 =0xA0; //设置定时器/计数器0的初值,60ms溢出 P0 =0; CNT=0; CSBIN=1; EA =1; }

/******************距离计算***************************/

void JULIJS() //使用全局变量,可以定义为空 {

float c,d,s; uint t;

if(temp<0x8000) c=331.4+0.61*temp*0.0625; else

c=331.4-0.61*temp*0.0625; t=jsh*256+jsl-120; d=(c*t*0.001)/2; d*=d; s=d-7.98;

distance=sqrt(s); 传输

}

//延时,避免直达信号干扰,启动定时器/计数器1

//延时避开直达信号

delay15(50);

//P2^5口,发射发射超声波 //P2^6口,接收信号 //开总中断

//温度为负 //计算计数值

//修正后的值,数据通过全局变量distance

37

中北大学毕业论文

/****************转换成2进制***************/ void HEXtoBCD()

{

float tp;

unsigned long int tmp; fuhao=0;

//温度符号位

if(temp<0x8000) tp=temp*0.0625;

else //温度为负,则求补码得到原码{ BUMA(); tp=temp*0.0625; fuhao=1; }

tp*=10; tmp=tp;

num[12]=tmp/100; //数据转换后放到显示数组里面 if(fuhao)

num[12]=num[12]|0x80; //最高位加上符号位

num[13]=tmp/10-(tmp/100)*10; tmp=distance; num[25]=tmp/1000; tmp%=1000; num[26]=tmp/100; tmp%=100; num[27]=tmp/10; tmp%=10; num[28]=tmp/1; }

/**************温度转换函数***************************/ void TESTTEMP() {

Init_18B20(); //初始化18B20

if(flag) {

B20_WDAT(0xCC);

// 跳过读序号列号的操作,忽略ROM匹配

38

中北大学毕业论文

B20_WDAT(0x44); // 发送温度转化命令

} }

/***********读取温度函数**************/ uint GET_WD(void) {

uint a = 0, b = 0, t = 0; Init_18B20();

//初始化18B20

B20_WDAT(0xCC); //跳过读序号列号的操作 B20_WDAT(0xBE); //发送读温度命令

a = B20_RDAT(); b = B20_RDAT();

//读取一个字节(读出高8位和低8位)

t = b; t <<= 8; t = t | a; //字节合并

return (t);

//返回结果给调用

}

/***************18B20复位函数***********************/ void Init_18B20() {

DQ = 1; //DQ复位

Delay(10);

DQ = 0; //单片机将DQ拉低 Delay(80); //480us DQ = 1;

//拉高总线

Delay(10); //稍做延时后 如果x=0则初始化成功,x=1则初始化失败if(DQ) flag=0; else flag=1; Delay(20); }

/*******************读数据******************************/ uchar B20_RDAT(void) //读取一个字节

{

uchar i = 0;

39

中北大学毕业论文

uchar dat = 0;

for (i = 8; i > 0; i--) {

DQ = 0; // 拉低数据线,开始读数据 dat >>= 1; DQ = 1;

// 拉高数据线,停止读数据

if(DQ)

dat |= 0x80; //拼装处理

Delay(15); }

return (dat); //注意读取的为补码

}

/*********************写数据****************************/ void B20_WDAT(uchar dat) {

uchar i = 0;

for (i = 8; i > 0; i--) { DQ = 0;

//拉低数据线至少15us以作为起始信号 DQ = dat&0x01; //取出低位的一位数据 Delay(5); //稍作延时

DQ = 1;

//将数据线拉高以作为停止信号 dat>>=1;

//移位,为写入下一位数据做准备

} }

/*******************数据转换函数**************************/ void BUMA() {

temp=~temp; //按位取反 temp+=1; }

/**************************LCD显示函数*******************/ void LCD_DISP() {

uchar a,b,d; Init_LCD();

40