Delay_Nus(7);//15~60us内18B20采样
w_data>>=1;
}
W_B20_CHANNEL_1();
Delay_Nus(4);
}
//three
staticunsignedcharRead_18b20(void)
{
unsignedchari;
unsignedchartemp;
unsignedcharr_data=0x00;
for(i=0;i<8;i++)
{
r_data>>=1;
W_B20_CHANNEL_1();
W_B20_CHANNEL_0();//从高到低15us内,再到高,产生读间隙
Delay_Nus
(1);
W_B20_CHANNEL_1();
temp=B20_PORT<<(7-B20_CHANNEL);//读数据,从低位开始
temp&=(1<<7);
r_data+=temp;
Delay_Nus(8);//整个读一位过程在60~120us
}
W_B20_CHANNEL_1();
returnr_data;
}
//four
/*
若要读出当前的温度数据我们需要执行两次工作周期,
第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。
紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据
(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)
*/
signedcharGet_Temputer(void)//读取温度值,返回的带符号字符型-55到+127;128无法显示,初始化失败会显示
{
unsignedchartem_h,tem_l;
signedchartemp;
if(Init_18b20()==0)//复位18b20
{
Write_18b20(SKIP_ROM);//跳过ROM
Write_18b20(TEMPUTER_CONVERT);//温度变换
}
else
returntemp=0;
//Delay_Nus(100);
if(Init_18b20()==0)//复位18b20
{
Write_18b20(SKIP_ROM);//跳过ROM
Write_18b20(READ_ROM);//读暂存存储器
}
else
returntemp=0;
tem_l=Read_18b20();//读数据
tem_h=Read_18b20();
/*
只要高字符的低四位和低字符的高四位,温度范围0~99,temp为补码,直接由unsignedchar赋值给signedchar内容不变,代表的值改变
*/
temp=(tem_h<<4)+(tem_l>>4);
returntemp;
}
:
#defineCOMMON_ANODIC0//共阳数码管
#defineCOMMON_CATHODAL1//共阴数码管
#defineSEG_CATEGORY0//选择共阳数码管
#defineSEG8_A~(1<<0)//段A亮时为0,属共阳数码管
#defineSEG8_B~(1<<1)
#defineSEG8_C~(1<<2)
#defineSEG8_D~(1<<3)
#defineSEG8_E~(1<<4)
#defineSEG8_F~(1<<5)
#defineSEG8_G~(1<<6)
#defineSEG8_DP~(1<<7)
#defineSEG8_CHAR_0~(SEG8_G&SEG8_DP)
#defineSEG8_CHAR_1~(SEG8_A&SEG8_D&SEG8_E&SEG8_F&SEG8_G&SEG8_DP)
#defineSEG8_CHAR_2~(SEG8_C&SEG8_F&SEG8_DP)
#defineSEG8_CHAR_3~(SEG8_E&SEG8_F&SEG8_DP)
#defineSEG8_CHAR_4~(SEG8_A&SEG8_D&SEG8_E&SEG8_DP)
#defineSEG8_CHAR_5~(SEG8_B&SEG8_E&SEG8_DP)
#defineSEG8_CHAR_6~(SEG8_B&SEG8_DP)
#defineSEG8_CHAR_7~(SEG8_D&SEG8_E&SEG8_F&SEG8_G&SEG8_DP)
#defineSEG8_CHAR_8~SEG8_DP
#defineSEG8_CHAR_9~(SEG8_E&SEG8_DP)
#defineSEG8_CHAR_~0
#defineSEG8_CHAR_E~(SEG8_B&SEG8_C&SEG8_DP)
#defineSEG8_CHAR_R~(SEG8_A&SEG8_B&SEG8_C&SEG8_D&SEG8_F&SEG8_DP)
#defineSEG8_CHAR_SUB~(SEG8_A&SEG8_B&SEG8_C&SEG8_D&SEG8_E&SEG8_F&SEG8_DP)
//#defineSEG8_CHAR_A
//#defineSEG8_CHAR_B
#defineSEG8_CHAR_C~(SEG8_B&SEG8_C&SEG8_G&SEG8_DP)
//#defineSEG8_CHAR_D
//#defineSEG8_CHAR_F
//#defineSEG8_CHAR_H
#ifSEG_CATEGORY==COMMON_ANODIC
staticconstunsignedcharSEG8_CODE[]={
SEG8_CHAR_0,
SEG8_CHAR_1,
SEG8_CHAR_2,
SEG8_CHAR_3,
SEG8_CHAR_4,
SEG8_CHAR_5,
SEG8_CHAR_6,
SEG8_CHAR_7,
SEG8_CHAR_8,
SEG8_CHAR_9,
SEG8_CHAR_,//SEG8_CODE[10]
SEG8_CHAR_E,//SEG8_CODE[11]
SEG8_CHAR_R,//SEG8_CODE[12]
SEG8_CHAR_SUB,//SEG8_CODE[13]
SEG8_CHAR_C//SEG8_CODE[14]
};
#else
staticconstunsignedcharSEG8_CODE[]={
~SEG8_CHAR_0,
~SEG8_CHAR_1,
~SEG8_CHAR_2,
~SEG8_CHAR_3,
~SEG8_CHAR_4,
~SEG8_CHAR_5,
~SEG8_CHAR_6,
~SEG8_CHAR_7,
~SEG8_CHAR_8,
~SEG8_CHAR_9,
~SEG8_CHAR_,//SEG8_CODE[10]
~SEG8_CHAR_E,//SEG8_CODE[11]
~SEG8_CHAR_R,//SEG8_CODE[12]
~SEG8_CHAR_SUB,//SEG8_CODE[13]
~SEG8_CHAR_C//SEG8_CODE[14]
};
#endif
#defineSEG8_SLECT_PORTP3//此处可以设置I/O口
#defineBIT00
#defineBIT11
#defineBIT22
#defineBIT33
#defineSEG8_BIT0_ON()SEG8_SLECT_PORT|=(1<#defineSEG8_BIT0_OFF()SEG8_SLECT_PORT&=~(1<#defineSEG8_BIT1_ON()SEG8_SLECT_PORT|=(1<#defineSEG8_BIT1_OFF()SEG8_SLECT_PORT&=~(1<#defineSEG8_BIT2_ON()SEG8_SLECT_PORT|=(1<#defineSEG8_BIT2_OFF()SEG8_SLECT_PORT&=~(1<#defineSEG8_BIT3_ON()SEG8_SLECT_PORT|=(1<#defineSEG8_BIT3_OFF()SEG8_SLECT_PORT&=~(1<#defineSEG8_CODE_PORTP2//此处可以设置I/O口
voidSeg_Display(char*p)
{
unsignedchartemp[4];
temp[0]=SEG8_CODE[*p++];
temp[1]=SEG8_CODE[*p++];
temp[2]=SEG8_CODE[*p++];
temp[3]=SEG8_CODE[*p++];
if(*p<4)
#ifSEG_CATEGORY==COMMON_ANODIC
temp[*p]&=SEG8_DP;
#else
temp[*p]|=~SEG8_DP;
#endif
{
unsignedchari;
for(i=0;i<150;i++)
{
SEG8_CODE_PORT=temp[0];
SEG8_BIT0_ON();
Delay_Nus(6);//
SEG8_BIT0_OFF();
SEG8_CODE_PORT=temp[1];
SEG8_BIT1_ON();
Delay_Nus(6);
SEG8_BIT1_OFF();
SEG8_CODE_PORT=temp[2];
SEG8_BIT2_ON();
Delay_Nus(6);
SEG8_BIT2_OFF();
SEG8_CODE_PORT=temp[3];
SEG8_BIT3_ON();
Delay_Nus(6);
SEG8_BIT3_OFF();
}
}
}