📄 ds18.c
字号:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep=P3^3;
sbit ds=P3^4;
sbit lcdrs=P3^6;
sbit lcden=P3^7;
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
uint temp,qian,bai,shi,ge;
float f_temp;
uchar flag;
int warn_l1=20;
int warn_l2=50;
int warn_h1=320;
int warn_h2=350;
uchar code table[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
uchar code table1[]="Voltage:";
void delay(uint z)
{
uint i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void delayus(uint i)
{ while(i--); }
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
lcden=0;
}
void reset()
{
ds=1;
delayus(4);
ds=0;
delayus(100);
ds=1;
delayus(40);
}
uchar read()
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
ds=0; //给脉冲信号
dat>>=1;
ds=1; //给脉冲信号
if(ds)
dat|=0x80;
delayus(10);
}
return(dat);
}
void write(uchar dat)
{
uchar i=0;
for(i=8;i>0;i--)
{
ds=0;
ds=dat&0x01;
delayus(10);
ds=1;
dat>>=1;
}
}
void tempchange()
{
reset();
delay(1);
write(0xcc);
write(0x44);
delay(750);
}
uint get_temp()
{
int a,b;
reset();
delay(1);
write(0xcc);
write(0xbe);
a=read();
b=read();
flag=0;
b=b&0x0f;
if(b>8)
{
flag=1;
b=b&0x07;
b=(b*256+a);
temp=2047-b+1;
}
else
{
b=b&0x07;
temp=(b*256+a);
}
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
return(temp);
}
void display()
{
uint num;
write_com(0x84);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(5);
}
write_com(0x80+0x40+8);
write_data('.');
write_com(0x80+0x40+11);
write_data('V');
write_com(0x80+0x40+5);
write_data(0x30+qian);
write_com(0x80+0x40+6);
write_data(0x30+bai);
write_com(0x80+0x40+7);
write_data(0x30+shi);
write_com(0x80+0x40+9);
write_data(0x30+ge);
if(flag==1)
{
write_com(0x80+0x40+4);
write_data('-');
}
}
void dis_temp(uint t)
{
qian=t/1000;
bai=t%1000/100;
shi=t%1000%100/10;
ge=t%1000%100%10;
display();
}
void warn(uint s,uchar led)
{
uchar i;
i=s;
beep=1;
P1=~(led);
delay(i);
beep=0;
P1=0xff;
}
void deal(uint t)
{
if(flag==1)warn(40,0x01);
else if((t>warn_l1)&&(t<=warn_l2))
{
warn(10,0x02);
}
else if(t<=warn_l1)
{
warn(40,0x01);
}
else if((t<warn_h2)&&(t>=warn_h1))
{
warn(10,0x04);
}
else if(t>=warn_h2)
{
warn(40,0x08);
}
}
void init()
{
beep=0;
flag=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main()
{
init();
while(1)
{
tempchange();
dis_temp(get_temp());
deal(temp);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -