找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数字式温度计实验(18B20、ZLG7290)源程序

[复制链接]
跳转到指定楼层
楼主
ID:293603 发表于 2018-3-18 16:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
数字式温度计实验(18B20ZLG7290)
  1. ; **************主程序(MAIN.ASM)***********************
  2. ; 向DS18B20发出温度转换信号,延时等待,读出温度;将温度值由十六进制转换成十进制数,使用8155控制LED显示温度
  3.   TEMPER_L        EQU        29H                  ;用于保存读出温度的低8位
  4.   TEMPER_H        EQU        28H                ;用于保存读出温度的高8位
  5.   TIAO_H        EQU     27H             ;用于保存设定温度的数据
  6.   ;FLAG1        EQU     38H             ;是否检测到DS18B20标志位
  7.   buffer        EQU        35H                ;温度临时存放区
  8.   ;a_bit        EQU     20H             ;数码管个位数存放内存位置
  9.   ;b_bit        EQU     21H             ;数码管十位数存放内存位置
  10.   SL            EQU     22H             ;设定温度时数码管个位数存放内存位置
  11.   SH            EQU     23H             ;设定温度时数码管十位数存放内存位置
  12.   sdwd          EQU     24H             ;设定温度压缩BCD码位
  13.      DQ         BIT     P3.0                ;数据输入/输出端
  14.           ORG   0000H
  15.           AJMP  MAIN0
  16.           ORG   0100H
  17. MAIN0:   MOV   SP,#70H
  18.           MOV   A,#89H       ;           ;8155方式控制字0DH(A、C口输出,B口输入)送累加器A
  19.           MOV   DPTR,#0F003H
  20.           MOVX  @DPTR,A
  21.           MOV   sdwd, #25H              ;设定初始温度37度,上电后内部设定温度
  22. MAIN1:   LCALL        BH_DISBCD
  23.           LCALL KEY
  24.           JNB  00H,MAIN1
  25.           CLR 00H
  26. MAIN2:   LCALL        START_Temperature       ;向DS18B20发送读温度指令
  27.           LCALL        DelayTime        
  28.           LCALL        RD_Temperature                ;读出温度值,并转换为BCD码
  29.           MOV        TEMPER_L,B                ;温度个位,小数位数据
  30.           MOV        TEMPER_H,A              ;温度十位数据
  31.          ;LCALL DIS_BCD                 ;提取温度数据,转换为非压缩型BCD码,并显示
  32.           LCALL        BH_DISBCD
  33.           LCALL KEY
  34.           LCALL TContral
  35.           AJMP        MAIN2        
  36. ;**********************************************************
  37. ; 判断DS18B20是否存在,启动DS18B20           ;CY为判断标志
  38.   START_Temperature: SETB   DQ        
  39.                      ACALL  INIT_18B20        ;先复位DS18B20
  40.                      JC            GET_T0        
  41.                      MOV    A,#0CCH        ;跳过ROM匹配
  42.                      LCALL  WRITE_18B20        
  43.                      MOV    A,#44H        ;发出温度转换命令
  44.                      LCALL  WRITE_18B20        
  45.                      CLR    C        
  46.              GET_T0: RET               
  47. ;***********************************************************
  48. ; 读出转换后的温度值,保存于:A-高8位数据,B-低8位数据
  49. RD_Temperature:LCALL        INIT_18B20        ;准备读温度前先复位
  50.                 JC        GET_T1
  51.                 MOV        A,#0CCH                ;跳过ROM匹配
  52.                 LCALL        WRITE_18B20        
  53.                 MOV        A,#0BEH                ;发出读温度命令
  54.                 LCALL        WRITE_18B20        
  55.                 LCALL        READ_18B20        ;读出温度
  56.                 MOV        B,A                ;存放到A,B中
  57.                 LCALL        READ_18B20        
  58.         GET_T1: RET
  59. ;***********************************************************
  60. ;  DS18B20温度转换/显示
  61.    DIS_BCD:  MOV       R0,#buffer+3         ;设置显示内容存放区首地址        
  62.              MOV       @R0,#10H                 ;正数
  63.              MOV       A,TEMPER_H         
  64.              JNB       ACC.3,DIS_BCD1         ;判断温度是否为负
  65.              MOV       @R0,#11H                 ;负数
  66.              CPL       A         
  67.              XCH       A,TEMPER_L        
  68.              CPL       A        
  69.              ADD       A,#1        
  70.              XCH       A,TEMPER_L        
  71.              ADDC      A,#0        
  72.    DIS_BCD1: ANL       A,#0FH                 ;将温度整数位转换为ASCII
  73.              MOV       B,A        
  74.              MOV       A,TEMPER_L        
  75.              ANL       A,#0F0H        
  76.              ORL       A,B                 ;将温度的个位与十位BCD合在一起
  77.              SWAP      A        
  78.              MOV       B,#10        
  79.              DIV       AB        
  80.              JNZ       DIS_BCD2                 ;判断温度的十位是否为0进行相应处理
  81.              MOV       A,#10H                 ;十位为0
  82.              XCH       A,@R0        
  83.              DEC       R0        
  84.              MOV       @R0,A        
  85.              SJMP      DIS_BCD3        
  86.    DIS_BCD2: DEC       R0        
  87.              MOV       @R0,A        
  88.    DIS_BCD3: DEC       R0
  89.              MOV       A,B
  90.              ;ORL      A,#80H                 ;小数点
  91.              MOV       @R0,A
  92.              DEC       R0        
  93.              MOV       A,TEMPER_L        ;转换小数部分
  94.              ANL       A,#0FH        
  95.              MOV       B,A        
  96.              CLR       A        
  97.              JNB       B.0, DIS_BCD4        
  98.              MOV       A,#6        
  99.    DIS_BCD4: JNB       B.1, DIS_BCD5        
  100.              ADD       A,#12H        
  101.              DA               A        
  102.    DIS_BCD5: JNB       B.2, DIS_BCD6        
  103.              ADD       A,#25H        
  104.              DA        A        
  105.    DIS_BCD6: JNB       B.3, DIS_BCD7        
  106.              ADD       A,#50H        
  107.              DA        A        
  108.    DIS_BCD7: SWAP      A        
  109.              ANL       A,#0FH        
  110.              MOV       @R0,A        
  111.              MOV       R0,#buffer+4         ;显示数据首地址
  112.              MOV       @R0,#10H        
  113.              INC       R0        
  114.              MOV       @R0,#10H        
  115.              INC       R0        
  116.              MOV       @R0,#10H        
  117.              INC       R0        
  118.              MOV       @R0,#10H        
  119.              MOV       R0,#buffer        
  120.              LCALL     Display        
  121.              RET
  122. ;***********************************************************
  123. ;DS18B20温度转换/显示
  124. BH_DISBCD: MOV A,TEMPER_L            ;
  125.             MOV C,40H                 ;将28H中的最低位移入C(28H.0-C)
  126.             RRC A
  127.             MOV C,41H
  128.             RRC A
  129.             MOV C,42H
  130.             RRC A
  131.             MOV C,43H
  132.             RRC A
  133.             MOV TEMPER_L,A           ;新字节29H是实际测量的温度
  134.             LCALL BCDBHDA
  135.             LCALL Display
  136.             RET
  137. ;***********************************************************
  138. TContral: CLR C                      ;比较转换值与设定值
  139.            MOV 26H,sdwd               ;把温度设定保存到26H单元后减2度,作为低度的数据
  140.            DEC 26H
  141.            MOV A,TEMPER_L
  142.            CJNE A,26H,LOOP1           ;下限设定温度,不相等跳LOOP1
  143.            LJMP HOTTING               ;与下限值相等跳HOTTING,加热
  144.     LOOP1: JC HOTTING                 ;温度小于下限值跳HOTTING,加热
  145.            MOV A,TEMPER_L             ;温度大于下限值,与上限值比较
  146.            CLR C
  147.            MOV 27H,sdwd
  148.            INC 27H
  149.            CJNE A,27H,LOOP2           ;上限设定温度,不相等跳LOOP2
  150.            SJMP STOPHOT               ;相等跳STOPHOT,停止加热 
  151.     LOOP2: JNC STOPHOT                ;温度大于上限值跳STOPHOT,停止加热
  152.            SJMP KEEP                  ;温度小于上限且大于下限值跳KEEP,保温
  153.   HOTTING: CLR  P1.0                  ;小,加热器驱动
  154.            SETB P1.1                  ;关闭保温灯
  155.     KEEP:  SJMP BACK                  ;返回,保持原态,保温
  156.   STOPHOT: SETB P1.0                  ;关闭加热器
  157.            CLR  P1.1                  ;点亮保温灯           
  158.    BACK:   RET
  159. ;***********************************************************
  160. ;键盘响应子程序
  161. KEY:    MOV DPTR,#0F002H
  162.          MOVX A,@DPTR                  ;读列线状态
  163.          ORL A,#0F0H
  164.          CJNE A,#0FFH,NEXT1        
  165.   SS:    RET
  166.   NEXT1: LCALL D10ms
  167.          MOV DPTR,#0F002H               ;指向8255C口
  168.          MOVX A,@DPTR
  169.          ORL A,#0F0H
  170.          CJNE A,#0FFH,NEXT2
  171.          LJMP SS
  172.   NEXT2: MOV R3,#4
  173.          MOV DPTR,#0F002H
  174.          MOV R4,#00H
  175.          MOVX A,@DPTR
  176.   NEXT3: RRC A
  177.          JNC NEXT4
  178.          INC R4
  179.          DJNZ R3,NEXT3
  180.          LJMP SS
  181.   NEXT4: MOVX A,@DPTR                 ;等待键释放
  182.          ORL A,#0F0H
  183.          CJNE A,#0FFH,NEXT4
  184.          MOV DPTR,#TAB               ;指向按键转移指令表首地址
  185.          MOV A,R4
  186.          RL A         
  187.          JMP @A+DPTR
  188. TAB:    AJMP KEY0
  189.          AJMP KEY1
  190.          AJMP KEY2
  191.          AJMP KEY3
  192.          ;AJMP KEY4
  193.          ;AJMP KEY5
  194.          ;AJMP KEY6
  195.          ;AJMP KEY7
  196. ;*********************************
  197. ;按下KEY0后转加1程序
  198. KEY0: MOV R5,#30H
  199.        LCALL Displa
  200.        MOV A,sdwd               ;把设定温度送累加器判断
  201.        CJNE A,62H,JIA0          ;比较设定温度是否到99度,不是则加            
  202.        MOV sdwd,#00H
  203.        LJMP JIA1      
  204. JIA0: INC sdwd
  205. JIA1: LCALL Displa
  206.        DJNZ R5,JIA1
  207.        LJMP SS
  208. ;*************************
  209. KEY1: MOV R5,#30H
  210.        LCALL Displa
  211.        MOV A,sdwd               ;把设定温度送累加器判断
  212.        CJNE A,01H,JIAN0         ;比较设定温度是否到0度,不是则减            
  213.        MOV sdwd,#62H
  214.        LJMP JIAN1      
  215. JIAN0:DEC sdwd
  216. JIAN1:LCALL Displa
  217.        DJNZ R5,JIAN1
  218.        LJMP SS
  219. ;*************************   
  220. KEY2: SETB 00H
  221.        LJMP SS
  222. ;*************************   
  223. KEY3: LJMP SS
  224. ;***********************************************************
  225.    ;DS18B20复位初始化子程序
  226.    INIT_18B20:        SETB        DQ
  227.                 NOP                        
  228.                 CLR        DQ                 ;主机发出501us的复位低脉冲
  229.                        MOV        R7,#250        
  230.                 DJNZ        R7,$
  231.                 SETB        DQ                 ;拉高数据线
  232.                 MOV        R7,#30        
  233.           TSR:        JNB        DQ,TSR1                 ;等待DS18B20回应
  234.                 DJNZ        R7,TSR        
  235.                 SETB        C                 ;置位标志位,表示DS18B20不存在
  236.                 RET               
  237.           TSR1: CLR        C                  ;复位标志位,表示DS18B20存在
  238.                 MOV        R7,#250        
  239.                 DJNZ        R7,[        DISCUZ_CODE_2        ]nbsp;                ;时序要求延时一段时间
  240.                 RET
  241. ;***************************************************************               
  242.   ;DS18B20写操作
  243.   WRITE_18B20:        MOV        R7,#8                 ;一共8位数据
  244.                 CLR        C        
  245.           WRI:        NOP               
  246.                 CLR        DQ        
  247.                 MOV        R6,#3        
  248.                 DJNZ        R6,[        DISCUZ_CODE_2        ]nbsp;      
  249.                 RRC        A        
  250.                 MOV        DQ,C        
  251.                 MOV        R6,#26        
  252.                 DJNZ        R6,[        DISCUZ_CODE_2        ]nbsp;      
  253.                 SETB        DQ        
  254.                 DJNZ        R7,WRI
  255.                 SETB        DQ        
  256.                 RET               
  257. ;****************************************************************  
  258.   ;DS18B20读操作
  259.   READ_18B20:        MOV    R7,#8                 ;数据一共有8位
  260.        READ1:        CLR    DQ
  261.                 NOP
  262.                 NOP
  263.                 SETB   DQ
  264.                 NOP               
  265.                 MOV    R6,#3        
  266.                 DJNZ   R6,[        DISCUZ_CODE_2        ]nbsp;      
  267.                 MOV    C,DQ        
  268.                 MOV    R6,#26        
  269.                 DJNZ   R6,[        DISCUZ_CODE_2        ]nbsp;      
  270.                 RRC    A        
  271.                 DJNZ   R7,READ1        
  272.                 RET               
  273.         
  274. ;******************************************************************
  275. BCDBHDA: MOV R0,#buffer
  276.          MOV A,TEMPER_L      ;将29H中的十六进制数转换成10进制
  277.          MOV B,#10           ;10进制/10=10进制
  278.          DIV AB
  279.          MOV @R0,B           ;个位在buffer(35H)
  280.          INC R0
  281.          MOV @R0,A           ;十位在buffer+1(36H)
  282. ;*************************
  283.          INC R0
  284.          MOV A,sdwd
  285.          MOV B,#10           ;10进制/10=10进制
  286.          DIV AB
  287.          MOV @R0,B           ;个位在buffer+2(37H)
  288.          INC R0
  289.          MOV @R0,A           ;十位在buffer+3(38H)           
  290.          RET
  291. ;******************************************************************
  292. Display: MOV R0,#buffer
  293.          MOV R7,#04H          ;----1显示子程序开始
  294.          MOV R1,#60H          ;60H 61H(62H 63H)存放测量(设定)温度个位、十位段码
  295. DISP0:   MOV A,@R0            
  296.          MOV DPTR,#TABLE
  297.          MOVC A,@A+DPTR
  298.          MOV @R1,A
  299.          INC R0
  300.          INC R1
  301.          DJNZ R7,DISP0
  302. ;*****************************
  303.        MOV R7,#04H         
  304.        MOV R0,#60H
  305.        MOV R3,#0FEH
  306. DISP1: MOV DPTR,#0F001H     ;指定字位码入口地址:8155的C口
  307.        MOV A,R3
  308.        MOVX @DPTR,A      
  309.        RL  A
  310.        MOV R3,A
  311.        MOV DPTR,#0F000H     ;指定字型码入口地址:8155的A口
  312.        MOV A,@R0
  313.        MOVX @DPTR,A     
  314.        INC R0
  315.        LCALL DELAY                 
  316.        DJNZ R7,DISP1
  317.        RET                 ;----1显示子程序结束
  318. ;******************************************************************
  319. ;;闪烁设定显示
  320. Displa: MOV A,sdwd
  321.         MOV B,#10            ;10进制/10=10进制
  322.         DIV AB
  323.         MOV SL,B             ;十位在b
  324.         MOV SH,A             ;个位在a
  325.         MOV R1,#250          ;显示250次
  326. dpl2:   MOV A,SL             ;取设定温度个位数
  327.         MOV DPTR,#TABLE      ;指定查表启始地址
  328.         MOVC A,@A+DPTR       ;查个位数的7段代码
  329.         MOV DPTR,#0F000H
  330.         MOVX @DPTR,A         ;送出个位的7段代码
  331.         MOV DPTR,#0F001H  
  332.         MOV A,#0FBH
  333.         MOVX @DPTR,A         ;开个位显示                 
  334.         ACALL D1ms           ;显示1ms
  335.         MOV A,#0FFH
  336.         MOVX @DPTR,A                    
  337.         MOV  A,SH            ;取设定温度十位数
  338.         MOV DPTR,#TABLE      ;指定查表启始地址
  339.         MOVC A,@A+DPTR       ;查十位数的7段代码
  340.         MOV DPTR,#0F000H
  341.         MOVX @DPTR,A         ;送出十位的7段代码
  342.         MOV DPTR,#0F001H  
  343.         MOV A,#0F7H
  344.         MOVX @DPTR,A         ;开十位显示
  345.         ACALL D1ms           ;显示1ms
  346.         MOV A,#0FFH
  347.         MOVX @DPTR,A                  
  348.         DJNZ  R1,dpl2        ;250次没完循环
  349.         RET
  350. TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
  351. ;******************************************************************
  352. ;延时程序
  353. DelayTime:        PUSH        07H
  354.                 PUSH        06H
  355.                 PUSH        05H
  356.                 MOV        R7,#1
  357. DelayTime_1:        MOV        R6,#1
  358. DelayTime_2:        MOV        R5,#0
  359.                 DJNZ        R5,$
  360.                 DJNZ        R6,DelayTime_2
  361.                 DJNZ        R7,DelayTime_1
  362.                 POP        05H
  363.                 POP        06H
  364.                 POP        07H
  365.                 RET
  366. ;*************************************************
  367. DELAY: NOP
  368.        MOV R6,#2          ;----2延时子程序开始
  369. DEL2:  MOV R5,#0FFH
  370. DEL1:  NOP
  371.        NOP
  372.        DJNZ R5, DEL1
  373.        DJNZ R6, DEL2
  374.        RET                     
  375. ;*************************************************
  376. D10ms: MOV R5,#20
  377. DL:   MOV R6,#0FFH
  378. DL0:  DJNZ R6,DL0
  379.        DJNZ R5,DL
  380.        RET
  381. ;*************************************************
  382. D1ms: MOV R7,#1
  383.        DJNZ R7,$
  384.        RET
  385. ;*************************************************      
  386.        END

复制代码


新建 Microsoft Word 文档.docx

22.28 KB, 下载次数: 6, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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