代码如下:
ds18b20.c
#include"ds18b20.h"
/*********************************************************************************************************
** 全局变量
********************************************************************************************************/
unsigned char Temperature;
/*********************************************************************************************************
** 函数名称:Delay_us(unsigned char us)
** 函数功能:延时uS
** 入口参数:unsigned char us
** 出口参数:void
** 说 明:u,延时精度2us
********************************************************************************************************/
void Delay_us (unsigned char us)
{
while(--us);
}
/*********************************************************************************************************
** 函数名称:unsigned char OWTouchReset(void)
** 函数功能:复位温度传感器,并返回是否检测到信号
** 入口参数:void
** 出口参数:unsigned char,返回是否检测到信号
** 说 明: 返回值为1代表没有检测到,否则检测到
********************************************************************************************************/
unsigned char OWTouchReset (void)
{
unsigned char result;
DQ = 0; //低电平驱动
Delay_us(TRSTL/2); //600us复位低电平
Delay_us(TRSTL/2);
DQ = 1; //高电平驱动
Delay_us(TPDHIGH); //40us高电平存在检测
_nop_();
result = DQ; // 检测信号
Delay_us(TPDLOW); //160us低电平存在检测
DQ = 1;
Delay_us(TTSTH ); //160us低电平存在检测
return result;
}
/*********************************************************************************************************
** 函数名称:void OWWriteBit (unsigned char BitData)
** 函数功能:往总线上写1位数据
** 入口参数:unsigned char BitData
** 出口参数:void
** 说 明:分为数据0和数据1
********************************************************************************************************/
void OWWriteBit (unsigned char BitData)
{
if (BitData) //数据位为1
{
DQ = 0; //低电平驱动
Delay_us( TLOW1 ); //单线写1低电平时间7us
DQ = 1; // 高电平驱动
Delay_us(TSOLT ); //时间间隙80us
DQ = 1;
}
else //数据位为0
{
DQ = 0; // 低电平驱动
Delay_us(TLOW0); //单线写0低电平时间80us
DQ = 1; //高电平驱动
}
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadBit (void)
** 函数功能:从总线读取一个数据位
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char OWReadBit (void)
{
unsigned char result;
DQ = 0; // 低电平驱动
Delay_us(TRDV); //获得信号时间7us
DQ = 1; //高电平驱动
_nop_();
result = DQ; // 获取信号
Delay_us(TSOLT); //时间间隙80us
DQ = 1;
return result;
}
/*********************************************************************************************************
** 函数名称:void OWWriteByte (unsigned char Data)
** 函数功能:往总线写一字节
** 入口参数:unsigned char Data
** 出口参数:void
** 说 明:
********************************************************************************************************/
void OWWriteByte (unsigned char Data)
{
unsigned char i;
//发送8位数据
for (i=8;i!=0;i--)
{
OWWriteBit(Data & 0x01);
Data = (Data >> 1);
}
}
/*********************************************************************************************************
** 函数名称:unsigned char OWReadByte (void)
** 函数功能:从总线读取一个字节
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char OWReadByte (void)
{
unsigned char i,result=0;
for (i=8;i!=0;i--)
{
//从高位开始存取
result = (result >> 1);
if (OWReadBit()) result |= 0x80;
}
return result;
}
/*********************************************************************************************************
** 函数名称:unsigned char DS18B20_Init (void)
** 函数功能:初始化温度传感器
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char DS18B20_Init (void)
{
EA = 0; //关中断
if (OWTouchReset())
{
EA = 1; //如果没有检测到,开中断
return 0xE0;
}
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_WriteScratchpad); //写暂存器
OWWriteByte(0x3D); // TH=60 设置最高温度
OWWriteByte(0x00); // TL=0 设置最低温度
//精度设置为12-BIT
OWWriteByte(0x7F); // DS18B20配置寄存器R1,R0=11
if (OWTouchReset())
{
EA = 1; //开中断
return 0xE0;
}
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_CopyScratchpad); //复制暂存器
EA = 1; //关中断
return 0;
}
/*********************************************************************************************************
** 函数名称:unsigned char ReadDS18B20 (void)
** 函数功能:读取传感器温度
** 入口参数:void
** 出口参数:unsigned char
** 说 明:
********************************************************************************************************/
unsigned char ReadDS18B20 (void)
{
unsigned char i,result=0;
EA = 0; //关中断
if (OWTouchReset())
{
EA = 1; //开中断
return 0xE0;
}
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_ReadScratchpad); //读取暂存器的值,9字节
for (i=0;i <9;i++)
{
result = OWReadByte();
if (0 == i) //温度低字节
{
Temperature = result >> 4; // 温度不保留小数
}
else if (1 == i) //温度高字节
{
if (result & 0xF8)
{
Temperature = 0; // 负温度归零
}
else
{
Temperature |= (( result&0x07)<<4 ); // 温度保留8bit整数
}
}
}
EA = 1; ////////////////
return 0;
}
/*********************************************************************************************************
** 函数名称:void DS18B20ConvT (void)
** 函数功能:转换温度
** 入口参数:void
** 出口参数:void
** 说 明:
********************************************************************************************************/
void DS18B20ConvT (void)
{
EA = 0; //关中断
if (OWTouchReset())
{
EA = 1; //开中断
return;
}
OWWriteByte(OW_SkipROM); //跳过ROM
OWWriteByte(OW_ConvertT); //温度转换
EA = 1; //开中断
}
ds18b20.h
#ifndef ds18b20_H
#define ds18b20_H
/*********************************************************************************************************
** 基本环境
********************************************************************************************************/
#include <intrins.h>
#include<reg52.h>
/*********************************************************************************************************
** 1-Wire参数定义
********************************************************************************************************/
//1-Wire Standard Speed
#define TLOW0 40 //单线写0低电平时间80us
#define TLOW1 1 //单线写1低电平时间7us
#define TSOLT 40 //时间间隙80us
#define TRDV 1 //获得信号时间7us
#define TRSTL 300 //复为低电平时间 600us延时
#define TPDHIGH 20 //40us高电平存在检测
#define TPDLOW 80 //160us低电平存在检测
#define TTSTH 200 //400us复位电平延时
/*********************************************************************************************************
** 1-Wire命令定义
********************************************************************************************************/
/*ROM操作命令*/
#define OW_SearchROM 0xF0 //搜索ROM
#define OW_ReadROM 0x33 //读取ROM
#define OW_MatchROM 0x55 //匹配ROM
#define OW_SkipROM 0xCC //跳过ROM
#define OW_AlarmSearch 0xEC //告警搜索
/*存取器操作与温度变换命令*/
#define OW_ConvertT 0x44 //温度转换
#define OW_WriteScratchpad 0x4E //写暂存器命令
#define OW_ReadScratchpad 0xBE //读暂存器命令
#define OW_CopyScratchpad 0x48 // 复制寄存器
#define OW_RecallE2 0xB8 //从新调用E2
#define OW_ReadPower 0xB4 //读电源模式
/*********************************************************************************************************
** 信号线声明
********************************************************************************************************/
sbit DQ =P2^7;
/*********************************************************************************************************
** 变量全局声明
********************************************************************************************************/
extern unsigned char Temperature;
/*********************************************************************************************************
** 函数声明
********************************************************************************************************/
static void Delay_us (unsigned char us);
static unsigned char OWTouchReset (void);
static void OWWriteBit (unsigned char BitData);
static unsigned char OWReadBit (void);
static void OWWriteByte (unsigned char Data);
static unsigned char OWReadByte (void);
extern unsigned char DS18B20_Init (void);
extern unsigned char ReadDS18B20 (void);
extern void DS18B20ConvT (void);
/**********************end****************************************/
#endif
display.c
//程序:display.c键盘显示子程序
//功能:显示所需要显示的数字
//函数返回值:unsigned char
#include"display.h"
//sbit LED1=P2^0;
// 数码管0~1, A,B所对应的数码管键值
uchar code disp_save_num[12]={0X88, 0XBE, 0XC4, 0X94, 0XB2, 0X91,
0X81, 0XBC, 0X80,0X90,0XA0,0XFF};
//读取所需显示的数字,并显示
void Display(uchar *disp_num)
{
uchar move_number,move_bit;
uchar disp_number;
SS_CLK = 0;
for(move_number=0;move_number<4;move_number++)
{
disp_number=disp_save_num[*(disp_num+move_number)];//读取所需显示的数字
//并从所对应的键值里
//选择对应的键值
for(move_bit=0; move_bit<8; move_bit++)
{//显示对应键值
// P0=disp_save_num[3];
// LED1=0;
SS_DATA = disp_number&0x80;
SS_CLK = 1;
SS_CLK = 0;
disp_number<<=1;
}
}
}
display.h
//程序:display.h数码管显示子程序头文件
//功能:显示数码管所需数字
//函数说明:
// void Display(uchar *disp_num)
// 读取四个数码管所需显示的数值,并显示
//////////////////////////////////////////////////////////////////////////////
#ifndef _DISPLAY_H
#define _DISPLAY_H
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void Display(uchar *disp_num);
sbit SS_DATA =P0^0;
sbit SS_CLK =P2^0;
#endif
main.c
/*文件名:测试DS18B20.C
/功能:使用数码管测试温度传感器
*/
/****************************************************************************************
*包含文件声明
***************************************************************************************/
#include<reg52.h>
#include"display.h"
#include"ds18b20.h"
#include <intrins.h>
/**********************************************************************************
*函数声明
********************************************************************************/
void delay_50ms(unsigned int ) ; //延时精度50ms
void hextobcd( void) ; //将十六进制转换为BCD
/************************************************************************************
*全局变量声明
***********************************************************************************/
extern unsigned char Temperature;
uchar disp_data[4] = {0,0,0,0}; //数码管显示数据
/**********************************************************************************
*主程序
********************************************************************************/
/*******************************************************************************
** 函数名称:void main ()
** 函数功能:使用数码管测试温度传感器
** 入口参数:void
** 出口参数:void
** 说 明:
**************************************************************************************/
void main(void)
{
Display(disp_data);
delay_50ms(10);
DS18B20_Init(); //温度传感器初始化
while (1)
{
delay_50ms(1);
DS18B20ConvT(); //转换温度
delay_50ms(16); //800ms转换时间等待
ReadDS18B20(); //读取温度
hextobcd(); //将温度转换为BCD
_nop_();
Display(disp_data);
}
}
/***************************************************************************************
** 函数名称:void delay_50ms(unsigned int t)
** 函数功能:延时程序
** 入口参数:unsigned int t
** 出口参数:void
** 说 明:延时精度50ms
****************************************************************************************/
void delay_50ms(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
for(j = 6245;j>0;j--)
;
}
/***************************************************************************************
** 函数名称:void hextobcd( void)
** 函数功能:将十六进制转换为BCD
** 入口参数:void
** 出口参数:void
** 说 明:使用了全局变量
***************************************************************************************/
void hextobcd( void)
{
unsigned int high = 0,low = 0, temp =0, high_temp = 0, low_temp =0;
high_temp = (Temperature>>4) *0x16;
low_temp = Temperature&0x0F;
if(low_temp > 9)
{
low_temp = low_temp -10 + 0x10;
}
temp = high_temp + low_temp;
high = temp>>4;
low = temp & 0x0F;
if(low>9)
{
high +=1;
low -=10;
}
disp_data[1]= high;
disp_data[0] = low;
}
代码在keil中编译错误,错误代码如下
..\BAI\DS18B20.C(30): error C202: 'TRSTL': undefined identifier
..\BAI\DS18B20.C(31): error C202: 'TRSTL': undefined identifier
..\BAI\DS18B20.C(33): error C202: 'TPDHIGH': undefined identifier
..\BAI\DS18B20.C(36): error C202: 'TPDLOW': undefined identifier
..\BAI\DS18B20.C(38): error C202: 'TTSTH': undefined identifier
..\BAI\DS18B20.C(54): error C202: 'TLOW1': undefined identifier
..\BAI\DS18B20.C(56): error C202: 'TSOLT': undefined identifier
..\BAI\DS18B20.C(62): error C202: 'TLOW0': undefined identifier
..\BAI\DS18B20.C(78): error C202: 'TRDV': undefined identifier
..\BAI\DS18B20.C(82): error C202: 'TSOLT': undefined identifier
..\BAI\DS18B20.C(142): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(143): error C202: 'OW_WriteScratchpad': undefined identifier
..\BAI\DS18B20.C(155): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(156): error C202: 'OW_CopyScratchpad': undefined identifier
..\BAI\DS18B20.C(183): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(184): error C202: 'OW_ReadScratchpad': undefined identifier
..\BAI\DS18B20.C(227): error C202: 'OW_SkipROM': undefined identifier
..\BAI\DS18B20.C(228): error C202: 'OW_ConvertT': undefined identifier
compiling main.c...
..\BAI\MAIN.C(42): warning C206: 'DS18B20_Init': missing function-prototype
..\BAI\MAIN.C(47): warning C206: 'DS18B20ConvT': missing function-prototype
..\BAI\MAIN.C(49): warning C206: 'ReadDS18B20': missing function-prototype
..\BAI\MAIN.C(80): error C141: syntax error near '1'
..\BAI\MAIN.C(80): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(81): error C202: 'high_temp': undefined identifier
..\BAI\MAIN.C(82): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(83): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(85): error C202: 'low_temp': undefined identifier
..\BAI\MAIN.C(87): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(88): error C202: 'temp': undefined identifier
..\BAI\MAIN.C(89): error C202: 'temp': undefined identifier
仿真图如下:
有时间的坛友帮看下,程序那里有问题,应该怎么改。非常感谢~~
|