📄 ds18b20.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 + -