51 단편기 학습 노트: DS18B20 온도 측정 프로그램
9625 단어 ds18b20
#include "my51.h"
#include "smg.h"
#include "ds18b20.h"
void main() // ,6
{
u8 i=0;
u16 temp=0;
while(1)
{
temp=ds18b20_readTemperaData();
for(i=0;i<100;i++)
{
displaySMG(ds18b20_processTempData(temp));
}
}
}
#ifndef _DS18B20_H
#define _DS18B20_H
#include "my51.h"
#include "smg.h"
extern u8 smgWela[7]; //
sbit DQ=P2^2; //
bool ds18b20_init(); //
u8* ds18b20_processTempData(u16 temp);// temp
u16 ds18b20_readTemperaData(); //
u8 ds18b20_readByte() ; //
void ds18b20_writeByte(u8 dat); //mcu 18b20
#endif
#include "ds18b20.h"
/******************************************************************
t0
to 1us ,15us
DSl820 t0 15-60us 0 , 1
2 1us
1, 60us, t0 1us 1,15us ic , 45us
0, 60~120us,15~60us ic ,120 ,mcu
1 0, 60us ,ic , mcu
*******************************************************************/
void ds18b20_writeByte(u8 dat) //mcu ic
{
u8 i;
u8 tmep=dat;
for(i=0;i<8;i++)
{
DQ=0; //
_nop_(); // 1us
DQ=dat & 0x01; // ,
delayXus(10);// 74us, 0 60~120us , 1 60us
DQ=1; // , mcu ,
dat>>=1; // ,2 1us
}
}
/**************************************************************************
60us , 1us
DS18B20 1us , 2~3 ,
15μs , mcu
5~13us , 15~60us 18b20 ,
, , mcu
*******************************************************/
u8 ds18b20_readByte() //mcu
{
u8 i,value=0;
for(i=0;i<8;i++)
{
DQ=0; //
value>>=1; // 3~4
DQ=1; //mcu
_nop_();_nop_();_nop_(); // 3.3us
if(DQ)
{
value|=0x80;// , , 0
}
delayXus(8); // 60.76us
}
return value;
}
u16 ds18b20_readTemperaData() //
{
u16 temp=0;
if(ds18b20_init())
{
ds18b20_writeByte(0xcc); // : rom
ds18b20_writeByte(0x44); // :
//delayms(750);// 750ms ,
// , 85 ,
// ,
if(ds18b20_init())
{
ds18b20_writeByte(0xcc); // : rom
ds18b20_writeByte(0xbe); // :
temp=ds18b20_readByte(); // 8
temp|=(u16)ds18b20_readByte()<<8; // 8 ,
temp&= 0x0FFF; // 4 ,
}
else
{
led5=0; //
temp=0x2000; // ,
}
}
else
{
led6=0; //
temp=0x1000; // , ,
}
return temp;
}
bool ds18b20_init() //
{
u8 checkState=0;
DQ=1; //
_nop_();_nop_();
DQ=0; //mcu
delayXus(80); // 530us, 480us~960us
// ic
//mcu , ic
// mcu 15~60us ,ic
// 60~240us
DQ=1; //mcu
delayXus(10); //mcu 15~60us ,(8+6*10)*1.085=73us,
// DS18B20 , 60~240us ,
checkState=DQ; // 60~240us ,mcu ,0
delayXus(70); // 464us, 73us, 537us
// ic 60~240us , , 480us
// 537us,
if(checkState) //checkstate 0 , 1
{
return FALSE;
}
return TRUE; //
}
u8* ds18b20_processTempData(u16 temp) //
{
u8 i=0;
if(0x0550==temp) // 85
{
led7=0; // ,
smgWela[5]=18; // 85 , 6
return smgWela; //
}
if(1==(temp&0x0800)) // 11 1, 1
{
temp&=0x07ff; // 0~10 11
temp=(~temp+1) & 0x07ff;//
smgWela[0]=18; // 18 ,
}
else
{
smgWela[0]=dark; //
}
temp=(u16)(temp*6.25); // 1000 ,
if(temp>=10000)
{
smgWela[1]=1; // 1, ,100
}
else
{
smgWela[1]=dark; // 0 0
}
smgWela[2]=temp%10000/1000; //
smgWela[3]=temp%1000/100; //
smgWela[4]=temp%100/10; //
smgWela[5]=temp%10; //
smgWela[6]=0xf7; // 4
return smgWela; //
}
#ifndef _51SMG_H_
#define _51SMG_H_
#include <reg52.h>
#include "mytype.h"
sbit dula =P2^6; //
sbit wela =P2^7; //
#define dark 0x11// ,0x11 17 ,0x00 , , table[17]
#define dotDark 0xff//
void displaySMG(u8* pWela); // ,
#endif
#include "smg.h"
#include "my51.h"
static u8 code table[]= { //0~F
0x3f , 0x06 , 0x5b , 0x4f , // 0 1 2 3
0x66 , 0x6d , 0x7d , 0x07 , // 4 5 6 7
0x7f , 0x6f , 0x77 , 0x7c , // 8 9 A B
0x39 , 0x5e , 0x79 , 0x71 , // C D E F
0x80 , 0x00 ,0x40 // . 17
};
/* , ,
,
pWela->dot = 0xfe & 0xdf
u8 code dotTable[]={ // , 0 ,
0xff , //
0xfe , 0xfd , 0xfb , //1 2 3
0xf7 , 0xef , 0xdf //4 5 6
};*/
u8 data smgWela[7]={0,0,0,0,0,0,0}; // ,
//P0 6 , 2 ,
void displaySMG(u8* pWela)
{
u8 i=0;
// 6 , dark
u8 preState=P0|0x3f; // 2 , ADC0804
wela=0;dula=0;_nop_();// , 2
P0=0; // , ,
dula=1;_nop_();
dula=0; //
P0=preState; // , 6 1, 2
wela=1;_nop_(); // :wela dula 1
wela=0; // , 2 , 6
for(i=0;i<6;i++) // 6
{
P0=table[pWela[i]]|(((1<<i) & pWela[6])?0x00:0x80);
dula=1;_nop_(); // , ,0x00
dula=0;
P0=preState&~(1<<i); // 2 , 6 ,
wela=1; _nop_(); //
wela=0;
delayms(1); // ,
{ // , 1 , 6 1, 2
P0=preState;
wela=1; _nop_();
wela=0;
}
}
}
#ifndef _MY51_H
#define _MY51_H
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#include "mytype.h"
#define high 1 //
#define low 0 //
#define led P1 //
sbit led0=P1^0; //8 led ,
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit led4=P1^4;
sbit led5=P1^5;
sbit led6=P1^6;
sbit led7=P1^7;
sbit ledLock=P2^5; //led ,0 ,1
sbit beep=P2^3; //
void delayms(u16 ms);
void delayXus(u8 us); // (8+6x) , t=(8+6x)*1.085
/////////////////////////////////////////////////////////////////////////////
#endif
#include "MY51.h"
void delayms(u16 ms) //
{
u16 i,j;
for(i=ms;i>0;i--)
{
for(j=113;j>0;j--)
{}
}
}
/****************************************************************
12 mcu, 11059200Hz
12/11059200=1.085
keil4 , 8
us=0 , 9 , t=9*1.085=9.77 us
us!=0 , (8+6x) , t=(8+6x)*1.085 us
*****************************************************************/
void delayXus(u8 us) //
{
while(us) // us=0
{
us--;
}
}