⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.c

📁 DS18B20.rar 温度传感元件 stc89c51 12MHz 好东东希望你能喜欢!
💻 C
字号:
DS18B20


/********************************************************************** 
公司名: 广州强智数码科技有限公司 
文件名: FM100.c 
设计者: 王健强 
开始日: 2005-12-20 12:19 
完成日: 2006-2-7 11:49 
---------------------------------------------------------------------- 
MCU stc89c51 
Crycle 12MHz 
Audio input selector PT2314 ; FM PC MP 
2CH Audio Processor PT2314 ; Volume &amt; Tone &amt; Loud 
LCD Drive HT1621 ; 
A/D LM324 ; 
Template DS18B20 ; 
Remote transmit HT2222 
**********************************************************************/ 

#define X0_Seq 0 
#define T0_Seq 1 
#define X1_Seq 2 
#define T1_Seq 3 
#define T2_Seq 5 

#include < reg51.h > 
#include < intrins.h> 
#include "b.h" 

/************************************************************* 
Data Define 
*************************************************************/ 
#define uchar unsigned char 
#define uint unsigned int 
#define BYTE unsigned char 
#define WORD unsigned int 

#define nop _nop_() 
#define True 1 
#define False 0 
#define High 1 
#define Low 0 
#define ON 1 
#define OFF 0 

#define Lcd_On 0x8060 
#define Lcd_Off 0x8040 
#define Sys_En 0x8020 
#define Bais_4 0x8520 

#define F_Lcd_X1 0 
#define F_Lcd_X2 1 
#define F_Lcd_Bal 2 
#define F_Lcd_FAD 3 
#define F_Lcd_A 4 
#define F_Lcd_MP 5 
#define F_Lcd_X 6 
#define F_Lcd_AM 7 
#define F_Lcd_FM 8 
#define F_Lcd_P1 9 
#define F_Lcd_T 10 
#define F_Lcd_X3 11 
#define F_Lcd_X4 12 
#define F_Lcd_MHZ 13 
#define F_Lcd_KHZ 14 
#define F_Lcd_AUX 15 
#define F_Lcd_COL 16 
#define F_Lcd_PC 17 

#define LCD_0 0 
#define LCD_1 1 
#define LCD_2 2 
#define LCD_3 3 
#define LCD_4 4 
#define LCD_5 5 
#define LCD_6 6 
#define LCD_7 7 
#define LCD_8 8 
#define LCD_9 9 
#define LCD_A 10 
#define LCD_B 11 
#define LCD_C 12 
#define LCD_d 13 
#define LCD_E 14 
#define LCD_F 15 

#define LCD_Space 16 
#define LCD_V 17 
#define LCD_n 18 
#define LCD_o 19 
#define LCD_T 20 
#define LCD_M 21 
#define LCD_P 22 
#define LCD_L 23 
#define LCD_c 24 

#define Dot_A 25 
#define Dot_B 26 
#define Dot_C 27 
#define Dot_D 28 
#define Dot_E 29 
#define Dot_F 30 
#define Dot_G 31 

#define No_Key 0 
#define Key_In 0x0c 
#define Key_Mute 0x0a 
#define Key_Ch_Dn 0x09 
#define Key_Ch_Up 0x11 
#define Key_Vol_Dn 0x12 
#define Key_Vol_Up 0x14 

/************************************************************* 
P0 
*************************************************************/ 
sbit P_DO72130 = P0^0; 
sbit P_CLK72130 = P0^1; 
sbit P_DI72130 = P0^2; 
sbit P_CE72130 = P0^3; 
sbit P_SDA = P0^4; 
sbit P_SCK = P0^5; 
sbit P_AD_Ctrl = P0^6; 
sbit P_LoudLed = P0^7; 

/************************************************************* 
P2 
*************************************************************/ 
sbit P_RedLed = P2^7; 
sbit P_GreenLed = P2^6; 
sbit P_BlueLed = P2^5; 

/************************************************************* 
P1 
*************************************************************/ 
sbit P_18B20 = P1^4; 

/************************************************************* 
P3 
*************************************************************/ 
sbit P_ADIn = P3^2; 
sbit P_Remote = P3^3; 
sbit P_Cs1621 = P3^4; 
sbit P_Clk1621 = P3^5; 
sbit P_Dat1621 = P3^6; 
sbit P_Buzz = P3^7; 

/************************************************************* 
bdata max16 bytes ( 20h-3fh ) 
*************************************************************/ 
bit F_Key_In ; // Key flag 
bit F_RemAdr ; 
/************************************************************* 
data max24+80=104 bytes ( 08h-1fh &amt; 30h-7fh ) 
*************************************************************/ 
uchar data Disp_Buf0[8]; 
uchar data Disp_Char_Buf[4]; 
BYTE Rem_Buf[4] ; 
uchar data Key_Tmp ; 
uchar data Key_Code ; 


/****************************************** 
; Delay 
******************************************/ 
void Delay_10us(void) 
{ 
nop ; 
nop ; 
nop ; 
nop ; 
nop ; 
nop ; 
} 

//----------------------------------------- 
void Delay_100us(uchar count) 
{ 
uchar i=0 ; 
uchar j=0 ; 
for (i=0;i<count;i++) 
{ 
for (j=0;j<10;j++) 
{ 
nop ; 
nop ; 
nop ; 
nop ; 
nop ; 
nop ; 
} 
} 
} 

//----------------------------------------- 
void Delay_ms(uchar count) 
{ 
uchar i=0 ; 
uchar j=0 ; 
for (i=0;i<count;i++) 
{ 
for (j=0;j<78;j++) 
{ 
Delay_10us() ; 
} 
} 
} 

uchar code Char_Word_Tab[]= 
{ 
/*BAegf_xxxx,Bdcba_xxXx,*/ 
B0101_0000,B1111_0000,//0 LCD_0 0 
B0000_0000,B0110_0000,//1 LCD_1 1 
B0110_0000,B1011_0000,//2 LCD_2 2 
B0010_0000,B1111_0000,//3 LCD_3 3 
B0011_0000,B0110_0000,//4 LCD_4 4 
B0011_0000,B1101_0000,//5 LCD_5 5 
B0111_0000,B1101_0000,//6 LCD_6 6 
B0000_0000,B0111_0000,//7 LCD_7 7 
B0111_0000,B1111_0000,//8 LCD_8 8 
B0011_0000,B1111_0000,//9 LCD_9 9 
B0111_0000,B0111_0000,//A LCD_A 10 
B0010_0000,B1111_0010,//B LCD_B 11 
B0101_0000,B1001_0000,//C LCD_C 12 
B0110_0000,B1110_0000,//D LCD_D 13 
B0111_0000,B1001_0000,//E LCD_E 14 
B0111_0000,B0001_0000,//F LCD_F 15 
/*BAegf_xxxx,Bdcba_xxXx,*/ 
B0000_0000,B0000_0000,//space LCD_Space 16 
B0101_0000,B1110_0000,//U/V LCD_V 17 
B0101_0000,B0111_0000,//- LCD_n 18 
B0110_0000,B1100_0000,//o LCD_o 19 
B0000_0000,B0001_0010,//T LCD_T 20 
B0101_0000,B0111_0010,//M LCD_M 21 
B0111_0000,B0011_0000,//P LCD_P 22 
B0101_0000,B1000_0000,//L LCD_L 23 
B0110_0000,B1000_0000,//c LCD_c 24 
/*BAegf_xxxx,Bdcba_xxXx,*/ 
B0000_0000,B0001_0000,//- Dot_A 25 
B0000_0000,B0010_0000,//- Dot_B 26 
B0000_0000,B0100_0000,//- Dot_C 27 
B0000_0000,B1000_0000,//- Dot_D 28 
B0100_0000,B0000_0000,//- Dot_E 29 
B0001_0000,B0000_0000,//- Dot_F 30 
B0010_0000,B0000_0000,//- Dot_G 31 
}; 
uchar code Char_Byte_Tab[]= 
{ 
/*Bdcba_xegf*/ 
B1111_0101,//0 LCD_0 0 
B0110_0000,//1 LCD_1 1 
B1011_0110,//2 LCD_2 2 
B1111_0010,//3 LCD_3 3 
B0110_0011,//4 LCD_4 4 
B1101_0011,//5 LCD_5 5 
B1101_0111,//6 LCD_6 6 
B0111_0000,//7 LCD_7 7 
B1111_0111,//8 LCD_8 8 
B1111_0011,//9 LCD_9 9 
B0111_0111,//A LCD_A 10 
B1100_0111,//b LCD_B 11 
B1001_0101,//C LCD_C 12 
B1110_0110,//d LCD_d 13 
B1001_0111,//e LCD_E 14 
B0001_0111,//f LCD_F 15 
/*Bdcba_xegf*/ 
B0000_0000,//space LCD_Space 16 
B1110_0101,//U/V LCD_V 17 
B0111_0101,//- LCD_n 18 
B1100_0110,//b LCD_b 19 
B0000_0010,//- LCD_T 20 
B0000_0010,//- LCD_M 21 
B0011_0111,//P LCD_P 22 
B1000_0101,//u LCD_L 23 
B1000_0110,//c LCD_c 24 
/*Bdcba_xegf*/ 
B0001_0000,//- Dot_A 25 
B0010_0000,//- Dot_B 26 
B0100_0000,//- Dot_C 27 
B1000_0000,//- Dot_D 28 
B0000_0100,//- Dot_E 29 
B0000_0001,//- Dot_F 30 
B0000_0010,//- Dot_G 31 
}; 

uchar code Lcd_Flag_Tab[][2]= 
{// Buf(n),dot 
0, B0000_0001, // LCD_Flag_X1 0 
0, B0000_0010, // LCD_Flag_X2 1 
0, B0000_0100, // LCD_Flag_Bal 2 
0, B0000_1000, // LCD_Flag_FAD 3 
0, B1000_0000, // LCD_Flag_A 4 
1, B0000_0001, // LCD_Flag_MP 5 
1, B0000_0010, // LCD_Flag_X 6 
1, B0000_0100, // LCD_Flag_AM 7 
1, B0000_1000, // LCD_Flag_FM 8 
3, B0000_1000, // LCD_Flag_P1 9 
4, B0000_1000, // LCD_Flag_T 10 
5, B0000_0001, // LCD_Flag_X3 11 
5, B0000_0010, // LCD_Flag_X4 12 
5, B0000_0100, // LCD_Flag_MHZ 13 
5, B0000_1000, // LCD_Flag_KHZ 14 
6, B0001_0000, // LCD_Flag_AUX 15 
6, B0010_0000, // LCD_Flag_COL 16 
6, B0100_0000, // LCD_Flag_PC 17 
}; 

/************************************************ 
Ht1621驱动程序(24C128/PTC2323/Pt2314) 
************************************************/ 
void Lcd_Command( uint Command ) 
{ 
uchar i; 
P_Cs1621 = Low ; 
for ( i=0; i<12; i++ ) 
{ 
P_Clk1621 = Low ; 
if (Command&amt;0x8000) 
{ 
P_Dat1621 = High ; 
} 
else 
{ 
P_Dat1621 = Low ; 
} 
P_Clk1621 = High ; 
Command <<= 1; 
} 
P_Cs1621 = High ; 
} 
/************************************************/ 
void Lcd_Write_Head(void) 
{ 
P_Dat1621 = High ; 
nop ; 
P_Clk1621 = Low ; 
nop ; 
P_Clk1621 = High ; 
nop ; 
P_Dat1621 = Low ; 
nop ; 
P_Clk1621 = Low ; 
nop ; 
P_Clk1621 = High ; 
nop ; 
P_Dat1621 = High ; 
nop ; 
P_Clk1621 = Low ; 
nop ; 
P_Clk1621 = High ; 
} 
/************************************************/ 
void WriteHt1621( uchar Addr_Tmp,uchar Data_Tmp ) 
{ 
uchar i ; 
P_Cs1621 = Low ; 
Lcd_Write_Head() ; 
for (i=0;i<6;i++) 
{ // set offset address 
P_Clk1621 = Low ; 
if (Addr_Tmp&amt;0x20) 
{ 
P_Dat1621 = High ; 
} 
else 
{ 
P_Dat1621 = Low; 
} 
P_Clk1621 = High; 
Addr_Tmp <<= 1 ; 
} 
for (i=0;i<8;i++) 
{ // data output 
P_Clk1621 = Low ; 
if ( Data_Tmp&amt;0x01 ) 
{ 
P_Dat1621 = High ; 
} 
else 
{ 
P_Dat1621 = Low ; 
} 
P_Clk1621 = High ; 
Data_Tmp >>= 1 ; 
} 
P_Cs1621 = High ; 
} 
/************************************************/ 
void Update_Disp( void ) 
{ 
uchar i; 
for ( i=0;i<8;i++ ) 
{ 
WriteHt1621( (15+i*2),Disp_Buf0[i] ); 
Disp_Buf0[i] = 0 ; 
} 
} 
/************************************************/ 
void Lcd_Initial( void) 
{ 
Lcd_Command( Lcd_On ) ; 
Lcd_Command( Sys_En ) ; 
Lcd_Command( Bais_4 ) ; 
Update_Disp() ; 
} 
/************************************************/ 
void Make_Flag_Data( uchar LCD_Flag ) 
{ 
Disp_Buf0[ Lcd_Flag_Tab[(LCD_Flag)][0] ] |= Lcd_Flag_Tab[(LCD_Flag)][1] ; 
} 
/************************************************/ 
void Make_Char_Data( void ) 
{ 
uchar i,Tmp; 
for ( i = 0; i < 4; i++ ) 
{ 
Tmp = Disp_Char_Buf[i]; 
if ( i ) 
{ 
Disp_Buf0[i+1] = Char_Byte_Tab[Tmp] ; 
} 
else 
{ 
Tmp <<= 1; 
Disp_Buf0[0] = Char_Word_Tab[Tmp] ; 
Disp_Buf0[1] = Char_Word_Tab[Tmp+1]; 
} 
} 
} 
/************************************************/ 
void send_one_byte( uchar send_data ) 
{ 
TI =False; 
SBUF = send_data; 
while( TI==0 ); 
TI =False; 
} 
/************************************* 
9600bps 
**************************************/ 
void Uart_Initial( void ) 
{ 
TMOD = 0x22; // 定时器工作方式2 
SCON = 0x50; // 串口工作方式1 
TL1 = 243 ; // 波特率=(1/32)*(12M*/12)*(1/(256-TL)==> TL=256-(1M/(波特率*32)) 
TH1 = 243 ; // 波特率=2400bps 
TR1 = 1 ; // 启动定时器记数 
EA = 1 ; // 允许中断 
} 
/************************************************/ 
void CharDisplay( void ) 
{ 
if (F_Key_In) 
{ 
P_Buzz = Low ; 
Delay_ms(100) ; 
P_Buzz = High; 

F_Key_In = OFF ; 
switch(Key_Code) 
{ 
case Key_In: 
Disp_Char_Buf[0] = Rem_Buf[0]/16 ; 
Disp_Char_Buf[1] = Rem_Buf[0]&amt;0x0f ; 
Disp_Char_Buf[2] = Rem_Buf[1]/16 ; 
Disp_Char_Buf[3] = Rem_Buf[1]&amt;0x0f ; 
send_one_byte(Rem_Buf[0]) ; 
send_one_byte(Rem_Buf[1]) ; 
break ; 
default: 
Disp_Char_Buf[0] = Rem_Buf[2]/16 ; 
Disp_Char_Buf[1] = Rem_Buf[2]&amt;0x0f ; 
Disp_Char_Buf[2] = Rem_Buf[3]/16 ; 
Disp_Char_Buf[3] = Rem_Buf[3]&amt;0x0f ; 
send_one_byte(Rem_Buf[2]) ; 
send_one_byte(Rem_Buf[3]) ; 
break ; 
} 
} 
Make_Char_Data(); 
} 
/************************************************ 
I2C驱动程序(24Cxx/Pt2314...) 
************************************************/ 
void Start_I2C(void) 
{ // 启动条件是P_SCK为高电平,P_SDA下降触发 
P_SCK = False ; 
Delay_10us() ; 
P_SDA = True ; 
Delay_10us() ; 
P_SCK = True ; 
Delay_10us() ; 
P_SDA = False ; // 下降触发 
Delay_10us() ; 
P_SCK = False ; 
} 
//----------------------------------------- 
void Stop_I2C(void) 
{ // 停止条件是P_SCK为高电平,P_SDA上升触发 
P_SCK = False ; 
Delay_10us() ; 
P_SDA = False ; 
Delay_10us() ; 
P_SCK = True ; 
Delay_10us() ; 
P_SDA = True ; // 上升触发 
Delay_10us() ; 
P_SCK = False ; 
} 
//----------------------------------------- 
void WByte_I2C(uchar value) 
{ 
uchar i ; 
for (i=0;i!=8;i++) 
{ 
if ( value&amt;0x80 ) 
{ 
P_SDA = True ; 
} 
else 
{ 
P_SDA = False ; 
} 
value <<=1 ; 
Delay_10us() ; 
P_SCK = True ; 
Delay_10us() ; 
P_SCK = False ; 
Delay_10us() ; 
} 
P_SDA = True ; // 读数据之前,预置P_SDA 
P_SCK = True ; 
do 
{ 
i++ ; 
} while(P_SDA&amt;&amt;i!=255) ; 
P_SCK = False ; 
} 
//----------------------------------------- 
BYTE I2C_RByte(bit Byte_F) 
{ 
BYTE i ; 
BYTE value=0 ; 
P_SDA = HIGH ; // 读数据之前,预置P_SDA 
for (i=0;i!=8;i++) 
{ 
P_SCK = HIGH ; 
Delay_10us() ; 
value <<=1 ; 
if (P_SDA) 
{ 
value ++ ; 
} 
P_SCK = LOW ; 
Delay_10us() ; 
} 
P_SDA = Byte_F ; 
Delay_10us() ; 
P_SCK = HIGH ; 
Delay_10us() ; 
P_SCK = LOW ; 
return value ; 
} 
/*-------------------------------------- 
24C驱动程序 
--------------------------------------*/ 
void Write_24C02_Byte(BYTE * Eep_Buf ) 
{ 
Delay_MS(10) ; 
Start_I2C() ; 
WByte_I2C(0xA0) ; // IC_ADDR &amt; write command 
WByte_I2C(Eep_Buf) ; 
WByte_I2C(*Eep_Buf) ; 
Stop_I2C() ; 
} 

//----------------------------------------- 
void Wrt_24C02_Page(BYTE * Eep_Buf ) 
{ 
BYTE i ; 
Delay_MS(10) ; 
Start_I2C() ; 
WByte_I2C(0xA0) ; // IC_ADDR &amt; write command 
WByte_I2C(Eep_Buf) ; 
for (i=0;i!=8;i++) 
{ 
WByte_I2C(*Eep_Buf) ; 
Eep_Buf++ ; 
} 
Stop_I2C() ; 
} 
//----------------------------------------- 
void Read_24C02_Byte(BYTE * Eep_Buf) 
{ 
Start_I2C() ; 
WByte_I2C(0xA0) ; // IC_ADDR &amt; write command 
WByte_I2C(Eep_Buf) ; 
Start_I2C() ; 
WByte_I2C(0xA1) ; // IC_ADDR &amt; read command 
* Eep_Buf=I2C_RByte(1) ; // read command over 
Stop_I2C() ; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -