标题:
单片机最小系统+DS18B20进行温度测量试验 串口发送温度结果
[打印本页]
作者:
dzdiy
时间:
2015-4-11 22:04
标题:
单片机最小系统+DS18B20进行温度测量试验 串口发送温度结果
这个用单片机最小系统+DS18B20进行温度测量试验,所需要器材:一块单片机最小系统、一只DS18B20数字温度传感器,测试结果经串口发送到PC机,通过电脑串口调试软件显示测量结果,测量范围-55-125度,保留一位小数。关于单片机最小系统的制作,在本空间有详细介绍,本文就不作介绍,相关的原理图、PCB图、元件清单等内容有,这里就不作介绍了,需要制作的爱好者可参考本空间的手把手制作单片机最小系统。这里只给出单片机最小系统+DS18B20进行温度测量试验的具体程序的压缩包,需要的可以自己下载。需要说明的是,DS18B20的1脚接地、数据端口(2脚)是直接焊接在单片机最小系统板上的单片机P2.0口上、3脚接+5伏。DS18B20的2脚接正电源的4.7K的电阻可以省去,原因是单片机内部是自己带有上接电阻。下面是试验的相关图片。
下载:
用单片机最小系统 DS18B20进行温度测量试验程序.rar
(389.53 KB, 下载次数: 394)
2015-4-11 22:01 上传
点击文件名下载附件
下载积分: 黑币 -5
串口调试助手等单片机工具软件的下载地址:
http://www.51hei.com/mcudown/
源代码:
//单片机使用AT89C51晶振11.0592MHz
//读取DS18B20上的数据,发送至电脑
//数据格式:符号、十位、个位、小数、换行符
//分别发送。 串口:(9600,N,8,1)
#include<at89x51.h>
#define uchar unsigned char
#define uint unsigned int
#define DQ P2_0 //定义P0.0口为单总线数据口
uchar code st[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//小数部分转换
bit stop=1;
uchar pe=0; //发送指针
uchar t=0; //延时计数
uchar rad; //温度数值
uchar disply[]={'0','0','0','.','0','\n'};//温度极性,十位,个位,小数
void temp(uchar aa);
void rest(void);
void write(uchar da);
void read(void);
void hand(void);
void disp(void);
void timer(void);
void temp(uchar aa)
{
while(--aa); //每执行一次2uS
}
void rest(void) //返回"1"时表示有设备应答,复位成功
{
DQ=1;
DQ=0;
temp(225); //大于480us低电平产生复位
DQ=1;
temp(150);
}
void write(uchar da)
{
uchar wb=0x01,t;
for(t=0;t<8;t++)
{
if(da&wb)
{
DQ=0;
temp(1);
DQ=1;
temp(17);
}
else
{
DQ=0;
temp(12);
DQ=1;
temp(6);
}
wb=wb<<1;
}
}
void read(void)
{
uchar sb=0x01,s,tes;
bit pdt;
rad=0;
for(s=0;s<8;s++)
{
DQ=0;
DQ=1;
temp(2);
pdt=DQ;
temp(18);
if(pdt)
{
rad=rad|sb;
}
sb=sb<<1;
tes=rad;
}
}
void hand(void)
{
uchar et,lcm,hcm;
uint cm;
rest();
write(0xcc); //跳过
write(0x44); //启动转换
timer(); //延时500ms
rest();
write(0xcc); //跳过
write(0xbe); //读取命令
read();
lcm=rad;
read();
hcm=rad;
cm=hcm;
cm=cm<<8;
cm=cm|lcm;
if(cm&0xf000)
{
cm=~cm;
cm++;
disply[0]='-';
}
else
{
disply[0]=' ';
}
et=cm&0x000f;
disply[4]=st[et]|0x30; //截取后四位,查表转换后,填入显示缓冲区
et=cm>>4;
if(et>99)
{
disply[0]='1';
et=et-100;
}
disply[1]=(et/10)|0x30; //取温度整数
disply[2]=(et%10)|0x30;
stop=0;
}
void pc(void) interrupt 4 //串口中断
{
if(TI)
{
if(pe>5) //发送完成
{
pe=0;
stop=1;
}
else //继续发送剩余部分
{
ACC=disply[pe];
SBUF=ACC;
pe++;
}
TI=0;
}
}
void disp(void)
{
stop=0;
ACC=disply[0];
SBUF=ACC;
pe++;
}
void tep(void) interrupt 1 //定时器0中断
{
TH0=0x4c;
TL0=0x00;
t++;
}
void timer(void) //延时500ms
{
TR0=1;
while(t<50); //启动定时器,等待10次中断
TR0=0;
t=0;
TH0=0x4c;
TL0=0x00;
}
void main(void)
{
TMOD=0x21; //定时器1模式2;定时器0模式1
// TH1=0xfd;
// TL1=0xfd; //波特率9600,11.0592MHz晶振
TH1=0xE6;
TL1=0xE6; //波特率1200,12MHz晶振
TH0=0x4c;
TL0=0x00; //定时器初值,50ms
SCON=0x50; //串口模式1,允许接受,单机通讯0x90
PCON=0;
IE=0x92; //开所有中断,开串口中断,开T0中断
TR1=1; //启动T1,波特率发生器
TR0=0; //暂停T0
disp();
while(1)
{
while(!stop);
hand();
disp();
}
}
复制代码
作者:
18629701
时间:
2015-9-30 09:50
下载看看
作者:
zy6666
时间:
2015-11-29 23:01
正好需要呢,下来参考下,感谢楼主
作者:
zy6666
时间:
2015-11-30 23:20
楼主的程序,温度转换,为什么不乘以0.0625呢
作者:
蕃茄将
时间:
2016-6-24 11:32
PC端如何拿到10禁止数据可以详细点嘛
作者:
fengluyao
时间:
2017-3-11 19:40
谢谢,很不错,真好
作者:
luoxi123
时间:
2017-5-17 16:30
谢,很不错,真好
作者:
wbacsn
时间:
2017-6-19 22:49
我用ds1820b 开串口中断后读出温度不准,应该是串口中断扰乱了ds1820b的时序,这个怎么解决
作者:
骡子的蹄
时间:
2017-12-15 00:26
要是双机通信的话,接收方的程序该怎么样呢?
作者:
邵椋深
时间:
2017-12-29 11:43
你好,这个程序我为什么接收不到温度呢,不准确,一直是-0.01是怎么回事,能帮我看看吗?1397195833,谢谢啦
作者:
持勤补拙
时间:
2017-12-31 14:38
感谢楼主,学习了
作者:
撼地神牛雨
时间:
2018-1-1 23:02
学习一下,参考
作者:
lvhm
时间:
2018-11-7 00:24
学习一下,参考
作者:
飞将军
时间:
2018-11-7 12:37
我的学生做过温湿度计,不过不怎么精细
作者:
铃恋仙
时间:
2018-11-8 16:36
新手前来学习
作者:
51单片机1234
时间:
2018-12-29 14:44
很不错,谢谢楼主的分享了
作者:
hyyzzby
时间:
2019-5-6 18:11
thank you mvery much
作者:
tkcster
时间:
2019-10-5 18:04
下来看看,谢谢了
作者:
lubenweiniubi
时间:
2020-5-19 11:27
谢谢参考
作者:
nongxin117
时间:
2021-1-23 12:44
谢谢分享,共同进步
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1