18B20测温时读取到的温度数据怎么转换!
ORG0000H;单片机内存分配申明!TEMPER_LEQU29H;用于保存读出温度低8位TEMPER_HEQU28H;用于保存读出温度高8位FLAG1EQU38H;否检测DS18B20标志位a_bitequ20h;数码管位数存放内存位置b_bitequ21h;数码管十位数存放内存位置;进行温度显示,里我们考虑用网站提供两位数码管来显示温度;显示范围0099度,显示精度1度;因12位转化时每位精度0.0625度,我们要求显示小数所抛弃29H低4位;28H低4位移入29H高4位,样获得新字节,字节实际测量获得温度;转化温度方法非常简洁无需乘于0.0625系数MAIN:LCALLGET_TEMPER;调用读温度子程序MOVA,29HMOVC,40H;28H低位移入CRRCAMOVC,41HRRCAMOVC,42HRRCAMOVC,43HRRCAMOV29H,ALCALLDISPLAY;调用数码管显示子程序JNBFLAG1,MM1CLRP1.0SJMPMAINMM1:SETBP1.0SJMPMAININIT_1820:SETBP2.2;DS18B20复位初始化子程序NOPCLRP2.2MOVR1,#3;主机发出延时537微秒复位低脉冲TSR1:MOVR0,#107DJNZR0,$DJNZR1,TSR1SETBP2.2;拉高数据线NOPNOPNOPMOVR0,#25HTSR2:JNBP2.2,TSR3;等待DS18B20回应DJNZR0,TSR2LJMPTSR4;延时TSR3:SETBFLAG1;置标志位,表示DS1820存LJMPTSR5TSR4:CLRFLAG1;清标志位,表示DS1820存LJMPTSR7TSR5:MOVR0,#70TSR6:DJNZR0,TSR6;时序要求延时段时间TSR7:SETBP2.2RETGET_TEMPER:SETBP2.2;读出转换温度值LCALLINIT_1820;先复位DS18B20JBFLAG1,TSS2RET;判断DS1820否存?若DS18B20存则返回TSS2:MOVA,#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA,#44H;发出温度转换命令LCALLWRITE_1820LCALLDISPLAY;里通过调用显示子程序实现延时段时间,等待AD转换结束,12位750微秒LCALLINIT_1820;准备读温度前先复位MOVA,#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA,#0BEH;发出读温度命令LCALLWRITE_1820LCALLREAD_18200;读出温度数据保存35H/36HRETWRITE_1820:MOVR2,#8;写DS18B20子程序(有具体时序要求),共8位数据CLRCWR1:CLRP2.2MOVR3,#5DJNZR3,$RRCAMOVP2.2,CMOVR3,#21DJNZR3,$SETBP2.2NOPDJNZR2,WR1SETBP2.2RETREAD_18200:MOVR4,#2;读DS18B20程序,从DS18B20读出两字节温度数据,温度高位和低位从DS18B20读出MOVR1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOVR2,#8;数据共有8位RE01:CLRCSETBP2.2NOPNOPCLRP2.2NOPNOPNOPSETBP2.2MOVR3,#8RE10:DJNZR3,RE10MOVC,P2.2MOVR3,#21RE20:DJNZR3,RE20RRCADJNZR2,RE01MOV@R1,ADECR1DJNZR4,RE00RETdisplay:mova,29H;显示子程序29H十六进制数转换成10进制movb,#10;10进制/10=10进制divabmovb_bit,a;十位amova_bit,b;位bmovdptr,#numtab;指定查表启始地址movr0,#4dpl1:movr1,#250;显示1000次dplop:mova,a_bit;取位数MOVCA,@ADPTR;查位数7段代码movp0,a;送出位7段代码clrp2.6;开位显示acalld1ms;显示1mssetbp2.6mova,b_bit;取十位数MOVCA,@ADPTR;查十位数7段代码movp0,a;送出十位7段代码clrp2.7;开十位显示acalld1ms;显示1mssetbp2.7djnzr1,dplop;100次没完循环djnzr0,dpl1;4100次没完循环retD1MS:MOVR7,#80;1MS延时DJNZR7,$RETnumtab:DB0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H080H,090H;实验板上7段数码管0~9数字共阴显示代码end