DS18B20
#include "ds18b20.h"
#include "seg.h"
sbit DQ = P1^4; //单总线接口
//单总线延时函数
void Delay_OneWire(u8 t) //IAP15F2K61S2
{
t = t * 7;
while(t--);
}
//通过单总线向DS18B20写一个字节
void Write_DS18B20(u8 dat)
{
u8 i;
EA = 0;
for(i=0;i<8;i++)
{
DQ = 0;
DQ = dat&0x01;
Delay_OneWire(5);
DQ = 1;
dat >>= 1;
}
Delay_OneWire(5);
EA = 1;
}
//从DS18B20读取一个字节
u8 Read_DS18B20(void)
{
u8 i;
u8 dat;
EA = 0;
for(i=0;i<8;i++)
{
DQ = 0;
dat >>= 1;
DQ = 1;
if(DQ)
{
dat |= 0x80;
}
Delay_OneWire(5);
}
EA = 1;
return dat;
}
void Delay500us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 6;
j = 93;
do
{
while (--j);
} while (--i);
}
void Ds18b20_Init() //不太能理解这部分的延时
{
DQ=0;
Delay500us();
DQ=1;
Delay500us();
}
u8 Temp_Get()
{
u8 LSB , MSB;
u8 temp;
Ds18b20_Init();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Ds18b20_Init();
Write_DS18B20(0xCC); //跳过ROM设置
Write_DS18B20(0xBE); //读取暂存器指令
LSB = Read_DS18B20(); //读取低八位
MSB = Read_DS18B20(); //读取高八位
temp =(MSB<<4)|(LSB>>4); //数据组合
return temp;
}
#ifndef ___DS18B20_H
#define ___DS18B20_H
#include "sys.h"
#include "seg.h"
extern void Delay_OneWire(u8 t);
extern void Write_DS18B20(u8 dat);
extern u8 Read_DS18B20(void);
extern void Ds18b20_Init();
extern u8 Temp_Get();
#endif
DS1302
#include "ds1302.h"
#include "seg.h"
u8 Init_time[7] = {55,59,23,6,10,2,20};
u8 time[7];
void Write_Ds1302(u8 temp)
{
u8 i;
for (i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
SCK=1;
temp>>=1;
}
}
void Write_Ds1302_Byte( u8 address,u8 dat )
{
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
dat=((dat/10)<<4)|(dat%10);
Write_Ds1302(dat);
RST=0;
}
u8 Read_Ds1302_Byte (u8 address )
{
u8 i,temp,temp1,temp2;
RST=0; _nop_();
SCK=0; _nop_();
RST=1; _nop_();
Write_Ds1302(address);
for (i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
}
RST=0; _nop_();
SCK