SCLK=0; //确保写数居前SCLK被拉低 RST=1; //启动数据传输 Write1302(Cmd); //写入命令字 dat=Read1302(); //读出数据
SCLK=1; //将时钟电平置于已知状态 RST=0; //禁止数据传递 return dat; //将读出的数据返回 }
/***************************************************** 函数功能: 对1302进行写设置和写数据
***************************************************/ void Init_DS1302(void) {
WriteSet1302(0x8E,0x00); //1302进行初始化,根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((time_m/10)<<4|(time_m))); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((time_f/10)<<4|(time_f))); //根据写分寄存器命令字,写入WriteSet1302(0x84,((time_s/10)<<4|(time_s))); //根据写小时寄存器命令字,写入WriteSet1302(0x86,((time_r/10)<<4|(time_r))); //根据写日寄存器命令字,写入日WriteSet1302(0x88,((time_y/10)<<4|(time_y))); //根据写月寄存器命令字,写入月
分的初始值 小时的初始值 的初始值 的初始值
WriteSet1302(0x8a,((time_w/10)<<4|(time_w))); //根据写周寄存器命令字,写入周的初始值 }
二、温度模块程序(部分程序) /*产生复位脉冲初始化DS18B20*/ void Init() {
uint i=100; DQ=0;
while(i>0)i--;//拉低约900us
WriteSet1302(0x8c,((time_n/10)<<4|(time_n))); //根据写年寄存器命令字,写入
年的初始值
}
DQ=1;//拉高电平,产生上升沿 i=4; while(i>0)i--;
/*等待应答脉冲*/ void Wait() { }
/*读数据一位*/ bit Rebit() { }
/*读一个字节数据*/ uchar Rebyte() { }
uchar i,j=0,k=0; for(i=0;i<8;i++) { } return(j);
k=Rebit(); j=(k<<7)|(j>>1);
uint i; bit b; DQ=0;
i++;//保持低电平至少1us DQ=1;
i++;i++;//延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效 b=DQ; i=9;
while(i>0)i--;//读时隙不低于60us return(b); uint i; while(DQ); while(~DQ); i=4; while(i>0)i--;
//检测到应答脉冲
/*写一个字节数据*/ void Wrbyte(uchar b) { }
/*启动温度转化*/ void Convert() { }
Init();//初始化DS18B20 Wait();//等待应答 delay(1);//延时
Wrbyte(0xcc);//skip rom命令 Wrbyte(0x44);//convert T命令 uint i,j; bit temp; for(j=0;j<8;j++) { }
temp=b&0x01; b>>=1; if(temp) { } else { }
/*写0*/ DQ=0; i=8; while(i>0)i--; DQ=1; i++;i++; /*写1*/ DQ=0;
i++;i++;//延时15us DQ=1; i=8;
while(i>0)i--;//整个写1时隙不低于60us
/*读取温度值*/ void Retemp() {
Init();//初始化DS18B20
Wait();//等待应答 delay(1);//延时
Wrbyte(0xcc);//skip rom命令
Wrbyte(0xbe);//read scratchpad(读暂存器)命令
tplsb=Rebyte();//温度低位字节(其中第四位为小数部分) tpmsb=Rebyte();//温度高位字节(其中高五位为符号位) temp=(tpmsb*256+tplsb)*0.0625;//转换 }
//温度显示 void Display() {
Convert();//温度转换 delay(10); Retemp();//读温度 delay(10);
WriteAddress(0xb); WriteData(digit[temp/10]); }
WriteData(digit[temp]);