找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机DS18B20测温系统仿真设计-创新性实验结题报告

[复制链接]
跳转到指定楼层
楼主
ID:231567 发表于 2017-9-7 09:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
山东科技大学电工电子实验教学中心

创新性实验结题报告

实验项目名称  _基于Proteus的温度检测_

组长姓名 娄猛__   学号 _2*01417

手机    159*917

成员姓名    ____         学号   _      _  

成员姓名    ____         学号   _      _  

专    业  电子信息工程_    班级 _  09

指导教师及职称 ____吕常智______

开课学期      至_学年_1_学期

提交时间      年1月日




一、实验摘要

根据 DS18B20 的 1-wire 的通信原理,利用单片机汇编(或 C)语言实现一个温度测试并显示的电路,在 Proteus 平台上进行电路设计,并且载入单片机程序进行仿真验证。


、实验目的

掌握虚拟仿真软件 Proteus 的应用,了解温度传感器 DS18B20 的 1-wire 的通信原理,学会采用 Proteus 虚拟仿真软件工具,利用单片机汇编(或 C)语言实现一个温度测试并显示的电路,并且在 Proteus 软件上仿真测试,进行验证,综合实验系统的使用方法,熟悉创新性实验报告的撰写方法。


实验场地及仪器、设备和材料:

实验场地: 院实验室318、424
仪器设备: 计算机一台
软件:   Proteus软件

(1)DS18B20特点:
DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制 功能将无法使用。主要首先提供以下功能命令之一: <1> 读ROM,<2>ROM匹配,<3>搜索ROM,<4>跳过ROM,<5>报警检查。这些指令操作作用在没有一个器件的64位光刻ROM序列号,可以在挂在一线上多个器件选定某一个器件,同时,总线也可以知道总线上挂有有多少,什么样的设备。
若指令成功地使DS18B20完成温度测量,数据存储在DS18B20的存储器。一个控制功能 指挥指示DS18B20的演出测温。测量结果将被放置在DS18B20内存中,并可以让阅读发出记忆功能的指挥,阅读内容的片上存储器。温度报警触发器 TH和TL都有一字节EEPROM 的数据。如果DS18B20不使用报警检查指令,这些寄存器可作为一般的用户记忆用途。在片上还载有配置字节以理想的解决温度数字转换。写TH,TL指令 以及配置字节利用一个记忆功能的指令完成。通过缓存器读寄存器。所有数据的读,写都是从最低位开始。

DS18B20部分命令设置:
命令
名称
作用及解释
0CCH
SKIP ROM命令
这条命令允许总线控制器不用提供 64 位ROM 编码就使用存储器操作命令,在单点总线情况下右以节省时间。如果总线上不止一个从机,在 Skip ROM命令之后跟着发一条读命令,由于多个从机同时传送信号,总线上就会发生数据冲突(漏极开路下拉效果相当于相与)。
4EH
写暂存存储器命令
这个命令向 DS1820 的暂存器中写入数据,开始位置在地址 2。接下来写入的两个字节将被存到暂存器中的地址位置 2 和3。可以在任何时刻发出复位命令来中止写入。
44H
温度转换命令
这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后 DS1820保持等待状态。如果总线控制器在这条命令之后跟着发出读时间隙,而 DS1820 又忙于做时间转换的话,DS1820 将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。
0BEH
读温度命令
这个命令读取暂存器的内容。读取将从字节 0 开始,一直进行下去,直到第 9(字节 8,CRC)字节读完。如果不想读完所有字节,控制器可以在任何时间发出复位命令来中止读取。
0ECH
告警搜索
这条命令的流程图和 Search ROM 相同。然而,只有在最近一次测温后遇到符合报警条件的情况,DS1820才会响应这条命令。报警条件定义为温度高于TH或低于TL。只要 DS1820 不掉电,报警状态将一直保持,直到再一次测得的温度值达不到报警条件。
DS18B20读写时序图:
说明:
主机要生成一个写时间隙,必须把数据线拉到低电平然后释放,在写时间隙开始后的15μs内允许数据线拉到高电平。 主机要生成一个写 0 时间隙,必须把数据线拉到低电平并保持 60μs。
初始化过程“复位和存在脉冲”:
说明:
DS1820 需要严格的协议以确保数据的完整性。协议包括几种单线信号类型:复位脉冲、存在脉冲、写0、写 1、读0 和读1。所有这些信号,除存在脉冲外,都是由总线控制器发出的。 和 DS1820 间的任何通讯都需要以初始化序列开始,一个复位脉冲跟着一个存在脉冲表明 DS1820 已经准备好发送和接收数据(适当的 ROM 命令和存储器操作命令)。



DS18B20温度值格式表:
说明:
  这是12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面 5位是符号位,如果测得的温度大于0, 这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际 温度。 例如+125℃的数字输出为07D0H,+25.0625℃的数字输出为0191H,-25.0625℃的数字输出为FE6FH,-55℃的数字输出为FC90H 。
(2)数码显示:
采用数码管动态显示,通过位控线选择数码管,同时单片机通过查表送出段选送显示的段码,利用人的视觉暂留特点达到显示的目的。
(3)复位电路:
复位电路采用手动复位,实现单片机系统复位。
(4)震荡电路;
为单片机提供恒定可靠的震荡周期。
(5)驱动电路:
由于单片机的驱动能力有限,考虑到数码管的特点,实际应加上驱动电路,以提供合适的电流。
(6)测温开关
给单片机信号,给予其开始测温,关闭测温指示。
(7)Proteus 虚拟仿真
在keil中编写单片机程序,生成相应的.Hex文件,将文件复制到一个文件夹下,在Proteus里添加单片机并设置程序的路径,找到该文件,仿真时就会调用该程序文件。

2、实验内容
根据设计要求设计硬件电路,根据各项指标选择合适的原件,在Proteus原理图中画出原理图。本设计采用六个八段数码段动态显示,硬件电路主要有单片机,复位电路,数码显示,震荡电路,驱动电路,测温开关电路,传感器电路等组成。开机显示“HELLO”友好界面,测温控制开关开始关闭测温,当开关闭合时,处于测温状态,显示的温度值即为真实温度,开关打开时为关闭状态,数码管组显示“OFF”与最后一次测量值的交替显示,警示测温中断,开关再次合上时又进行正常测温。考虑到成本问题单片机选用AT89C52,该单片机为一8位单片机,详细介绍再次就不过多陈述,具体参数参考技术资料。单片机程序采用汇编语言,在Keil环境下编译。

3、实验步骤
(1)根据功能设计硬件电路
<1>数码管显示及其驱动电路:
本设计采用的是6位8段共阳数码管,如下图所示,ABCDEFG个DP分别是数码管的八个段,123456是对应的六个线选线,由于单片机的灌电流能力也不是很强,直接驱动几个数码管有点困难,因此加上了373锁存器,跟7407同向驱动芯片。373锁存p0(开漏输出)口输出的段选信号,P2口是线选信号输出口。P2口虽然内部有上拉电阻,但是由于7407是集电极开路六组驱动器,没有上拉不能输出高电平所以还要加上拉电阻。7407的驱动能力比较强,高电平时输出最大电流可达41mA,而输入高电平电流只需40uA即可,能够满足该六位数码管正常显示。

<2>振荡电路
该振荡电路外部由两个电容C1,C2跟晶振X1组成,如下图连接接地,并接到单片机的XTAL1跟XTAL2引脚上。由于51单片机内部有一个用于构成振荡器的可控高增益反向放大器,两个引脚XTAL1,XTAL2分别是该放大器的输入端跟输出端。按下图所示,就可构成一个自激振荡器,匹配电容根据晶振的要求选取,一般选用20~30pF瓷片电容即可。

<3>复位电路
下图是一个简单手动复位与上电复位的综合复位电路。R2,R3构成手动复位电路,R2一般取1~5KΩ。在实际电路中,当R3=200Ω,R2=800Ω时,按下按键实现可靠复位电压为4V.即Urst=U*R2/(R2+R3)。由于仿真软件的问题,当R2大于1K时,上电后RST引脚不能实现低电平,因此不能满足复位的条件,采用800Ω电阻时能够实现。但实际电路中R2取到1K才能实现可靠的上电复位。(相关公式:Urst=5*e^(-t/τ), τ=R2*C,当复位电压大于等于3V时是可靠复位电压。带入上式,t=τ*ln(5/3) ≈0.15τ,当R2=1KΩ,C=22uF时,t≈11.2ms.即复位时间约为11.2ms。为保证可靠复位,复位时间大于10ms即可。)
<4>测温开关:
测温开关的实现时利用检验其是否存在的原理进而转换显示状态,故可以设置在DS18B20跟单片机相连的路径之间(接在P3.3引脚),开关断开,单片机就会检测不到传感器,转换到关闭测温状态,开关闭合,单片机又能检测到传感器,自动转到测温显示状态。由于DS1820 的单总线端口(I/O 引脚)是漏极开路式的,一个多点总线由一个单线总线和多个挂于其上的从机构成。在发出任何涉及拷贝到 E2存储器或启动温度转换的协议之后,必须在最多 10μs之内把 I/O 线转换到强上拉,因此单线总线需要一个约 5KΩ的上拉电阻。
实际电路如下图所示:

(2)设计单片机程序,画出流程图
通过单线总线端口访问 DS1820 的协议如下:
• 初始化   
• ROM 操作命令   
• 存储器操作命令
• 执行/数据
程序组成:
主程序
子程序:
HELLO与OFF开关显示、DS18B20初始化、重写DB18B20、读温度、温度数值转换等。

主程序流程图:
HELLO与OFF开关显示流程图:

DS18B20初始化流程图:
重写DB18B20流程图:





读温度流程图:
温度数值转换流程图:

(3)编写程序
根据硬件电路编写程序,程序见实验结果部分的程序清单。
(4)仿真调试
在Keil编译环境下编译汇编程序,设置晶振12MHz,生成.Hex文件。打开用Proteus画好的原理图,双击单片机,设置震荡频率12MHz,与硬件电路相对应,浏览找到生成的该程序的.Hex文件作为其程序。设置完成,打开仿真按钮,进行仿真调试,打开闭合测温开关观察现象,调节DS18B20的温度调节部分调节温度,观察数码显示温度值。


、实验结果与分析
1、实验现象、数据记录
当仿真开始时,显示开机界面“HELLO”:
测温时,当测试零下温度时显示零下温度值:
当测试零上温度时显示正的温度值:
当测温开关打开时,显示“OFF”与最后一次测温值交替显示界面:


2、对实验现象、数据及观察结果的分析与讨论:
    开机时显示“HELLO”问候,采用200次动态扫描显示,显示完之后自动转到下面的初始化及测温程序,传感器存在时,进行正常测温,零上温度入上面图示,显示零上温度,无效位消隐,实现方法是每次遍历存储空间,将无效位的段选置空,有效的位用数据填充,小数点另加到倒数第二个数码管的小数点处。当测试零下温度时,数值转换要取反加1,还要在前面加负号,考虑到负数最多显示两位,故将负号固定在倒数第四位,省去了判断的麻烦。当测温开关断开时,由于检测不到DS18B20的存在,故程序转到显示“OFF”界面,由于要不断地检测存在位,所以要循环检测,循环显示,由于时序的原因,会使OFF与最后一次测温结果交替显示。开关闭合,又能检测到标志位,程序自动进入正常测温序列。
3、主要关键和创新点:
  在Proteus仿真环境下,使用DS18B20进行一路测温,测温精度达到到0.5摄氏度开机显示友好界面“HELLO”问候,当测温关闭时,会显示“OFF”提醒,闭合开关,又可以进行正常测温。本设计通过检查存在标志位的方法进行了测温开关的控制,避免了使用中断进行控制,从而避免了中断导致的测温时序混乱,测温不准的结果。

程序清单:
  1. ;===================================
  2. ;FLAG1: 标志位,为"1"时表示检测到DS18B20
  3. ;FLAG2: 标志位,为“1”时测温,为0时关闭
  4. ;DQ:    DS18B20的数据总线接脚
  5. ;===================================
  6. ;RAM
  7.         ByteCnt  data 31H ;数据字节计数器
  8.                             TEMPER_H EQU 35H ;温度高八位
  9.         TEMPER_L  EQU 36H  ;温度低八位
  10.         TEMPER_NUM EQU  37H                 ;保存读出的温度数据
  11.         ZhengShu  EQU 38H  ;存放整数部分数据
  12.         Show_Dat  EQU 40H ;存储要显示的数据                           
  13. ;BIT
  14.         FLAG1  EQU  20H              ;标志位,为"1"时表示检测到DS18B20
  15.         DQ   BIT   P3.3                 ;;DS18B20的数据总线接脚
  16. ;===================================
  17.         ORG  00H              ;;给定主函数起始位置
  18.         LJMP   MAIN              ;;跳至主函数
  19.         ORG  000BH              ;;定时器T0中断服务程序入口
  20.         LJMP   INT_T0  ;;跳至T0中断            
  21. ;===================================
  22. ;MAIN
  23. ;主程序
  24. ;===================================
  25. MAIN:   NOP
  26.                    MOV              R3,#0C8H              ;显示200次
  27.                    MOV  50H,#0     ;显示缓冲单元
  28.         MOV    51H,#1
  29.         MOV    52H,#2
  30.         MOV    53H,#3
  31.         MOV    54H,#4
  32.         MOV    55H,#5
  33.                             CALL  HELLO ;;调用开机显示界面
  34.                             NOP
  35.         MOV    SP,#0E0H              ;;设堆栈指针
  36.         MOV   TMOD,#01H  ;T0工作在16位定时器
  37.         MOV  TH0,#0F8H   ;定时2ms初值
  38.         MOV    TL0,#50H
  39.         SETB    ET0   ;允许定时器0中断
  40.         CLR    EA         ;关闭全局中断
  41.         SETB    TR0        ;打开定时器0
  42.         MOV    R0,#40H                 ;该地址是存储要显示的数据区首址
  43. AGAIN: MOV    @R0,#0FFH              ;;存储区初始化,置1
  44.         INC    R0
  45.         CJNE   R0,#48H,AGAIN                ;;遍历
  46. MAIN_1: CALL   INIT_1820              ;;初始化18B20
  47.         CALL   RE_CONFIG                ;;重新写DS18B20
  48.         CALL   GET_TEMPER              ;;读温度
  49.         MOV    Show_Dat+1,#0FFH   ;;存储区初始化,置1
  50.         MOV    Show_Dat+2,#0FFH
  51.         MOV    Show_Dat+3,#0FFH
  52.         LCALL  Temper_chng              ;;数值转换
  53.         MOV    R5,#01H                            ;;第一个位选
  54.         MOV    R0,#40H                            ;;显示首址
  55.         SETB    EA                              ;;开全局中断
  56.         LCALL  DELAY                ;;延时
  57.         CLR     EA                                          ;;关全局中            
  58.         JMP     MAIN_1                            ;;返回主函数
  59. ;===================================
  60. ;INIT_1820
  61. ;DS18B20初始化程序
  62. ;===================================
  63. INIT_1820:
  64.         SETB   DQ              ;;先拉高总线,准备拉低
  65.         NOP              ;;等待1us电平转换状态完毕
  66.         CLR     DQ                                          ;;释放总线
  67.         MOV    R0,#6BH              ;为延时送初值
  68.         MOV    R1,#03H                            ;;为延时送初值
  69. TSR1:   DJNZ   R0,TSR1    ;延时约700us (480~960)
  70.         MOV    R0,#6BH  ;;为延时送初值
  71.         DJNZ   R1,TSR1
  72.         SETB   DQ         ;释放总线
  73.         NOP                                                                      ;;延时
  74.         NOP
  75.         NOP
  76.         MOV    R0,#20H                            ;;为延时送初值
  77. TSR2:   JNB    DQ,TSR3  ;有存在信号跳转
  78.         DJNZ   R0,TSR2   ;延时约70us,70us后如果数据线没有存在脉冲(低电平)说明DS18B20不存在
  79.         LJMP   TSR4              ;;转到清除标志操作
  80. TSR3:   SETB   FLAG1   ;置标志位,表示DS1820存在
  81.         LJMP   TSR5              ;;准备延时
  82. TSR4:   CLR    FLAG1     ;清标志位,表示DS18B20不存在
  83.         LJMP   TSR7 ;;准备释放总线继续等
  84. TSR5:   MOV    R0,#05CH              ;;送延时初值
  85. TSR6:   DJNZ   R0,TSR6      ;延时200us
  86. TSR7:   SETB   DQ           ;释放总线
  87.         RET
  88. ;===================================
  89. ; RE_CONFIG
  90. ; 重新写DS18B20暂存存储器设定值
  91. ;===================================
  92. RE_CONFIG:
  93.         JB  FLAG1,RE_CONFIG1 ;若DS18B20存在,转RE_CONFIG1
  94.                             MOV                R3,#0C8H              ;显示200次
  95.                    MOV    60H,#0     ;显示缓冲单元
  96.         MOV    61H,#1
  97.         MOV    62H,#2
  98.         MOV    63H,#3
  99.         MOV    64H,#4
  100.         MOV    65H,#5
  101.                             CALL   OFF
  102.         RET
  103. RE_CONFIG1:
  104.         MOV  A,#0CCH ;发SKIP ROM命令
  105.         LCALL  WRITE_1820
  106.         MOV  A,#4EH ;发写暂存存储器命令
  107.         LCALL  WRITE_1820
  108.        MOV A,#30H;TH(上限)中写入00H
  109.         LCALL  WRITE_1820
  110.         MOV  A,#00H  ;TL(下限)中写入00H
  111.         LCALL  WRITE_1820
  112.         MOV  A,#1FH ;选择9位温度分辨率
  113.         LCALL  WRITE_1820
  114.         RET
  115. ;===================================
  116. ; 读出转换后的温度值
  117. ; 数据存储到TEMPER_H和TEMPER_L中
  118. ; 包含告警搜索
  119. ;===================================
  120. GET_TEMPER:
  121.         SETB   DQ          ;定时入口
  122.         LCALL  INIT_1820   ;初始化1820
  123.         JB     FLAG1,TSS2
  124.         RET     ;若DS18B20不存在则返回
  125. TSS2:   MOV    A,#0CCH ;跳过ROM匹配
  126.         LCALL  WRITE_1820                   ;;调写DS18B20的程序
  127.         MOV    A,#44H ;发出温度转换命令
  128.         LCALL  WRITE_1820
  129.         LCALL  INIT_1820
  130.         MOV    A,#0CCH  ;跳过ROM匹配
  131.         LCALL  WRITE_1820
  132.         MOV    A,#0BEH  ;发出读温度命令
  133.         LCALL  WRITE_1820
  134.         LCALL  READ_18200
  135.         MOV  TEMPER_NUM,A   ;将读出的温度数据保存
  136.         MOV    A,#0ECH       ;告警搜索
  137.         CALL   WRITE_1820
  138.         RET
  139. ;===================================
  140. ; READ_1820
  141. ; 读DS18B20的程序,从DS18B20中读出一个字节的数据
  142. ; 读出的数据在A中
  143. ;===================================
  144. READ_1820:
  145.         MOV    R2,#8                            ;一个字节8位
  146. RE1:
  147.         CLR    C                                          ;清零进借位
  148.         SETB   DQ         ;数据线拉高
  149.         NOP                                            ;延时
  150.         NOP
  151.         CLR    DQ        ;数据线拉低
  152.         NOP                                            ;延时
  153.         NOP
  154.         NOP
  155.         SETB DQ;数据线拉高产生读时间隙
  156.         MOV    R3,#3  ;;为延时6us送初值
  157.         DJNZ    R3,[        DISCUZ_CODE_7        ]nbsp;       ;延时约6us
  158.         MOV    C,DQ          ;读入数据
  159.         MOV    R3,#23              ;为延时50us送初值
  160.         DJNZ    R3,[        DISCUZ_CODE_7        ]nbsp;       ;延时约50us
  161.         SETB    DQ         ;数据线拉高
  162.         NOP
  163.         RRC    A
  164.         DJNZ   R2,RE1
  165.         RET
  166. ;===================================
  167. ;WRITE_1820:
  168. ; 写DS18B20的程序
  169. ;===================================
  170. WRITE_1820:
  171.         MOV    R2,#8                            ;;8位
  172.         CLR     C                                          ;;清空C
  173. WR1:  CLR   DQ ;数据线拉低产生写时间隙
  174.       MOV    R3,#6                            ;;为延时送数
  175.    DJNZ  R3,[        DISCUZ_CODE_7        ]nbsp; ;延时约6us(要求小于15us)
  176.     RRC     A                                          ;;循环右移
  177.     MOV    DQ,C     ;数据送到数据线
  178.     MOV    R3,#23                 ;为延时送初值
  179.    DJNZ  R3,[        DISCUZ_CODE_7        ]nbsp; ;延时约25us(要求15us-60us)
  180.         SETB    DQ        ;数据线拉高
  181.         NOP                ;延时1.085us(要求连续写2 位间的间隙大于1us)
  182.         DJNZ    R2,WR1    ;判断是否写完没写完接着写下一位
  183.         SETB    DQ                                          ;;写完拉高
  184.         RET
  185. ;===================================
  186. ; READ_18200
  187. ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
  188. ; 数据存储到TEMPER_H和TEMPER_L中
  189. ;===================================
  190. READ_18200:
  191.         MOV    R4,#2  ;将温度高位和低位从DS18B20中读出
  192.         MOV    R1,#36H    ;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
  193. RE00:
  194.         MOV    R2,#8       ;;8位
  195. RE01:
  196.         CLR    C                                            ;;清进借位
  197.         SETB    DQ                                           ;;拉高
  198.         NOP
  199.         NOP
  200.         CLR     DQ                                          ;;拉低
  201.         NOP
  202.         NOP
  203.         NOP
  204.         SETB    DQ                                          ;;释放总线
  205.         MOV    R3,#3                            ;;为延时送数
  206.         DJNZ   R3,[        DISCUZ_CODE_7        ]nbsp;        ;延时约6us
  207.         MOV    C,DQ                                          ;;读数据
  208.         MOV    R3,#23                            ;;为延时送数
  209.         DJNZ    R3,[        DISCUZ_CODE_7        ]nbsp;        ;延时约50us
  210.         SETB   DQ         ;数据线拉高
  211.         NOP
  212.         RRC    A                               ;;移位保存
  213.         DJNZ   R2,RE01;;判断8位是否读完
  214.         MOV    @R1,A ;;将低位数据保存
  215.         DEC    R1              ;;转到存储高位数据地址
  216.       DJNZ R4,RE00;判断两个字节是否读完
  217.         RET
  218. Temper_chng:
  219.         MOV  DPTR,#TAB ;字形码表头地址
  220.         MOV  R0,#Show_Dat ;显示首地址赋给R0
  221.         MOV  A,TEMPER_L  ;;温度低八位
  222.         ANL    A,#0FH                            ;取温度低四位            
  223.       CJNE  A,#0H,NEXT ;判断小数部分数据
  224.         MOV    @R0,#0C0H     ;小数为0
  225.         LJMP   NEXT1
  226. NEXT:   MOV    @R0,#92H     ;小数为5
  227. NEXT1:  INC    R0                            ;;下一个地址
  228.        MOV A,TEMPER_L ;整数移位到低四位
  229.         RR     A
  230.         RR     A
  231.         RR     A
  232.         RR     A
  233.         ANL     A,#0FH      ;保留低四位
  234.         MOV    ZhengShu,A      
  235.         MOV    A,TEMPER_H  ;整数部分移位到高四位
  236.         RL     A
  237.         RL     A
  238.         RL     A
  239.         RL     A
  240.         ANL    A,#0F0H      ;保留高四位
  241.         ADD    A,ZhengShu   ;相加得到整数部分数据
  242.         MOV    ZhengShu,A ;存储整数部分                           
  243. ;===================================
  244. ;判断正负数              ,正数可以直接进行转换,负数取反加1并且加负号
  245. ;===================================
  246.                               PUSH   ACC                            ;;保存A
  247.                               ANL    A,#80H              ;;取符号位
  248.                               JZ                            NEXT12              ;;符号位为零,跳转至正数处理部分
  249.                               POP    ACC
  250.                               CPL    A              ;;取反
  251.                               ADD    A,#01H                            ;;加1
  252.                               PUSH   ACC
  253.                               MOV    R0,#Show_Dat    ;显示首地址赋给R0
  254.          MOV    A,TEMPER_L;;温度低八位
  255.          ANL     A,#0FH ;;取温度低四位            
  256.                               CPL     A              ;;取反
  257.                               ADD    A,#01H                                               ;;加1
  258.          CJNE    A,#0H,NEXT13  ;判断小数部分数据
  259.          MOV    @R0,#0C0H    ;小数为0
  260.                               INC    R0              ;;移到下一位
  261.                               MOV    A,#0BFH        ;加负号
  262.          MOV    Show_Dat+3,A                ;;送回
  263.                               POP   ACC
  264.         LJMP   NEXT2
  265. NEXT13: MOV     @R0,#92H      ;小数为5
  266.         INC    R0
  267.                               MOV    A,#0BFH        ;加负号
  268.         MOV    Show_Dat+3,A                 ;送回
  269.                               POP    ACC
  270.                               DEC    A
  271.                               LJMP   NEXT2
  272. NEXT12: POP    ACC
  273. NEXT2:  MOV    B,#10 ;16进制转成十进制
  274.         DIV      AB
  275.         MOV     R6,A                            ;;得高位
  276.         MOV    A,B
  277.         MOVC   A,@A+DPTR
  278.   MOV   @R0,A;将段码送到相应的地址空间
  279.         INC      R0                            ;;转移到下一个地址
  280.         MOV    A,R6
  281.     CJNE   A,#0,NEXT2              ;;判断是否转换完
  282.         MOV    A,Show_Dat+1   ;加小数点
  283.         CLR    C                                          ;清除进借位
  284.         SUBB    A,#80H                                            ;;加点
  285.         MOV    Show_Dat+1,A                ;;送回
  286.         RET
  287. TAB:    DB     0c0H,0f9H,0a4H,0b0H,99H,92H,82H,0f8H,80H,90H
  288. ;;共阳数码管对应的字符表:0,1,2,3,4,5,6,7,8,9,              负号:0BFH
  289. TAB1:   DB    0C0H,0C7H,0C7H,86H,89H,0FFH
  290. ;;"HELLO"
  291. TAB2:   DB                0FFH,8EH,8EH,0C0H,0FFH,0FFH
  292. ;;"OFF"
  293. ;===================================
  294. DELAY:
  295.         MOV    R3,#10   ;;为延时送初值
  296. DELAY2: MOV    R7,#200  ;;为延时送初值
  297. DELAY1: MOV    R4,#250   ;;为延时送初值
  298.         DJNZ   R4,$
  299.         DJNZ   R7,DELAY1
  300.         DJNZ   R3,DELAY2
  301.         RET
  302. ;===================================
  303. INT_T0: MOV    TH0,#0F8H    ;重赋2ms的定时器时间常数
  304.         MOV    TL0,#50H
  305.         MOV    P0,#0FFH              ;高电位灭码
  306.         MOV    P2,R5      ;送当前显示数码管的位选信号
  307.         MOV    A,@R0                                            ;;取数
  308.         MOV    P0,A          ;送字形代码
  309.         INC    R0     ;显示数据缓冲器指针加1,为下一个显示数据作准备
  310.         CJNE    R0,#48H,NEXT3    ;判断是否8个数据全部送完,未送完则不用调整显示缓冲指针
  311.         MOV    R0,#40H          ;送完则调整显示缓冲指针
  312. NEXT3: MOV     A,R5           ;将目前的位选暂存信号左移,为下一个数码管显示作准备
  313.         RL      A                                                           ;左移
  314.         MOV    R5,A                            ;;下一个位选
  315.         RETI                              
  316. ;===========显示开关界面
  317. ;===================================
  318. HELLO: MOV    R0,#50H     ;显示缓冲首址
  319.                   MOV    R2,#2H    ;位控初始码(先亮最低位)
  320. LOOPs: MOV                A,#0H          ;共阴灭码
  321.                   MOV    P2,A     
  322.                   MOV                A,R2        ;送位控信号
  323.                   MOV    P2,A
  324.                   MOV    A,@R0 ;从显示缓冲中取数
  325.                   MOV    DPTR,#TAB1
  326.                  MOVC  A,@A+DPTR ;查出字形代码
  327.                   MOV    P0,A    ;送显示字符段代码
  328.                   MOV    R7,#0FFH
  329.    DJNZ   R7,[        DISCUZ_CODE_7        ]nbsp;   ;1ms延时,稳定显示信息
  330.                   INC                 R0        ;取下一个数
  331.                   MOV                A,R2         
  332.                   JB                    ACC.6,EXIT1  ;判断是否送到最高位?                 
  333.        RL                A
  334.                   MOV              R2,A  ;得到下一个位控信号
  335.                             AJMP   LOOPs
  336. EXIT1: DJNZ    R3,HELLO;是否显示完200次
  337.        RET            
  338. OFF:   MOV    R0,#60H    ;显示缓冲首址
  339.                   MOV    R2,#2H    ;位控初始码(先亮最低位)
  340. LOOPs2: MOV                A,#0H        ;共阴灭码
  341.                   MOV    P2,A     
  342.                   MOV                A,R2        ;送位控信号
  343.                   MOV    P2,A
  344.                   MOV    A,@R0 ;从显示缓冲中取数
  345.                   MOV    DPTR,#TAB2
  346.                   MOVC              A,@A+DPTR;查出字形代码
  347.                   MOV    P0,A   ;送显示字符段代码
  348.                   MOV    R7,#0FFH
  349.     DJNZ R7,[        DISCUZ_CODE_7        ]nbsp; ;1ms延时,稳定显示信息
  350.                   INC                 R0        ;取下一个数

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

完整论文下载(word格式 可编辑):
基于单片机的DS18B20测温系统的设计.doc (1.17 MB, 下载次数: 21)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:747812 发表于 2020-5-9 17:20 | 只看该作者
有C语言的程序吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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