课程名称:机器人原理和应用实验类型: 设计型
实验项目名称:DS18B20温度传感器实验
实验地点: 实验日期:年 月日
成绩:
一、实验目的及要求
二、实验环境及要求
1.普中实验开发版一块, 杜邦线若干,端子线一个,温度传感器DS18B20一个
2.PC机一台
3.软件环境:OS:WIN7、Keil uVision4、普中科技自动下载软件
三、实验原理
四、实验内容及步骤
1.DS18B20模块电路原理图
2.连线:
JP10端口连接JP12端口,也就是STC89C51的P0端口连接74HC245, STC89C51的P2.2,P2.3,P2.4端口连接U12的A,B,C端口。温度传感器DS18B20出厂时就安装好了。
3.简述DS18B20温度转换规则。
答:
该实验项目包括main.c, temp.c, temp.h三个文件。
以下为main.c文件内容:
#include "reg52.h"
#include"temp.h"
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
char num=0;
uchar DisplayData[8];
uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void datapros(int temp) //此函数功能是
{
float tp;
if(temp< 0) //添加注释:
{
DisplayData[0] = 0x40;
temp=temp-1;
temp=~temp; //添加注释:
tp=temp;
temp=tp*0.0625*100+0.5; //添加注释:
}
else //添加注释:
{
DisplayData[0] = 0x00;
tp=temp;
temp=tp*0.0625*100+0.5;
}
DisplayData[1] = smgduan[temp / 10000];
DisplayData[2] = smgduan[temp % 10000 / 1000];
DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80;
DisplayData[4] = smgduan[temp % 100 / 10];
DisplayData[5] = smgduan[temp % 10];
}
void DigDisplay() //此函数功能是
{
uchar i;
for(i=0;i<6;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第 位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第 位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第 位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第 位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第 位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第 位
}
P0=DisplayData;
delayms(1);
P0=0x00; //添加注释:
}
}
void main()
{
while(1)
{
datapros(Ds18b20ReadTemp()); //添加注释:
DigDisplay(); //添加注释:
}
}
以下为temp.c文件内容
#include"temp.h"
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
uchar Ds18b20Init()
{
uchar i;
DSPORT = 0; //将总线拉低480us~960us
i = 70;
while(i--); //延时642us
DSPORT = 1;//然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
i = 0;
while(DSPORT) //等待DS18B20拉低总线
{
delayms(1);
i++;
if(i>5)//等待>5MS
{
return 0;//初始化失败
}
}
return 1;//初始化成功
}
void Ds18b20WriteByte(uchar dat)
{
uint i, j;
for(j=0; j<8; j++)
{
DSPORT = 0; //每写入一位数据之前先把总线拉低1us
i++;
DSPORT = dat & 0x01; //然后写入一个数据,从最低位开始
i=6;
while(i--); //延时68us,持续时间最少60us
DSPORT = 1; //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
dat >>= 1;
}
}
uchar Ds18b20ReadByte()
{
uchar byte, bi;
uint i, j;
for(j=8; j>0; j--)
{
DSPORT = 0;//先将总线拉低1us
i++;
DSPORT = 1;//然后释放总线
i++;
i++;//延时6us等待数据稳定
bi = DSPORT; //读取数据,从最低位开始读取
/*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
byte = (byte >> 1) | (bi << 7);
i = 4; //读取完之后等待48us再接着读取下一个数
while(i--);
}
return byte;
}
void Ds18b20ChangTemp()
{
Ds18b20Init();
delayms(1);
Ds18b20WriteByte(0xcc); //添加注释:
Ds18b20WriteByte(0x44); //添加注释:
}
void Ds18b20ReadTempCom()
{
Ds18b20Init();
delayms(1);
Ds18b20WriteByte(0xcc);
Ds18b20WriteByte(0xbe); //添加注释:
}
int Ds18b20ReadTemp()
{
int temp = 0;
uchar tmh, tml;
Ds18b20ChangTemp(); //添加注释:
Ds18b20ReadTempCom(); //添加注释:
tml = Ds18b20ReadByte(); //添加注释:
tmh = Ds18b20ReadByte(); //添加注释:
temp = tmh;
temp <<= 8;
temp |= tml;
return temp;
}
以下为temp.h文件内容:
#ifndef __TEMP_H_
#define __TEMP_H_
#include<reg52.h>
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//--定义使用的IO口--//
sbit DSPORT=P3^7;
//--声明全局函数--//
void delayms(uint );
uchar Ds18b20Init();
void Ds18b20WriteByte(uchar com);
uchar Ds18b20ReadByte();
void Ds18b20ChangTemp();
void Ds18b20ReadTempCom();
int Ds18b20ReadTemp();
#endif
5. 要求添加上面代码的注释。
6. 调试程序、并下载到普中实验板,观察实验现象。实验效果要求演示给指导教师。
实验现象是:
7. 回答DS18B20的单总线编程需要注意事项。
答:
四、提高实验
1. 请指出温度显示的最小刻度是多少?
2. 请画出该实验的datapros()函数的软件流程图?
3. 修改程序,实现温度显示能显示出小数后3位,整数保留3位。
完整的Word格式文档51黑下载地址:
机器人原理实验报告二20181029.doc
(1.18 MB, 下载次数: 26)
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |