RTInputByte(ucAddr); /* 地址,命令 */ ucData = RTOutputByte(); /* 读1Byte数据 */ T_CLK = 1; T_RST = 0; return(ucData); }
/******************************************************* 函数名:Set1302() 功能:设置初始时间
说明:先写地址,后读命令/数据(寄存器多字节方式) 调用:W1302()
入口参数:pClock: 设置时钟数据地址格式为: 秒分时日月星期年 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 返回值:无
********************************************************/ void Set1302(uchar *pClock) { uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/ for(i =7; i>0; i--) {
W1302(ucAddr,*pClock); /* 秒分时日月星期年 */ pClock++; ucAddr +=2; }
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/ }
//================================= 温度显示控制部分 =============================================== /***************************************************** 函数名:void delay() 功能:DS18B20延时 说明:DS18B20时序延时 入口参数:useconds
返回值:无
*****************************************************/ //*********** 18B20驱动 ************************** //延时
void delay(word useconds) {
for(;useconds>0;useconds--); }
/***************************************************** 函数名:byte ow_reset() 功能:DS18B20复位
说明:DS18B20使用时先要复位 入口参数:无 返回值:presence
*****************************************************/ //复位
byte ow_reset(void) {
byte presence; DQ = 0; //拉低总线 delay(29); // 保持 480us DQ = 1; // 释放总线 delay(3); // 等待回复 presence = DQ; // 读取信号 delay(25); // 等待结束信号
return(presence); // 返回 0:正常 1:不存在 }
/***************************************************** 函数名:byte read_byte()
功能:从 1-wire 总线上读取一个字节 说明:读总线上的数据有严格的时序 入口参数: 返回值:value
*****************************************************/ byte read_byte(void)
{ byte i; byte value = 0; for (i=8;i>0;i--) {
value>>=1; DQ = 0; DQ = 1; delay(1);
if(DQ)value|=0x80; delay(6); }
return(value); }
/***************************************************** 函数名:void write_byte()
功能:向 1-WIRE 总线上写一个字节 说明:写总线上的数据有严格的时序 入口参数:val 返回值:无
*****************************************************/ void write_byte(char val) { byte i;
for (i=8; i>0; i--) // 一次写一位 {
DQ = 0; // DQ = val&0x01; delay(5); // DQ = 1; val=val/2; } delay(5); }
/*****************************************************
函数名:Read_Temperature() 功能:读取和显示温度 说明:
入口参数:xx,yy 返回值:无
*****************************************************/ Read_Temperature(char xx,char yy) {
uchar i,tl_temp; uint x; uchar ct[8]; union //共用体 { byte c[2]; int x; }temp;
ow_reset(); // DS18B20复位 write_byte(0xCC); // Skip ROM write_byte(0x44); // 转换温度 ow_reset();
write_byte(0xCC); // Skip ROM write_byte(0xbe); // 读取寄存器
temp.c[1]=read_byte(); // 读出温度低8位 temp.c[0]=read_byte(); // 读出温度高8位
// 零下温度判断
sflag=0; //温度零下标志 0:零上,1:零下 if((temp.c[0]&0xf8)!=0x00) {
sflag=1; // 零下标志位置1
temp.c[1]=~temp.c[1]; // 低8位取反 temp.c[0]=~temp.c[0]; // 高8位取反 tl_temp=temp.c[1]+1; // 低8位加1 temp.c[1]=tl_temp; // 计算后重新存入数组
if(tl_temp>255) temp.c[0]++; // 如果低8位大于255,向高8位进1 }
x=((temp.c[0]&0x07)*256+temp.c[1])*.625; for(i=0;i<8;i++) { ct[i]=0; } i=0; while(x/10) {
ct[i]=x; x=x/10; i++; } ct[i]=x;
if(sflag==1) DisplayOneChar(xx-1,yy,0x2d); else DisplayOneChar(xx-1,yy,0x20);
DisplayOneChar(xx, yy,ct[2]+0x30); // 显示温度十位数 DisplayOneChar(xx+1,yy,ct[1]+0x30); // 显示温度个位数 DisplayOneChar(xx+2,yy,0x2e); // 显示小数点
DisplayOneChar(xx+3,yy,ct[0]+0x30); // 显示温度小数位 DisplayOneChar(xx+4,yy,0x01); // 显示自定义字符 DisplayOneChar(xx+5,yy,0x43); // 显示字符\}
/***************************************************** 函数名:void adjust_res() 功能:温度分辨率调整
说明:此函数可以对温度的显示进行精度调节. 入口参数:res 返回值:无
*****************************************************/
void adjust_res(char res) // res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
// 0.5, 0.25, 0.125 {
ow_reset(); // 复位
write_byte(0xcc); // 跳过Rom write_byte(0x4e); // 写暂存器 write_byte(0x02); // 写TH write_byte(0x01); // 写TL
write_byte(res); // 温度转换分辨率设置 ow_reset(); // 复位
write_byte(0xcc); // 跳过Rom
write_byte(0x48); // 把暂存器内容写到EPRam中 }
//==========================程序结束
======================================================