#include <reg52.h>
#include <intrins.h>
#include <sys\sys.h>
#include <lcd\lcd.h>
#include <font\font.h>
#include<DS1302\DS1302.h>
#include<DS18B20\DS18B20.h>
void main(void)
{
P2=0xff;
P3=0xff;
P1=0xff;
Lcd_Init();
LCD_Clear(WHITE);
BACK_COLOR=BLACK;;POINT_COLOR=WHITE;
Initial();
ds_reset(); // 函數運行到這里,就沒反映了
write_byte(0xcc); //
write_byte(0x44); //
while(1)
{
key1scan();
key2scan();
key3scan();
read_temp(); //
work_temp(); //
wendu=wendudisplay();
miao=read1302(read_second);
fen=read1302(read_minute);
shi=read1302(read_hour);
ri=read1302(read_day);
nian=read1302(read_year);
yue=read1302(read_month);
week=read1302(read_week);
LCD_ShowString(0,0,"day:"); LCD_ShowString(48,17,"-"); LCD_ShowString(72,17,"-");
LCD_ShowString(17,17,"20");LCD_Show2Num(32,17,nian,2);LCD_Show2Num(56,17,yue,2); LCD_Show2Num(80,17,ri,2);
LCD_ShowString(0,34,"time:"); LCD_ShowString(48,51,":"); LCD_ShowString(72,51,":");
LCD_Show2Num(32,51,shi,2);LCD_Show2Num(56,51,fen,2); LCD_Show2Num(80,51,miao,2);
LCD_ShowString(0,68,"week:"); LCD_Show2Num(56,85,week,2);
LCD_ShowString(0,102,"wendu:");
LCD_Show2Num(56,119,wendu,4);LCD_ShowString(88,119,"C");
}
}
下面是DS18B20
#include<reg52.h>
#include <intrins.h>
#include <sys\sys.h>
#include<DS18B20\DS18B20.h>
uchar dispaly[7];
uchar temp_data[2]={0x00,0x00};
//---------------------------------------------------DS1820復位函數-----------------------------------------------
void ds_reset(void)
{
char aa=1;
while(aa)
{
while(aa)
{
DQ=1;
_nop_();
_nop_();
DQ=0;
delay1(80);
DQ=1;
delay1(9);
aa=DQ;
}
delay1(64);
aa=~DQ;
}
DQ=1;
}
//-------------------------------------------------DS1820寫函數---------------------------------------------------
void write_byte(uchar value)
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
DQ=0;_nop_();_nop_();_nop_();_nop_();_nop_();
DQ=value&0x01;
delay1(9);
value>>=1;
}
DQ=1;
delay1(1);
}
//------------------------------------------------DS1820讀函數---------------------------------------------------
uchar read_byte(void)
{
uchar i;
uchar value1=0;
for(i=8;i>0;i--)
{
DQ=1;_nop_();_nop_();
value1>>=1;
DQ=0;
_nop_();_nop_();_nop_();_nop_();
DQ=1;
_nop_();_nop_();_nop_();_nop_();
if(DQ)
value1|=0x80;
delay1(9);
}
DQ=1;
return(value1);
}
//-----------------------------------------------讀取溫度---------------------------------------------------------
void read_temp()
{
ds_reset();
write_byte(0xcc);
write_byte(0xbe);
temp_data[0]=read_byte();
temp_data[1]=read_byte();
ds_reset();
write_byte(0xcc);
write_byte(0x44);
}
//----------------------------------------------溫度處理----------------------------------------------------------
void work_temp()
{
uchar n=0;
if(temp_data[1]>127)
{
temp_data[1]=(256-temp_data[1]); //負值
temp_data[0]=(256-temp_data[0]);
n=1;
}
dispaly[6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
dispaly[5]=dispaly[6]/100; //百位
dispaly[4]=dispaly[6]%100; //
dispaly[2]=dispaly[4]/10; //十位
dispaly[1]=dispaly[4]%10; //個位
switch (temp_data[0]&0x0f) //小數位
{
case 0x0f:dispaly[0]=9;break;
case 0x0e:dispaly[0]=9;break;
case 0x0d:dispaly[0]=8;break;
case 0x0c:dispaly[0]=8;break;
case 0x0b:dispaly[0]=7;break;
case 0x0a:dispaly[0]=6;break;
case 0x09:dispaly[0]=6;break;
case 0x08:dispaly[0]=5;break;
case 0x07:dispaly[0]=4;break;
case 0x06:dispaly[0]=4;break;
case 0x05:dispaly[0]=3;break;
case 0x04:dispaly[0]=3;break;
case 0x03:dispaly[0]=2;break;
case 0x02:dispaly[0]=1;break;
case 0x01:dispaly[0]=1;break;
case 0x00:dispaly[0]=1;break;
default:break;
}
if(n) //負值時顯示aa,正直顯示dd
{
dispaly[3]=0x11; //
}
else dispaly[3]=0x22;
}
uchar wendudisplay(void)
{
float degree;
degree=dispaly[2]*16+dispaly[1]+dispaly[0];
return degree;
}
|