盐城工学院本科生毕业论文 (2010)
附 录
附录一:电路PCB图
31
超声波测距系统的设计与实现
附录二:程序代码
//超声波测距系统 12M晶振 //#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