DS18B20测温显示,proteus仿真。Writtenbyjinsongliang具体程序如下Main.c:#includereg51.h#includelib51v3.c#include18b20.c#includesegv3.cvoidmain(void){unsignedchardisp[5]={10,0,0,14,2};signedchartemp=0;while(1){/*1、读取温度值*/temp=Get_Temputer();//2、显示前处理*/if(temp0){disp[0]=13;temp=-temp;disp[1]=temp/10;disp[2]=temp%10;}else{disp[0]=temp/100;disp[1]=temp/10-disp[0]*10;disp[2]=temp%10;if(!disp[0])//百位数不为0则显示,若要显示0,可将其注释掉disp[0]=10;}//3、显示*/Seg_Display(disp);}}Lib51v3.cvoidDelay_Nus(unsignedcharn){while(n--);//for(;n0;n--);}18b20.c:/******************************************************************时序很重要,移植时注意延时函数******************************************************************/#defineB20_PORTP1//此处可以设置I/O口#defineB20_CHANNEL0#defineR_B20_CHANNEL()B20_PORT&(1B20_CHANNEL)#defineW_B20_CHANNEL_1()B20_PORT|=(1B20_CHANNEL)#defineW_B20_CHANNEL_0()B20_PORT&=~(1B20_CHANNEL)#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.cW_B20_CHANNEL_0();Delay_Nus(81);W_B20_CHANNEL_1();//2、单片机拉低数据线480us以上,拉高数据线,释放Delay_Nus(14);//3、之后ds18b20,15~60us以后反应,拉高数据线x=R_B20_CHANNEL();//4、单片机读取数据线if(x)returnx;Delay_Nus(20);returnx;//x=0代表复位成功}//twostaticvoidWrite_18b20(unsignedcharw_data){unsignedchari;unsignedchartemp;for(i=0;i8;i++){W_B20_CHANNEL_1();temp=w_data&(10);W_B20_CHANNEL_0();//单片机从高到低,拉低1us以上,并在15us内产生写间隙B20_PORT=tempB20_CHANNEL;//写数据,(先写低位)Delay_Nus(7);//15~60us内18B20采样w_data=1;}W_B20_CHANNEL_1();Delay_Nus(4);}//threestaticunsignedcharRead_18b20(void){unsignedchari;unsignedchartemp;unsignedcharr_data=0x00;for(i=0;i8;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&=(17);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无法显示,初始化失败会显示00.C{unsignedchartem_h,tem_l;signedchartemp;if(Init_18b20()==0)//复位18b20{Write_18b20(SKIP_ROM);//跳过ROMWrite_18b20(TEMPUTER_CONVERT);//温度变换}elsereturntemp=0;//Delay_Nus(100);if(Init_18b20()==0)//复位18b20{Write_18b20(SKIP_ROM);//跳过ROMWrite_18b20(READ_ROM);//读暂存存储器}elsereturntemp=0;tem_l=Read_18b20();//读数据tem_h=Read_18b20();/*只要高字符的低四位和低字符的高四位,温度范围0~99,temp为补码,直接由unsignedchar赋值给signedchar内容不变,代表的值改变*/temp=(tem_h4)+(tem_l4);returntemp;}Segv3.c:#defineCOMMON_ANODIC0//共阳数码管#defineCOMMON_CATHODAL1//共阴数码管#defineSEG_CATEGORY0//选择共阳数码管#defineSEG8_A~(10)//段A亮时为0,属共阳数码管#defineSEG8_B~(11)#defineSEG8_C~(12)#defineSEG8_D~(13)#defineSEG8_E~(14)#defineSEG8_F~(15)#defineSEG8_G~(16)#defineSEG8_DP~(17)#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_ANODICstaticconstunsignedcharSEG8_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]};#elsestaticconstunsignedcharSEG8_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|=(1BIT0)#defineSEG8_BIT0_OFF()SEG8_SLECT_PORT&=~(1BIT0)#defineSEG8_BIT1_ON()SEG8_SLECT_PORT|=(1BIT1)#defineSEG8_BIT1_OFF()SEG8_SLECT_PORT&=~(1BIT1)#defineSEG8_BIT2_ON()SEG8_SLECT_PORT|=(1BIT2)#defineSEG8_BIT2_OFF()SEG8_SLECT_PORT&=~(1BIT2)#defineSEG8_BIT3_ON()SEG8_SLECT_PORT|=(1BIT3)#defineSEG8_BIT3_OFF()SEG8_SLECT_PORT&=~(1BIT3)#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(*p4)#ifSEG_CATEGOR