#include<reg51.h>//程序没有调成功!!
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dq=P3^7;//18b20的数据口
sbit rw=P2^5;
sbit rs=P2^6;
sbit lcden=P2^7;
void delay(uchar z)
{
uchar x;
for(x=0;x<z;x++);
}
void delayus(uint x,uchar y)
{
uint i;
uchar j;
for(i=x;i>0;i--);
for(j=y;j>0;j--);
}
void delay1(uchar z)
{
uchar x,y;
for(x=0;x<z;x++)
for(y=110;y>0;y--);
}
void init18b20()//18b20初始化
{
dq=1;
_nop_();_nop_();
dq=0;
delay(80);
dq=1;
delay(5);
}
void write_18b20(uchar byte)//18b20写一个字节
{
uchar x,temp;
dq=1;
_nop_();_nop_();
for(x=0;x<8;x++)
{
temp=byte&0x01;
dq=0;
delayus(0,0);
if(temp==1)
dq=1;//释放总线(因为有上拉电阻,为高时时释放总线状态)
delayus(2,2);
dq=1;
byte=byte>>1;
}
}
uchar read_18b20()//18b20读一个字节
{
uchar x,temp,date;
for(x=0;x<8;x++)
{
date=date>>1;
dq=1;
_nop_();_nop_();
dq=0;
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
dq=1;
_nop_();_nop_();_nop_();_nop_();
temp=dq;
if(temp==1)
date=date|0x80;
delayus(1,1);
}
return date;
}
uchar get_18tem()
{
uchar temp1,temp2;
int temp;
float aa;
init18b20();//初始化
write_18b20(0xCC);//跳过ROM,因为只有1个18b20
write_18b20(0x44);//温度转换
//上边一段让18b20开始转换温度
init18b20();
write_18b20(0xCC);
write_18b20(0xBE);//发送读取温度指令
temp1=read_18b20();//读取温度的低8位
temp2=read_18b20();//读取温度的高8位
aa=(temp2*256+temp1)*6.25;
temp=(int)aa;
return temp;
}
void write_com(uchar com)
{
lcden=0;
rs=0;
rw=0;
P0=com;
delay1(20);
lcden=1;
delay1(20);
lcden=0;
}
void write_date(uchar date)
{
lcden=0;
rs=1;
rw=0;
P0=date;
delay1(20);
lcden=1;
delay1(20);
lcden=0;
}
void init16()//1602液晶初始化
{
write_com(0x38);
write_com(0x0f);
write_com(0x06);
write_com(0x01);//清屏
}
void dis_temp()
{
uint temp;
uchar n1,n2,n3,n4;
while(1)
{
temp=get_18tem();
n1=temp/1000;
n2=temp%1000/100;
n3=temp%100/10;
n4=temp%10;
write_com(0x80);//指定显示的初始指针
write_date('+');
write_date(0x30+n1);
write_date(0x30+n2);
write_date('.');
write_date(0x30+n3);
write_date(0x30+n4);
}
}
void main()
{
init16();
while(1)
{
dis_temp();
delayus(50,70);
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
好的,非常感谢。
一周热门 更多>