超声波测距系统本科毕业论文 下载本文

内容发布更新时间 : 2024/3/29 2:05:24星期一 下面是文章的全部内容请认真阅读。

盐城工学院本科生毕业论文 (2010)

附 录

附录一:电路PCB图

31

超声波测距系统的设计与实现

附录二:程序代码

//超声波测距系统 12M晶振 //#include \#include #include //#include \

#define uint unsigned int #define uchar unsigned char

#define LED_Data P0 //定义LED显示数据为P1口 #define OFF P3

sbit led_1H=P2^7; //定义数码管百位 片选 sbit led_2H=P2^6; sbit led_3H=P2^5;

sbit DQ=P3^4;

sbit bell=P2^2; sbit Sout=P3^7;

sbit k1=P1^0; sbit k2=P1^1; sbit k3=P1^2;

bit r=0;

//定义数码管十位 片选 //定义数码管个位 片选 //18b20定义端口

//定义蜂鸣器,为1则不响,为0时响 //定义超声波输出引脚

//定义按键

//18b20存在标志位 0为不存在,1为存在

bit flag=0; //定义外部中断1标志位 bit TO=0; //定义T1中断1标志位

bit tu=0; //定义温度正、负标示位0为正1为负 bit show_temperature=0; //定义显示温度标志位

uchar T_C; //存温度值 uint i;

uint dis; //定义实形距离变量 float speed=346.50; // 346.5m/s(25度)

32

盐城工学院本科生毕业论文 (2010)

uchar temp[3]={0xF7,0xF7,0xF7};//*- - -*/ 定义显示暂存区 //显示段代码表 uchar code LED0[]={ 0x28,0xEE,0x32,0xA2,0xE4,0xA1,0x21,0xEA,0x20,0xA0,0xF7,};//0~9 - //第一位数码管显示段码

uchar code LED1[]={0x08,0xCE,0x12,0x82,0xC4,0x81,0x01,0xCA,0x00,0x80,}; //0.~9.带小数点

//--------------------------------------------温度部分涵数声明 void time_11uS(uint x); //延时11US

void LED_T_C(uint x); //温度显示转换 uint Read_Temperature(void); //读温度 void write(char wr); //写1820 uint read(void); //读1820

uchar reset(void); //复位1820

//--------------------------------------------测距部分涵数声明 void led_display(void); //LED显示函数 void time(uint x); //延时1mS

void Send_40K(void); //输出20个40k方波函数 void LED_temp(uint x); //显示转换 void TT1(void); //装入初值

uint C_speed(void); //根据温度查表取声速值 float Dis_count(); //距离计算函数 //--------------------------------------------

//-------------------------------------------- //延时11us

void time_11uS(uint x)

{

for(;x>0;x--); }

//--------------------------------------------

uchar reset(void) //复位1820 {

r=0; DQ = 1;

_nop_();_nop_();

33

超声波测距系统的设计与实现

DQ = 0; time_11uS(50); DQ = 1; time_11uS(6); //置低电平 // 等待500us // 置高电平 // 等待66US

while(DQ==0){r=1;} // 读响应 _nop_();

return(r); // 返回响应值 1=存在, 0 不存在 }

//-------------------------------------------- void write(char wr) //向总线上写一个字节 {

uchar i;

for (i=8; i>0; i--) // 写8位, 一位一位地写 {

DQ = 0; // 设为低电平,写开始 _nop_();_nop_();_nop_();_nop_(); DQ = wr&0x01; //最低位移出 time_11uS(6); // 延时66US确保数据送出 DQ = 1; //停止

wr=wr/2; //算法,相当于右移1位 }

time_11uS(1); }

//--------------------------------------------

uint read(void) //从总线上读取2个字节 {

uchar i; uint v = 0;

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

DQ = 0; // 开始信号 _nop_();_nop_(); v>>=1;

DQ = 1; // 恢复 _nop_();_nop_();_nop_();_nop_();

34

// 延时

盐城工学院本科生毕业论文 (2010)

if(DQ)v|=0x8000; //数据拼装 time_11uS(6); // 延时 }

DQ = 1; return(v); }

//--------------------------------------------

uint Read_Temperature(void) //读取温度,返回整数值 {

uint c;

reset(); tu=0; if(r) {

write(0xCC);

write(0xBE);

//复位18b20

//先置位温度正负标示为正

// 跳过多传感器识别skio rom

//发读内部9字节内容指令

c=read(); //读两个字

reset(); //读完两个字节后复位

write(0xCC); // 跳过多传感器识别skio rom write(0x44); // 发启动温度变换指令

if(c>0x1000){c=c+1;tu=1;} //若温度小于0,tu=1

c>>=4; //去掉低四位即为整数温度值,无需*0.0625

return c; }

else{return r; } //返回0XFF表示未检测到18B20 }

//-------------------------------------------- void LED_T_C(uint x) //温度显示转换

35