cm;
cm=TH1*256+TL1;
cm-=7610; //减去限制10M的初值+可调误差值
cm*=speed; //计算距离uS*34650m
cm/=20000; //转换为s 单程
return cm;
}
5.4.4 主函数的结构与内容
void main(void) //主函数
{
uchar w;
Read_Temperature(); //先采一次温度
for(w=11;w<255;w--) //启动显示9~0,H~A,-
{
LED_Data=LED0[w];
led_1H=0;led_2H=0;led_3H=0;
time(400);
bell=0;
LED_Data=0xff;
time(20);
bell=1;
OFF=0xff; //关闭P3口
}//--------------------------------------------
key();
T_show: //标号
EA=0; //关总中断
TR1=0; //停止计数
do{
LED_T_C(Read_Temperature());//采温度并转换为LED显示值
show(25); //显168次后采一次温度
key();
show(25);
key();
show(25);
key();
show(25);
key();
show(25);
key();
show(25);
key();
show(25);
key();
}while(show_temperature==1); //如WD为0只显示温度
//------------------测距部分开始
TMOD=0X11; //设定时器T0、T1工作于16位定时/计数 模式
EA=1; //开总中断
IT1=1; //外部中断下降沿触发方式
w=0;
while(1)
{
TT1(); //装T1初值
TR1=1; //启动定时器T1
Send_40K(); //发送测量方波
time_11uS(6); //延时66uS,限制最小测量
ET1=1; //允许T1中断
EX0=1; //允许外部中断0中断
do{ led_display();}
while(flag==0&&TO==0); //判断是否有收到回波 如有则计算 判断 是否超出测量范围
if(flag==1)
{
if(w>27){C_speed();w=0;} //测Wu次距后取一次温度声速
w++;
dis=Dis_count(); //转换距离
flag=0;
if(dis<=8||dis>=996){temp[0]=0xF7;temp[1]=0xF7;temp[2]=0xF7;}//溢出处理
else{
bell=0;
LED_temp(dis);
bell=1;
show(10); //测量数据显示
}
}
TO=0;
show(10);
key();
if(show_temperature==1)goto T_show; //如果WD为0则只显示温度
}
}
附录二:程序代码
//超声波测距系统 12M晶振
//#include "REG2051.H"
#include <REGx51.H>
#include <intrins.h>
//#include "math.h"
#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; //18b20定义端口
sbit bell=P2^2; //定义蜂鸣器,为1则不响,为0时响
sbit Sout=P3^7; //定义超声波输出引脚
sbit k1=P1^0; //定义按键
sbit k2=P1^1;
sbit k3=P1^2;
bit r=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度)
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_();
DQ = 0; //置低电平
time_11uS(50); // 等待500us
DQ = 1; // 置高电平
time_11uS(6); // 等待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; |