电子温度计:stc15系列的单片机,12864液晶,ds18b20
#include"stc15.h"
#define uchar unsigned char
#define uint unsigned int
uchar data disdata[5];
uint temp; //ζÈÖµ
uchar tflag; //ζÈÕý¸º±êÖ¾
uint count_shi,count_ge;
uint temp,t1; //¶¨ÒåÕûÐ͵ÄζÈÊý¾Ý
uint f_temp; //¶¨Ò帡µãÐ͵ÄζÈÊý¾Ý
uchar a1,a11,a12,a2,a21,a22;
uchar code d1[]={"ÉÏÏÞ: 30"};
uchar code d2[]={"µ±Ç°:"};
sbit rs=P4^1;
sbit rw=P4^2;
sbit en=P4^4;
sbit rst=P3^7;
sbit psb=P4^5;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P0^6;
sbit key3=P0^7;
sbit DS18B20_DQ=P0^5;
/********ÑÓʱº¯Êý********/
void delay(uint z)
{
uint x,y;
for(x=z;z>0;z--)
for(y=110;y>0;y--);
}
/********12864Òº¾§ÏÔʾ********/
void write_com(uchar com) //Òº¾§Ð´Ö¸Áî
{
rs=0;
rw=0;
P2=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_data(uchar dat) //Òº¾§Ð´Êý¾Ý
{
rs=1;
rw=0;
P2=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void lcd_add(uchar a,uchar b) //×Ö·ûµØÖ·
{
uchar add;
if(a==0)
{a=0x80;}
else if(a==1)
{a=0x90;}
else if(a==2)
{a=0x88;}
else if(a==3)
{a=0x98;}
add=a+b;
write_com(add);
}
void init() //Òº¾§³õʼ»¯
{
psb=1;
write_com(0x30);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x01);
delay(5);
}
/********18B20********/
void delay_18B20(uint i)
{
i=i*10;
while(i--);
}
void DS18B20_init() //DS18B20³õʼ»¯
{
uint t=1000;
DS18B20_DQ=1;
delay_18B20(4);
DS18B20_DQ=0;
delay_18B20(100);
DS18B20_DQ=1;
while(t--);
}
uchar DS18B20_read() //¶ÁÊý¾Ý
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--) //¶ÁÈ¡Ò»¸ö×Ö½Ú
{
DS18B20_DQ=0;
dat>>=1;
DS18B20_DQ=1;
if(DS18B20_DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void DS18B20_write(uchar wdata) //дÊý¾Ý
{
uchar i=0;
for(i=8;i>0;i--) //дһ¸ö×Ö½Ú
{
DS18B20_DQ=0;
DS18B20_DQ=wdata&0x01; //Êý¾Ý´¦Àí£¬´ÓµÍµ½¸ßλµÄ˳Ðò·¢ËÍÊý¾Ý
delay_18B20(10);
DS18B20_DQ=1;
wdata>>=1; //´¦ÀíÏÂһλ
}
DS18B20_DQ=1;
}
void read_temp() //¶ÁȡζÈÖµ²¢×ª»»
{
uchar a,b;
DS18B20_init();
DS18B20_write(0xcc); //Ìø¹ý¶ÁROM£¬ÊÊÓÃÓÚÒ»¸ö´Ó»ú¹¤×÷
DS18B20_write(0x44); //Æô¶¯Î¶Èת»»
DS18B20_init();
DS18B20_write(0xcc); //Ìø¹ý¶ÁROM
DS18B20_write(0xbe); //¶ÁȡζÈ
a=DS18B20_read(); //¶ÁµÍ°Ëλ
b=DS18B20_read(); //¶Á¸ß°Ëλ
temp=b; //´¦ÀíζÈÖµ
temp<<=8;
temp=temp|a;
if(temp<0x0fff) //ÅжÏζÈÕý¸º²¢½øÐд¦Àí
tflag=0; //ζÈΪÕý
else
{
temp=~temp+1; //ζÈΪ¸º£¬×ª»»²¹ÂëΪÔÂë
tflag=1;
}
temp=(temp*(0.0625))*100+0.5; //ζÈÖµÀ©´ó100±¶£¬¾«È·µ½2λСÊý,½øÐÐËÄÉáÎåÈë´¦Àí
disdata[0]=temp/10000+0x30;
disdata[1]=temp%10000/1000+0x30; //ʮλÊý
disdata[2]=temp%1000/100+0x30; //¸ö·Öλ
disdata[3]=temp%100/10+0x30;
disdata[4]=temp%10+0x30;
}
/********Ö÷º¯Êý********/
void main()
{
uint n;
delay(10);
init();
a1=32;
a2=26;
lcd_add(0,0);
n=0;
while(d1[n]!='\0')
{
write_data(d1[n]);
n++;
}
lcd_add(1,0);
n=0;
while(d2[n]!='\0')
{
write_data(d2[n]);
n++;
}
while(1)
{
read_temp(); //ζȶÁÈ¡ÒÔ¼°ÏÔʾ
lcd_add(1,3);
write_data(disdata[1]);
write_data(disdata[2]);
write_data('.');
write_data(disdata[3]);
write_data(disdata[4]);
t1=temp/100; //t1ÊÇÁ½Î»Êý£¬·½±ãÏÂÃæ±È½Ï
/*°´¼ü²¿·Ö*/
while(key3==0) //°´¼ü3
{
delay(10);
if(key3==0)
{
if(a1==99)
a1=0;
a1++;
}
while(!key3);
a11=a1/10;
a12=a1%10;
lcd_add(0,3);
write_data(a11+'0');
write_data(a12+'0');
}
while(key2==0) //°´¼ü2
{
delay(10);
if(key2==0)
{
if(a1==0)
a1=100;
a1--;
}
while(!key2);
a11=a1/10;
a12=a1%10;
lcd_add(0,3);
write_data(a11+'0');
write_data(a12+'0');
}
}
}
#include"stc15.h"
#define uchar unsigned char
#define uint unsigned int
uchar data disdata[5];
uint temp; //ζÈÖµ
uchar tflag; //ζÈÕý¸º±êÖ¾
uint count_shi,count_ge;
uint temp,t1; //¶¨ÒåÕûÐ͵ÄζÈÊý¾Ý
uint f_temp; //¶¨Ò帡µãÐ͵ÄζÈÊý¾Ý
uchar a1,a11,a12,a2,a21,a22;
uchar code d1[]={"ÉÏÏÞ: 30"};
uchar code d2[]={"µ±Ç°:"};
sbit rs=P4^1;
sbit rw=P4^2;
sbit en=P4^4;
sbit rst=P3^7;
sbit psb=P4^5;
sbit key0=P1^0;
sbit key1=P1^1;
sbit key2=P0^6;
sbit key3=P0^7;
sbit DS18B20_DQ=P0^5;
/********ÑÓʱº¯Êý********/
void delay(uint z)
{
uint x,y;
for(x=z;z>0;z--)
for(y=110;y>0;y--);
}
/********12864Òº¾§ÏÔʾ********/
void write_com(uchar com) //Òº¾§Ð´Ö¸Áî
{
rs=0;
rw=0;
P2=com;
delay(5);
en=1;
delay(5);
en=0;
}
void write_data(uchar dat) //Òº¾§Ð´Êý¾Ý
{
rs=1;
rw=0;
P2=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void lcd_add(uchar a,uchar b) //×Ö·ûµØÖ·
{
uchar add;
if(a==0)
{a=0x80;}
else if(a==1)
{a=0x90;}
else if(a==2)
{a=0x88;}
else if(a==3)
{a=0x98;}
add=a+b;
write_com(add);
}
void init() //Òº¾§³õʼ»¯
{
psb=1;
write_com(0x30);
delay(5);
write_com(0x0c);
delay(5);
write_com(0x01);
delay(5);
}
/********18B20********/
void delay_18B20(uint i)
{
i=i*10;
while(i--);
}
void DS18B20_init() //DS18B20³õʼ»¯
{
uint t=1000;
DS18B20_DQ=1;
delay_18B20(4);
DS18B20_DQ=0;
delay_18B20(100);
DS18B20_DQ=1;
while(t--);
}
uchar DS18B20_read() //¶ÁÊý¾Ý
{
uchar i=0;
uchar dat=0;
for(i=8;i>0;i--) //¶ÁÈ¡Ò»¸ö×Ö½Ú
{
DS18B20_DQ=0;
dat>>=1;
DS18B20_DQ=1;
if(DS18B20_DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void DS18B20_write(uchar wdata) //дÊý¾Ý
{
uchar i=0;
for(i=8;i>0;i--) //дһ¸ö×Ö½Ú
{
DS18B20_DQ=0;
DS18B20_DQ=wdata&0x01; //Êý¾Ý´¦Àí£¬´ÓµÍµ½¸ßλµÄ˳Ðò·¢ËÍÊý¾Ý
delay_18B20(10);
DS18B20_DQ=1;
wdata>>=1; //´¦ÀíÏÂһλ
}
DS18B20_DQ=1;
}
void read_temp() //¶ÁȡζÈÖµ²¢×ª»»
{
uchar a,b;
DS18B20_init();
DS18B20_write(0xcc); //Ìø¹ý¶ÁROM£¬ÊÊÓÃÓÚÒ»¸ö´Ó»ú¹¤×÷
DS18B20_write(0x44); //Æô¶¯Î¶Èת»»
DS18B20_init();
DS18B20_write(0xcc); //Ìø¹ý¶ÁROM
DS18B20_write(0xbe); //¶ÁȡζÈ
a=DS18B20_read(); //¶ÁµÍ°Ëλ
b=DS18B20_read(); //¶Á¸ß°Ëλ
temp=b; //´¦ÀíζÈÖµ
temp<<=8;
temp=temp|a;
if(temp<0x0fff) //ÅжÏζÈÕý¸º²¢½øÐд¦Àí
tflag=0; //ζÈΪÕý
else
{
temp=~temp+1; //ζÈΪ¸º£¬×ª»»²¹ÂëΪÔÂë
tflag=1;
}
temp=(temp*(0.0625))*100+0.5; //ζÈÖµÀ©´ó100±¶£¬¾«È·µ½2λСÊý,½øÐÐËÄÉáÎåÈë´¦Àí
disdata[0]=temp/10000+0x30;
disdata[1]=temp%10000/1000+0x30; //ʮλÊý
disdata[2]=temp%1000/100+0x30; //¸ö·Öλ
disdata[3]=temp%100/10+0x30;
disdata[4]=temp%10+0x30;
}
/********Ö÷º¯Êý********/
void main()
{
uint n;
delay(10);
init();
a1=32;
a2=26;
lcd_add(0,0);
n=0;
while(d1[n]!='\0')
{
write_data(d1[n]);
n++;
}
lcd_add(1,0);
n=0;
while(d2[n]!='\0')
{
write_data(d2[n]);
n++;
}
while(1)
{
read_temp(); //ζȶÁÈ¡ÒÔ¼°ÏÔʾ
lcd_add(1,3);
write_data(disdata[1]);
write_data(disdata[2]);
write_data('.');
write_data(disdata[3]);
write_data(disdata[4]);
t1=temp/100; //t1ÊÇÁ½Î»Êý£¬·½±ãÏÂÃæ±È½Ï
/*°´¼ü²¿·Ö*/
while(key3==0) //°´¼ü3
{
delay(10);
if(key3==0)
{
if(a1==99)
a1=0;
a1++;
}
while(!key3);
a11=a1/10;
a12=a1%10;
lcd_add(0,3);
write_data(a11+'0');
write_data(a12+'0');
}
while(key2==0) //°´¼ü2
{
delay(10);
if(key2==0)
{
if(a1==0)
a1=100;
a1--;
}
while(!key2);
a11=a1/10;
a12=a1%10;
lcd_add(0,3);
write_data(a11+'0');
write_data(a12+'0');
}
}
}