多点测温 + 1602显示仿真原理图如下
单片机源程序如下:
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define lcddata P0
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
sbit DQ=P2^3;
sbit key=P3^7;
uchar temp1[]={"T : "};
uchar temp2[]={"T : "};
/*uchar temp3[9]={"T3: "};
uchar temp4[9]={"T4: "};
uchar temp5[9]={"T5: "};
uchar temp6[9]={"Ta: "};*/
uchar code ds_rom1[]={0x28,0x22,0x22,0x22,0x00,0x00,0x00,0xca};//U2ROM
uchar code ds_rom2[]={0x28,0x33,0x33,0x33,0x00,0x00,0x00,0};//U3ROM
uchar code ds_rom3[]={0x28,0x44,0x44,0x44,0x00,0x00,0x00,0xAF};//U4ROM
uchar code ds_rom4[]={0x28,0x55,0x55,0x55,0x00,0x00,0x00,0xC5};//U5ROM
uchar code ds_rom5[]={0x28,0x66,0x66,0x66,0x00,0x00,0x00,0x7B};//U6ROM
int temp;//温度
bit temp_flag,value_flag;//正负标志位
int t1,t2,t3,t4,t5,num=1;
/*1602LCD函数*/
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void writelcd(uchar dat,bit x)//写0指令,1数据
{
e=0;
lcddata=dat;
rs=x;
rw=0;
e=1;
delay(1);
e=0;
}
void initlcd()
{
writelcd(0x38,0);
writelcd(0x0c,0);
writelcd(0x06,0);
writelcd(0x01,0);
}
/*DS18B20*/
void delayus(uchar x)// 延时1us
{
while(--x);
}
bit init_DS18B20()//初始化函数
{
bit Status_DS18B20;
DQ=1;
DQ=0;
delayus(250);
DQ=1;
delayus(20);
if(!DQ)
Status_DS18B20=0;
else
Status_DS18B20=1;
delayus(250);
DQ=1;
return Status_DS18B20;
}
uchar read_DS18B20()//读数据
{
uchar i=0,dat=0;
for(i=0;i<8;i++)
{
DQ=1;
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
DQ=1;
delayus(25);
}
return(dat);
}
void write_DS18B20(uchar dat)//写数据
{
uchar i;
for(i=0;i<8;i++)
{
DQ=1;
dat>>=1;
DQ=0;
DQ=CY;
delayus(25);
DQ=1;
}
}
void Match_rom(uchar a) //匹配ROM
{
uchar j;
write_DS18B20(0x55); //发送匹配ROM命令
if(a==1)
{
for(j=0;j<8;j++)
write_DS18B20(ds_rom1[j]); //发送18B20的序列号,先发送低字节
}
if(a==2)
{
for(j=0;j<8;j++)
write_DS18B20(ds_rom2[j]); //发送18B20的序列号,先发送低字节
}
if(a==3)
{
for(j=0;j<8;j++)
write_DS18B20(ds_rom3[j]); //发送18B20的序列号,先发送低字节
}
if(a==4)
{
for(j=0;j<8;j++)
write_DS18B20(ds_rom4[j]); //发送18B20的序列号,先发送低字节
}
if(a==5)
{
for(j=0;j<8;j++)
write_DS18B20(ds_rom5[j]); //发送18B20的序列号,先发送低字节
}
}
void gettemp(uchar z)/*读取温度值并转换*/
{
uchar a,b;
while(init_DS18B20());
if(z==1)
{
Match_rom(1); //匹配ROM 1
}
if(z==2)
{
Match_rom(2); //匹配ROM 2
}
if(z==3)
{
Match_rom(3); //匹配ROM 3
}
if(z==4)
{
Match_rom(4); //匹配ROM 4
}
if(z==5)
{
Match_rom(5); //匹配ROM 5
}
write_DS18B20(0x44);//*启动温度转换*/
while(init_DS18B20());
if(z==1)
{
Match_rom(1); //匹配ROM 1
}
if(z==2)
{
Match_rom(2); //匹配ROM 2
}
if(z==3)
{
Match_rom(3); //匹配ROM 3
}
if(z==4)
{
Match_rom(4); //匹配ROM 4
}
if(z==5)
{
Match_rom(5); //匹配ROM 5
}
write_DS18B20(0xbe);//*读取温度*/
a=read_DS18B20();
b=read_DS18B20();
temp=b;
temp<<=8;
temp=temp|a;
if(b>=8)
{
temp=~temp+1;
temp_flag=1;
}
else
{
temp_flag=0;
}
if(temp_flag==1)
temp=temp*0.625*-1;
if(temp_flag==0)
temp=temp*0.625;
if(z==1)
t1=temp;
if(z==2)
t2=temp;
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』