找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+DS18B20仓库温湿度控制器汇编语言源程序

[复制链接]
跳转到指定楼层
楼主
设计基本要求
(1) 设计仓库温度检测控制器的硬件电路和控制程序,实现如下功能。
(2) 该仓库温度检测控制器可以检测仓库内的温度,并对其进行控制。
(3) 能实现通过键盘对仓库温度上下限的设定。
(4) 在仓库温度低于温度下限时,启动加热器加热,同时报警。
(5) 在仓库温度高于温度上下时,启动风机降温,同时报警。
(6) 能显示各个测温点的温度和仓库的平均温度。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. ;



  2.           TEMP_ZH   DATA  24H     ;实时温度值存放单元
  3.           TEMPL     DATA  25H     ;
  4.           TEMPH     DATA  26H     ;
  5.           TEMP_TH   DATA  27H     ;高温报警值存放单元
  6.           TEMP_TL   DATA  28H     ;低温报警值存放单元
  7.           TEMPHC    DATA  29H     ;
  8.           TEMPLC    DATA  2AH

  9.           K1     EQU  P3.4
  10.           K2     EQU  P3.5
  11.           K3     EQU  P3.6
  12.           K4     EQU  P3.7

  13.           BEEP   EQU  P1.0
  14.           RELAY  EQU  P1.3
  15.           LCD_X     EQU  2FH      ;LCD 地址变量
  16.           LCD_RS    EQU  P2.5
  17.           LCD_RW    EQU  P2.6
  18.           LCD_EN    EQU  P2.7
  19.           flag1     equ  20H.0    ;DS18B20是否存在标记
  20.           KEY_UD    EQU  20H.1    ;设定 KEY 的UP与DOWN 标记
  21.           date_line equ p2.0
  22. ;=====================================================
  23.            ORG  0000H
  24.            JMP  MAIN

  25. MAIN:     MOV  SP,#60H
  26.           MOV  A,#00H
  27.           MOV  R0,#20H       ;将 20H-2FH 单元清零
  28.           MOV  R1,#10H
  29. CLEAR:    MOV  @R0,A
  30.           INC  R0
  31.           DJNZ  R1,CLEAR

  32.           CALL  SET_LCD
  33.           CALL  RE_18B20

  34. start:    CALL  RESET          ;18B20复位子程序
  35.           JNB   FLAG1,START1   ;DS1820不存在
  36.           CALL  MENU_OK
  37.           CALL  READ_E2
  38.           CALL  TEMP_BJ        ;显示温度标记
  39.           JMP   START2
  40. START1:   CALL  MENU_ERROR
  41.           CALL  TEMP_BJ        ;显示温度标记
  42.           JMP  $

  43. START2:
  44.           CALL  RESET
  45.           JNB  FLAG1,START1    ;DS1820不存在
  46.           MOV   A,#0CCH        ; 跳过ROM匹配
  47.           CALL  WRITE
  48.           MOV   A,#44H         ; 发出温度转换命令
  49.           CALL  WRITE
  50.           CALL  RESET
  51.           MOV   A,#0CCH        ; 跳过ROM匹配
  52.           CALL  WRITE
  53.           MOV   A,#0BEH        ; 发出读温度命令
  54.           CALL  WRITE
  55.           CALL  READ
  56.           call CONVTEMP
  57.           Call DISPBCD
  58.           CALL CONV
  59.           CALL TEMP_COMP
  60.           CALL  PROC_KEY       ; 键扫描

  61.           SJMP        START2
  62. ;-----------------------------------------------------
  63. PROC_KEY:
  64.          JB  K1,PROC_K1                  ; 按键K1处理
  65.          CALL  BEEP_BL
  66.          JNB  K1,$
  67.          MOV  DPTR,#M_ALAX1
  68.          MOV  A,#1
  69.          CALL  LCD_PRINT
  70.          CALL  LOOK_ALARM
  71.          JB  K3,$
  72.          CALL  BEEP_BL
  73.          JMP  PROC_K2
  74. PROC_K1:                          ; 按键K2处理
  75.          JB  K2,PROC_END
  76.          CALL  BEEP_BL
  77.          JNB  K2,$
  78.          MOV   DPTR,#RESET_A1
  79.          MOV   A,#1
  80.          CALL  LCD_PRINT
  81.          CALL  SET_ALARM
  82.          CALL  RE_18B20           ;将设定的TH,TL值写入DS18B20内
  83.          CALL  WRITE_E2
  84. PROC_K2:
  85.          CALL  MENU_OK
  86.          CALL  TEMP_BJ
  87. PROC_END:
  88.          RET
  89. ;============================================
  90. ;设定报警值 TH、TL
  91. ;============================================
  92. SET_ALARM:
  93.          ;CALL  RESET_ALARM
  94.          CALL  LOOK_ALARM
  95. AS0:
  96.          JB   K1,AS00
  97.          CALL  BEEP_BL
  98.          JNB  K1,$
  99.          CPL  20H.1            ;UP/DOWN 标记
  100. AS00:    JB  20H.1,ASZ01       ;20H.1=1,UP
  101.          JMP  ASJ01            ;20H.1=0,DOWN

  102. ASZ01:   JB  K2,ASZ02          ;TH值调整(增加)
  103.          CALL  BEEP_BL
  104.          INC  TEMP_TH
  105.          MOV  A,TEMP_TH
  106.          CJNE  A,#120,ASZ011
  107.          MOV  TEMP_TH,#0
  108. ASZ011:  CALL  LOOK_ALARM
  109.          MOV  R5,#10
  110.          CALL  DELAY
  111.          JMP  ASZ01

  112. ASZ02:   JB  K3,ASZ03          ;TL值调整(增加)
  113.          CALL  BEEP_BL
  114.          INC  TEMP_TL
  115.          MOV  A,TEMP_TL
  116.          CJNE  A,#99,ASZ021
  117.          MOV  TEMP_TL,#00H
  118. ASZ021:  CALL  LOOK_ALARM    ;
  119.          MOV  R5,#10
  120.          CALL  DELAY
  121.          JMP  ASZ02
  122. ASZ03:   JB  K4,AS0          ;确定调整 OK
  123.          CALL  BEEP_BL
  124.          JNB  K4,$
  125.          RET

  126. ASJ01:
  127.          JB  K2,ASJ02          ;TH值调整 (减少)
  128.          CALL  BEEP_BL
  129.          DEC   TEMP_TH
  130.          MOV  A,TEMP_TH
  131.          CJNE  A,#0FFH,ASJ011
  132.          JMP  ASJ022
  133. ASJ011:  CALL  LOOK_ALARM
  134.          MOV  R5,#10
  135.          CALL  DELAY
  136.          JMP  AS0

  137. ASJ02:   JB  K3,ASJ03         ;TL值调整(减少)
  138.          CALL  BEEP_BL
  139.          DEC  TEMP_TL
  140.          MOV  A,TEMP_TL
  141.          CJNE  A,#0FFH,ASJ021
  142.          JMP  ASJ022
  143. ASJ021:  CALL  LOOK_ALARM    ;
  144.          MOV  R5,#10
  145.          CALL  DELAY
  146.          JMP  AS0
  147. ASJ022:  CPL  20H.1
  148.          JMP  ASZ01
  149. ASJ03:   JMP  ASZ03
  150.          RET


  151. RESET_ALARM:
  152.           MOV  DPTR,#RESET_A1  ;指针指到显示信息区
  153.           MOV  A,#1            ;显示在第一行
  154.           CALL  LCD_PRINT
  155.           RET
  156. RESET_A1:
  157.      DB  "RESET ALERT CODE"
  158. ;====================================================
  159. ;实际温度值与标记温度值比较子程序
  160. ;====================================================
  161. TEMP_COMP:
  162.           MOV  A,TEMP_TH      
  163.           SUBB  A,TEMP_ZH       ;减数>被减数,则
  164.           JC  CHULI1            ;借位标志位C=1,转
  165.           MOV  A,TEMP_ZH
  166.           SUBB  A,TEMP_TL       ;减数>被减数,则
  167.           JC  CHULI2            ;借位标志位C=1,转
  168.           MOV  DPTR,#BJ5
  169.           CALL  TEMP_BJ3
  170.           CLR   RELAY           ;继电器吸合
  171.           RET
  172. CHULI1:
  173.           MOV  DPTR,#BJ3
  174.           CALL  TEMP_BJ3
  175.           SETB  RELAY           ;继电器关闭
  176.           CALL  BEEP_BL
  177.           RET
  178. CHULI2:
  179.           MOV  DPTR,#BJ4
  180.           CALL  TEMP_BJ3
  181.           CALL  BEEP_BL
  182.           RET
  183. ;-----------------------------------------
  184. TEMP_BJ3:
  185.           MOV  A,#0CEH
  186.           CALL WCOM
  187.           MOV  R1,#0
  188.           MOV  R0,#2

  189. BBJJ3:    MOV  A,R1
  190.           MOVC A,@A+DPTR
  191.           CALL  WDATA
  192.           INC R1
  193.           DJNZ  R0,BBJJ3
  194.           RET
  195. BJ3:
  196.       DB  ">H"
  197. BJ4:
  198.       DB  "<L"
  199. BJ5:
  200.       DB  " R"
  201. ;==================================================
  202. ;显示温度标记子程序
  203. ;==================================================
  204. TEMP_BJ:
  205.           MOV  A,#0CBH
  206.           CALL WCOM
  207.           MOV  DPTR,#BJ1  ;指针指到显示消息
  208.           MOV  R1,#0
  209.           MOV  R0,#2

  210. BBJJ1:    MOV  A,R1
  211.           MOVC A,@A+DPTR
  212.           CALL  WDATA
  213.           INC R1
  214.           DJNZ  R0,BBJJ1
  215.           RET
  216. BJ1:
  217.       DB  00H,"C"
  218. ;=================================================
  219. MENU_OK:

  220.           MOV  DPTR,#M_OK1  ;指针指到显示消息
  221.           MOV  A,#1          ;显示在第一行
  222.           CALL  LCD_PRINT
  223.           MOV  DPTR,#M_OK2  ;指针指到显示消息
  224.           MOV  A,#2          ;显示在第一行
  225.           CALL  LCD_PRINT

  226.           RET
  227. M_OK1:
  228.     DB   "   DS18B20 OK   ",0
  229. M_OK2:
  230.     DB   " TEMP:          ",0
  231. ;-----------------------------------------------
  232. MENU_ERROR:
  233.           MOV  DPTR,#M_ERROR1  ;指针指到显示消息1
  234.           MOV  A,#1          ;显示在第一行
  235.           CALL  LCD_PRINT
  236.           MOV  DPTR,#M_ERROR2  ;指针指到显示消息1
  237.           MOV  A,#2          ;显示在第一行
  238.           CALL  LCD_PRINT
  239.           RET
  240. M_ERROR1:
  241.     DB   " DS18B20 ERROR  ",0
  242. M_ERROR2:
  243.     DB   " TEMP: ----     ",0
  244. ;====================================================
  245. reset:  setb date_line
  246.         nop
  247.         clr date_line
  248.         mov r0,#6bh         ;主机发出延时复位低脉冲
  249.         mov r1,#04h
  250. tsr1:   djnz r0,$
  251.         mov r0,#6bh
  252.         djnz r1,tsr1
  253.         setb date_line        ;然后拉高数据线
  254.         nop
  255.         nop
  256.         nop
  257.         mov r0,#32h
  258. tsr2:   jnb date_line,tsr3   ;等待DS18B20回应
  259.         djnz r0,tsr2
  260.         jmp tsr4             ; 延时
  261. tsr3:   setb flag1           ; 置标志位,表示DS1820存在
  262.         jmp tsr5
  263. tsr4:   clr flag1            ; 清标志位,表示DS1820不存在
  264.         jmp tsr7
  265. tsr5:   mov r0,#06bh
  266. tsr6:   djnz r0,$            ; 时序要求延时一段时间
  267. tsr7:   setb date_line
  268.         ret
  269. ;=======================================================
  270. RE_18B20:
  271.         JB  FLAG1,RE_18B20A
  272.         RET
  273. RE_18B20A:
  274.         CALL  RESET
  275.         MOV  A,#0CCH       ;跳过ROM匹配
  276.         LCALL  WRITE
  277.         MOV  A,#4EH        ;写暂存寄存器
  278.         LCALL  WRITE
  279.         MOV  A,TEMP_TH     ;TH(报警上限)
  280.         LCALL  WRITE
  281.         MOV  A,TEMP_TL     ;TL(报警下限)
  282.         LCALL  WRITE
  283.         MOV  A,#7FH        ;12位精确度
  284.         LCALL  WRITE
  285.         RET
  286. ;------------------------------------------------------------
  287. WRITE_E2:
  288.         CALL  RESET
  289.         MOV  A,#0CCH        ;跳过ROM匹配
  290.         LCALL  WRITE
  291.         MOV  A,#48H         ;把暂存器里的温度报警值拷贝到EEROM
  292.         LCALL  WRITE
  293.         RET
  294. ;--------------------------------------------------------------
  295. READ_E2:
  296.         CALL  RESET
  297.         MOV  A,#0CCH        ;跳过ROM匹配
  298.         LCALL  WRITE
  299.         MOV  A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器
  300.         CALL  WRITE
  301.         RET
  302. ;--------------------------------------------------------------
  303. ;将自定义字符写入LCD1602的CGRAM中
  304. ;--------------------------------------------------------------
  305. STORE_DATA:
  306.         MOV  A,#40H
  307.         CALL  WCOM
  308.         MOV  R2,#08H
  309.         MOV  DPTR,#D_DATA
  310.         MOV  R3,#00H
  311. S_DATA:
  312.         MOV  A,R3
  313.         MOVC  A,@A+DPTR
  314.         CALL  WDATA      ;写入数据
  315.         INC  R3
  316.         DJNZ  R2,S_DATA
  317.         RET

  318. D_DATA:
  319.     DB  0CH,12H,12H,0CH,00H,00H,00H,00H
  320. ;==============================================================
  321. write:  mov r2,#8            ;一共8位数据
  322.         CLR  C
  323. wr1:
  324.         clr date_line        ;开始写入DS18B20总线要处于复位(低)状态
  325.         mov r3,#07
  326.         djnz r3,$            ;总线复位保持16微妙以上
  327.         rrc a                ;把一个字节DATA 分成8个BIT环移给C
  328.         mov date_line,c      ;写入一个BIT
  329.         mov r3,#3CH
  330.         djnz r3,$            ;等待100微妙
  331.         setb date_line       ;重新释放总线
  332.         nop
  333.         djnz r2,wr1          ;写入下一个BIT
  334.         setb date_line
  335.         ret
  336. ;--------------------------------------------------------------------
  337. read:    mov r4,#4          ; 将温度低位、高位、TH、TL从DS18B20中读出
  338.          mov r1,#TEMPL        ; 存入25H、26H、27H、28H
  339. re00:    mov r2,#8
  340. re01:    clr cy
  341.          setb date_line
  342.          nop
  343.          nop
  344.          clr date_line        ;读前总线保持为低
  345.          nop
  346.          nop
  347.          
  348. ……………………

  349. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
源程序.zip (145.36 KB, 下载次数: 62)




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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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