找回密码
 立即注册

QQ登录

只需一步,快速开始

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

八通道18B20温度显示仿真加单片机汇编语言程序

[复制链接]
跳转到指定楼层
楼主
八通道18B20温度显示  包含程序 8ds18b20.zip (489.7 KB, 下载次数: 11)

30H:采样高位
31H:采样低位
33H:存储组合的数据,初始化为0
34H35H.36H:组合的BCD码
37H~3CH:分离的BCD码,小数部分作如下处理:将3CH的数据放入3BH中

单片机源程序如下:
  1.      CLR P3.7
  2. MAIN:MOV 38H,#00H
  3.      MOV 39H,#00H
  4.      MOV 3AH,#00H
  5.      MOV 3BH,#00H
  6.      LCALL   GET_TEMPER
  7.      LCALL   TEMPRRO
  8.      MOV P2,#06H
  9.      LCALL PRO
  10. ;------------------------------------------------------

  11.      MOV 38H,#00H
  12.      MOV 39H,#00H
  13.      MOV 3AH,#00H
  14.      MOV 3BH,#00H
  15.      LCALL   GET_TEMPER2
  16.      LCALL   TEMPRRO
  17.      MOV P2,#5BH
  18.      LCALL PRO
  19. ;------------------------------------------------------

  20.      MOV 38H,#00H
  21.      MOV 39H,#00H
  22.      MOV 3AH,#00H
  23.      MOV 3BH,#00H
  24.      LCALL   GET_TEMPER3
  25.      LCALL   TEMPRRO
  26.      MOV P2,#4FH
  27.      LCALL PRO

  28. ;------------------------------------------------------

  29.      MOV 38H,#00H
  30.      MOV 39H,#00H
  31.      MOV 3AH,#00H
  32.      MOV 3BH,#00H
  33.      LCALL   GET_TEMPER4
  34.      LCALL   TEMPRRO
  35.      MOV P2,#66H
  36.      LCALL PRO
  37. ;------------------------------------------------------

  38.      MOV 38H,#00H
  39.      MOV 39H,#00H
  40.      MOV 3AH,#00H
  41.      MOV 3BH,#00H
  42.      LCALL   GET_TEMPER5
  43.      LCALL   TEMPRRO
  44.      MOV P2,#6DH
  45.      LCALL PRO
  46. ;------------------------------------------------------

  47.      MOV 38H,#00H
  48.      MOV 39H,#00H
  49.      MOV 3AH,#00H
  50.      MOV 3BH,#00H
  51.      LCALL   GET_TEMPER6
  52.      LCALL   TEMPRRO
  53.      MOV P2,#7DH
  54.      LCALL PRO
  55. ;------------------------------------------------------

  56.      MOV 38H,#00H
  57.      MOV 39H,#00H
  58.      MOV 3AH,#00H
  59.      MOV 3BH,#00H
  60.      LCALL   GET_TEMPER7
  61.      LCALL   TEMPRRO
  62.      MOV P2,#07H
  63.      LCALL PRO
  64. ;------------------------------------------------------

  65.      MOV 38H,#00H
  66.      MOV 39H,#00H
  67.      MOV 3AH,#00H
  68.      MOV 3BH,#00H
  69.      LCALL   GET_TEMPER8
  70.      LCALL   TEMPRRO
  71.      MOV P2,#7FH
  72.      LCALL PRO
  73.       LJMP  MAIN
  74.    


  75. ;==============================================CHL1
  76. GET_TEMPER:
  77.           SETB      P1.0H ; 定时入口
  78. BCD:      LCALL     INIT_1820
  79.           JB        00H,S22
  80.           LJMP      BCD ; 若DS18B20不存在则返回

  81. S22:     LCALL     DELAY1
  82.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  83.          LCALL     WRITE_1820
  84. MOV A,#44H ; 发出温度转换命令
  85. LCALL WRITE_1820
  86. NOP
  87. LCALL DELAY1
  88. CBA:LCALL INIT_1820
  89. JB 00H,ABC
  90. LJMP CBA
  91. ABC:LCALL DELAY1
  92. MOV A,#0CCH ; 跳过ROM匹配
  93. LCALL WRITE_1820
  94. MOV A,#0BEH ; 发出读温度命令
  95. LCALL WRITE_1820
  96. LCALL READ_18200 ;READ_1820
  97. RET
  98. ;==============================
  99. READ_1820:
  100. MOV R2,#8
  101. RE1:
  102. CLR C
  103. SETB P1.0H
  104. NOP
  105. NOP
  106. CLR P1.0H
  107. NOP
  108. NOP
  109. NOP
  110. SETB P1.0H
  111. MOV R3,#7
  112. DJNZ R3,$
  113. MOV C,P1.0H
  114. MOV R3,#23
  115. DJNZ R3,$
  116. RRC A
  117. DJNZ R2,RE1
  118. RET
  119. ;=============================
  120. WRITE_1820:
  121. MOV R2,#8
  122. CLR C
  123. WR1:
  124. CLR P1.0H
  125. MOV R3,#6
  126. DJNZ R3,$
  127. RRC A
  128. MOV P1.0H,C
  129. MOV R3,#23
  130. DJNZ R3,$
  131. SETB P1.0H
  132. NOP
  133. DJNZ R2,WR1
  134. SETB P1.0H
  135. RET
  136. ;=======================================
  137. READ_18200:
  138. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  139. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  140. RE00:
  141. MOV R2,#8
  142. RE01:
  143. CLR C
  144. SETB P1.0H
  145. NOP
  146. NOP
  147. CLR P1.0H
  148. NOP
  149. NOP
  150. NOP
  151. SETB P1.0H
  152. MOV R3,#7
  153. DJNZ R3,$
  154. MOV C,P1.0H
  155. MOV R3,#23
  156. DJNZ R3,$
  157. RRC A
  158. DJNZ R2,RE01
  159. MOV @R1,A
  160. DEC R1
  161. DJNZ R4,RE00
  162. RET
  163. ;=======================================
  164. INIT_1820:
  165. SETB P1.0H
  166. NOP
  167. CLR P1.0H
  168. MOV R0,#250
  169. TSR1:
  170. DJNZ R0,TSR1 ; 延时520us
  171. SETB P1.0H
  172. MOV R0,#25H ;96US-25H
  173. TSR2:
  174. DJNZ R0,TSR2
  175. JNB P1.0H,TSR3;如D0为低则复位成功,DS18B20存在
  176. LJMP TSR4 ; 延时
  177. TSR3:
  178. SETB 00H ; 置标志位,表示DS1820存在
  179. LJMP TSR5
  180. TSR4:
  181. CLR 00H ; 清标志位,表示DS1820不存在
  182. LJMP TSR7
  183. TSR5:
  184. MOV R0,#06BH ;200US
  185. TSR6:
  186. DJNZ R0,TSR6 ; 延时
  187. TSR7:
  188. SETB P1.0H ;拉高总线
  189. RET
  190. ;===============================
  191. GET_TEMPER2:
  192.           SETB      P1.1H ; 定时入口
  193. BCD2:      LCALL     INIT_18202
  194.           JB        00H,S222
  195.           LJMP      BCD2 ; 若DS18B20不存在则返回

  196. S222:     LCALL     DELAY1
  197.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  198.          LCALL     WRITE_18202
  199. MOV A,#44H ; 发出温度转换命令
  200. LCALL WRITE_18202
  201. NOP
  202. LCALL DELAY1
  203. CBA2:LCALL INIT_18202
  204. JB 00H,ABC2
  205. LJMP CBA2
  206. ABC2:LCALL DELAY1
  207. MOV A,#0CCH ; 跳过ROM匹配
  208. LCALL WRITE_18202
  209. MOV A,#0BEH ; 发出读温度命令
  210. LCALL WRITE_18202
  211. LCALL READ_182002 ;READ_1820
  212. RET
  213. ;==============================
  214. READ_18202:
  215. MOV R2,#8
  216. RE12:
  217. CLR C
  218. SETB P1.1H
  219. NOP
  220. NOP
  221. CLR P1.1H
  222. NOP
  223. NOP
  224. NOP
  225. SETB P1.1H
  226. MOV R3,#7
  227. DJNZ R3,$
  228. MOV C,P1.1H
  229. MOV R3,#23
  230. DJNZ R3,$
  231. RRC A
  232. DJNZ R2,RE12
  233. RET
  234. ;=============================
  235. WRITE_18202:
  236. MOV R2,#8
  237. CLR C
  238. WR12:
  239. CLR P1.1H
  240. MOV R3,#6
  241. DJNZ R3,$
  242. RRC A
  243. MOV P1.1H,C
  244. MOV R3,#23
  245. DJNZ R3,$
  246. SETB P1.1H
  247. NOP
  248. DJNZ R2,WR12
  249. SETB P1.1H
  250. RET
  251. ;=======================================
  252. READ_182002:
  253. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  254. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  255. RE002:
  256. MOV R2,#8
  257. RE012:
  258. CLR C
  259. SETB P1.1H
  260. NOP
  261. NOP
  262. CLR P1.1H
  263. NOP
  264. NOP
  265. NOP
  266. SETB P1.1H
  267. MOV R3,#7
  268. DJNZ R3,$
  269. MOV C,P1.1H
  270. MOV R3,#23
  271. DJNZ R3,$
  272. RRC A
  273. DJNZ R2,RE012
  274. MOV @R1,A
  275. DEC R1
  276. DJNZ R4,RE002
  277. RET
  278. ;=======================================
  279. INIT_18202:
  280. SETB P1.1H
  281. NOP
  282. CLR P1.1H
  283. MOV R0,#250
  284. TSR12:
  285. DJNZ R0,TSR12 ; 延时520us
  286. SETB P1.1H
  287. MOV R0,#25H ;96US-25H
  288. TSR22:
  289. DJNZ R0,TSR22
  290. JNB P1.1H,TSR32;如D0为低则复位成功,DS18B20存在
  291. LJMP TSR42 ; 延时
  292. TSR32:
  293. SETB 00H ; 置标志位,表示DS1820存在
  294. LJMP TSR52
  295. TSR42:
  296. CLR 00H ; 清标志位,表示DS1820不存在
  297. LJMP TSR72
  298. TSR52:
  299. MOV R0,#06BH ;200US
  300. TSR62:
  301. DJNZ R0,TSR62 ; 延时
  302. TSR72:
  303. SETB P1.1H ;拉高总线
  304. RET
  305. ;===============================
  306. GET_TEMPER3:
  307.           SETB      P1.2H ; 定时入口
  308. BCD3:      LCALL     INIT_18203
  309.           JB        00H,S223
  310.           LJMP      BCD3 ; 若DS18B20不存在则返回

  311. S223:     LCALL     DELAY1
  312.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  313.          LCALL     WRITE_18203
  314. MOV A,#44H ; 发出温度转换命令
  315. LCALL WRITE_18203
  316. NOP
  317. LCALL DELAY1
  318. CBA3:LCALL INIT_18203
  319. JB 00H,ABC3
  320. LJMP CBA3
  321. ABC3:LCALL DELAY1
  322. MOV A,#0CCH ; 跳过ROM匹配
  323. LCALL WRITE_18203
  324. MOV A,#0BEH ; 发出读温度命令
  325. LCALL WRITE_18203
  326. LCALL READ_182003 ;READ_1820
  327. RET
  328. ;==============================
  329. READ_18203:
  330. MOV R2,#8
  331. RE13:
  332. CLR C
  333. SETB P1.2H
  334. NOP
  335. NOP
  336. CLR P1.2H
  337. NOP
  338. NOP
  339. NOP
  340. SETB P1.2H
  341. MOV R3,#7
  342. DJNZ R3,$
  343. MOV C,P1.2H
  344. MOV R3,#23
  345. DJNZ R3,$
  346. RRC A
  347. DJNZ R2,RE13
  348. RET
  349. ;=============================
  350. WRITE_18203:
  351. MOV R2,#8
  352. CLR C
  353. WR13:
  354. CLR P1.2H
  355. MOV R3,#6
  356. DJNZ R3,$
  357. RRC A
  358. MOV P1.2H,C
  359. MOV R3,#23
  360. DJNZ R3,$
  361. SETB P1.2H
  362. NOP
  363. DJNZ R2,WR13
  364. SETB P1.2H
  365. RET
  366. ;=======================================
  367. READ_182003:
  368. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  369. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  370. RE003:
  371. MOV R2,#8
  372. RE013:
  373. CLR C
  374. SETB P1.2H
  375. NOP
  376. NOP
  377. CLR P1.2H
  378. NOP
  379. NOP
  380. NOP
  381. SETB P1.2H
  382. MOV R3,#7
  383. DJNZ R3,$
  384. MOV C,P1.2H
  385. MOV R3,#23
  386. DJNZ R3,$
  387. RRC A
  388. DJNZ R2,RE013
  389. MOV @R1,A
  390. DEC R1
  391. DJNZ R4,RE003
  392. RET
  393. ;=======================================
  394. INIT_18203:
  395. SETB P1.2H
  396. NOP
  397. CLR P1.2H
  398. MOV R0,#250
  399. TSR13:
  400. DJNZ R0,TSR13 ; 延时520us
  401. SETB P1.2H
  402. MOV R0,#25H ;96US-25H
  403. TSR23:
  404. DJNZ R0,TSR23
  405. JNB P1.2H,TSR33;如D0为低则复位成功,DS18B20存在
  406. LJMP TSR43 ; 延时
  407. TSR33:
  408. SETB 00H ; 置标志位,表示DS1820存在
  409. LJMP TSR53
  410. TSR43:
  411. CLR 00H ; 清标志位,表示DS1820不存在
  412. LJMP TSR73
  413. TSR53:
  414. MOV R0,#06BH ;200US
  415. TSR63:
  416. DJNZ R0,TSR63 ; 延时
  417. TSR73:
  418. SETB P1.2H ;拉高总线
  419. RET
  420. ;===============================
  421. GET_TEMPER4:
  422.           SETB      P1.3H ; 定时入口
  423. BCD4:      LCALL     INIT_18204
  424.           JB        00H,S224
  425.           LJMP      BCD4 ; 若DS18B20不存在则返回

  426. S224:     LCALL     DELAY1
  427.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  428.          LCALL     WRITE_18204
  429. MOV A,#44H ; 发出温度转换命令
  430. LCALL WRITE_18204
  431. NOP
  432. LCALL DELAY1
  433. CBA4:LCALL INIT_18204
  434. JB 00H,ABC4
  435. LJMP CBA4
  436. ABC4:LCALL DELAY1
  437. MOV A,#0CCH ; 跳过ROM匹配
  438. LCALL WRITE_18204
  439. MOV A,#0BEH ; 发出读温度命令
  440. LCALL WRITE_18204
  441. LCALL READ_182004 ;READ_1820
  442. RET
  443. ;==============================
  444. READ_18204:
  445. MOV R2,#8
  446. RE14:
  447. CLR C
  448. SETB P1.3H
  449. NOP
  450. NOP
  451. CLR P1.3H
  452. NOP
  453. NOP
  454. NOP
  455. SETB P1.3H
  456. MOV R3,#7
  457. DJNZ R3,$
  458. MOV C,P1.3H
  459. MOV R3,#23
  460. DJNZ R3,$
  461. RRC A
  462. DJNZ R2,RE14
  463. RET
  464. ;=============================
  465. WRITE_18204:
  466. MOV R2,#8
  467. CLR C
  468. WR14:
  469. CLR P1.3H
  470. MOV R3,#6
  471. DJNZ R3,$
  472. RRC A
  473. MOV P1.3H,C
  474. MOV R3,#23
  475. DJNZ R3,$
  476. SETB P1.3H
  477. NOP
  478. DJNZ R2,WR14
  479. SETB P1.3H
  480. RET
  481. ;=======================================
  482. READ_182004:
  483. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  484. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  485. RE004:
  486. MOV R2,#8
  487. RE014:
  488. CLR C
  489. SETB P1.3H
  490. NOP
  491. NOP
  492. CLR P1.3H
  493. NOP
  494. NOP
  495. NOP
  496. SETB P1.3H
  497. MOV R3,#7
  498. DJNZ R3,$
  499. MOV C,P1.3H
  500. MOV R3,#23
  501. DJNZ R3,$
  502. RRC A
  503. DJNZ R2,RE014
  504. MOV @R1,A
  505. DEC R1
  506. DJNZ R4,RE004
  507. RET
  508. ;=======================================
  509. INIT_18204:
  510. SETB P1.3H
  511. NOP
  512. CLR P1.3H
  513. MOV R0,#250
  514. TSR14:
  515. DJNZ R0,TSR14 ; 延时520us
  516. SETB P1.3H
  517. MOV R0,#25H ;96US-25H
  518. TSR24:
  519. DJNZ R0,TSR24
  520. JNB P1.3H,TSR34;如D0为低则复位成功,DS18B20存在
  521. LJMP TSR44 ; 延时
  522. TSR34:
  523. SETB 00H ; 置标志位,表示DS1820存在
  524. LJMP TSR54
  525. TSR44:
  526. CLR 00H ; 清标志位,表示DS1820不存在
  527. LJMP TSR74
  528. TSR54:
  529. MOV R0,#06BH ;200US
  530. TSR64:
  531. DJNZ R0,TSR64 ; 延时
  532. TSR74:
  533. SETB P1.3H ;拉高总线
  534. RET
  535. ;===============================
  536. GET_TEMPER5:
  537.           SETB      P1.4H ; 定时入口
  538. BCD5:      LCALL     INIT_18205
  539.           JB        00H,S225
  540.           LJMP      BCD5 ; 若DS18B20不存在则返回

  541. S225:     LCALL     DELAY1
  542.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  543.          LCALL     WRITE_18205
  544. MOV A,#44H ; 发出温度转换命令
  545. LCALL WRITE_18205
  546. NOP
  547. LCALL DELAY1
  548. CBA5:LCALL INIT_18205
  549. JB 00H,ABC5
  550. LJMP CBA5
  551. ABC5:LCALL DELAY1
  552. MOV A,#0CCH ; 跳过ROM匹配
  553. LCALL WRITE_18205
  554. MOV A,#0BEH ; 发出读温度命令
  555. LCALL WRITE_18205
  556. LCALL READ_182005 ;READ_1820
  557. RET
  558. ;==============================
  559. READ_18205:
  560. MOV R2,#8
  561. RE15:
  562. CLR C
  563. SETB P1.4H
  564. NOP
  565. NOP
  566. CLR P1.4H
  567. NOP
  568. NOP
  569. NOP
  570. SETB P1.4H
  571. MOV R3,#7
  572. DJNZ R3,$
  573. MOV C,P1.4H
  574. MOV R3,#23
  575. DJNZ R3,$
  576. RRC A
  577. DJNZ R2,RE15
  578. RET
  579. ;=============================
  580. WRITE_18205:
  581. MOV R2,#8
  582. CLR C
  583. WR15:
  584. CLR P1.4H
  585. MOV R3,#6
  586. DJNZ R3,$
  587. RRC A
  588. MOV P1.4H,C
  589. MOV R3,#23
  590. DJNZ R3,$
  591. SETB P1.4H
  592. NOP
  593. DJNZ R2,WR15
  594. SETB P1.4H
  595. RET
  596. ;=======================================
  597. READ_182005:
  598. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  599. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  600. RE005:
  601. MOV R2,#8
  602. RE015:
  603. CLR C
  604. SETB P1.4H
  605. NOP
  606. NOP
  607. CLR P1.4H
  608. NOP
  609. NOP
  610. NOP
  611. SETB P1.4H
  612. MOV R3,#7
  613. DJNZ R3,$
  614. MOV C,P1.4H
  615. MOV R3,#23
  616. DJNZ R3,$
  617. RRC A
  618. DJNZ R2,RE015
  619. MOV @R1,A
  620. DEC R1
  621. DJNZ R4,RE005
  622. RET
  623. ;=======================================
  624. INIT_18205:
  625. SETB P1.4H
  626. NOP
  627. CLR P1.4H
  628. MOV R0,#250
  629. TSR15:
  630. DJNZ R0,TSR15 ; 延时520us
  631. SETB P1.4H
  632. MOV R0,#25H ;96US-25H
  633. TSR25:
  634. DJNZ R0,TSR25
  635. JNB P1.4H,TSR35;如D0为低则复位成功,DS18B20存在
  636. LJMP TSR45 ; 延时
  637. TSR35:
  638. SETB 00H ; 置标志位,表示DS1820存在
  639. LJMP TSR55
  640. TSR45:
  641. CLR 00H ; 清标志位,表示DS1820不存在
  642. LJMP TSR75
  643. TSR55:
  644. MOV R0,#06BH ;200US
  645. TSR65:
  646. DJNZ R0,TSR65 ; 延时
  647. TSR75:
  648. SETB P1.4H ;拉高总线
  649. RET
  650. ;===============================
  651. GET_TEMPER6:
  652.           SETB      P1.5H ; 定时入口
  653. BCD6:      LCALL     INIT_18206
  654.           JB        00H,S226
  655.           LJMP      BCD6; 若DS18B20不存在则返回

  656. S226:     LCALL     DELAY1
  657.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  658.          LCALL     WRITE_18206
  659. MOV A,#44H ; 发出温度转换命令
  660. LCALL WRITE_18206
  661. NOP
  662. LCALL DELAY1
  663. CBA6:LCALL INIT_18206
  664. JB 00H,ABC6
  665. LJMP CBA6
  666. ABC6:LCALL DELAY1
  667. MOV A,#0CCH ; 跳过ROM匹配
  668. LCALL WRITE_18206
  669. MOV A,#0BEH ; 发出读温度命令
  670. LCALL WRITE_18206
  671. LCALL READ_182006 ;READ_1820
  672. RET
  673. ;==============================
  674. READ_18206:
  675. MOV R2,#8
  676. RE16:
  677. CLR C
  678. SETB P1.5H
  679. NOP
  680. NOP
  681. CLR P1.5H
  682. NOP
  683. NOP
  684. NOP
  685. SETB P1.5H
  686. MOV R3,#7
  687. DJNZ R3,$
  688. MOV C,P1.5H
  689. MOV R3,#23
  690. DJNZ R3,$
  691. RRC A
  692. DJNZ R2,RE16
  693. RET
  694. ;=============================
  695. WRITE_18206:
  696. MOV R2,#8
  697. CLR C
  698. WR16:
  699. CLR P1.5H
  700. MOV R3,#6
  701. DJNZ R3,$
  702. RRC A
  703. MOV P1.5H,C
  704. MOV R3,#23
  705. DJNZ R3,$
  706. SETB P1.5H
  707. NOP
  708. DJNZ R2,WR16
  709. SETB P1.5H
  710. RET
  711. ;=======================================
  712. READ_182006:
  713. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  714. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  715. RE006:
  716. MOV R2,#8
  717. RE016:
  718. CLR C
  719. SETB P1.5H
  720. NOP
  721. NOP
  722. CLR P1.5H
  723. NOP
  724. NOP
  725. NOP
  726. SETB P1.5H
  727. MOV R3,#7
  728. DJNZ R3,$
  729. MOV C,P1.5H
  730. MOV R3,#23
  731. DJNZ R3,$
  732. RRC A
  733. DJNZ R2,RE016
  734. MOV @R1,A
  735. DEC R1
  736. DJNZ R4,RE006
  737. RET
  738. ;=======================================
  739. INIT_18206:
  740. SETB P1.5H
  741. NOP
  742. CLR P1.5H
  743. MOV R0,#250
  744. TSR16:
  745. DJNZ R0,TSR16 ; 延时520us
  746. SETB P1.5H
  747. MOV R0,#25H ;96US-25H
  748. TSR26:
  749. DJNZ R0,TSR26
  750. JNB P1.5H,TSR36;如D0为低则复位成功,DS18B20存在
  751. LJMP TSR46 ; 延时
  752. TSR36:
  753. SETB 00H ; 置标志位,表示DS1820存在
  754. LJMP TSR56
  755. TSR46:
  756. CLR 00H ; 清标志位,表示DS1820不存在
  757. LJMP TSR76
  758. TSR56:
  759. MOV R0,#06BH ;200US
  760. TSR66:
  761. DJNZ R0,TSR66 ; 延时
  762. TSR76:
  763. SETB P1.5H ;拉高总线
  764. RET
  765. ;===============================
  766. GET_TEMPER7:
  767.           SETB      P1.6H ; 定时入口
  768. BCD7:      LCALL     INIT_18207
  769.           JB        00H,S227
  770.           LJMP      BCD7; 若DS18B20不存在则返回

  771. S227:     LCALL     DELAY1
  772.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  773.          LCALL     WRITE_18207
  774. MOV A,#44H ; 发出温度转换命令
  775. LCALL WRITE_18207
  776. NOP
  777. LCALL DELAY1
  778. CBA7:LCALL INIT_18207
  779. JB 00H,ABC7
  780. LJMP CBA7
  781. ABC7:LCALL DELAY1
  782. MOV A,#0CCH ; 跳过ROM匹配
  783. LCALL WRITE_18207
  784. MOV A,#0BEH ; 发出读温度命令
  785. LCALL WRITE_18207
  786. LCALL READ_182007 ;READ_1820
  787. RET
  788. ;==============================
  789. READ_18207:
  790. MOV R2,#8
  791. RE17:
  792. CLR C
  793. SETB P1.6H
  794. NOP
  795. NOP
  796. CLR P1.6H
  797. NOP
  798. NOP
  799. NOP
  800. SETB P1.6H
  801. MOV R3,#7
  802. DJNZ R3,$
  803. MOV C,P1.6H
  804. MOV R3,#23
  805. DJNZ R3,$
  806. RRC A
  807. DJNZ R2,RE17
  808. RET
  809. ;=============================
  810. WRITE_18207:
  811. MOV R2,#8
  812. CLR C
  813. WR17:
  814. CLR P1.6H
  815. MOV R3,#6
  816. DJNZ R3,$
  817. RRC A
  818. MOV P1.6H,C
  819. MOV R3,#23
  820. DJNZ R3,$
  821. SETB P1.6H
  822. NOP
  823. DJNZ R2,WR17
  824. SETB P1.6H
  825. RET
  826. ;=======================================
  827. READ_182007:
  828. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  829. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  830. RE007:
  831. MOV R2,#8
  832. RE017:
  833. CLR C
  834. SETB P1.6H
  835. NOP
  836. NOP
  837. CLR P1.6H
  838. NOP
  839. NOP
  840. NOP
  841. SETB P1.6H
  842. MOV R3,#7
  843. DJNZ R3,$
  844. MOV C,P1.6H
  845. MOV R3,#23
  846. DJNZ R3,$
  847. RRC A
  848. DJNZ R2,RE017
  849. MOV @R1,A
  850. DEC R1
  851. DJNZ R4,RE007
  852. RET
  853. ;=======================================
  854. INIT_18207:
  855. SETB P1.6H
  856. NOP
  857. CLR P1.6H
  858. MOV R0,#250
  859. TSR17:
  860. DJNZ R0,TSR17 ; 延时520us
  861. SETB P1.6H
  862. MOV R0,#25H ;96US-25H
  863. TSR27:
  864. DJNZ R0,TSR27
  865. JNB P1.6H,TSR37;如D0为低则复位成功,DS18B20存在
  866. LJMP TSR47; 延时
  867. TSR37:
  868. SETB 00H ; 置标志位,表示DS1820存在
  869. LJMP TSR57
  870. TSR47:
  871. CLR 00H ; 清标志位,表示DS1820不存在
  872. LJMP TSR77
  873. TSR57:
  874. MOV R0,#06BH ;200US
  875. TSR67:
  876. DJNZ R0,TSR67; 延时
  877. TSR77:
  878. SETB P1.6H ;拉高总线
  879. RET
  880. ;===============================
  881. GET_TEMPER8:
  882.           SETB      P1.7H ; 定时入口
  883. BCD8:      LCALL     INIT_18208
  884.           JB        00H,S228
  885.           LJMP      BCD8; 若DS18B20不存在则返回

  886. S228:     LCALL     DELAY1
  887.          MOV        A,#0CCH ; 跳过ROM匹配------0CC命令
  888.          LCALL     WRITE_18208
  889. MOV A,#44H ; 发出温度转换命令
  890. LCALL WRITE_18208
  891. NOP
  892. LCALL DELAY1
  893. CBA8:LCALL INIT_18208
  894. JB 00H,ABC8
  895. LJMP CBA8
  896. ABC8:LCALL DELAY1
  897. MOV A,#0CCH ; 跳过ROM匹配
  898. LCALL WRITE_18208
  899. MOV A,#0BEH ; 发出读温度命令
  900. LCALL WRITE_18208
  901. LCALL READ_182008 ;READ_1820
  902. RET
  903. ;==============================
  904. READ_18208:
  905. MOV R2,#8
  906. RE18:
  907. CLR C
  908. SETB P1.7H
  909. NOP
  910. NOP
  911. CLR P1.7H
  912. NOP
  913. NOP
  914. NOP
  915. SETB P1.7H
  916. MOV R3,#7
  917. DJNZ R3,$
  918. MOV C,P1.7H
  919. MOV R3,#23
  920. DJNZ R3,$
  921. RRC A
  922. DJNZ R2,RE18
  923. RET
  924. ;=============================
  925. WRITE_18208:
  926. MOV R2,#8
  927. CLR C
  928. WR18:
  929. CLR P1.7H
  930. MOV R3,#6
  931. DJNZ R3,$
  932. RRC A
  933. MOV P1.7H,C
  934. MOV R3,#23
  935. DJNZ R3,$
  936. SETB P1.7H
  937. NOP
  938. DJNZ R2,WR18
  939. SETB P1.7H
  940. RET
  941. ;=======================================
  942. READ_182008:
  943. MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
  944. MOV R1,#31H ; 低位存入30H(TEMPER_L),高位存入31H(TEMPER_H)
  945. RE008:
  946. MOV R2,#8
  947. RE018:
  948. CLR C
  949. SETB P1.7H
  950. NOP
  951. NOP
  952. CLR P1.7H
  953. NOP
  954. NOP
  955. NOP
  956. SETB P1.7H
  957. MOV R3,#7
  958. DJNZ R3,$
  959. MOV C,P1.7H
  960. MOV R3,#23
  961. DJNZ R3,$
  962. RRC A
  963. DJNZ R2,RE018
  964. MOV @R1,A
  965. DEC R1
  966. DJNZ R4,RE008
  967. RET
  968. ;=======================================
  969. INIT_18208:
  970. SETB P1.7H
  971. NOP
  972. CLR P1.7H
  973. MOV R0,#250
  974. TSR18:
  975. DJNZ R0,TSR18 ; 延时520us
  976. SETB P1.7H
  977. MOV R0,#25H ;96US-25H
  978. TSR28:
  979. DJNZ R0,TSR28
  980. JNB P1.7H,TSR38;如D0为低则复位成功,DS18B20存在
  981. LJMP TSR48; 延时
  982. TSR38:
  983. SETB 00H ; 置标志位,表示DS1820存在
  984. LJMP TSR58
  985. TSR48:
  986. CLR 00H ; 清标志位,表示DS1820不存在
  987. LJMP TSR78
  988. TSR58:
  989. MOV R0,#06BH ;200US
  990. TSR68:
  991. DJNZ R0,TSR68; 延时
  992. TSR78:
  993. SETB P1.7H ;拉高总线
  994. RET
  995. ;===============================
  996. ;======================================
  997. DELAY1:MOV R7,#20H
  998. DJNZ R7,$
  999. RET

  1000. ;====================================
  1001. TEMPRRO:MOV 33H,#00H;初始化0
  1002. MOV A,30H
  1003. ANL A,#0FH
  1004. SWAP A
  1005. MOV 33H,A
  1006. MOV A,31H
  1007. ANL A,#0F0H
  1008. SWAP A
  1009. ORL 33H,A;重新组合成的带符号数据(整数部分)
  1010. MOV A,33H
  1011. ANL A,#80H;判断符号

  1012. JZ TEMPP
  1013. MOV A,33H
  1014. CPL A
  1015. ;ADD A,#01H
  1016. SJMP TEMPP1
  1017. TEMPP:MOV A,33H;正数处理程序
  1018.       LCALL HBCD
  1019.       MOV A,31H
  1020.       ANL A,#0FH
  1021.       MOV DPTR,#TEMPTAB;小数查表
  1022.       MOVC A,@A+DPTR
  1023.       MOV 36H,A
  1024.       CLR P3.7;表示正数
  1025.       SJMP EXIT
  1026. TEMPP1:LCALL HBCD;负数处理程序
  1027.        MOV A,31H
  1028.        ANL A,#0FH
  1029.        ORL A,#0F0H
  1030.        CPL A
  1031.        ADD A,#01H
  1032.        MOV DPTR,#TEMPTAB
  1033.        MOVC A,@A+DPTR;小数查表
  1034.        MOV 36H,A
  1035.        SETB P3.7;表示负数
  1036. EXIT:RET

  1037. HBCD:        MOV        B,#100        ;分离出百位,存放在R3中
  1038.         DIV        AB
  1039.         MOV        R3,A
  1040.         MOV        A,#10        ;余数继续分离十位和个位
  1041.         XCH        A,B
  1042.         DIV        AB
  1043.         SWAP        A
  1044.         ORL        A,B        ;将十位和个位拼装成BCD码
  1045.         MOV 34H,R3
  1046.         MOV 35H,A
  1047.         RET
  1048. TEMPTAB:DB 00H,01H,01H,02H,03H,03H,04H,04H
  1049.         DB 05H,06H,06H,07H,08H,08H,09H,09H;0~16*0.0652
  1050. ;==================================================
  1051. CBCD:;MOV R2,#04H;5个待分离的BCD
  1052. CL:MOV A,@R1     ;分离后将占10个单元
  1053.    MOV B,A
  1054.    ANL A,#0F0H
  1055.    SWAP A
  1056.    MOV 4CH,A
  1057.    MOV A,B
  1058.    ANL A,#0FH
  1059.    MOV 4DH,A
  1060.    MOV @R0,4CH
  1061.    INC R0
  1062.    MOV @R0,4DH
  1063.    INC R0
  1064.    INC R1
  1065.    DJNZ R2,CL
  1066.    RET
  1067. ;===================================================
  1068. DISPLAY:MOV R0,#38H;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;显示缓冲区首地址
  1069.         MOV R2,#04
  1070. DISP_LOOP:MOV A,@R0
  1071.           LCALL DISP
  1072.           INC R0
  1073.           DJNZ R2,DISP_LOOP
  1074.           CLR  P0.2
  1075.           NOP
  1076.           NOP
  1077.           SETB P0.2      ;上升沿将数据送到输出锁存器
  1078.           NOP
  1079.           NOP
  1080.           NOP
  1081.           CLR  P0.2
  1082.           RET
  1083. DISP:MOV R4,#08H;移位寄存器接收数据
  1084. WR_LOOP: RLC A
  1085.          MOV P0.1,C
  1086.          SETB P0.0        ;上升沿发生移位
  1087.          NOP
  1088.          NOP
  1089.          CLR P0.0
  1090.          DJNZ R4,WR_LOOP
  1091.          RET
  1092. ;=============================
  1093. PRO: MOV R2,#03H;N个待分离的BCD
  1094.      MOV R0,#37H;分离后BCD首地址
  1095.      MOV R1,#34H;待分离BCD首地址
  1096.      LCALL CBCD;分离压缩的BCD码
  1097.      MOV 3BH,3CH;小数处理

  1098.      MOV R0,#38H;显示数据首地址
  1099.      MOV R1,#38H;显示缓冲区首地址
  1100.      MOV R2,#04;数据个数
  1101. RES_LOOP:MOV A,@R0
  1102.          LCALL RES
  1103.          MOV @R1,A
  1104.          INC R0
  1105.          INC R1
  1106.          DJNZ R2,RES_LOOP  
  1107.       ORL 3AH,#80H;小数点
  1108.       LCALL DISPLAY
  1109. LCALL DELAYS
  1110. LCALL DELAYS
  1111. LCALL DELAYS
  1112. LCALL DELAYS
  1113. LCALL DELAYS
  1114. LCALL DELAYS
  1115. RET
  1116. ;==============================
  1117. RES:MOV DPTR,#TAB
  1118.     MOVC A,@A+DPTR
  1119.     RET
  1120. TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
  1121. ;======================================
  1122. DELAYS:MOV R5,#0FFH
  1123. LOOP2:MOV R4,#0FFH
  1124. LOOP1:NOP
  1125.       NOP
  1126.       DJNZ R4,LOOP1
  1127.       DJNZ R5,LOOP2
  1128.       RET
  1129.                 END
复制代码




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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