找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2859|回复: 0
打印 上一主题 下一主题
收起左侧

基于18B20温度检测程序精确0.25度

[复制链接]
跳转到指定楼层
楼主
ID:70976 发表于 2014-12-27 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. ;=================================================================================
  2. ;Filename:DS18B20.asm                                           ;
  3. ;Program function: temperature testing                           ;
  4. ;           version: v1.0                           ;
  5. ;     date: 2009-9-03 11;49                            ;
  6. ;           Author: 兰建文                                       ;
  7. ;           Company: YUANDIAN                                    ;
  8. ;=================================================================================
  9. ;MCU type:AT89S52                                           ;
  10. ;FOSC: ERC,HF,XT,LF,TMR0 Mode                              ;
  11. ;WDTEN: DISABLE                                             ;
  12. ;PROTECT:YES                                                ;
  13. ;LVDTEN:ENABLE   LVD=1.8V                                   ;
  14. ;OSCD:  12 oscillator periods                               ;
  15. ;PMCD:  No_Power saving                                     ;
  16. ;SET freq:12MHz                                             ;
  17. ;Fosc=XT 1MHz(2T)=0.50us                                    ;
  18. ;Time:T=(65536-M)*Pre*Tm/Osc               ;
  19. ;Tm:Oscillater periods=12,Pre(TCC=1:x)                      ;                     
  20. ;PAPH: Disable                                             ;
  21. ;PBPH: Enable                                              ;
  22. ;VDD:  extv=5V                                             ;
  23. ;CHECKSUM:   CONFIG:   ,CONFIG1:                            ;
  24. ;ROM size:       RAM size:        ;
  25. ;=================================================================================
  26. ;     Register Definitions
  27. ;-----------Define system register---------------------------
  28. ;=================================================================================
  29. ;单片机内存分配申明!
  30. ;=================================================================================
  31. TEMPER_L  EQU     29H;用于保存读出温度的低8位
  32. TEMPER_H EQU     28H;用于保存读出温度的高8位
  33. FLAG1    EQU     22H.0H;是否检测到DS18B20标志位
  34. a_bit    EQU     20H;数码管个位数存放内存位置
  35. b_bit    EQU     21H;数码管十位数存放内存位置
  36. c_bit  EQU 23H;数码管小数点个分位
  37. d_bit  EQU 24H;数码管小数点十分位
  38. ORG  0000H
  39. JMP MAIN
  40. ORG 0030H
  41. MAIN:
  42.        LCALL   GET_TEMPER;调用读温度子程序
  43. ;=================================================================================
  44. ;进行温度显示
  45. ;显示范围00到99度,显示精度为1度
  46. ;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
  47. ;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
  48. ;=================================================================================
  49. MOV 27H,29H
  50. MOV     A,29H
  51.         MOV     C,28H.0;将28H中的最低位移入C
  52.         RRC     A
  53.         MOV     C,28H.1
  54.         RRC     A
  55.         MOV     C,28H.2
  56.         RRC     A
  57.         MOV     C,28H.3
  58.         RRC     A
  59.         MOV     29H,A
  60. MOV A,27H
  61. RR A
  62. RR      A
  63. ANL A,#03H
  64. CJNE A,#3,LAN1
  65. MOV 27H,#75
  66. AJMP XIANSHI
  67. LAN1: CJNE A,#2,LAN2
  68. MOV 27H,#50
  69. AJMP XIANSHI
  70. LAN2: CJNE A,#1,LAN3
  71. MOV 27H,#25
  72. AJMP XIANSHI
  73. LAN3: CJNE A,#0,MAIN
  74. MOV 27H,#00
  75. XIANSHI:LCALL   DISPLAY;调用数码管显示子程序
  76.         AJMP    MAIN
  77. ;=================================================================================
  78. ; 这是DS18B20复位初始化子程序
  79. ;=================================================================================
  80. INIT_1820:
  81.         SETB    P3.5
  82.         NOP
  83.         CLR     P3.5
  84. ;主机发出延时537微秒的复位低脉冲
  85.         MOV     R1,#3
  86. TSR1:   
  87.         MOV     R0,#107
  88.        DJNZ    R0,$
  89.         DJNZ    R1,TSR1
  90.         SETB    P3.5;然后拉高数据线
  91.         NOP
  92.         NOP
  93.         NOP
  94.         MOV     R0,#25H
  95. TSR2:
  96.         JNB     P3.5,TSR3;等待DS18B20回应
  97.         DJNZ    R0,TSR2
  98.         LJMP    TSR4 ; 延时
  99. TSR3:
  100.         SETB    FLAG1 ; 置标志位,表示DS1820存在
  101.         LJMP    TSR5
  102. TSR4:
  103.         CLR     FLAG1 ; 清标志位,表示DS1820不存在
  104.         LJMP    TSR7
  105. TSR5:
  106.         MOV     R0,#117
  107. TSR6:
  108.         DJNZ    R0,TSR6 ; 时序要求延时一段时间
  109. TSR7:
  110. SETB    P3.5
  111. RET
  112. ;=================================================================================
  113. ; 读出转换后的温度值
  114. ;=================================================================================
  115. GET_TEMPER:
  116.         SETB  P3.5
  117.        LCALL   INIT_1820;先复位DS18B20
  118.         JNB      FLAG1,OUT ; 判断DS1820是否存在?若DS18B20不存在则返回
  119. MOV  A,#0CCH ; 跳过ROM匹配
  120. LCALL  WRITE_1820
  121. MOV  A,#44H ; 发出温度转换命令
  122. LCALL   WRITE_1820;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
  123. LCALL  DISPLAY
  124.   LCALL  INIT_1820;准备读温度前先复位
  125. MOV  A,#0CCH ; 跳过ROM匹配
  126. LCALL   WRITE_1820
  127. MOV  A,#0BEH ; 发出读温度命令
  128. LCALL  WRITE_1820
  129. LCALL  READ_18200; 将读出的温度数据保存到35H/36H
  130. OUT:
  131. RET
  132. ;=================================================================================
  133. ;写DS18B20的子程序(有具体的时序要求)
  134. ;=================================================================================
  135. WRITE_1820:
  136.         MOV  R2,#8;一共8位数据
  137.         CLR   C
  138. WR1:
  139. CLR  P3.5
  140. MOV  R3,#6
  141. DJNZ  R3,$
  142. RRC  A
  143. MOV  P3.5,C
  144. MOV  R3,#23
  145. DJNZ  R3,$
  146. SETB  P3.5
  147. NOP
  148. DJNZ  R2,WR1
  149. SETB  P3.5
  150. RET
  151. ;=================================================================================
  152. ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
  153. ;=================================================================================
  154. READ_18200:
  155. MOV  R4,#2 ; 将温度高位和低位从DS18B20中读出
  156. MOV  R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
  157. RE00:
  158. MOV  R2,#8;数据一共有8位
  159. RE01:
  160. CLR  C
  161. SETB  P3.5
  162. NOP
  163. NOP
  164.   CLR  P3.5
  165. NOP
  166. NOP
  167. NOP
  168. SETB  P3.5
  169. MOV  R3,#9
  170. RE10:
  171. DJNZ  R3,RE10
  172. MOV  C,P3.5
  173. MOV  R3,#23
  174. RE20:
  175. DJNZ  R3,RE20
  176. RRC  A
  177. DJNZ  R2,RE01
  178. MOV  @R1,A
  179. DEC  R1
  180. DJNZ  R4,RE00
  181. RET
  182. ;=================================================================================
  183. ;显示子程序
  184. ;=================================================================================
  185. DISPLAY:
  186. MOV     A,29H;将29H中的十六进制数转换成10进制
  187. MOV     B,#10 ;10进制/10=10进制
  188. DIV     AB
  189. MOV     b_bit,A ;十位在a
  190. MOV     a_bit,B ;个位在b
  191. MOV A,27H
  192. MOV B,#10
  193. DIV AB
  194. MOV c_bit,A
  195. MOV d_bit,B
  196. MOV     R0,#4
  197. Dpl1:
  198.         MOV     R1,#250 ;显示1000次
  199. DPLOP:
  200.         MOV     DPTR,#TAB1 ;指定查表启始地址
  201. MOV     A,a_bit ;取个位数
  202.         MOVC    A,@A+DPTR ;查个位数的7段代码
  203.         MOV     P0,A ;送出个位的7段代码
  204.         CLR     P2.2 ;开个位显示
  205.         ACALL   D1MS ;显示1ms
  206. SETB    P2.2
  207.         MOV     A,b_bit ;取十位数
  208. MOV DPTR,#TAB
  209. MOVC    A,@A+DPTR ;查十位数的7段代码
  210. MOV     P0,A ;送出十位的7段代码
  211. CLR     P2.3 ;开十位显示
  212. ACALL   D1MS ;显示1ms
  213. SETB    P2.3
  214. MOV DPTR,#TAB
  215. MOV A,c_bit
  216. MOVC A,@A+DPTR
  217. MOV P0,A
  218. CLR P2.1
  219. ACALL D1MS
  220. SETB P2.1
  221. MOV A,d_bit
  222. MOVC A,@A+DPTR
  223. MOV P0,A
  224. CLR P2.0
  225. ACALL D1MS
  226. SETB P2.0
  227. DJNZ    R1,DPLOP ;250次没完循环
  228. DJNZ    R0,Dpl1 ;4个250次没完循环
  229. RET
  230. ;=================================================================================
  231. ;1MS延时(按12MHZ算)
  232. ;=================================================================================
  233. D1MS:
  234.       MOV  R7,#80
  235.      DJNZ  R7,$
  236. RET
  237. ;=================================================================================
  238. ;实验板上的7段数码管0~9数字的共阳显示代码
  239. ;=================================================================================
  240. TAB:
  241. DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
  242. TAB1:
  243. DB 080H,079H,024H,030H,19H,12H,02H,078H,00H,10H
  244. END
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表