51单片机+DS18B20温控保温汇编程序

发布者:真情相伴最新更新时间:2015-06-19 来源: 51hei关键字:51单片机  DS18B20  温控保温 手机看文章 扫描二维码
随时随地手机看文章
;DS18B20和AT89C2051制作的热水器程序!两位数码管显示温度,设定温度时数码管成闪烁状态,延时几秒后跳转到被测温度;DS18B20的正电源就是红线接+5伏,兰线接地,黄线接P3.2,红线和黄线之间接一个4.7K的上拉电阻
;这是关于DS18B20的读写程序,数据脚P3.2,晶振12MHz
;温度传感器18B20汇编程序,采用器件默认的12位转化,最大转化时间750微秒
;可以将检测到的温度直接显示到AT89C2051的p1口输数码管段码到两位一体数码管上
;显示温度00到99度,很准确哦~~无需校正!
;p3.1驱动加热管装置,让温度保温在0-99度内
;p3.0保温指示灯,p3.4是温度设定按键加1度;p3.5是温度设定按键减1度,p3.7是数码管高位位码,p3.3是数码管低位位码
;程序16进制的温度值放在29h里,我用可调节0度到99度的16进制值(#08H/#0EH)与之比较
;1至40度的16进制为:01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH     1-10度
;                   0BH 0CH 0DH 0EH 0FH 10H 11H 12H 13H 14H     11-20度
;                   15H 16H 17H 18H 19H 1AH 1BH 1CH 1DH 1EH     21-30度
;                   1FH 2OH 21H 22H 23H 24H 25H 26H 27H 28H     31-40度
;                   29H 2AH 2BH 2CH 2DH 2EH 2FH 30H 31H 32H     41-50度
;                   33H 34H 35H 36H 37H 38H 39H 3AH 3BH 3CH     51-60度
;                   3CH 3DH 3EH 3FH 40H 41H 42H 43H 44H 45H     61-70度
;                   46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH     71-80度
;                   51H 52H 53H 54H 55H 56H 57H 58H 59H 5AH     81-90度
;                   5BH 5CH 5DH 5EH 5FH 60H 61H 62H 63H 64H     91-100度
;=========================================================================================
;单片机内存分配申明!
       TEMPER_L EQU 29H          ;用于保存读出温度的低8位
       TEMPER_H EQU 28H          ;用于保存读出温度的高8位(特别是可位寻址,程序中用的着哦)
       TIAO_H   EQU 27H       ;用于保存设定温度的数据(最低温度的设定,高温度为低温度加2度)
       FLAG1 EQU 38H             ;是否检测到DS18B20标志位
       a_bit equ 20h             ;数码管个位数存放内存位置
       b_bit equ 21h             ;数码管十位数存放内存位置
       SL   EQU  22H            ;设定温度时数码管个位数存放内存位置
       SH   EQU  23H             ;设定温度时数码管十位数存放内存位置
       sdwd  equ 24h            ;设定温度压缩BCD码位
      DS18B20 BIT P3.2        ;定义DS18B20的数据脚为P3.2端口
       ORG 0000H
       MOV sdwd,#25H         ;;;;设定初始温度37度,上电后内部设定温度
  MAIN:LCALL INIT_1820           ;调用复位DS18B20子程序
MAIN1:LCALL GET_TEMPER          ;调用读温度子程序
;进行温度显示,这里我是用两位数码管来显示温度,显示范围00到99度,显示精度为1度
;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位
;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度
;这个转化温度的方法可是我想出来的哦~~非常简洁无需乘于0.0625系数
       MOV A,29H
       MOV C,40H                 ;将28H中的最低位移入C
       RRC A
       MOV C,41H
       RRC A
       MOV C,42H
       RRC A
       MOV C,43H
       RRC A
       MOV 29H,A
       LCALL DISPLAY             ;调用数码管显示子程序
;这里是后加的,做为控制在0-99度内恒温的程序!p3.1驱动加热管装置
      setb p3.4
      setb p3.5
      jnb p3.4,DD1             ;按下后转加1程序
      jnb p3.5,DD2             ;按下后转减1程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TT:     CLR C                    ;比较转换值与设定值
       MOV 26H,sdwd              ;把低温度设定保存到26H单元后减2度,作为低度的数据
       DEC 26H
        MOV A,29H
        CJNE A,26H,LOOP1        ;下限设定温度度,不相等跳LOOP1
        SJMP HOTTING             ;与下限值相等跳HOTTING,加热
  LOOP1:JC  HOTTING              ;温度小于下限值跳HOTTING,加热
        MOV A,29H                ;温度大于下限值,与上限值比较
        CLR C
     mov  27h,sdwd
     inc 27h
        CJNE A,27h,LOOP2        ;上限设定温度度,不相等跳LOOP2
        SJMP STOPHOT             ;相等跳STOPHOT,停止加热 
  LOOP2:JNC STOPHOT              ;温度大于上限值跳STOPHOT,停止加热
        SJMP KEEP                ;温度小于上限且大于下限值跳KEEP,保温
HOTTING:CLR P3.1                 ;小,加热器驱动
        setb p3.0                ;关闭保温灯
   KEEP:SJMP MAIN              ;返回,保持原态,保温
STOPHOT:SETB P3.1                ;关闭加热器
        clr p3.0                ;点亮保温灯
        AJMP MAIN                ;反回主程序
;;;;;;;;;;;;;;;;;;;;;按键处理;;;;;;;;;;;;
;;;;;加限设定温度度;;;;;;;;;;
DD1:LCALL  displa             ;调用数码管闪烁设定显示子程序
    mov r5,#30
    JNB P3.4,DD1
    mov a,sdwd               ;把设定温度送累加器判断
cjne a,#62h,ty1               ;比较设定温度是否到99度,不是则加
  ajmp dh2
ty1: INC sdwd
dh2:jnb p3.4,DD1
      jnb p3.5,DD2             ;按下后转减1程序
     LCALL  displa             ;调用数码管闪烁设定显示子程序
    djnz r5,dh2
   LJMP  TT
;;;减限设定温度度;;;;;;;;;;;;
DD2:LCALL  displa             ;调用数码管闪烁设定显示子程序
    mov r5,#30
    JNB P3.5,DD2
    mov a,sdwd               ;把设定温度送累加器判断
cjne a,#01h,ty               ;比较设定温度是否到0度,不是则减
  ajmp dh1
ty: DEC sdwd
dh1:jnb p3.5,DD2
      jnb p3.4,DD1             ;按下后转加1程序
    LCALL  displa             ;调用数码管闪烁设定显示子程序
    djnz r5,dh1
   LJMP  TT
;=========================================================================================
; DS18B20复位初始化程序
INIT_1820:SETB DS18B20
          NOP
          CLR DS18B20
          MOV R0,#06BH          ;主机发出延时537微秒的复位低脉冲
          MOV R1,#03H
     TSR1:DJNZ R0,TSR1
          MOV R0,#6BH
          DJNZ R1,TSR1
          SETB DS18B20             ;然后拉高数据线
          NOP
          NOP
          NOP
          MOV R0,#25H
     TSR2:JNB DS18B20,TSR3         ;等待DS18B20回应
          DJNZ R0,TSR2
          LJMP TSR4             ;延时
     TSR3:SETB FLAG1            ;置标志位,表示DS1820存在
          LJMP TSR5
     TSR4:CLR FLAG1             ;清标志位,表示DS1820不存在
          LJMP TSR7
     TSR5:MOV R0,#06BH
     TSR6:DJNZ R0,TSR6          ;时序要求延时一段时间
     TSR7:SETB DS18B20
          RET
;=========================================================================================
; 读出转换后的温度值
GET_TEMPER:SETB DS18B20            ;定时入口
           LCALL INIT_1820      ;先复位DS18B20
           JB FLAG1,TSS2
           RET                  ;判断DS1820是否存在?若DS18B20不存在则返回
      TSS2:MOV A,#0CCH          ;跳过ROM匹配
           LCALL WRITE_1820
           MOV A,#44H           ;发出温度转换命令
           LCALL WRITE_1820
           LCALL DISPLAY        ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒.
           LCALL INIT_1820      ;准备读温度前先复位
           MOV A,#0CCH          ;跳过ROM匹配
           LCALL WRITE_1820
           MOV A,#0BEH          ;发出读温度命令
           LCALL WRITE_1820
           LCALL READ_18200     ;将读出的温度数据保存到35H/36H
           RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:MOV R2,#8            ;一共8位数据
           CLR C
       WR1:CLR DS18B20
           MOV R3,#6
           DJNZ R3,$
           RRC A
           MOV DS18B20,C
           MOV R3,#23
           DJNZ R3,$
           SETB DS18B20
           NOP
           DJNZ R2,WR1
           SETB DS18B20
           RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:MOV R4,#2          ;将温度高位和低位从DS18B20中读出
           MOV R1,#29H        ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
      RE00:MOV R2,#8
      RE01:CLR C
           SETB DS18B20
           NOP
           NOP
           CLR DS18B20
           NOP
           NOP
           NOP
           SETB DS18B20
           MOV R3,#09
      RE10:DJNZ R3,RE10
           MOV C,DS18B20
           MOV R3,#23
      RE20:DJNZ R3,RE20
           RRC A
           DJNZ R2,RE01
           MOV @R1,A
           DEC R1
           DJNZ R4,RE00
           RET[page]
;=========================================================================================
;;;;;;;;;;;;;;;显示子程序;;;;;;;;;;;;;;;;;;
display:mov a,29H            ;将29H中的十六进制数转换成10进制
        mov b,#10            ;10进制/10=10进制
        div ab
        mov b_bit,a          ;十位在a
        mov a_bit,b          ;个位在b
        mov dptr,#numtab     ;指定查表启始地址
        mov r1,#250          ;显示250次
  dplop:mov a,a_bit          ;取个位数
        MOVC A,@A+DPTR       ;查个位数的7段代码
        mov p1,a             ;送出个位的7段代码
        clr p3.3             ;开个位显示
        acall d1ms           ;显示1ms
        setb p3.3
        mov a,b_bit          ;取十位数
        MOVC A,@A+DPTR       ;查十位数的7段代码
        mov p1,a             ;送出十位的7段代码
        clr p3.7            ;开十位显示
        acall d1ms           ;显示1ms
        setb p3.7
        djnz r1,dplop        ;250次没完循环
        RET
;;;===============================================================
;;;;;;;闪烁设定显示子程序=====================
displa:   MOV A,sdwd
        mov b,#10            ;10进制/10=10进制
        div ab
        mov SL,a          ;十位在a
        mov SH,b          ;个位在b
        mov r1,#250          ;显示250次
dpl2:  mov a,SL          ;取设定温度个位数
        mov dptr,#numtab     ;指定查表启始地址
        MOVC A,@A+DPTR       ;查个位数的7段代码
        mov p1,a             ;送出个位的7段代码
        clr p3.7            ;开个位显示
        acall d1ms           ;显示1ms
        setb p3.7
        mov a,SH          ;取设定温度十位数
        MOVC A,@A+DPTR       ;查十位数的7段代码
        mov p1,a             ;送出十位的7段代码
        clr p3.3           ;开十位显示
        acall d1ms           ;显示1ms
        setb p3.3
        djnz r1,dpl2        ;250次没完循环
        acall D1s           ;显示1ms
        RET
;;=========================================================================================
;1MS延时(按12MHZ算)
   D1MS:MOV R7,#80
        DJNZ R7,$
        RET
;;1S延时(按12MHZ算)
  D1s:MOV R7,#255
     l1:nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        nop
        DJNZ R7,l1
        RET
;=========================================================================================
numtab:         DB        0EEH;0
        DB        048H;1
        DB        0D6H;2
        DB        0DCH;3
        DB        078H;4
        DB        0BCH;5
        DB        0BEH;6
        DB        0C8H;7
        DB        0FEH;8
        DB        0FCH;9

END
关键字:51单片机  DS18B20  温控保温 引用地址:51单片机+DS18B20温控保温汇编程序

上一篇:STC51单片机SPI接口单主单从模式通信-汇编语言
下一篇:89s51和89s52不同晶振之间通信实验

推荐阅读最新更新时间:2024-03-16 14:04

51单片机学习笔记2.动态数码管的使用
原理图 内容 74HC138译码器 数码管 公共端 - 位选线 连在一起的段线 - 段选线 通过控制在不同位选线 不同的段选线通电(段选数据不同)以达到在不同位置显示不同数字的目的 具体看单片机原理图即可 动态显示其实一个时刻只点亮一个数字,在24ms内点亮下一个就会看成是同时亮的 代码 首先是一段转码用的 u8 code smgduan ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//最高位为小数点,如果需要点亮小数点只需 | (0x80)或是 | 128 然后是显示用的函数
[单片机]
<font color='red'>51单片机</font>学习笔记2.动态数码管的使用
C语言在8051单片机上的扩展
直接访问寄存器和端口 定义 sfr P0 0x80 sfr P1 0x81 sfr ADCON; 0xDE sbit EA 0x9F 操作 ADCON = 0x08 ; P1 = 0xFF ; io_status = P0 ; EA = 1 ; 在使用了interrupt 1 关键字之后,会自动生成中断向量 在 ISR中不能 与其他 后台循环代码 (the background loop code) 共享局部变量 因为 连接器 会复用 在RAM中这些变量的 位置 ,所以它们会有不同的意义,这取决于当前使用的不同的函数 复用变量对 RAM有
[单片机]
51单片机控制SL811HS的USB主机底层驱动
引言 基于USB接口的设备使用方便,性价比高,因此在人们的工作和生活中得到了广泛的应用,如U盘,移动硬盘,光驱,USB摄像头,USB鼠标键盘等,同时,51系列单片机以其成熟的技术和高性价比吸引了大量国内用户,被广泛应用于测控和自动化领域,因此,如果在51单片机系统中增加USB主机接口,实现对USB从机设备的控制,则该单片机系统可以充分利用现有的各种USB从机设备,大大扩展单片机系统功能。 本设计实现了在51单片机系统中增加USB主机功能,采用普通51单片机外接专用USB接口芯片的方案,这种方案虽然会使系统传输速度受到限制,而且在稳定性有所欠缺,但此方案设计灵活性高,且易于移植,为低成本产品的开发提供了广阔前景,设计中采用51单
[单片机]
51单片机学习笔记———13.2DS1302实时时钟代码部分(1)
代码: 实验序列:11.1 实验任务: 向DS1302中写入初始校准时间,然后不断从DS1302中读出时间并显示 实现现象:程序运行后动态数码管显示初始时间:23-59-50,并不断更新显示 硬件接线:同动态数码管一节要求。 注意事项:(1) DS1302的SPI接口用到了P3.4、P3.5、P3.6,若程序运行有问题查 硬件问题时可以从这三个引脚复用部分查起 (2) DS1302的初始化时间是随便给的,之所以给23.59.50,是为了在10 秒后即可看到24.59.59到00.00.00的跳变。 (3) DS1302寄存器读写的函数编写时要注意时序和LSB这2个要点。 ***
[单片机]
51单片机的MODBUS C语言程序(从机)
#include reg52.h typedef unsigned char uint8 typedef unsigned int uint16 uint8 sendCount; uint8 receCount; uint8 sendPosi; //字地址 0 - 255 (只取低8位) //位地址 0 - 255 (只取低8位) /// CRC 高位字节值表 /// const uint8 code auchCRCHi = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
[单片机]
51单片机汇编DS1302实时时钟课程设计
实时时钟课题要求: 实时时钟系统设计 1、用 1 个拨动开关设定“工作状态”和“设置状态”; 2、“设置状态”下,用 4 个独立按键实现时间设置:“+”“-”、“移位”、“确认”, 对年(2 位)、月、日、时、分、秒进行每 1 位的数值设置; 3、采用 DS1302 时钟芯片,采用 LCD 进行时钟显示 Proteus7.8仿真效果如下: 汇编代码如下: /*******************************实时时钟实验(Zidone)*************************************************/ /***********LCD12864相关定义***************
[单片机]
<font color='red'>51单片机</font>汇编DS1302实时时钟课程设计
89c51单片机编程环境布置
第一步,使用Professional 的isis7连接模拟电路 第二步,根据电路引脚的使用情况,用keil uVision4编写调试源程序 第三步,代码调试无误,回到isis7中,将代码下载到模拟硬件中。运行查看。 具体做法:右击单片机AT89c51,选择最底下的Add/Remove source files,出现下图: 其中Code Generation Tool从下拉列表选择ASEM51,source code filename调整目录选择自己的源码,点击ok即可完成软件下载到硬件。 第四步:运行,查看效果。单击左下角三角图标:
[单片机]
MCS-51单片机的中断系统(1)
在CPU 与外设交换信息时,存在着一个快速的 CPU 与慢速的外设之间的矛盾。为解决这个问题,发展了中断的概念。 单片机在某一时刻只能处理一个任务,当多个任务同时要求单片机处理时,这一要求应该怎么实现呢?通过中断可以实现多个任务的资源共享。 中断现象在现实生活中也会经常遇到,例如,你在看书 手机响了 你在书上作个记号 你接通电话和对方聊天 谈话结束 从书上的记号处继续看书。这就是一个中断过程。通过中断,你一个人在一特定的时刻,同时完成了看书和打电话两件事情。用计算机语言来描述,所谓的中断就是,当 CPU 正在处理某项事务的时候,如果外界或者内部发生了紧急事件,要求 CPU 暂停正在处理工作而去处理这个紧急事件,待处理
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved