标题:
ds18b20温度采集上位机(vc)和下位机(单片机)程序源码
[打印本页]
作者:
heicc
时间:
2016-6-17 01:11
标题:
ds18b20温度采集上位机(vc)和下位机(单片机)程序源码
0.png
(30.19 KB, 下载次数: 141)
下载附件
2016-6-17 01:08 上传
上位机程序,用vc写的,带有源代码
ds18b20温度采集下位机程序(51单片机)
#include<at89x51.h>
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit DQ=P3^2;
unsigned int j=0;
uchar flag,a;
// 延时子函数
//**************************************************************/
void delay(uint t)
{ for (; t>0 ; t--) ;
}
/************************************************************
/* 产生复位脉冲初始化DS18B20 */
void ow_reset(void)
{ char presence=1;
while(presence)
{
while(presence)
{
DQ=1;_nop_();_nop_();//从高拉倒低
DQ=0;
delay(50); //550 us
DQ=1;
delay(6); //66 us
presence=DQ; //presence=0 复位成功,继续下一步
}
delay(45); //延时500 us
presence=~DQ;
}
DQ=1; //拉高电平
}
/************************************************************
向 1-WIRE 总线上写一个字节**数据线从高电平拉至低电平,产生写起始信号。
15ms之内将所需写的位送到数据线上
**************************************************************/
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--) //在15~60ms之间对数据线进行采样,如果是高电平就写1,低写0发生。
{
DQ = 1;_nop_(); _nop_(); //在开始另一个写周期前必须有1Us以上的高电平恢复期。
DQ = 0;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //5us
DQ = val&0x01; //最低位移出
delay(6) ; //66us
val = val/2; //右移1位
}
delay(1);
}
/************************************************************
//读1字节 //主机数据线先从高拉至低电平1us以上,再使数据线升为高电平,从而产生读信号
**************************************************************/
uchar read_byte (void)
{
uchar i;
uchar value = 0;
for(i = 8;i>0;i--)
{
DQ = 1; // 给脉冲信号
_nop_(); _nop_();
value>>= 1;
DQ = 0; // 给脉冲信号
_nop_(); _nop_(); _nop_(); _nop_();_nop_(); //4us
DQ = 1; _nop_();_nop_();_nop_();_nop_();_nop_();//5us
if(DQ)
{ value|= 0x80 ; }
delay(13); //66us 注意延时的长短,如果是delay(6) 会造成LED闪烁
}
DQ = 1;
return(value) ;
}
void Setting_DS18B20(void)
{
ow_reset();
write_byte(0xCC); // 跳过读序号列号的操作
write_byte(0x4e);
write_byte(0x64); //100不使用DS18B20本身的温度告警设置,为进行转换精度设定,凑两个写寄存器操作
write_byte(0x8a); //-10
write_byte(0x7f); //设置DS18B20 为12位转换精度 R1,R0的值决定转换精度 R1=R0=1对应12位
}
/*--------------------------------------------------------------------------------------
读取温度并完成转化,
-----------------------------------------------------------------------------------------*/
Read_Temperature()
{
uchar tplsb,tpmsb; // 温度值低位、高位字节
uchar flag=0;
// unsigned int j=0; //暂存计算得温度的整数部分
float tt;
ow_reset();
write_byte(0xCC); // 跳过读序号列号的操作
write_byte(0x44); // 启动温度转换
ow_reset();
write_byte(0xCC); //跳过读序号列号的操作
write_byte(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
tplsb=read_byte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
tpmsb=read_byte(); // 高位值高位字节(其中高5位为符号位
//转换温度
j=tpmsb;
j<<=8;
j+=tplsb; //写为j=j|tplsb;也可以。// 两字节合成一个整型变量。
if(tpmsb>7)
{
j=(j^0xffff);//异或
j=j+1; //如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。
}
tt=(j*0.0625);
return tt;
}
/*------------------------------------------------------------------------
主函数
--------------------------------------------------------------------*/
void main()
{ Setting_DS18B20();
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{ if(flag==1)
{ ES=0;
flag=0;
SBUF=Read_Temperature();
while(!TI);
TI=0;
ES=1;
}
}
}
void ckzd() interrupt 4
{
RI=0;
P0=SBUF;
a=SBUF;
flag=1;
if(a=='b')P1=~P1;
else P1=0xff;
}
复制代码
0.png
(90.72 KB, 下载次数: 107)
下载附件
2016-6-17 01:09 上传
18b20温度传感器测试程序,包涵上位机源程序很下位机源程序,将18b20采集的温度值发送给上位机显示
18B20upanddown.rar
(4.93 MB, 下载次数: 228)
2016-6-17 01:09 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
昭通音响-小倪
时间:
2016-7-1 15:51
下载看看,不错
作者:
鹅鹅鹅111
时间:
2016-8-3 11:20
学习学习了
作者:
阿凡提
时间:
2016-12-23 21:09
不错学习一下
作者:
nnq
时间:
2017-5-17 16:23
下载学习一下,谢谢
作者:
DevilQ
时间:
2017-7-8 17:05
谢谢大佬Orz
作者:
xmch
时间:
2018-1-15 22:20
感谢分享,先下来学习。
作者:
fmqwh626
时间:
2018-5-9 09:26
赞一个!
作者:
heidianzi520
时间:
2020-4-24 10:32
上位机的呢?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1