资源预览内容
第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
亲,该文档总共8页全部预览完了,如果喜欢就下载吧!
资源描述
;这是关于 DS18B20 的读写程序,数据脚 P2.2,晶振 11.0592mhz;温度传感器 18B20 汇编程序,采用器件默认的 12 位转化,最大转化时间 750 微秒;可以将检测到的温度直接显示到 AT89C51 的两个数码管上;显示温度 00 到 99 度,很准确无需校正!ORG 0000H;单片机内存分配申明!TEMPER_L EQU 29H;用于保存读出温度的低 8 位TEMPER_H EQU 28H;用于保存读出温度的高 8 位FLAG1 EQU 38H;是否检测到 DS18B20 标志位a_bit equ 20h ;数码管个位数存放内存位置b_bit equ 21h ;数码管十位数存放内存位置MAIN:LCALL GET_TEMPER;调用读温度子程序;进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度;显示范围 00 到 99 度,显示精度为 1 度;因为 12 位转化时每一位的精度为 0.0625 度,我们不要求显示小数所以可以抛弃 29H 的低4 位;将 28H 中的低 4 位移入 29H 中的高 4 位,这样获得一个新字节,这个字节就是实际测量获得的温度;这个转化温度的方法可是我想出来的哦非常简洁无需乘于 0.0625 系数MOV A,29HMOV C,40H;将 28H 中的最低位移入 CRRC AMOV C,41HRRC AMOV C,42HRRC AMOV C,43HRRC AMOV 29H,ALCALL DISPLAY;调用数码管显示子程序CPL P1.0AJMP MAIN; 这是 DS18B20 复位初始化子程序INIT_1820:SETB P2.2NOPCLR P2.2;主机发出延时 537 微秒的复位低脉冲MOV R1,#3TSR1:MOV R0,#107DJNZ R0, R1,TSR1SETB P2.2;然后拉高数据线NOPNOPNOPMOV R0,#25HTSR2:JNB P2.2,TSR3;等待 DS18B20 回应DJNZ R0,TSR2LJMP TSR4 ; 延时TSR3:SETB FLAG1 ; 置标志位,表示 DS1820 存在CLR P1.7;检查到 DS18B20 就点亮 P1.7LEDLJMP TSR5TSR4:CLR FLAG1 ; 清标志位,表示 DS1820 不存在CLR P1.1LJMP TSR7TSR5:MOV R0,#117TSR6:DJNZ R0,TSR6 ; 时序要求延时一段时间TSR7:SETB P2.2RET; 读出转换后的温度值GET_TEMPER:SETB P2.2LCALL INIT_1820;先复位 DS18B20JB FLAG1,TSS2CLR P1.2RET ; 判断 DS1820 是否存在?若 DS18B20 不存在则返回TSS2:CLR P1.3;DS18B20 已经被检测到!MOV A,#0CCH ; 跳过 ROM 匹配LCALL WRITE_1820MOV A,#44H ; 发出温度转换命令LCALL WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待 AD 转换结束,12 位的话 750 微秒LCALL DISPLAYLCALL INIT_1820;准备读温度前先复位MOV A,#0CCH ; 跳过 ROM 匹配LCALL WRITE_1820MOV A,#0BEH ; 发出读温度命令LCALL WRITE_1820LCALL READ_18200; 将读出的温度数据保存到 35H/36HCLR P1.4RET;写 DS18B20 的子程序(有具体的时序要求)WRITE_1820:MOV R2,#8;一共 8 位数据CLR CWR1:CLR P2.2MOV R3,#5DJNZ R3, AMOV P2.2,CMOV R3,#21DJNZ R3, P2.2NOPDJNZ R2,WR1SETB P2.2RETREAD_18200: ; 读 DS18B20 的程序,从 DS18B20 中读出两个字节的温度数据MOV R4,#2 ; 将温度高位和低位从 DS18B20 中读出MOV R1,#29H ; 低位存入 29H(TEMPER_L),高位存入 28H(TEMPER_H)RE00:MOV R2,#8;数据一共有 8 位RE01:CLR CSETB P2.2NOPNOPCLR P2.2NOPNOPNOPSETB P2.2MOV R3,#8RE10:DJNZ R3,RE10MOV C,P2.2MOV R3,#21RE20:DJNZ R3,RE20RRC ADJNZ R2,RE01MOV ,ADEC R1DJNZ R4,RE00RET;显示子程序display: mov a,29H;将 29H 中的十六进制数转换成 10 进制mov b,#10 ;10 进制/10=10 进制div abmov b_bit,a ;十位在 amov a_bit,b ;个位在 bmov dptr,#numtab ;指定查表启始地址mov r0,#4dpl1: mov r1,#250 ;显示 1000 次dplop: mov a,a_bit ;取个位数MOVC A,+DPTR ;查个位数的 7 段代码mov p0,a ;送出个位的 7 段代码clr p2.7 ;开个位显示acall d1ms ;显示 1mssetb p2.7mov a,b_bit ;取十位数MOVC A,+DPTR ;查十位数的 7 段代码mov p0,a ;送出十位的 7 段代码clr p2.6 ;开十位显示acall d1ms ;显示 1mssetb p2.6djnz r1,dplop ;100 次没完循环djnz r0,dpl1 ;4 个 100 次没完循环ret;1MS 延时D1MS: MOV R7,#80DJNZ R7,;实验板上的 7 段数码管 09 数字的共阴显示代码numtab: DB 0CFH,03H,5DH,5BH,93H,0DAH,0DEH,43H,0DFH,0DBHEND
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号