单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DS18B20智能温度控制器设计-汇编语言源程序带详细注释

[复制链接]
跳转到指定楼层
楼主

以前做了一个设计,抽到的题目是智能温度控制器,要求是汇编语言实现,
并且要在开发板上进行实物验证。
(本代码已在实验室验证,一定可行)
具体程序代码、内容、要求等都在word里面。
该系统在超过设定的温度上限或者低于其下限的时候会亮灯报警。
此设计为原创设计。
仿真图如图所示。
希望大家多多鼓励。谢谢。

设计任务: 采用DS18B20温度传感器和AT89S52单片机及显示电路完成环境温度的实时显示。
⒈ 数字温度计的总体方案设计
⑴系统总体结构
数字温度计的系统框图。
⑵芯片选择
⑶DS18B20主要性能指标
⒉硬件电路设计
⑴AT89S52单片机最小系统
⑵DS18B20与AT89S52单片机接口电路设计
⑶显示电路与AT89S52单片机接口电路设计
⒊软件设计
⑴主程序框图
⑵DS18B20温度采集程序框图
⑶显示程序框图
⒋调试与测试结果分析
⑴实验系统连线图
⑵程序调试
⑶实验结果分析
⒌程序清单和系统原理图


附录:单片机程序及设计电路(有比较详细的中文注释)
DQ     BIT        P1.0               ;DS18B20数据位   
FLAG1  BIT        00H                   ;DS18B20是否存在的标志位        
SIGN      BIT        01H                   ;符号位      
MSB       EQU        30H               ;转换数据高位字节   
LSB    EQU        31H                   ;转换数据低位字节
INTEG    EQU        32H               ;转换数据整数部分   
DECIM    EQU        33H               ;转换数据小数部分
SEG_S    EQU        34H               ;符号位段码
SEG_I3    EQU        35H               ;整数部分的百位段码
SEG_I2    EQU        36H               ;整数部分的十位段码
SEG_I1    EQU        37H               ;整数部分的个位段码
SEG_D1    EQU        38H               ;小数部分的段码
            ORG    0000H
MAIN:        CLR P1.1               ;正常运行指示灯亮
            LCALL    INIT_1820      ;DS18B20初始化
            LCALL    GET_TEMPER  ;读取转换数据
            LCALL   COMPARE       ;判断是否超出设定温度范围
            LCALL    DATA_PROC    ;数据处理
            LCALL    SEG_GEN       ;生成显示码
            LCALL    DISPLAY       ;数码显示
            SJMP    MAIN
;DS18B20复位初始化子程序(单总线)
INIT_1820:  SETB     DQ
            NOP
            CLR        DQ               ;主机发出延时复位低脉冲
            MOV     R1,#3
TSR1:        MOV     R0,#107
            DJNZ     R0,$
            DJNZ     R1,TSR1        ;延时651微秒
            SETB     DQ               ;拉高数据线
            NOP
            NOP
            NOP                   ;延时3微秒
            MOV     R0,#25H
TSR2:       JNB     DQ,TSR3       ;等待DS18B20回应
            DJNZ     R0,TSR2           ;延时并检测应答信号,148微秒
            LJMP     TSR4         
TSR3:       SETB     FLAG1            ;置标志位,表示DS1820存在
            LJMP     TSR5
TSR4:        CLR     FLAG1            ;清标志位,表示DS1820不存在
            LJMP     TSR6
TSR5:        MOV     R0,#117
            DJNZ     R0,$             ;时序要求延时一段时间,234微秒
TSR6:        SETB     DQ
            RET                    
;读出转换后的温度值
GET_TEMPER:
SETB     DQ   
LCALL     INIT_1820        ;先复位DS18B20
JB     FLAG1,TSS2         
RET                      ;判断DS1820是否存在
TSS2:       MOV     A,#0CCH         ;跳过ROM匹配
LCALL     WRITE_1820
MOV     A,#44H           ;发出温度转换命令   
LCALL     WRITE_1820
LCALL     DELAY             ;等待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     DQ
            MOV     R3,#6
            DJNZ     R3,$
            RRC     A
            MOV     DQ,C
            MOV     R3,#23
            DJNZ     R3,$
            SETB     DQ
            NOP                       ;两个写周期至少需要1微秒的恢复时间
            DJNZ     R2,WR1
            SETB     DQ
            RET        
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:MOV     R4,#2                ;将温度高位和低位从DS18B20中读出
MOV     R1,#31H            ;低位存入31H,高位存入30H
RE00:       MOV     R2,#8               ;数据一共有8位
RE01:        CLR     C
            SETB     DQ
            NOP
            NOP
            CLR     DQ
            NOP
            NOP
            NOP
            SETB     DQ
            MOV     R3,#9
RE10:       DJNZ     R3,RE10
            MOV     C,DQ
            MOV     R3,#23
            DJNZ     R3,$
            RRC     A
            DJNZ     R2,RE01
            MOV     @R1,A
            DEC     R1
            DJNZ     R4,RE00
            RET
;数据处理子程序,判断正负,并分离转换值的整数和小数部分
;符号位为SIGN,0为正,1为负
;整数部分存放在INTEG(32H)中,小数部分存放在DECIM(33H)中
;先判断转换数据的正负
DATA_PROC:    CLR    C             ;清零进位位
            CLR    SIGN        ;清零符号位
            MOV    A,MSB     ;将DS18B20转换数据的高位字节给8位累加器
            RLC    A             ;将累加器A带进位的左移,把MSB的最高位给C
            JC    NEG         ;判断符号位,C=1说明为负数,跳转到NEG   
            LJMP    PROC    ;C=0说明为正数,跳转到PROC
;下面对负数进行取补码
NEG:        CLR    C             ;清零进位位
            SETB    SIGN    ;将符号位置1,表示负数
            MOV    A,LSB     ;将DS18B20转换数据的低位字节给8位累加器
            CPL    A             ;累加器A的8位取反
            ADD    A,#1         ;取反后加1
            MOV    LSB,A     ;再将取反后的补码给LSB
            MOV    A,MSB     ;同理将MSB进行取补码
            CPL    A
            ADDC    A,#0     ;此处应注意LSB是否向MSB进位
            MOV    MSB,A
;下面分离转换值的整数和小数部分
;DS18B20为转换数据为16位,其中,高字节的高5位为温度符号位,
;高字节的低3位+低字节的高4位为温度的整数部分,低字节的低4位为温度的小数部分
PROC:       MOV    A,LSB              
            ANL    A,#0FH     ;保留低字节的低4位
            MOV    DECIM,A ;将小数部分存储在DECIM   
            MOV    A,MSB   
            SWAP    A         ;累加器A中高低4位互换
            ANL    A,#0F0H     ;保留高字节的低4位
            MOV    INTEG,A
            MOV    A,LSB
            SWAP    A
            ANL    A,#0FH      ;保留低字节的高4位
            MOV    R0,INTEG
            ORL    A,R0      ;高字节的低4位加上低字节的高4位
            MOV    INTEG,A      ;得到的整数部分存储在INTEG   
            RET
;下面对设置温度上限与下限,超过范围将点亮报警灯
COMPARE:  PUSH ACC
            CLR C
            MOV A, #28         ;设置温度上限
            SUBB A,INTEG   ;温度上限减去整数部分
            JC Z1               ;若超过温度上限,则跳转到Z1
               MOV A,#26         ;设置温度下限
            SUBB A,INTEG   ;温度下限减去整数部分
            JNC Z1             ;若低于温度下限,则跳转到Z1
            CLR C           
            SETB P1.2         ;若在上下限之间,则不点亮报警灯
            POP ACC
            RET
Z1:         CLR C           
            CLR P1.2         ;点亮报警灯
            POP ACC
            RET
;生成显示码子程序
;符号位段码存放在SEG_S中,整数段码存放在SEG_I3到SEG_I1中
;小数部分段码存放在SEG_D1中
SEG_GEN:    MOV    DPTR,#TABLE     ;将0到9的数码段的段首地址给DPTR
            JB    SIGN,S_NEG             ;判断符号位,若为负数,跳转至S_NEG
            MOV    SEG_S,#0FFH     ;若为正数,则符号位数码段都不亮
            SJMP    S_INT
S_NEG:        MOV    SEG_S,#0BFH     ;若为负数,则符号位数码段显示“-”
S_INT:        MOV    A,INTEG
            MOV    B,#100
            DIV    AB                   ;A除以B,商放在A中,商即为整数部分的百位数
            MOVC    A,@A+DPTR     ;将百位数的段码给A
            MOV    SEG_I3,A        ;得到百位数段码,存储在SEG_I3
;下面同理得到十位数的段码
            MOV    A,B
            MOV    B,#10
            DIV    AB
            MOVC    A,@A+DPTR
            MOV    SEG_I2,A   
            MOV    A,B
            MOVC A,@A+DPTR
            ANL  A,#7FH             ;加上小数点
            MOV    SEG_I1,A      ;得到十位数的段码
;下面通过散转程序得到小数的段码
            MOV    DPTR,#SWITCH
            MOV    A,DECIM
            MOV    B,DECIM         
            ADD    A,B              ;AJMP指令占用2个字节
            JMP    @A+DPTR          ;间接转移指令,根据小数值查表,求段码
SWITCH:    AJMP    K0
            AJMP    K1
            AJMP    K2
            AJMP    K3
            AJMP    K4
            AJMP    K5
            AJMP    K6
            AJMP    K7
            AJMP    K8
            AJMP    K9
            AJMP    K10
            AJMP    K11
            AJMP    K12
            AJMP    K13
            AJMP    K14
            AJMP    K15
K0:            MOV    SEG_D1,#0C0H
            AJMP    RETURN            
K1:            MOV    SEG_D1,#0F9H
            AJMP    RETURN
K2:            MOV    SEG_D1,#0F9H
            AJMP    RETURN        
K3:            MOV    SEG_D1,#0A4H
            AJMP    RETURN
K4:            MOV    SEG_D1,#0B0H
            AJMP    RETURN            
K5:            MOV    SEG_D1,#0B0H
            AJMP    RETURN
K6:            MOV    SEG_D1,#99H
            AJMP    RETURN            
K7:            MOV    SEG_D1,#99H
            AJMP    RETURN
K8:            MOV    SEG_D1,#92H
            AJMP    RETURN            
K9:            MOV    SEG_D1,#82H
            AJMP    RETURN
K10:        MOV    SEG_D1,#82H
             AJMP    RETURN            
K11:            MOV    SEG_D1,#0F8H
            AJMP    RETURN
K12:        MOV    SEG_D1,#80H
            AJMP    RETURN            
K13:        MOV    SEG_D1,#80H
            AJMP    RETURN
K14:        MOV    SEG_D1,#90H
            AJMP    RETURN            
K15:        MOV    SEG_D1,#90H
            AJMP    RETURN
RETURN:        JNB    SIGN,RETURN1  ;若为正数则跳转至RETURN1
            MOV    SEG_I3,#0BFH  ;若为负数,则百位数将显示“-”   
RETURN1:      RET
;显示子程序,首位为符号位,三位整数,1位小数
DISPLAY:    MOV     SP,#80H
            MOV     P2,#0FFH
            MOV     DPTR,#0FF23H   ;指向8255的控制字寄存器
            MOV     A,#81H         ;设置8255的PA、PB为输出,PC为输入
            MOVX    @DPTR,A        ;写8255控制字寄存器
XS1:        MOV     DPTR,#0FF21H   ;指向8255的PB口(七段码)
            MOV     A,SEG_I3          ;百位的七段码
            MOVX    @DPTR,A        ;通过8255的PB口送出七段码
            MOV     DPTR,#0FF20H   ;位选地址(PA)
            MOV     A,#0DFH        ;左边第1个数码管的位选
            MOVX    @DPTR,A           ;点亮选择左边第一个数码管
            CALL    DELAY            ;调用延时子程序
;下面相同原理进行位选数码管
XS2:        MOV     DPTR,#0FF21H   
            MOV     A,SEG_I2       ;十位的七段码
            MOVX    @DPTR,A        
            MOV     DPTR,#0FF20H
            MOV     A,#0EFH        ;左边第2个数码管的位选
            MOVX    @DPTR,A        
            CALL    DELAY
XS3:        MOV     DPTR,#0FF21H   
            MOV     A,SEG_I1       ;个位的七段码
            MOVX    @DPTR,A         
            MOV     DPTR,#0FF20H
            MOV     A,#0F7H        ;左边第3个数码管的位选   
            MOVX    @DPTR,A         
            CALL    DELAY
XS4:        MOV     DPTR,#0FF21H     
            MOV     A,SEG_D1       ;小数的七段码  
            MOVX    @DPTR,A         
            MOV     DPTR,#0FF20H
            MOV     A,#0FBH        ;左边第4个数码管的位选  
            MOVX    @DPTR,A           
            CALL    DELAY
XS5:        MOV     DPTR,#0FF21H      
            MOV     A,#9CH         ;"℃"的小圆圈的七段码   
            MOVX    @DPTR,A           
            MOV     DPTR,#0FF20H
            MOV     A,#0FDH        ;左边第5个数码管的位选   
            MOVX    @DPTR,A         
            CALL    DELAY
XS6:        MOV     DPTR,#0FF21H      
            MOV     A,#0C6H        ;"℃"的“C“的七段码   
            MOVX    @DPTR,A            
            MOV     DPTR,#0FF20H
            MOV     A,#0FEH        ;左边第6个数码管的位选
            MOVX    @DPTR,A         
            CALL    DELAY
;延时子程序
DELAY:
            MOV R1,#5        
D2:         MOV R2,#120      
            DJNZ R2,$
            DJNZ R1,D2
            RET
;0到9数字的数码段段码
TABLE:         DB 0C0H,0F9H,0A4H,0B0H,99H   
            DB 92H,82H,0F8H,80H,90H
END

完整的Word格式文档51黑下载地址:
课设报告.doc (68.5 KB, 下载次数: 6)



评分

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

查看全部评分

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

使用道具 举报

沙发
tieq1952 发表于 2019-9-14 13:21 | 只看该作者
谢谢分享!!!
回复

使用道具 举报

板凳
zrl1021 发表于 2019-9-19 08:55 | 只看该作者
请问有仿真图和PCB图嘛
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51Hei单片机16群 联系QQ:125739409;技术交流QQ群7344883

Powered by 单片机教程网

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