ds18b20C程序proteus仿真Word文档格式.docx
《ds18b20C程序proteus仿真Word文档格式.docx》由会员分享,可在线阅读,更多相关《ds18b20C程序proteus仿真Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
else
{disp[0]=temp/100;
disp[1]=temp/10-disp[0]*10;
if(!
disp[0])//百位数不为0则显示,若要显示0,可将其注释掉
disp[0]=10;
//3、显示*/
Seg_Display(disp);
}
}
Lib51v3.c
voidDelay_Nus(unsignedcharn)
while(n--);
//for(;
n>
0;
n--);
18b20.c:
/******************************************************************
时序很重要,移植时注意延时函数
******************************************************************/
#defineB20_PORTP1//此处可以设置I/O口
#defineB20_CHANNEL0
#defineR_B20_CHANNEL()B20_PORT&
(1<
<
B20_CHANNEL)
#defineW_B20_CHANNEL_1()B20_PORT|=(1<
#defineW_B20_CHANNEL_0()B20_PORT&
=~(1<
#defineSKIP_ROM0xCC
#defineTEMPUTER_CONVERT0x44
#defineREAD_ROM0xBE
//one
/*
初始化函数,失败会返回1,初始化过程见注释
若单片机读到了数据线上的低电平“0”后,还要做延时,
其延时的时间从单片机发出的高电平算起最少要480微秒。
之后单片机将数据线再次拉高到高电平“1”后结束。
*/
staticunsignedcharInit_18b20(void)
{
unsignedcharx=0;
W_B20_CHANNEL_1();
//1、从单片机拉高数据线开始
Delay_Nus(8);
//6*nusecondslib51v3.c
W_B20_CHANNEL_0();
Delay_Nus(81);
//2、单片机拉低数据线480us以上,拉高数据线,释放
Delay_Nus(14);
//3、之后ds18b20,15~60us以后反应,拉高数据线
x=R_B20_CHANNEL();
//4、单片机读取数据线
if(x)
returnx;
Delay_Nus(20);
//x=0代表复位成功
//two
staticvoidWrite_18b20(unsignedcharw_data)
unsignedchari;
unsignedchartemp;
for(i=0;
i<
8;
i++)
{
W_B20_CHANNEL_1();
temp=w_data&
0);
W_B20_CHANNEL_0();
//单片机从高到低,拉低1us以上,并在15us内产生写间隙
B20_PORT=temp<
B20_CHANNEL;
//写数据,(先写低位)
Delay_Nus(7);
//15~60us内18B20采样
w_data>
>
=1;
}
Delay_Nus(4);
//three
staticunsignedcharRead_18b20(void)
unsignedcharr_data=0x00;
r_data>
//从高到低15us内,再到高,产生读间隙
Delay_Nus
(1);
temp=B20_PORT<
(7-B20_CHANNEL);
//读数据,从低位开始
temp&
=(1<
7);
r_data+=temp;
Delay_Nus(8);
//整个读一位过程在60~120us
returnr_data;
//four
若要读出当前的温度数据我们需要执行两次工作周期,
第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间。
紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据
(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)
signedcharGet_Temputer(void)//读取温度值,返回的带符号字符型-55到+127;
128无法显示,初始化失败会显示00.C
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
//跳过ROM
Write_18b20(READ_ROM);
//读暂存存储器
tem_l=Read_18b20();
//读数据
tem_h=Read_18b20();
只要高字符的低四位和低字符的高四位,温度范围0~99,temp为补码,直接由unsignedchar赋值给signedchar内容不变,代表的值改变
temp=(tem_h<
4)+(tem_l>
4);
returntemp;
Segv3.c:
#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&
#defineSEG8_CHAR_3~(SEG8_E&
#defineSEG8_CHAR_4~(SEG8_A&
#defineSEG8_CHAR_5~(SEG8_B&
#defineSEG8_CHAR_6~(SEG8_B&
#defineSEG8_CHAR_7~(SEG8_D&
#defineSEG8_CHAR_8~SEG8_DP
#defineSEG8_CHAR_9~(SEG8_E&
#defineSEG8_CHAR_~0
#defineSEG8_CHAR_E~(SEG8_B&
SEG8_C&
#defineSEG8_CHAR_R~(SEG8_A&
SEG8_B&
#defineSEG8_CHAR_SUB~(SEG8_A&
//#defineSEG8_CHAR_A
//#defineSEG8_CHAR_B
#defineSEG8_CHAR_C~(SEG8_B&
//#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
~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<
BIT0)
#defineSEG8_BIT0_OFF()SEG8_SLECT_PORT&
#defineSEG8_BIT1_ON()SEG8_SLECT_PORT|=(1<
BIT1)
#defineSEG8_BIT1_OFF()SEG8_SLECT_PORT&
#defineSEG8_BIT2_ON()SEG8_SLECT_PORT|=(1<
BIT2)
#defineSEG8_BIT2_OFF()SEG8_SLECT_PORT&
#defineSEG8_BIT3_ON()SEG8_SLECT_PORT|=(1<
BIT3)
#defineSEG8_BIT3_OFF()SEG8_SLECT_PORT&
#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<
#ifSEG_CATEGORY==COMMON_ANODIC
temp[*p]&
=SEG8_DP;
#else
temp[*p]|=~SEG8_DP;
#endif
unsignedchari;
for(i=0;
150;
i++)
{
SEG8_CODE_PORT=temp[0];
SEG8_BIT0_ON();
Delay_Nus(6);
//lib51v1.c
SEG8_BIT0_OFF();
SEG8_CODE_PORT=temp[1];
SEG8_BIT1_ON();
SEG8_BIT1_OFF();
SEG8_CODE_PORT=temp[2];
SEG8_BIT2_ON();
SEG8_BIT2_OFF();
SEG8_CODE_PORT=temp[3];
SEG8_BIT3_ON();
SEG8_BIT3_OFF();
}