超声波测距18b20测温 12864显示全.docx
《超声波测距18b20测温 12864显示全.docx》由会员分享,可在线阅读,更多相关《超声波测距18b20测温 12864显示全.docx(18页珍藏版)》请在冰豆网上搜索。
超声波测距18b20测温12864显示全
#include
#include
#defineunitunsignedint
#defineucharunsignedchar
ucharcodetable[]="超声波测距显示:
";
ucharcodetable1[]="距离:
";
ucharcodetablenum[]="温度:
";
ucharcodetable4[]="2010级15班我我";
ucharcodepicture[]={
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x00,0x00,
0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x9F,0xFF,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xF1,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x1F,0xFF,0xFF,0xFF,0xFC,0x3F,0x00,0x00,
0xE0,0x00,0x00,0x00,0x00,0x00,0x3F,0xFE,0x1F,0xFF,0xFF,0xFF,0xF8,0x3F,0x00,0x00,
0xE0,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x1F,0xFF,0xFF,0xFF,0xF0,0x7F,0x00,0x00,
0xC0,0x00,0x00,0x00,0x00,0x00,0x0F,0xF8,0x1F,0x9F,0xFF,0xFF,0xF0,0x7F,0x00,0x00,
0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x3F,0x1F,0xFF,0xFF,0xF0,0x7F,0x00,0x00,
0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x3E,0x00,0x00,0x00,0x30,0x7F,0x00,0x00,
0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0xF8,0x3C,0x00,0x00,0x00,0x30,0x7F,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x07,0xFC,0x3C,0x00,0x00,0x00,0x18,0x7F,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x07,0xFE,0x3C,0x00,0x00,0x00,0x1C,0x7F,0x00,0x00,
0xFF,0xFD,0xFF,0xFF,0xFF,0xFE,0x0F,0xFF,0x3C,0x00,0x00,0x00,0x1E,0x7F,0x00,0x00,
0xFF,0xF1,0xFF,0xFF,0xFF,0xFE,0x1F,0xFF,0x3E,0x00,0x00,0x00,0x1E,0x7F,0x00,0x00,
0xFF,0xF0,0x00,0x00,0x00,0x7C,0x3F,0xFF,0x3F,0x00,0x00,0x00,0x1E,0x7F,0x00,0x00,
0xFF,0xE0,0x00,0x00,0x00,0x3C,0x7F,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x00,0x00,0x00,0x3C,0x7F,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x00,0x00,0x00,0x3C,0x7F,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x00,0x00,0x00,0x3C,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x00,0x00,0x00,0x3F,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x3F,0xFF,0xC0,0x3F,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xFE,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xFC,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xF8,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xF0,0x7F,0xFF,0xFF,0x0F,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x4F,0xFF,0xFC,0x03,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x0F,0xFF,0xF8,0x03,0xFF,0xFF,0x3F,0x1F,0xC7,0xF8,0xFE,0x7F,0x00,0x00,
0xFF,0xE0,0x07,0xFF,0xF0,0x03,0xFF,0xFF,0x3F,0x00,0x00,0x00,0x1E,0x7F,0x00,0x00,
0xFF,0xE0,0x01,0xFF,0xE0,0x03,0xFF,0xFF,0x3E,0x00,0x00,0x00,0x1E,0x7F,0x00,0x00,
0xFF,0xF0,0x00,0x3F,0xC0,0x03,0xFF,0xFF,0x1E,0x00,0x00,0x00,0x0E,0x7F,0x00,0x00,
0xFF,0xF8,0x00,0x0F,0x80,0x07,0xFF,0xFF,0x1E,0x00,0x00,0x00,0x0E,0x7F,0x00,0x00,
0xFF,0xFC,0x00,0x03,0x80,0x1F,0xFF,0xFF,0x1E,0x00,0x00,0x00,0x0E,0x7F,0x00,0x00,
0xFF,0xFC,0x00,0x00,0x00,0x7F,0xFF,0xFF,0x1E,0x00,0x00,0x00,0x0E,0x7F,0x00,0x00,
0xFF,0x0C,0x00,0x00,0x00,0xFF,0xFF,0xFF,0x1F,0x87,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xFE,0x04,0x60,0x00,0x03,0xFF,0xFF,0xFF,0x1F,0x03,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xFC,0x00,0x7C,0x00,0x07,0xFF,0xFF,0xFF,0x1E,0x03,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xF8,0x00,0x7F,0x80,0x03,0xFF,0xFF,0xFF,0x3C,0x03,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xF0,0x00,0x7F,0xE0,0x01,0xFF,0xFF,0xFF,0xFC,0x03,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xE0,0x00,0x7F,0xE0,0x00,0xFF,0xFF,0xF3,0xF8,0x03,0xFF,0xFF,0xFE,0x3F,0x00,0x00,
0xE0,0x00,0x7F,0xC0,0x00,0x7F,0xFF,0xF3,0xF8,0x07,0xFF,0xFF,0xFE,0x7F,0x00,0x00,
0xE0,0x1C,0x7F,0xC0,0x80,0x3F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x00,
0xE0,0xFC,0x7F,0x81,0xE0,0x1F,0xFF,0xE0,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
0xE3,0xFC,0x7F,0x03,0xF0,0x0F,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
0xE7,0xFC,0x7F,0x07,0xFC,0x07,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
0xFF,0xFC,0x7E,0x0F,0xFE,0x03,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
0xFF,0xFC,0x7C,0x1F,0xFF,0x01,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,
0xFF,0xFC,0x7C,0x3F,0xFF,0x80,0xFF,0xC1,0xFF,0x00,0x3F,0xFF,0xFC,0x07,0x00,0x00,
0xFF,0xFC,0x7C,0x3F,0xFF,0xC0,0xFF,0xFF,0xFF,0x00,0x0F,0xFF,0xFF,0xFF,0x00,0x00
};
sbitrs=P2^0;
sbitrw=P2^1;
sbiten=P2^2;
sbitpsb=P2^3;
sbitTX=P2^6;//发送
sbitRX=P2^7;//接收
sbitDQ=P3^6;//18b20
sbitBEEP=P3^7;
bitflag=0;
bitflag1;
uchartime;
unita;
voiddelay(unitz)
{
uniti,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
voidbeep()//蜂鸣器响一声函数
{
uchari;
for(i=0;i<100;i++)
{
delay
(1);
BEEP=!
BEEP;//BEEP取反
}
BEEP=1;//关闭蜂鸣器
delay(250);//延时
}
voidcmd(ucharcmd)
{
rs=0;
rw=0;
P1=cmd;
delay
(2);
en=1;
delay
(2);
en=0;
}
voiddate(uchardate)
{
rs=1;
rw=0;
P1=date;
delay
(1);
en=1;
delay
(1);
en=0;
}
//显示汉字
voidpos(ucharx,uchary)//X为哪一行,Y为哪一列
{
ucharpos;
if(x==0)
{x=0x80;}
if(x==1)
{x=0x90;}
if(x==2)
{x=0x88;}
if(x==3)
{x=0x98;}
pos=x+y;//Y为1往右移一位,y自动加1
cmd(pos);//写入坐标
}
//图形初始化
voidpic_init()
{
psb=1;//并口方式
cmd(0x01);//清除lcd内容
delay(5);
cmd(0x30);//
delay(5);
cmd(0x34);//扩展指令动作(6)
delay(5);
cmd(0x36);//显示自定义图形(16)
delay(5);
}
voidinit()
{
psb=1;//并行口
TMOD=0X01;
TH0=0;
TL0=0;
//TH1=0;
//TL1=0;
//EA=1;
//ET1=1;
//TR1=1;
cmd(0x30);
delay(5);
cmd(0x0c);
delay(5);
cmd(0x01);
delay(5);
}
//液晶自定义显示
voiddispicture(ucharcode*add)//*add为指针类型!
!
!
{
unitx,y;
for(x=0;x<32;x++)//上半屏
{
cmd(0x80+x);//lie
cmd(0x80);//hang
for(y=0;y<16;y++)
{
date(*add);
add++;
}
}
for(x=0;x<32;x++)//下半屏
{
cmd(0x80+x);
cmd(0x88);
for(y=0;y<16;y++)
{
date(*add);
add++;
}
}
}
/*****************************************************
函数功能:
将DS18B20传感器初始化,读取应答信号
出口参数:
flag
***************************************************/
bitInit_DS18B20(void)
{
//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ=1;//先将数据线拉高
for(time=0;time<2;time++);//略微延时约6微秒
DQ=0;//再将数据线从高拉低,要求保持480~960us
for(time=0;time<200;time++);//略微延时约600微秒
//以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ=1;//释放数据线(将数据线拉高)
for(time=0;time<10;time++);
//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++);//延时足够长时间,等待存在脉冲输出完毕
return(flag1);//返回检测成功标志
}
/*****************************************************
函数功能:
从DS18B20读取一个字节数据
出口参数:
dat
***************************************************/
unsignedcharReadOneChar(void)
{
uchari=0;
uchardat;//储存读出的一个字节数据
for(i=0;i<8;i++)
{
DQ=1;//先将数据线拉高
_nop_();//等待一个机器周期
DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
_nop_();//等待一个机器周期
DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++);//延时约6us,使主机在15us内采样
dat>>=1;
if(DQ==1)
dat|=0x80;//如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++);//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);//返回读出的十六进制数据
}
/*****************************************************
函数功能:
向DS18B20写入一个字节数据
入口参数:
dat
***************************************************/
WriteOneChar(uchardat)
{
uchari=0;
for(i=0;i<8;i++)
{
DQ=1;//先将数据线拉高
_nop_();//等待一个机器周期
DQ=0;//将数据线从高拉低时即启动写时序
DQ=dat&0x01;//利用与运算取出要写的某位二进制数据,
//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;//释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;//将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++);//稍作延时,给硬件一点反应时间
}
/*****************************************************
函数功能:
做好读温度的准备
***************************************************/
voidReadyReadTemp(void)
{
Init_DS18B20();//将DS18B20初始化
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
delay(10);//转换一次需要延时一段时间
Init_DS18B20();//将DS18B20初始化
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器,前两个分别是温度的低位和高位
}
voiddisplay()
{
uchari;
pos(0,0);
i=0;
while(table[i]!
='\0')
{
date(table[i]);
i++;
}
pos(1,0);
i=0;
while(table1[i]!
='\0')
{
date(table1[i]);
i++;
}
pos(2,0);
i=0;
while(tablenum[i]!
='\0')
{
date(tablenum[i]);
i++;
}
cmd(0x8d);
date('.');
cmd(0x8f);
date('c');
pos(3,0);
i=0;
while(table4[i]!
='\0')
{
date(table4[i]);
i++;
}
cmd(0x90+6);
date('.');
}
voidzhengshu(ucharx)
{
ucharj,k,l;//j,k,l分别储存温度的百位、十位和个位
j=x/100;//取百位
k=(x%100)/10;//取十位
l=x%10;//取个位
cmd(0x8b);
if(flag1==1)
{
date('-');//负温度时显示“—”
}
else{
date(0x30+j);//将百位数字的字符常量写入LCD
}
date(0x30+k);//将十位数字的字符常量写入LCD
date(0x30+l);//将个位数字的字符常量写入LCD
delay(5);//延时1ms给硬件一点反应时间
}
/*****************************************************
函数功能:
显示温度的小数数部分
入口参数:
x
***************************************************/
voidxiaoshu(ucharx)
{
cmd(0x8e);//写显示地址,将在第2行第11列开始显示
date(0x30+x);//将小数部分的第一位数字字符常量写入LCD
delay(5);//延时1ms给硬件一点反应时间
}
voidce()
{
ucharj,k,l,m;
unsignedints;
unsignedinttime;
time=TH0*256+TL0;//1us,1个时钟周期
TH0=0;
TL0=0;//测试距离等于(高电平时间*声速340m/s)/2;
//s=(time*1.7)/100;//算出来是CM!
!
!
要显示小数点以后的位,比如121.3的话
s=(time*1.7)/