DS18B20 与51单片机 怎么用 ?
;本程序使用11.0592M晶振,你需要改动的地方仅仅是字型码及其输出端口和位选线。;可以将检测到的温度直接显示到数码管上l1bitp3.0l2bitp3.6l3bitp3.5;三位数码管的位选线outportequp1.0;字型码的输出端口;单片机内存分配申明!n1equ30Hn2equ31Hn3equ32H//两位整数和一位小数TEMPER_LEQU29H;用于保存读出温度的低8位TEMPER_HEQU28H;用于保存读出温度的高8位FLAG1EQUf0;是否检测到DS18B20标志位dqbitp2.7;数据脚P2.7ORG0000Hmovp3,#0movdptr,#tabMAIN:LCALLGET_TEMPER;调用读温度子程序acallchangeacalldisplayAJMPMAIN;这是DS18B20复位初始化子程序INIT_1820:SETBdqNOPCLRdq;主机发出延时537微秒的复位低脉冲MOVR1,#3TSR1:MOVR0,#107DJNZR0,$DJNZR1,TSR1SETBdq;然后拉高数据线NOPNOPNOPMOVR0,#25HTSR2:JNBdq,TSR3;等待DS18B20回应DJNZR0,TSR2LJMPTSR4;延时TSR3:SETBFLAG1;置标志位,表示DS1820存在LJMPTSR5TSR4:CLRFLAG1;清标志位,表示DS1820不存在LJMPTSR7TSR5:MOVR0,#117TSR6:DJNZR0,TSR6;时序要求延时一段时间TSR7:SETBdqRET;读出转换后的温度值GET_TEMPER:SETBdqLCALLINIT_1820;先复位DS18B20JBFLAG1,TSS2RET;判断DS1820是否存在?若DS18B20不存在则返回TSS2:MOVA,#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA,#44H;发出温度转换命令LCALLWRITE_1820;这里通过调用显示子程序实现延时一段时间,等待转换结束rep:LCALLDISPLAYCLRCSETBdqNOPNOPCLRdqNOPNOPNOPSETBdqMOVR3,#8DJNZR3,$MOVC,dqMOVR3,#21DJNZR3,$jncrepLCALLINIT_1820;准备读温度前先复位MOVA,#0CCH;跳过ROM匹配LCALLWRITE_1820MOVA,#0BEH;发出读温度命令LCALLWRITE_1820LCALLREAD_18200;将读出的温度数据保存到35H/36HRET;写DS18B20的子程序(有具体的时序要求)WRITE_1820:MOVR2,#8;一共8位数据CLRCWR1:CLRdqMOVR3,#5DJNZR3,$RRCAMOVdq,CMOVR3,#21DJNZR3,$SETBdqNOPDJNZR2,WR1SETBdqRETREAD_18200:;读DS18B20的程序,从DS18B20中读出两个字节的温度数据MOVR4,#2;将温度高位和低位从DS18B20中读出MOVR1,#29H;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)RE00:MOVR2,#8;数据一共有8位RE01:CLRCSETBdqNOPNOPCLRdqNOPNOPNOPSETBdqMOVR3,#8RE10:DJNZR3,RE10MOVC,dqMOVR3,#21RE20:DJNZR3,RE20RRCADJNZR2,RE01MOV@R1,ADECR1DJNZR4,RE00RETchange:mova,temper_hanla,#00000111Bmov40h,temper_lanl40H,#11110000Borla,40Hswapamovb,#10divabmovca,@adptrmovn2,amova,bmovca,@adptrmovn3,amova,temper_lanla,#1111Bmovb,#10mulabmovb,#16divabmovca,@adptrmovn4,aretdisplay:movoutport,n2setbl2acalldelayclrl2movoutport,n3clroutport.2setbl3acalldelayclrl3movoutport,n4setbl4acalldelayclrl4movoutport,#1ehsetbp3.2acalldelayclrp3.2movoutport,#27hsetbp3.3acalldelayclrp3.3retdelay:movr7,#0afhdjnzr7,$retTAB:DB05H,0DDH,46H,54H,9CH,34H,24H,5DH,04H,14Hend