还剩8页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
DS18B20测温显示,proteus仿真Writtenbyjinsongliang具体程序如下Main.c#includereg
51.h#includelib51v
3.c#include18b
20.c#includesegv
3.cvoidmainvoid{unsignedchardisp
[5]={1000142};signedchartemp=0;while1{/*
1、读取温度值*/temp=Get_Temputer;//
2、显示前处理*/iftemp0{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_Displaydisp;}}Lib51v
3.cvoidDelay_Nusunsignedcharn{whilen--;//for;n0;n--;}18b
20.c/******************************************************************时序很重要,移植时注意延时函数******************************************************************/#defineB20_PORTP1//此处可以设置I/O口#defineB20_CHANNEL0#defineR_B20_CHANNELB20_PORT1B20_CHANNEL#defineW_B20_CHANNEL_1B20_PORT|=1B20_CHANNEL#defineW_B20_CHANNEL_0B20_PORT=~1B20_CHANNEL#defineSKIP_ROM0xCC#defineTEMPUTER_CONVERT0x44#defineREAD_ROM0xBE//one/*初始化函数,失败会返回1,初始化过程见注释若单片机读到了数据线上的低电平“0”后,还要做延时,其延时的时间从单片机发出的高电平算起最少要480微秒之后单片机将数据线再次拉高到高电平“1”后结束*/staticunsignedcharInit_18b20void{unsignedcharx=0;W_B20_CHANNEL_1;//
1、从单片机拉高数据线开始Delay_Nus8;//6*nusecondslib51v
3.cW_B20_CHANNEL_0;Delay_Nus81;W_B20_CHANNEL_1;//
2、单片机拉低数据线480us以上,拉高数据线,释放Delay_Nus14;//
3、之后ds18b20,15~60us以后反应,拉高数据线x=R_B20_CHANNEL;//
4、单片机读取数据线ifxreturnx;Delay_Nus20;returnx;//x=0代表复位成功}//twostaticvoidWrite_18b20unsignedcharw_data{unsignedchari;unsignedchartemp;fori=0;i8;i++{W_B20_CHANNEL_1;temp=w_data10;W_B20_CHANNEL_0;//单片机从高到低,拉低1us以上,并在15us内产生写间隙B20_PORT=tempB20_CHANNEL;//写数据,先写低位Delay_Nus7;//15~60us内18B20采样w_data=1;}W_B20_CHANNEL_1;Delay_Nus4;}//threestaticunsignedcharRead_18b20void{unsignedchari;unsignedchartemp;unsignedcharr_data=0x00;fori=0;i8;i++{r_data=1;W_B20_CHANNEL_1;W_B20_CHANNEL_0;//从高到低15us内,再到高,产生读间隙Delay_Nus1;W_B20_CHANNEL_1;temp=B20_PORT7-B20_CHANNEL;//读数据从低位开始temp=17;r_data+=temp;Delay_Nus8;//整个读一位过程在60~120us}W_B20_CHANNEL_1;returnr_data;}//four/*若要读出当前的温度数据我们需要执行两次工作周期,第一个周期为复位、跳过ROM指令、执行温度转换存储器操作指令、等待500uS温度转换时间紧接着执行第二个周期为复位、跳过ROM指令、执行读RAM的存储器操作指令、读数据(最多为9个字节,中途可停止,只读简单温度值则读前2个字节即可)*/signedcharGet_Temputervoid//读取温度值,返回的带符号字符型-55到+127;128无法显示,初始化失败会显示
00.C{unsignedchartem_htem_l;signedchartemp;ifInit_18b20==0//复位18b20{Write_18b20SKIP_ROM;//跳过ROMWrite_18b20TEMPUTER_CONVERT;//温度变换}elsereturntemp=0;//Delay_Nus100;ifInit_18b20==0//复位18b20{Write_18b20SKIP_ROM;//跳过ROMWrite_18b20READ_ROM;//读暂存存储器}elsereturntemp=0;tem_l=Read_18b20;//读数据tem_h=Read_18b20;/*只要高字符的低四位和低字符的高四位,温度范围0~99temp为补码,直接由unsignedchar赋值给signedchar内容不变,代表的值改变*/temp=tem_h4+tem_l4;returntemp;}Segv
3.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_GSEG8_DP#defineSEG8_CHAR_1~SEG8_ASEG8_DSEG8_ESEG8_FSEG8_GSEG8_DP#defineSEG8_CHAR_2~SEG8_CSEG8_FSEG8_DP#defineSEG8_CHAR_3~SEG8_ESEG8_FSEG8_DP#defineSEG8_CHAR_4~SEG8_ASEG8_DSEG8_ESEG8_DP#defineSEG8_CHAR_5~SEG8_BSEG8_ESEG8_DP#defineSEG8_CHAR_6~SEG8_BSEG8_DP#defineSEG8_CHAR_7~SEG8_DSEG8_ESEG8_FSEG8_GSEG8_DP#defineSEG8_CHAR_8~SEG8_DP#defineSEG8_CHAR_9~SEG8_ESEG8_DP#defineSEG8_CHAR_~0#defineSEG8_CHAR_E~SEG8_BSEG8_CSEG8_DP#defineSEG8_CHAR_R~SEG8_ASEG8_BSEG8_CSEG8_DSEG8_FSEG8_DP#defineSEG8_CHAR_SUB~SEG8_ASEG8_BSEG8_CSEG8_DSEG8_ESEG8_FSEG8_DP//#defineSEG8_CHAR_A//#defineSEG8_CHAR_B#defineSEG8_CHAR_C~SEG8_BSEG8_CSEG8_GSEG8_DP//#defineSEG8_CHAR_D//#defineSEG8_CHAR_F//#defineSEG8_CHAR_H#ifSEG_CATEGORY==COMMON_ANODICstaticconstunsignedcharSEG8_CODE[]={SEG8_CHAR_0SEG8_CHAR_1SEG8_CHAR_2SEG8_CHAR_3SEG8_CHAR_4SEG8_CHAR_5SEG8_CHAR_6SEG8_CHAR_7SEG8_CHAR_8SEG8_CHAR_9SEG8_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_ONSEG8_SLECT_PORT|=1BIT0#defineSEG8_BIT0_OFFSEG8_SLECT_PORT=~1BIT0#defineSEG8_BIT1_ONSEG8_SLECT_PORT|=1BIT1#defineSEG8_BIT1_OFFSEG8_SLECT_PORT=~1BIT1#defineSEG8_BIT2_ONSEG8_SLECT_PORT|=1BIT2#defineSEG8_BIT2_OFFSEG8_SLECT_PORT=~1BIT2#defineSEG8_BIT3_ONSEG8_SLECT_PORT|=1BIT3#defineSEG8_BIT3_OFFSEG8_SLECT_PORT=~1BIT3#defineSEG8_CODE_PORTP2//此处可以设置I/O口voidSeg_Displaychar*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_CATEGORY==COMMON_ANODICtemp[*p]=SEG8_DP;#elsetemp[*p]|=~SEG8_DP;#endif{unsignedchari;fori=0;i150;i++{SEG8_CODE_PORT=temp
[0];SEG8_BIT0_ON;Delay_Nus6;//lib51v
1.cSEG8_BIT0_OFF;SEG8_CODE_PORT=temp
[1];SEG8_BIT1_ON;Delay_Nus6;SEG8_BIT1_OFF;SEG8_CODE_PORT=temp
[2];SEG8_BIT2_ON;Delay_Nus6;SEG8_BIT2_OFF;SEG8_CODE_PORT=temp
[3];SEG8_BIT3_ON;Delay_Nus6;SEG8_BIT3_OFF;}}}。