找回密码
 立即注册

QQ登录

只需一步,快速开始

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

汇编51单片机DS18B20数码管显示温度时间

[复制链接]
跳转到指定楼层
楼主
本文为通过51单片机进行DS18B20的温度采集,在6位数码管上显示时间与温度,并通过扫描方式输入9位按键,已封装好了各个按键的功能区。


右侧为设定温度,可通过按键进行设置,左侧27为检测温度,为DS18B20实测数据


时间显示,为2时3分13秒,各个时间也可通过按键设置
程序内有详细注释

单片机源程序如下:
  1. ;*************************************************
  2. ;***************温度时间显示模板.HUI**************
  3. ;*************************************************

  4.                         KEY                        EQU                40H                ;存放键值
  5.                         SECOND                EQU                37H
  6.                         MINUTE                EQU                38H
  7.                         HOUR                EQU                32H
  8.                         TCNT                EQU                34H                ;时间计数
  9.                         FLAG1                 BIT         00H     ; FLAG1:标志位,为"1"时表示检测到DS18B20
  10.                         TEMPER_NUM         EQU         50H         ; TEMPER_NUM:保存读出的温度数据
  11.                         TEMPER_L         EQU         36H           ;温度的低位
  12.                         TEMPER_H         EQU         35H            ;温度的高位
  13.                         TEMP                 EQU         34H     ;临时存放温度数据的单元
  14.                         SJGW                 EQU         30H     ;存放显示温度的个位数
  15.                         SJSW                 EQU         31H     ;存放显示温度的十位数
  16.                         DQ                         BIT         P1.3    ;DQ:DS18B20的数据总线接脚
  17.                         DIS_FLAG        BIT                01H                ;显示标志,为1时显示温度

  18.                         ORG                00H
  19.                         AJMP        MAIN
  20.                         ORG                0BH
  21.                         LJMP        INT_T0
  22.                        
  23.                        
  24. ;*********************子程序*********************

  25. ;**************中断子程序************************
  26. INT_T0:                PUSH ACC
  27.                         PUSH PSW
  28.                         MOV        TH0,#(65536-50000)/256
  29.                         MOV        TL0,#(65536-50000);MOD 256
  30.                         INC        TCNT
  31.                         MOV        A,TCNT
  32.                         CJNE A,#20,RETUNE        ;计时1秒
  33.                         INC        SECOND
  34.                         MOV        TCNT,#0
  35.                         MOV        A,SECOND
  36.                         CJNE A,#60,RETUNE
  37.                         INC        MINUTE
  38.                         MOV        SECOND,#0
  39.                         MOV        A,MINUTE
  40.                         CJNE A,#60,RETUNE
  41.                         INC        HOUR
  42.                         MOV        MINUTE,#0
  43.                         MOV        A,HOUR
  44.                         CJNE A,#24,RETUNE
  45.                         MOV        HOUR,#0
  46. RETUNE:                POP PSW
  47.                         POP ACC
  48.                         RETI               


  49. ;*****************显示子程序*********************
  50. DISPLAY1:        MOV        A,SECOND        ;显示秒
  51.                         MOV        B,#10
  52.                         DIV        AB
  53.                         MOV DPTR,#TABLE
  54.                         MOVC A,@A+DPTR
  55.                         MOV P1,#00000100B
  56.                         MOV        P0,A
  57.                         LCALL        DELAY1
  58.                         MOV        A,B
  59.                         MOVC A,@A+DPTR
  60.                         MOV P1,#00000101B
  61.                         MOV        P0,A
  62.                         LCALL DELAY1
  63.                         MOV                A,MINUTE        ;显示分钟
  64.                         MOV                B,#10
  65.                         DIV                AB
  66.                         MOVC        A,@A+DPTR
  67.                         MOV P1,#00000010B
  68.                         MOV                P0,A
  69.                         LCALL        DELAY1
  70.                         MOV                A,B
  71.                         MOVC        A,@A+DPTR
  72.                         MOV P1,#00000011B
  73.                         MOV                P0,A
  74.                         LCALL        DELAY1
  75.                         MOV                A,HOUR                ;显示小时
  76.                         MOV                B,#10
  77.                         DIV                AB
  78.                         MOVC        A,@A+DPTR
  79.                         MOV                P0,A
  80.                         MOV P1,#00000000B
  81.                         LCALL        DELAY1
  82.                         MOV                A,B
  83.                         MOVC        A,@A+DPTR
  84.                         MOV                P0,A
  85.                         MOV P1,#00000001B
  86.                         LCALL        DELAY1
  87.                         RET
  88. TABLE:                 DB 3FH,06H,5BH,4FH
  89.                         DB 66H,6DH,7DH,07H
  90.                         DB 7FH,6FH
  91. ;*****************DS18B20***********************
  92. ;*****************DS18B20***********************
  93. ;*****************DS18B20***********************
  94. DS18B20:        MOV TEMPER_NUM,A
  95.                         MOV TEMPER_L,#00
  96.                         MOV TEMPER_H,#00
  97.                         ACALL INIT_1820
  98.                         ACALL TEMPER
  99.                         RET

  100. TEMPER:         ACALL RE_CONFIG
  101.                         ACALL GET_TEMPER
  102.                         ACALL TEMPER_COV
  103.                         ACALL DISPLAY
  104.                         RET

  105. INIT_1820:         SETB DQ                        ;初始化程序
  106.                         NOP
  107.                         CLR DQ       ;主机发出延时540us的复位低脉冲
  108.                         MOV R0,#36
  109.                         LCALL DELAY
  110.                         SETB DQ      ;然后拉高数据线
  111.                         NOP
  112.                         NOP
  113.                         MOV R0,#36
  114. TSR2:                 JNB DQ,TSR3     ;等待DS18B20的回应
  115.                         DJNZ R0,TSR2
  116.                         LJMP TSR4;     延时
  117. TSR3:                SETB FLAG1;     置标志位,表示DS1820存在
  118.                         LJMP TSR5
  119. TSR4:                CLR FLAG1;      清标志位,表示DS1820不存在
  120.                         LJMP TSR7
  121. TSR5:                MOV R0,#06BH;   200us
  122. TSR6:                DJNZ R0,TSR6;    复位成功!时序要求延时一段时间
  123. TSR7:                SETB DQ
  124.                         RET
  125.                        
  126. ; 重新写DS18B20暂存存储器设定值
  127. RE_CONFIG: JB FLAG1,RE_CONFIG1; 若DS18B20存在,转RE_CONFIG1
  128.            RET
  129. RE_CONFIG1:MOV A,#0CCH;  发SKIP ROM命令
  130.            LCALL WRITE_1820
  131.            MOV A,#4EH;  发写暂存存储器命令
  132.            LCALL WRITE_1820
  133.            MOV A,#00H;  不 TH(报警上限)中写入00H
  134.            LCALL WRITE_1820
  135.            MOV A,#00H;   TL(报警下限)中写入00H
  136.            LCALL WRITE_1820
  137.            MOV A,#1FH;   选择9位温度分辨率
  138.            LCALL WRITE_1820
  139.            RET

  140. ; 读出转换后的温度值
  141. GET_TEMPER: SETB DQ; 定时入口
  142.             LCALL INIT_1820
  143.             JB FLAG1,TSS2
  144.             RET; 若DS18B20不存在则返回
  145. TSS2:       MOV A,#0CCH; 跳过ROM匹配
  146.             LCALL WRITE_1820
  147.             MOV A,#44H; 发出温度转换命令
  148.             LCALL WRITE_1820
  149.             MOV R0,#50;等待A/D转换结束,12位的话750us
  150.             LCALL DELAY
  151.             LCALL INIT_1820
  152.             MOV A,#0CCH; 跳过ROM匹配
  153.             LCALL WRITE_1820
  154.             MOV A,#0BEH; 发出读温度命令
  155.             LCALL WRITE_1820
  156.             LCALL READ_18200
  157.             MOV TEMPER_NUM,A; 将读出的温度数据保存
  158.             RET
  159.                        
  160. ; 读DS18B20的程序,从DS18B20中读出一个字节的数据
  161. READ_1820:         MOV R2,#8
  162. RE1:                 CLR C
  163.             SETB  DQ
  164.             NOP
  165.             NOP
  166.             CLR DQ
  167.             NOP
  168.             NOP
  169.             NOP
  170.             SETB DQ
  171.             MOV R3,#7
  172.             DJNZ R3,$
  173.             MOV C,DQ
  174.             MOV R3,#23
  175.             DJNZ R3,$
  176.             RRC A
  177.             DJNZ R2,RE1
  178.             RET
  179.                        
  180. ; 写DS18B20的程序                       
  181. WRITE_1820: MOV R2,#8
  182.             CLR C
  183. WR1:                 CLR DQ
  184.             MOV R3,#6
  185.             DJNZ R3,$
  186.             RRC A
  187.             MOV DQ,C
  188.             MOV R3,#23
  189.             DJNZ R3,$
  190.             SETB DQ
  191.             NOP
  192.             DJNZ R2,WR1
  193.             SETB DQ
  194.             RET
  195.                        
  196. ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
  197. READ_18200:        MOV R4,#2; 将温度高位和低位从DS18B20中读出
  198.             MOV R1,#36H; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
  199. RE00:                MOV R2,#8
  200. RE01:                CLR C
  201.             SETB DQ
  202.             NOP
  203.             NOP
  204.             CLR DQ
  205.             NOP
  206.             NOP
  207.             NOP
  208.             SETB DQ
  209.             MOV R3,#7
  210.             DJNZ R3,$
  211.             MOV C,DQ
  212.             MOV R3,#23
  213.             DJNZ R3,$
  214.             RRC A
  215.             DJNZ R2,RE01
  216.             MOV @R1,A
  217.             DEC R1
  218.             DJNZ R4,RE00
  219.             RET
  220.                        
  221. ; 将从DS18B20中读出的温度数据进行转换
  222. TEMPER_COV: MOV A,#0F0H
  223.             ANL A,TEMPER_L; 舍去温度低位中小数点后的四位温度数值
  224.             SWAP A
  225.             MOV TEMPER_NUM,A
  226.             MOV A,TEMPER_L
  227.             JNB ACC.3,TEMPER_COV1; 四舍五入去温度值
  228.             INC TEMPER_NUM
  229. TEMPER_COV1:MOV A,TEMPER_H
  230.             ANL A,#07H
  231.             SWAP A
  232.             ORL A,TEMPER_NUM
  233.             MOV TEMPER_NUM,A; 保存变换后的温度数据
  234.             LCALL BIN_BCD
  235.             RET
  236. ; 将16进制的温度数据转换成压缩BCD码
  237. BIN_BCD:         MOV DPTR,#TEMP_TAB
  238.             MOV A,TEMPER_NUM
  239.             MOVC A,@A+DPTR
  240.             MOV TEMPER_NUM,A
  241.                         RET
  242. TEMP_TAB:        DB 00H,01H,02H,03H,04H,05H,06H,07H
  243.             DB 08H,09H,10H,11H,12H,13H,14H,15H
  244.             DB 16H,17H,18H,19H,20H,21H,22H,23H
  245.             DB 24H,25H,26H,27H,28H,29H,30H,31H
  246.             DB 32H,33H,34H,35H,36H,37H,38H,39H
  247.             DB 40H,41H,42H,43H,44H,45H,46H,47H
  248.             DB 48H,49H,50H,51H,52H,53H,54H,55H
  249.             DB 56H,57H,58H,59H,60H,61H,62H,63H
  250.             DB 64H,65H,66H,67H,68H,69H,70H,71H
  251.                         DB 72H,73H,74H,75H,76H,77H,78H,79H
  252.             DB 80H,81H,82H,83H,84H,85H,86H,87H
  253.             DB 88H,89H,90H,91H,92H,93H,94H,95H
  254.             DB 96H,97H,98H,99H
  255.                                
  256. T2_10:      MOV B,#16
  257.             DIV AB
  258.             MOV SJSW,A;SJSW中存放温度的十位数
  259.             MOV SJGW,B;SJGW中存放温度的个位数
  260.             RET
  261.     DISPLAY:PUSH ACC              ;保存ACC
  262.             PUSH PSW
  263.             MOV A, TEMPER_NUM
  264.             LCALL T2_10
  265.                          
  266.             MOV A, SJGW
  267.             MOV DPTR,# XSTAB     ;取得数据
  268.             MOVC A, @A+DPTR     ;提取字模
  269.             MOV P0,A              ;显示温度的个位数
  270.                    SETB P1.0
  271.                         CLR P1.1
  272.                         CLR P1.2
  273.             ACALL DS1MS         ;调用显示1ms延时程序
  274.             
  275.             MOV A,SJSW
  276.             MOVC A, @A+DPTR    ;提取字模
  277.             MOV P0,A             ;显示温度的十位数
  278.                    CLR P1.0
  279.                         CLR P1.1
  280.                         CLR P1.2
  281.             CALL DS1MS           ;显示1ms
  282.             
  283.             POP PSW
  284.             POP ACC              ;出栈
  285.             RET                  ;返回调用
  286. XSTAB:                 DB 3FH,06H,5BH,4FH
  287.             DB 66H,6DH,7DH,07H
  288.             DB 7FH,6FH,77H,7CH
  289.                 DB 39H,5EH,79H,71H
  290. ;//*****************************************//
  291.                        
  292.                        
  293.                        


  294. SCAN_KEY:
  295.                         MOV P2,#0EH
  296.                         MOV A,P2
  297.                         ANL A,#0EH
  298.                         XRL A,#0EH
  299.                         JZ NO_KEY
  300.                         ACALL DELAY1
  301.                         MOV P2,#0EH
  302.                         MOV A,P2
  303.                         ANL A,#0EH
  304.                         XRL A,#0EH
  305.                         JZ NO_KEY
  306.                         MOV R2,#11011111B
  307. SCAN:                MOV A,R2
  308.                         MOV P2,A
  309.                         MOV A,P2
  310.                         ANL A,#00001110B
  311.                         MOV R3,A
  312.                         CJNE A,#0EH,KEY_PRSD
  313.                         MOV A,R2
  314.                         RL A
  315.                         MOV R2,A
  316.                         XRL A,#11111110B
  317.                         JNZ SCAN
  318. NO_KEY:                MOV KEY,#0FFH
  319.                         RET
  320. KEY_PRSD:        MOV A,R2
  321.                         ANL A,#11100000B
  322.                         ORL A,R3
  323.                         MOV R4,A
  324.                         MOV KEY,#00H
  325.                         MOV DPTR,#KEY_TAB
  326. CAL_VAL:        MOV A,KEY
  327.                         MOVC A,@A+DPTR
  328.                         XRL A,R4
  329.                         JZ FIXED
  330.                         INC KEY
  331.                         SJMP CAL_VAL
  332. FIXED:                MOV A,P2
  333.                         ANL A,#0EH
  334.                         XRL A,#0EH
  335.                         JNZ FIXED
  336.                         ACALL DELAY1
  337.                         MOV A,P2
  338.                         ANL A,#0EH
  339.                         XRL A,#0EH
  340.                         JNZ FIXED                       
  341. KEY_TAB:        DB 66H,6AH,6CH,0A6H,0AAH,0ACH,0C6H,0CAH,0CCH


  342. ;延时1ms
  343. DELAY1:                MOV        R6,#10
  344. D10:                MOV        R7,#100
  345.                         DJNZ        R7,$
  346.                         DJNZ        R6,D10
  347.                         RET
  348. DS1MS:                 MOV R1,#10
  349. DSLLO:                 MOV R2,#100
  350.             DJNZ R2,$
  351.             DJNZ R1,DSLLO
  352.             RET                  ;延时返回

  353.                                
  354. DELAY:
  355. LOOP:                MOV R1,#06H
  356. LOOP1:                DJNZ R1,LOOP1
  357.                         DJNZ R0,LOOP
  358.                         RET

  359. ;500毫秒延时子程序
  360. DELAY500:        MOV R4,#248
  361. DA222:                MOV R5,#248
  362.             DJNZ R5,$
  363.             DJNZ R4,DA222
  364.             RET
  365. ;显示程序
  366. ;*********************主函数*********************
  367. MAIN:                CLR                DIS_FLAG
  368.                         MOV                DPTR,#TABLE
  369.                         MOV                HOUR,#0                                                ;初始化
  370.                         MOV                MINUTE,#0
  371.                         MOV                SECOND,#0
  372.                         MOV                TCNT,#0
  373.                         MOV                TMOD,#01H
  374.                         MOV                TH0,#(65536-50000)/256                ;定时50毫秒
  375.                         MOV                TL0,#(65536-50000);MOD 256
  376.                         MOV                IE,#82H
  377.                         SETB        TR0
  378.                         ACALL        DS18B20
  379. MAIN_LOOP:        ACALL        SCAN_KEY
  380.                         MOV                R0,KEY
  381.                        
  382. ;按键处理程序,所有的都加载这下面
  383.                         CJNE        R0,#0FFH,NEXT0
  384.                         AJMP        NEXT10
  385.                        
  386. NEXT0:                CJNE        R0,#0,NEXT1
  387.                         CPL                DIS_FLAG
  388.                         AJMP        NEXT10
  389.                        
  390. NEXT1:                CJNE        R0,#1,NEXT2
  391.                         INC                HOUR
  392.                         MOV                A,HOUR
  393.                         CJNE        A,#24,BACK1       
  394.                         MOV                HOUR,#0
  395. BACK1:                AJMP        NEXT10
  396.                        
  397. NEXT2:                CJNE        R0,#2,NEXT3
  398.                         INC                MINUTE
  399.                         MOV                A,MINUTE
  400.                         CJNE        A,#60,BACK2
  401.                         MOV                MINUTE,#0
  402. BACK2:                AJMP        NEXT10
  403.                        
  404. NEXT3:                CJNE        R0,#3,NEXT4

  405. NEXT4:                CJNE        R0,#4,NEXT5

  406. NEXT5:                CJNE        R0,#5,NEXT6

  407. NEXT6:                CJNE        R0,#6,NEXT7

  408. NEXT7:                CJNE        R0,#7,NEXT8

  409. NEXT8:                CJNE        R0,#8,NEXT9

  410. NEXT9:                CJNE        R0,#9,NEXT10


  411. NEXT10:                JB                DIS_FLAG,TEM;什么都没按下
  412.                         ACALL        DISPLAY1;显示时间
  413.                         AJMP        MAIN_LOOP
  414. TEM:                ACALL        TEMPER        ;显示温度
  415.                         AJMP        MAIN_LOOP
  416.                         END
复制代码

程序51hei提供下载:
温度+时间程序模板.zip (33.57 KB, 下载次数: 23)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:763147 发表于 2020-5-28 15:51 | 只看该作者
这相当于一个框架,只需要在框架内加入自己的程序就可以,有较好的扩展性
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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