基于DS18B20温度传感器和AT98C51单片机的无线温度采集系统设计

本人课程设计的题目,望高手指导,给点资料,不胜感激!qianjin_nl@126.com QQ525147508
1. 无线温度采集仪工作原理的确定。

2. 设计系统单元电路。
包括:
(1) 远处温度采集及信号发射单元;
(2) 近处信号接收单元;
(3) 近处信号显示单元;

3. 设计总体电路图包括元器件型号,并用Proteus软件进行仿真,得到仿真结果。

说明:本程序使用1602LCD显示。温度采集芯片已经集成,温度模拟信号已经在DS18B20内部转换成数字信号,只需要通过18B20的数据引脚读取即可,具体请详细阅读DS18B20数据手册。要看仿真结果请到个人空间。大同小异,注意时序,串行读写时序要求最严格,程序注释很详细了。
/************************************
硬件:M16,DS18B20,引脚连线:DQ-PD2,
仿真:要求M16晶振达8MHZ
Author:LCA from WHUT
Application: Temperature Measureing
Date:2007-10
*************************************/
#include "1602LCD.h"
#include "DS1302.h"
//#include "key.h"
#include <iom16v.h>
#include <macros.h>

//BIT在<macros.h>中已经定义#define BIT(x) (1 << (x))

#define DQ_DIR_IN() DDRD&=~BIT(2) //data input
#define DQ_DIR_OUT() DDRD|=BIT(2) //data output
#define DQ_BUS_L() PORTD&=~BIT(2) //Pin output high
#define DQ_BUS_H() PORTD|=BIT(2) //Pin output low
#define BUS_state() (PIND & 0x04) //检测 ds18b20返回信号

unsigned char wmh,wml,wm3,sign_flag=0;
//unsigned char table[]={"0123456789"};

void DS18B20_init()
{ DQ_DIR_OUT(); //设置PD2 为输出
DQ_BUS_H();
DQ_BUS_L(); //占领总线
delay_nus(480); //480us以上
DQ_BUS_H(); //释放总线
DQ_DIR_IN();
delay_nus(20); //15~60us
while(BUS_state()); //回读DS18B20返回信号
DQ_DIR_OUT();
DQ_BUS_H(); //释放总线
delay_nus(140); //60~240us

}

/**********************************
函数:write_18B20()
功能:往18B20中写入数据(命令)
输入参数:数据(命令)
返回参数:无
注意:延时
************************************/
void write_18B20(unsigned char x)
{
unsigned char m;
for(m=0;m<8;m++)
{
DQ_BUS_L(); //占领总线
if(x&(1<<m)) //写数据了,先写低位的
DQ_BUS_H();
else
{DQ_BUS_L();}
delay_nus(40); //15~60us
DQ_BUS_H(); //完毕后释放总线
}
DQ_BUS_H();
}

/************************************
函数:read_18B20()
功能:从18B20中读取数据
输入参数:无
返回参数:读取值
注意:延时
*************************************/

unsigned char read_18B20(void)
{
unsigned char temp,n;
temp=0;
for(n=0;n<8;n++)
{
DQ_BUS_L(); //拉低总线
DQ_BUS_H(); //置高总线
DQ_DIR_IN(); //data input
if(BUS_state()) //读数据,从低位开始
temp|=(1<<n);
else
temp&=~(1<<n);
delay_nus(50); //60~120us
DQ_DIR_OUT(); //data output
}
return (temp);
}

/************************************
函数:get_temper_value();
功能:从18B20中读取温度值
输入参数:无
返回参数:无(处理值wm3,wmh,wml-全局变量)
注意:正负温度的转换方法,手册中数据
存储格式为:高8位的高4位为符号位
**************************************/
void get_temper_value(void) //读取温度值
{
unsigned char temh,wm1;
unsigned char wm0,teml,wm2;
DS18B20_init(); //复位18b20
write_18B20(0xcc); //skip ROM
write_18B20(0x44); //发出转换命令
DS18B20_init();
write_18B20(0xcc); //skip rom
write_18B20(0xbe); //发出读命令
teml=read_18B20(); //读数据
temh=read_18B20();
wm0=teml>>4; //低8位的高四位,温度范围0~115啦!
wm1=temh<<4; //只要高8位的低四位
wm2=wm1+wm0 ; //16进制转10进制
if(wm1&0x80) //测试符号位,测温范围-55
{wm2=256-wm2; //求取补码
sign_flag=1;
} //为负温度
else
{
sign_flag=0;
}
wm3=wm2/100; //百位
wmh=(wm2%100)/10; //出口参数了!wmh是显示的高位,wml使显示的低位 ,十位
wml=(wm2%100)%10; //个位
}

/************************************
函数:data_display();
功能:温度值显示(显示符号为,百位,十位,个位,小数点)
输入参数:无(全局变量wm3,wmh,wml)
返回参数:无
注意:显示地址的处理
**************************************/

void data_display(void)
{ unsigned char add=0;
add=LCD_display_string(0,0,"Tem:");
if(sign_flag)
{LCD_display_string(add++,0,"-");} //显示负号
if(!sign_flag) //负温度的时候不显示百位
{LCD_display_num(add++,0,table[wm3]);} //百位0
LCD_display_num(add++,0,table[wmh]); //十位
LCD_display_num(add++,0,table[wml]);
LCD_display_string(add++,0,".");
LCD_display_string(add++,0,"00");
LCD_display_string(add+1,0,"C");
}

void devices_init(void)
{
LCD_init();
DS18B20_init();
DS1302_init();
}

void main()
{unsigned char num=0;
devices_init();
while(1)
{get_temper_value(); //获取温度值
data_display(); //显示温度值
get_time(); //读取时钟并显示
// num=get_key();
//if(num)
// {LCD_display_string(14,1,"keynum"); }

}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-01-07
//这是关于DS18B20的c读写程序,数据脚P1.0,晶振12MHZ

//进行温度显示,这里我们考虑用四位数码管来显示温度

//显示范围-55.0到+99.5度,显示精度为0.5度

//关于程序中的延时请参考ds18b20的读写时序

#include <reg52.h>
#define uchar unsigned char

uchar tempint,tempdf; //温度整数部分和小数部分

sbit TMDAT = P1^0; //根据实实际情况设定
sbit ld7=P1^7; //初始化成功标志led
sbit ld6=P1^6; //负温度标志led
sbit point=P0^7; //小数点显示
uchar f; //负温度标志
第2个回答  2019-07-25
首先AT98C51你确定是这个吗??
其次这个东西我手上有现成的,不过不会给你,倒不是由于分数不多的问题,给你是害了你。
最后请Hi我,我给你讲解一下,关于DS18B20的温度采集以及无线模块的选取问题,其他的你自己弄。

基于DS18B20温度传感器和AT98C51单片机的无线温度采集系统设计
说明:本程序使用1602LCD显示。温度采集芯片已经集成,温度模拟信号已经在DS18B20内部转换成数字信号,只需要通过18B20的数据引脚读取即可,具体请详细阅读DS18B20数据手册。要看仿真结果请到个人空间。大同小异,注意时序,串行读写时序要求最严格,程序注释很详细了。\/ 硬件:M16,DS18B20,引脚连线:DQ-PD2,仿真:...

单片机初学者请教怎么购买学习板!!!
3、配有40Pin外扩接口和标准40Pin仿真连接头,与Keil C51 调试软件μVision2 配合,当作一台独立的51单片机仿真器使用,可按单步、断点、连续等方式调试实际应用程序。既可仿真调试学习系统内部资源,也可仿真调试用户目标板资源 4、配有ISP接口和ISP下载连接头,单独作ISP下载线使用,对外部目标板上的...

相似回答