多个ds18b20c程序Word格式.docx

上传人:b****6 文档编号:17873499 上传时间:2022-12-11 格式:DOCX 页数:10 大小:18.24KB
下载 相关 举报
多个ds18b20c程序Word格式.docx_第1页
第1页 / 共10页
多个ds18b20c程序Word格式.docx_第2页
第2页 / 共10页
多个ds18b20c程序Word格式.docx_第3页
第3页 / 共10页
多个ds18b20c程序Word格式.docx_第4页
第4页 / 共10页
多个ds18b20c程序Word格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

多个ds18b20c程序Word格式.docx

《多个ds18b20c程序Word格式.docx》由会员分享,可在线阅读,更多相关《多个ds18b20c程序Word格式.docx(10页珍藏版)》请在冰豆网上搜索。

多个ds18b20c程序Word格式.docx

uchark;

k=2;

while(k)k--;

j=DQ;

k=25;

while(k)k--;

returnj;

uchards_readbyte()//先读的为最低位

uchari,j,b;

b=0;

j=ds_readbit();

b=(j<

<

i)|b;

returnb;

ucharcrctest(uchar*p)

ucharcrc,i,n,cbit,bit0,byte,r;

crc=0;

9;

byte=*p;

for(n=0;

n<

n++)

cbit=crc&

bit0=byte&

crc=crc>

r=cbit^bit0;

if(r==1)crc=crc^0x8c;

byte=byte>

p++;

}//crc==0校正正确

returncrc;

voidGet_wendu()//得到float型全局量wendu[number_18B20]

ucharcodeserial_number[4][8]={0x28,0x2e,0xe0,0xce,0x01,0x00,0x00,0xe6,//一号18b20ROM号

0x28,0x13,0x2d,0x6c,0x01,0x00,0x00,0x21,//二号

0x28,0xea,0x07,0x6c,0x01,0x00,0x00,0x80,//三号

0x28,0x2a,0x0e,0x6c,0x01,0x00,0x00,0xec};

//四号

//四个18b20的八字节序列号数据

ucharscratch[9];

//TL,TH,ThR,TlR,Con,Res,Res,Res,CRC;

//温度高低字节,结构寄存器和卷积码字节

uintT_18B20;

//整型,合并存储温度数据

uchari,j,crc;

charfuhao;

//表示正负温度+1,-1;

while(ds_init());

//返回1则继续复位,直到检测到低电平的应答脉冲则向下执行

ds_writebyte(0xcc);

//SKIPROM,不发送ROM命令则要发送跳过ROM命令(0xcc)

ds_writebyte(0x44);

//命令单总线上的所有器件开始转换

delayms(10);

//一般转换要750us,这里等待3ms足够

for(j=0;

j<

number_18B20;

j++)//读取转换后的四个温度

while(ds_init());

//返回1则继续复位,直到检测到低电平的应答脉冲则向下执行

ds_writebyte(0x55);

//ROM匹配

for(i=0;

i++)

ds_writebyte(serial_number[j][i]);

//ROM匹配注意:

发送序列号后,只有匹配的18B20才会对接下来的命令响应

ds_writebyte(0xbe);

//readscratchpad命令

scratch[i]=ds_readbyte();

crc=crctest(scratch);

//crc==0校正正确

////////////////////////

T_18B20=0;

T_18B20=scratch[1];

T_18B20=(T_18B20<

8)+scratch[0];

fuhao=1;

if(T_18B20>

0xf000) 

//为负温度

T_18B20=~T_18B20+1;

fuhao=-1;

wendu[j]=fuhao*T_18B20/16.0+T_18B20%16/16.0;

//将温度高低字节变成float

if(crc!

=0)wendu[j]=85.5;

发表于2008/4/1620:

59:

28

标签:

无标签

DS18B20温度采集通过串口送入电脑

程序肯定还是把其它的驱动组合,呵呵,EDN51验证。

显示4位温度。

串口助手设置12008N1哦

给点支持吧

#include<

AT89x52.h>

#include<

intrins.h>

//*****************************************

sbit 

DS18b20_DQ=P1^6;

bit 

flag;

unsignedchar*p;

chara[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0x88,0x83,0xc6,0x86,0x8e,0x82};

charb[16]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,

0x00,0x19,0x08,0x03,0x46,0x06,0x0e,0x02};

charone,two,three,four;

unsignedchar 

codeCrcTable[256]={

0, 

94,188, 

226, 

97, 

63, 

221, 

131, 

194, 

156, 

126, 

32, 

163, 

253, 

31, 

65,

157, 

195, 

33, 

127, 

252, 

162, 

64, 

30, 

95, 

1, 

227, 

189, 

62, 

96, 

130, 

220,

35, 

125, 

159, 

193, 

66, 

28, 

254, 

160, 

225, 

191, 

93, 

3, 

128, 

222, 

60, 

98,

190, 

224, 

2, 

92, 

223, 

129, 

99, 

61, 

124, 

34, 

192, 

158, 

29, 

67, 

161, 

255,

70, 

24, 

250, 

164, 

39, 

121, 

155, 

197, 

132, 

218, 

56, 

102, 

229, 

187, 

89, 

7,

219, 

133,103, 

57, 

186, 

228, 

6, 

88, 

25, 

71, 

165, 

251, 

120, 

38, 

196, 

154,

101, 

59,217, 

135, 

4, 

90, 

184, 

230, 

167, 

249, 

27, 

69, 

198, 

152, 

122, 

36,

248, 

166,68, 

26, 

153, 

199, 

37, 

123, 

58, 

100, 

134, 

216, 

91, 

5, 

231, 

185,

140, 

210,48, 

110, 

237, 

179, 

81, 

15, 

78, 

16, 

242, 

172, 

47, 

113, 

147, 

205,

17, 

79, 

173, 

243, 

112, 

46, 

204, 

146, 

211, 

141, 

111, 

49, 

178, 

236, 

14, 

80,

175, 

241,19, 

77, 

206, 

144, 

114, 

44, 

109, 

51, 

209, 

143, 

12, 

82, 

176, 

238,

50, 

108, 

142, 

208, 

83, 

13, 

239, 

177, 

240, 

174, 

76, 

18, 

145, 

207, 

45, 

115,

202, 

148,118, 

40, 

171, 

245, 

23, 

73, 

8, 

86, 

180, 

234, 

105, 

55, 

213,139,

87, 

9, 

235, 

181, 

54, 

104, 

138, 

212, 

149, 

203, 

41, 

119, 

244, 

170, 

72, 

22,

233, 

183, 

85, 

11, 

136, 

214, 

52, 

106, 

43, 

117, 

151, 

201, 

74, 

20, 

246, 

168,

116, 

42, 

200, 

150, 

21, 

75, 

169, 

247, 

182, 

232, 

10, 

84, 

215, 

137, 

107, 

53};

unsignedchartemp_buff[9];

//存储读取的字节,readscratchpad为9字节,readromID为8字节

unsignedcharcrc_data;

floatTemperature;

unsignedcharid_buff[8];

/******定义函数****************/

#defineucharunsignedchar

#defineuintunsignedint

voidLCD_init(void);

//初始化函数

voidLCD_write_command(ucharcommand);

//写指令函数

voidLCD_write_data(uchardat);

//写数据函数

voidLCD_disp_char(ucharx,uchary,uchardat);

//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)

voiddelay_n40us(uintn);

//延时函数

//****************************************************/

voidTempDelay(uintus)

while(us--);

//******************************************************/

voidInit18b20(void)

DS18b20_DQ=1;

_nop_();

DS18b20_DQ=0;

TempDelay(86);

//delay530uS//80

_nop_();

TempDelay(14);

//delay100uS//14

if(DS18b20_DQ==0)

flag=1;

//detect1820success!

flag=0;

//detect1820fail!

TempDelay(20);

//20

DS18b20_DQ 

=1;

/*****************************

*Function:

向18B20写入一个字节*/

voidWriteByte(ucharwr) 

//单字节写入

uchari;

 

for(i=0;

0;

DS18b20_DQ=wr&

0x01;

TempDelay(5);

//delay45uS//5

wr>

=1;

/************************************************************

读18B20的一个字节

*************************************************************/

ucharReadByte(void) 

//读取单字节

uchari,u=0;

DS18b20_DQ=0;

u>

if(DS18b20_DQ==1)

u|=0x80;

TempDelay(4);

return(u);

读18B20

voidread_bytes(ucharj)

j;

*p=ReadByte();

/*Function:

CRC校验********************************/

ucharCRC(ucharj)

uchari,crc_data=0;

i++) 

//查表校验

crc_data=CrcTable[crc_data^temp_buff[i]];

return(crc_data);

读取温度

voidGemTemp(void)

read_bytes(9);

if(CRC(9)==0)//校验正确

Temperature=temp_buff[1]*0x100+temp_buff[0];

Temperature*=0.625;

Temperature/=16;

TempDelay

(1);

内部配置

voidConfig18b20(void) 

//重新配置报警限定值和分辨率

Init18b20();

WriteByte(0xcc);

//skiprom

WriteByte(0x4e);

//writescratchpad

WriteByte(0x19);

//上限

WriteByte(0x1a);

//下限

WriteByte(0x7f);

//set11bit(0.125)

WriteByte(0x48);

//保存设定值

WriteByte(0xb8);

//回调设定值

读18B20ID

*parameter:

*Return:

*Modify:

voidReadID(void)//读取器件id

Init18b20();

WriteByte(0x33);

//readrom

read_bytes(8);

18B20ID全处理*/

voidTemperatuerResult(void)

p=id_buff;

ReadID();

Config18b20();

Init18b20();

WriteByte(0x44);

//Temperatureconvert

WriteByte(0xbe);

voidGet_Temperature()

=temp_buff;

GemTemp();

/*voiddelay_n40us(uintn)

uinti;

ucharj;

for(i=n;

i>

0;

i--)

for(j=0;

15;

j++)

;

//

}*/ 

//初始化232

voidInit_RSC232()

//波特率:

1200bit/s,1位起始位,1位停止位,8位数据位

TMOD=0x20;

TL1 

=0xE8;

TH1 

TR1 

PCON=0x00;

SCON=0x50;

voidprintc(unsignedcharc)

TI 

SBUF= 

c;

while(TI==0)

TI 

=0 

voidprints(unsignedcharc[])

unsignedcharindex=0;

while(c[index]!

='

\0'

printc(c[index]);

index++;

voidprinthex(unsignedchari)

unsignedcharj;

j=i+0x30;

printc(j);

voiddelay_n40us(uintn)

//*******************************

//*********主函数*****************

voidmain(void)

intTemper;

Init_RSC232();

while

(1)

TemperatuerResult();

Get_Temperature();

//prints("

Welcometojizzll'

sblog!

\n\r"

);

Temper=(int)Temperature;

one="

Temper/10"

;

two="

Temper"

%10;

three=(Temperature-

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1