当前位置:首页 > 基于单片机的超声波测距仪的设计 - 图文
}
/****************转换成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(); if(flag)
//初始化18B20
//最高位加上符号位
//数据转换后放到显示数组里面
//温度为负,则求补码得到原码
24
{ 匹配 }
/***********读取温度函数**************/ uint GET_WD(void) {
uint a = 0, b = 0, t = 0; }
/***************18B20复位函数***********************/ void Init_18B20() {
DQ = 1; Delay(10);
DQ = 0; Delay(80); DQ = 1; if(DQ) flag=0; else flag=1; Delay(20); }
//单片机将DQ拉低 //480us //拉高总线
//DQ复位
Init_18B20();
//初始化18B20
//跳过读序号列号的操作 //发送读温度命令
//读取一个字节(读出高8位和低8位)
B20_WDAT(0xCC); B20_WDAT(0xBE); a = B20_RDAT(); b = B20_RDAT(); t = b; t <<= 8; t = t | a;
//字节合并 //返回结果给调用
B20_WDAT(0x44);
// 发送温度转化命令
}
B20_WDAT(0xCC);
// 跳过读序号列号的操作,忽略ROM
return (t);
Delay(10); //稍做延时后 如果x=0则初始化成功,x=1则初始化失败
25
/*******************读数据******************************/ uchar B20_RDAT(void) {
uchar i = 0; 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--) {
}
/*******************数据转换函数**************************/ void BUMA() {
temp=~temp; temp+=1; }
//按位取反
DQ = 0;
//拉低数据线至少15us以作为起始信号
//取出低位的一位数据 //将数据线拉高以作为停止信号 //稍作延时
//移位,为写入下一位数据做准备
DQ = dat&0x01; Delay(5); DQ = 1;
dat>>=1;
//注意读取的为补码
}
26
/**************************LCD显示函数*******************/ void LCD_DISP() {
uchar a,b,d; Init_LCD();
Write_Comm(0x01); //清显示 Write_Comm(0x80); //写首地址 for(a=0;a<16;a++) {
d=dispBUF[a];
if((a>11)&&(a<14)) {
d=numcode[num[a]]; //待显示的结果 }
if(14==a) { }
//写入要显示的数据
//换行,换到第二行
d=0xdf;
//如果是结果位到num[]里面读取
Write_Data(d); }
Write_Comm(0xc0); for(b=16;b<33;b++) {
d=dispBUF[b]; if((b>24)&&(b<29)) {
d=numcode[num[b]]; }
Write_Data(d); } }
/*********检查LCD忙状态***********/ bit LCD_BUSY() {
//lcd_busy为1时,忙,等待。
lcd-busy为0时,闲,可写指令与数据
//写入要显示的数据(数据传输)
27
共分享92篇相关文档