📄 temp.c
字号:
nop ;
}
}
}
/*====================================================
实现功能:写18B20子程序
实现方法:一个写周期初始化信号为MCU把数据线拉低,18B20会
在数据线变低后的15个US之后采样数据,一个写"0"周期为120
个US,一个写"1"周期为60个US,在完成写周期之后MCU要释放总
线,并保持至秒1个US的写周期恢复时间,接接着开始另外一个写
周期,在完成写18B20之后要把数据线拉高度,因为18B20在处理
温度时需这个外部条件.
====================================================*/
void WByte_18b20(uchar Wrt_Data )
{
uchar i;
// P_18B20 = High ;
for ( i = 0 ; i < 8 ; i++ )
{
P_18B20 = Low ;
if ( Wrt_Data & 0x01 )
{
P_18B20 = High ;
}
Delay_100us(1) ; // 15us<"0"<120us
P_18B20 = High ;
Wrt_Data = Wrt_Data >> 1;
}
}
/*===================================================
实现功能:读取18B20温度子程序.
实现方法:一个读周期初始化信号为MCU把数据总线拉低并
保持至少1个US,接着18B20会将数据送到出并保持
15个US之内有效,一个读周期为60US,在读周期完
成后MCU要释放总线并保持至少1个US的恢复时间,
接着开始另一个读周期.
====================================================*/
uchar RByte_18b20( void )
{
uchar i;
uchar Tmp;
// P_18B20 = High ;
for ( i = 0 ; i < 8 ; i++ )
{
Tmp=Tmp>>1;
P_18B20 = Low ;
Delay_10us() ; // 1us<t<15us
P_18B20 = High ;
if ( P_18B20 )
{
Tmp = Tmp | 0x80;
}
Delay_100us(1) ; // must>45us
}
return( Tmp );
}
/*====================================================
实现功能:读18B20的采样温度
实现方法:先读温度的低字节,再读温度的高字节,并舍去低字
节的低四位及高字节的高四位,将高字节的低四位与低字节的
高四位合并成一个字节,并将高两位屏蔽.
====================================================*/
void Read_Temp( void )
{
uchar Temp_Low , Temp_High ;
Temp_Low = RByte_18b20( );//读低8位
Temp_High = RByte_18b20( );//读高8位
Temp_High &= 0x0f;
Temp_High <<= 4;
Temp_Result[0] = Temp_Low>>4;
Temp_Result[0] |= Temp_High;
Temp_Low &= 0x0f;
Temp_Result[1] = Temp_Table[Temp_Low] ;
}
/*====================================================
实现功能:对18B20初始化
实现方法:MCU把数据线拉低并且保持最少480个US最多960个US
接着MCU释放数据线,并在等待15个至60个US之后,18B20会将数
据线拉低并且保持60个至240个US,之后18B20释放数据线,为了
让18B20部分地释放数据线,可以做比较长的廷时.一个初始化周
至少为960个US.
====================================================*/
void Ds18b20_Initial( void )
{
BYTE i ;
P_18B20 = High ;
nop;nop;nop;
P_18B20 = Low ;
Delay_100us(5) ; // must>480us
P_18B20 = High ;
i = 0 ;
do
{
i++ ;
} while(P_18B20&&i<50) ; // wait 18b20->Low
Delay_100us(3) ; // must>240us
}
void Temp_Pro( void )
{
Ds18b20_Initial() ; //复位DS18B20
WByte_18b20(0xcc) ; //跳过ROM匹配
WByte_18b20(0x44) ; //发出温度转换命令
Delay_100us(7) ;
Ds18b20_Initial();
WByte_18b20(0xcc) ;//跳过ROM匹配
WByte_18b20(0xbe) ;//读存储器命令
Read_Temp() ;
}
/************************************************
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&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&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&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 CharDisplay( void )
{
Disp_Char_Buf[0] = Temp_Result[0]/10 ;
Disp_Char_Buf[1] = Temp_Result[0]%10 ;
Disp_Char_Buf[2] = Temp_Result[1]/10 ;
Disp_Char_Buf[3] = Temp_Result[1]%10 ;
F_Temp_100 = OFF ;
if (Temp_Result[0]>=200)
{
Disp_Char_Buf[0] = Dot_G ;
Disp_Char_Buf[1] = Dot_G ;
Disp_Char_Buf[2] = Dot_G ;
Disp_Char_Buf[3] = Dot_G ;
}
else if (Temp_Result[0]>=100)
{
Disp_Char_Buf[1] = Temp_Result[0]/100 ;
Disp_Char_Buf[2] = Temp_Result[0]%100 ;
F_Temp_100 = ON ;
}
Make_Char_Data() ;
Make_Flag_Data( F_Lcd_X4 ) ;
Make_Flag_Data( F_Lcd_P1 ) ;
if (F_Temp_100)
{
Make_Flag_Data(F_Lcd_A) ;
}
}
/************************************************/
void main( void )
{
Lcd_Initial();
P_RedLed = Low ;
P_GreenLed = Low ;
P_BlueLed = Low ;
while( 1 )
{
Temp_Pro() ;
CharDisplay() ;
Update_Disp() ;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -