Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68498
  • 博文数量: 10
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-18 15:18
文章分类

全部博文(10)

文章存档

2011年(1)

2007年(9)

我的朋友
最近访客

分类:

2007-04-13 22:23:55

实验 12 数字温度计实验
1.实验目的
  熟悉数字温度计传感器DS18B20的使用方法和工作原理,了解单总线的读/写控制方法。
2.实验设备及器件
PC机                 一台
MCU51-V3.0型单片机实验板     一块
温度传感器18B20          一个

3.  实验内容:
① 编写程序,通过单片机的P3.7口对DS18B20进行操作,实现数字温度的采集。
  ② 记录采集到的温度数据,分析实验结果是否正确。    
4.  实验步骤:
① 将P3.7与DS18B20的数据端  DS(J12)相连
② 连接显示模块,P0口与J7,P2.7、P2.6分别连接J8。
③ 运行编写好的软件程序,完成多次温度采集并记录采集到的  
   温度数据。
④ 使用温度计测量环境的实际温度,并与实验数据相比较,判
   断采集数据的准确度
 
5.  实验参考程序
       ;P3.7接数据,P0口接段码,P2.7、P2.6分别为个位和十位
        TEMPER_L  EQU  29H  ;存放读出温度低位数据
        TEMPER_H  EQU  28H  ;存放读出温度高位数据
        FLAG1     BIT  00H
        DQ        BIT  P3.7 ;一线总线控制端口
        ORG 0000H
        MOV SP,#70H
   MAIN:LCALL GET_TEMPER ;从DS18B20读出温度数据
       ;因为12位转化时每一位的精度为0.0625,我们不需要显示小数所
        以可以舍弃29H的低4位          
       ;将28H的低4位移入29H的高4位,这样获得一个新字节,就为是
        测量获得的温度
        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 DISP          ;调用显示
        AJMP MAIN           ;继续温度采集
     ;以下为DS18B20单总线操作子程序
     ;读出转换后的温度值
     GET_TEMPER:SETB DQ              ;定时入口
    BCD:LCALL INIT_1820     ;先复位DS18B20
        JB FLAG1,S22        ;判断DS18B20是否存在?若不存在则返回
        RET                 ;若DS18B20不存在则返回        
    S22:MOV A,#0CCH         ;跳过ROM匹配0CCH
        LCALL WRITE_1820
        MOV A,#44H          ;发出温度转换命令
        LCALL WRITE_1820
        LCALL DISP          ;这里通过调用显示子程序延时一段时间,   等待AD转换结束,750毫秒
    CBA:LCALL INIT_1820     ;准备读温度前先复位
        JB FLAG1,ABC
        AJMP CBA
    ABC:MOV A,#0CCH         ;跳过ROM匹配
        LCALL WRITE_1820
        MOV A,#0BEH         ;发出读温度命令
        LCALL WRITE_1820
        LCALL READ_18200    ;将读出的温度数据保存到28H/29H
        RET
    ;执行533.8微秒
    WRITE_1820:MOV R2,#8        ;读取8个位,一个字节
        CLR C
    WR1:CLR DQ
        MOV R3,#5        ;延时
        DJNZ R3,$
        RRC A
        MOV DQ,C         ;发送1个位
        MOV R3,#21       ;延时
         DJNZ R3,$
        SETB DQ
        DJNZ R2,WR1
        SETB DQ
        RET
    ;执行1108.87微秒,读DS18B20的程序,从DS18B20中读出两个字节的温度数据
     READ_18200:MOV R4,#2         ;将温度高位和低位从DS18B20中读出
        MOV R1,#29H
   ;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
   RE00:MOV R2,#8        ;读取8个位,一个字节
   RE01:CLR C
        SETB DQ
        NOP
        CLR DQ
        NOP
        NOP
        NOP
        NOP         
        SETB DQ
        MOV R3,#2        ;延时
        DJNZ R3,$
        MOV C,DQ         ;读取1个位
        MOV R3,#22       ;延时
        DJNZ R3,$
        RRC A
        DJNZ R2,RE01
        MOV @R1,A
        DEC R1
        DJNZ R4,RE00
        RET
   DISP:MOV A,29H        ;将29H中的十六进制数转换成十进制
        MOV B,#10
        DIV AB
        MOV 40H,B        ;个位存放
        MOV 41H,A        ;十位存放
        MOV R4,#4
  DISP1:MOV R5,#100
  DISP2:CLR P2.7         ;开个位显示
        MOV DPTR,#TAB
        MOV A,40H
        MOVC A,@A+DPTR
        MOV P0,A
        LCALL D1MS
        SETB P2.7
        CLR P2.6
        MOV DPTR,#TAB
        MOV A,41H
        MOVC A,@A+DPTR
        MOV P0,A
        LCALL D1MS
        SETB P2.6
        DJNZ R5,DISP2
        DJNZ R4,DISP1
        RET
     ;DS18B20复位初始化程序
   INIT_1820:SETB DQ
        NOP
        CLR DQ
        MOV R1,#3
   TSR1:MOV R0,#80
        DJNZ R0,$        ;延时<
阅读(5316) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~