基于89S51的實(shí)時數(shù)字溫度計(DS1302 18B20)
#include
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define S_RST DS_RST=1
#define C_RST DS_RST=0
#define S_CLK DS_CLK=1
#define C_CLK DS_CLK=0
#define Write_Disable RW_DS1302(0x8e,0x80) //寫保護(hù)
#define Write_Enable RW_DS1302(0x8e,0x00) //允許寫入
sbit SET = P1^5; //設(shè)置按鍵
sbit ADD = P1^4; //調(diào)整加
sbit DEC = P1^6; //調(diào)整減
#define RdefineT1 TH1=0;TL1=0;TR1=0;a=0; //初始化超時檢測
//#define Delay2us() _nop_();_nop_(); //延時2us,每nop 1us
//#define Delay8us() _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
#define ReDetectTime 20 //設(shè)置重復(fù)檢測次次數(shù),超出次數(shù)則超時
//ds18b20命令
#define SkipROM 0xCC
#define MatchROM 0x55
#define ReadROM 0x33
#define SearchROM 0xF0
#define AlarmSearch 0xEC
#define Convert 0x44 //啟動溫度轉(zhuǎn)換
#define WriteScr 0x4E
#define ReadScr 0xBE
#define CopyScr 0x48
#define RecallEE 0xB8
#define ReadPower 0xB4
#define md collect_time[0]&0x0f
#define mg (collect_time[0]&0x70)/16
#define fd collect_time[1]&0x0f
#define fg (collect_time[1]&0x70)/16
#define sd collect_time[2]&0x0f
#define sg (collect_time[2]&0x30)/16
sbit DS_RST = P1^2; //DS復(fù)位端
sbit DS_CLK = P1^0; //SCLK端
sbit DS_IO = P1^1; //IO端
sbit DS18B20 = P1^3; //溫度傳感器接口
bit keyboard,flash,STA=1;
uchar choose,a;
uchar collect_time[3]={0x45,0x23,0x11};//定義變量秒分時
uchar collect_temperature[2] = {0};
uchar num[10] = {0x7e,0x48,0x3d,0x6d,0x4b,0x67,0x77,0x4c,0x7f,0x6f};
//七段數(shù)碼管顯示的段碼
uchar display[8] = {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08};
void delay(uint i)
{
uint k;
while(i--)
{
for(k=0;k<120;k++){;}
}
}
void Dat_Int(void)//數(shù)據(jù)初始化
{
P0=0xff;
P1=0xff;
P2=0xff;
choose=0;
flash=1;
}
void Time01_Int(void)
{
TMOD = 0x12; //定時器0為8位自動重載定時采樣,定時器1為16位超時檢測處理
TCON = 0x00;
TH0 = 0x60;
TL0 = 0x60;
TR0 = 1;
IE = 0x0a; //允許定時器0、1中斷
IP = 0x00;
}
/********************************************************
* *
* DS18B20溫度傳感器程序段 *
* *
********************************************************/
/***********11微秒延時函數(shù)**********/
//
void delayus(uint t)
{
for(;t>0;t--);
}
/***********18B20復(fù)位函數(shù)**********/
void ow_reset(void)
{
char presence=1;
while(presence)
{
while(presence)
{
DS18B20 = 1;_nop_();_nop_();
DS18B20 = 0;
delayus(50); // 550us
DS18B20 = 1;
delayus(6); // 66us
presence=DS18B20; // presence=0繼續(xù)下一步
}
delayus(45); //延時500us
presence = ~DS18B20;
}
DS18B20 = 1;
}
/**********18B20寫命令函數(shù)*********/
//向 1-WIRE 總線上寫一個字節(jié)
void write_byte(uchar val)
{
uchar i;
for (i=8; i>0; i--) //
{
DS18B20 = 1;_nop_();_nop_();
DS18B20 = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us
DS18B20 = val&0x01; //最低位移出
delayus(6); //66us
val=val/2; //右移一位
}
DS18B20 = 1;
delayus(1);
}
//
/*********18B20讀1個字節(jié)函數(shù)********/
//從總線上讀取一個字節(jié)
uchar read_byte(void)
{
uchar i;
uchar value = 0;
for (i=8;i>0;i--)
{
DS18B20 = 1;_nop_();_nop_();
value>>=1;
DS18B20 = 0; //
_nop_();_nop_();_nop_();_nop_(); //4us
DS18B20 = 1;_nop_();_nop_();_nop_();_nop_(); //4us
if(DS18B20)value|=0x80;
delayus(6); //66us
}
DS18B20 = 1;
return(value);
}
//
/***********讀出溫度函數(shù)**********/
//
void Ds18b20_ReadEE(void)
{
ow_reset();
write_byte(SkipROM); // Skip ROM
write_byte(Convert); // 發(fā)轉(zhuǎn)換命令
ow_reset(); //總線復(fù)位
write_byte(SkipROM); // 發(fā)Skip ROM命令
write_byte(ReadScr); // 發(fā)讀命令
collect_temperature[0]=read_byte(); //溫度低8位
collect_temperature[1]=read_byte(); //溫度高8位
}
/********************************************************
* *
* DS1302時鐘芯片程序段 *
* *
********************************************************/
void DS1302_InputByte(uchar byte) //往DS1302寫入1Byte數(shù)據(jù)
{
uchar i;
uchar temp;
temp = byte;
for(i=8; i>0; i--)
{
DS_IO = temp&0x01;
S_CLK;
C_CLK;
temp = temp >> 1;
}
}
uchar DS1302_OutputByte(void) //從DS1302讀取1Byte數(shù)據(jù)
{
uchar i;
uchar temp=0;
for(i=0; i<8;i++)
{
C_CLK;
if(DS_IO!=0) temp|=(1< S_CLK;
}
return(temp);
}
void RW_DS1302(uchar reg, uchar byte)//向DS1302寄存器寫數(shù)據(jù)
{
C_RST;
C_CLK;
S_RST;
DS1302_InputByte(reg);
DS1302_InputByte(byte);
S_CLK;
C_RST;
}
評論