18b20子程序文档格式.docx
《18b20子程序文档格式.docx》由会员分享,可在线阅读,更多相关《18b20子程序文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
读取ROM0x33
匹配ROM0x55发送该命令后,接着发送64位ID编号,之后就可以直接发送操作命令,这时只有匹配的才做出响应。
搜索ROM0xf0
跳过ROM0xCC
告警搜索指令0xec
*************************RAM操作命令代码:
温度转换0xbe
读取暂存器0xbe
写入暂存器0x4e发出向内部RAM3、4字节写上下限温度数据命令区分于写功能(用来写入所有指令的)
复制RAM到EEPROM0x48对RAM中第3、4字节的操作
恢复EEPROM到RAM0xb8
读取供电方式0xb4寄生供电时18b20发回“0”,外接电源供电发回“1”。
**********************************************************************************/
#defineportP2//定义18b20端口
sbitbuzzer=P1^3;
//蜂鸣器端口
unsignedcharaccount;
//定义全局变量
/**************************改变端口采样点用的数组*********************************/
unsignedcharchange[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharchange2[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/**************************温度存储用数组*****************************************/
unsignedcharsave_temp[8]={0};
//164显示程序
unsignedcharsheet[]={0x11,0x7D,0x23,0x29,0x4D,0x89,0x81,0x3D,0x01,0x09};
sbitdisp_data=P1^0;
sbitdisp_clk=P1^1;
voiddisp_164(unsignedintx)
{
unsignedchari,j=4,k;
while(j--)
{
k=sheet[x%10];
for(i=0;
i<
8;
i++)
if(k&
0x01)disp_data=1;
elsedisp_data=0;
disp_clk=0;
disp_clk=1;
disp_clk=0;
k=k>
>
1;
}
x/=10;
}
//18b20初始化
voidInit18B20(void)
{
unsignedcharqq=0;
port=0;
//DQ=0;
qq=250;
while(qq)qq--;
//Delay15(33);
//至少延时480us
port=0xff;
//DQ=1;
qq=75;
//Delay15(10);
//至少延时100us
//if(DQ==1)return0;
//初始化失败
//elsereturn1;
Delay15(18);
//18b20读取一个字节
/*********************************************************************************/
unsignedcharRead18B20(void)
{
unsignedchari,temp,qq=0;
temp=temp>
port&
=change[account];
qq++;
//_nop_();
qq=2;
_nop_();
if(port&
change2[account]/*DQ==1*/)
{temp=temp|0x80;
}
else
{temp=temp&
0x7f;
qq=15;
//Delay15(3);
}
return(temp);
//18b20写一个字节
voidWrite18B20(unsignedchartemp)
unsignedchari,qq=0;
//port&
//DQ=0;
qq=7;
//Delay15
(1);
if(temp&
0x01)port=0xff;
//DQ=ch&
0x01;
elseport=0;
qq=22;
//读取温度值
voidget_temp()
unsignedintTemH,TemL,temp,save=0,kk=0;
Init18B20();
Write18B20(0xCC);
//跳过ROM
//_nop_();
Write18B20(0x44);
//发送温度转换指令
qq=100;
//Delay10ms(25);
//等待1s转换
Write18B20(0xBE);
for(account=0;
account<
account++)//设定采样点的数量
TemL=Read18B20();
//读低位温度值
TemH=Read18B20();
//读高位温度值
//Delay10ms
(2);
temp=(TemH<
<
4)|(TemL>
4);
if(save_temp[account]!
=temp)
save_temp[account]=temp;
//只有当前采样值和前一次不同时才保存
//return(TemH);
/******************************************************************************