模块化数码管显示实时温度DS18B20
单片机 AT89C51
温度芯片 DS18B20
数码管 共阳 7407驱动
采用模块化编程
/*delay.h*/
#ifndef _DELAY_H
#define _DELAY_H_
#define uint unsigned int
#define uchar unsigned char
void delay(uint xms); //秒级延时
void delayms(uint xms); //毫秒级延时,不可以更改,若更改,DS18B20将显示异常
#endif
/*delay.c*/
#include "delay.h"
void delay(uint xms)
{
uint i;
uchar j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void delayms(uint xms)
{
while(xms--);
}
/*ds18b20.h*/
#ifndef _DS18B20_H
#define _DS18B20_H
#include
#include "delay.h"
#include
#define NOP() {_nop_(),_nop_(),_nop_(),_nop_()}
sbit DQ=P3^2; //DS18B20控制线,单线模式。
extern bit ng; //正负数标志位,ng=0,为正数,反之为负数,正数负数的处理方法不同,
extern bit DS18B20_IS_OK;//为1时表示当前读取温度正常,否则读取失败。
extern uchar Display_Digit[4]; //读取的温度值转换后存在这个数组中
extern void Read_Temperature(); //读取当前温度值
extern void Process_Temperature(); //处理当前获得的温度值,正数,负数等。
#endif
/*ds18b20.c*/
#include "ds18b20.h"
//温度字符
uchar code Temperature_Char[8] = {0x0c,0x12,0x12,0x0c,0x00,0x00, 0x00,0x00};
//温度小数对照表
uchar code df_Table[] = {0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9 };
uchar CurrentT = 0 ; //当前读取的温度整数部分
uchar Temp_Value[] = {0x00,0x00}; //从DS18B20读取的温度值
bit ng=0;
bit DS18B20_IS_OK=1;
uchar Display_Digit[4]={0,0,0,0};
//-------------------------------------------------------
// 初始化DS18B20
//-------------------------------------------------------
uchar Init_DS18B20()
{
uchar status;
DQ = 1; delayms(8); DQ = 0 ; delayms(90); DQ = 1; delayms(8);
status = DQ; delayms(100);
DQ = 1;
return status;
}
//-------------------------------------------------------
//读一字节
//-------------------------------------------------------
uchar ReadOneByte()
{
uchar i, dat = 0;
DQ = 1; _nop_();
for (i = 0; i < 8; i++)
{
DQ = 0; dat >>= 1; DQ = 1; _nop_();_nop_();
if(DQ) dat |= 0x80;
delayms(30);
DQ = 1;
}
return dat;
}
//-------------------------------------------------------
// 写一字节
//--------------------------------