单总线和i2c总线结合实现数字温度计的设计c语言程序,单总线和I2C总线结合实现数字温度计实验...

描述

单总线和I2C 总线结合实现数字温度计实验

一. 实验目的

通过本实验,理解掌握单总线器件和I2C总线器件的应用,熟悉串行总线的操作

技巧。

二. 实验设备及器件

IBM PC 机 一台

DP-51PROC 单片机综合仿真实验仪 一台

三. 实验内容

1. 编写程序,通过单片机的P3.3 口控制一个DS18B20 完成数字温度的采集,然后

用程序处理采集到的数据结果。

2. 编写程序,通过I2C 总线器件ZLG7290 实现温度数据的输出显示。

3. 结合以上两部分程序,编程实现数字式温度计的程序设计。

四. 实验要求

熟练掌握单总线方式器件的应用,熟悉I2C 总线协议,学习I2C 器件的使用方法。

五. 实验步骤

1. 安装B4 区JP12 接口上的短路帽,将B4 区的DQ 与A2 区INT1(P3.3)相连。

2. 安装D5 区JP1 接口上的短路帽,将D5 区的SDA、SCL 分别与A2 区的P17、

P16 相连。

3. 将D5 区的RST_L 针接上高电平。

4. 运行编写好的软件程序,观察D5 区数码管显示的温度数据。然后改变DS18B20

的表面温度,查看显示的温度数据是否有变化,并调整实验程序使测量值更准确。

六. 实验预习要求

认真学习本书2.8.10 节的实验内容和实验原理,做好实验前的准备工作。

七. 实验参考程序

TEMPER_L EQU 36H ;存放读出温度低位数据

TEMPER_H EQU 35H ;存放读出温度高位数据

TEMPER_NUM EQU 37H ;存放转换后的温度值

FLAG1 BIT 00H

DQ BIT P3.3 ;单总线控制端口

SDA BIT P1.7 ;I2C 总线定义

SCL BIT P1.6

MTD EQU 40H ;发送数据缓冲器

MRD EQU 49H ;接收数据缓冲区

;定义器件地址,变量

ZLG7290 EQU 70H ;ZLG7290 的器件地址

ACK BIT 10H ;应答标志位

SLA DATA 50H ;器件的从地址

SUBA DATA 51H ;器件的子地址

NUMBYTE DATA 52H ;读/写的字节数变量

ORG 8000H

LJMP MAIN

ORG 8100H

;温度计主程序如下:

MAIN:

MOV SP,#70H

DISP_LOOP:

LCALL GET_TEMPER ;从DS18B20 读出温度数据

LCALL TEMPER_COV ;转换读出的温度数据并保存

LCALL DELAY

MOV MTD,#60H

MOV MTD+1,TEMPER_NUM ;温度值低位

ANL MTD+1,#0FH

MOV SLA,#ZLG7290 ;指定器件地址

MOV SUBA,#07H ;指定子地址

MOV NUMBYTE,#02H ;发送2 字节数据

LCALL IWRNBYTE ;调用写2 字节数据程序

MOV MTD,#61H

MOV A,TEMPER_NUM

SWAP A

ANL A,#0FH

MOV MTD+1,A ;温度值高位

MOV SLA,#ZLG7290 ;指定器件地址

MOV SUBA,#07H ;指定子地址

MOV NUMBYTE,#02H ;发送2 字节数据

LCALL IWRNBYTE ;调用写2 字节数据程序

LCALL DELAY

SJMP DISP_LOOP ;温度循环采集显示

;读出转换后的温度值

GET_TEMPER:

SETB DQ ;定时入口

BCD:

LCALL INIT_1820

JB FLAG1,S22

LJMP BCD ;若DS18B20 不存在则返回

S22:

LCALL DELAY1

MOV A,#0CCH ;跳过ROM 匹配------0CC

LCALL WRITE_1820

MOV A,#44H ;发出温度转换命令

LCALL WRITE_1820

NOP

LCALL DELAY

LCALL DELAY

CBA:

LCALL INIT_1820

JB FLAG1,ABC

LJMP CBA

ABC:

LCALL DELAY1

MOV A,#0CCH ;跳过ROM 匹配

LCALL WRITE_1820

MOV A,#0BEH ;发出读温度命令

LCALL WRITE_1820

LCALL READ_18200 ;READ_1820

RET

;读DS18B20 的程序,从DS18B20 中读出一个字节的数据

READ_1820:

MOV R2,#8 ;读取一个字节

RE1:

CLR C

SETB DQ

NOP

NOP

CLR DQ

NOP

NOP

NOP

SETB DQ

MOV R3,#7 ;延时

DJNZ R3,$

MOV C,DQ ;读取一个位

MOV R3,#23 ;延时

DJNZ R3,$

RRC A

DJNZ R2,RE1

RET

;写DS18B20 的程序

WRITE_1820:

MOV R2,#8 ;发送一个字节

CLR C

WR1820:

CLR DQ

MOV R3,#6 ;延时

DJNZ R3,$

RRC A

MOV DQ,C ;发送一个位

MOV R3,#23 ;延时

DJNZ R3,$

SETB DQ

NOP

DJNZ R2,WR1820

SETB DQ

RET

;读DS18B20 的程序,从DS18B20 中读出两个字节的温度数据

READ_18200:

;将温度高位和低位从DS18B20 中读出

MOV R4,#2

MOV R1,#36H

; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)

RE00:

MOV R2,#8 ;读取一个字节

RE01:

CLR C

SETB DQ

NOP

NOP

CLR DQ

NOP

NOP

NOP

SETB DQ

MOV R3,#7 ;延时

DJNZ R3,$

MOV C,DQ ;读取一个位

MOV R3,#23 ;延时

DJNZ R3,$

RRC A

DJNZ R2,RE01

MOV @R1,A

DEC R1

DJNZ R4,RE00

RET

;将从DS18B20 中读出的温度数据进行转换

TEMPER_COV:

MOV A,#0F0H

ANL A,TEMPER_L

; 舍去温度低位中小数点后的四位温度数值

SWAP A

MOV TEMPER_NUM,A

MOV A,TEMPER_L

JNB ACC.3,TEMPER_COV1 ;四舍五入去温度值

INC TEMPER_NUM

TEMPER_COV1:

MOV A,TEMPER_H

ANL A,#07H

SWAP A

ADD A,TEMPER_NUM

MOV TEMPER_NUM,A ;保存变换后的温度数据

LCALL BIN_BCD

RET

;将16 进制的温度数据转换成压缩BCD 码

BIN_BCD:

MOV DPTR,#TEMP_TAB

MOV A,TEMPER_NUM

MOVC A,@A+DPTR

MOV TEMPER_NUM,A

RET

TEMP_TAB:

DB 00H,01H,02H,03H,04H,05H,06H,07H

DB 08H,09H,10H,11H,12H,13H,14H,15H

DB 16H,17H,18H,19H,20H,21H,22H,23H

DB 24H,25H,26H,27H,28H,29H,30H,31H

DB 32H,33H,34H,35H,36H,37H,38H,39H

DB 40H,41H,42H,43H,44H,45H,46H,47H

DB 48H,49H,50H,51H,52H,53H,54H,55H

DB 56H,57H,58H,59H,60H,61H,62H,63H

DB 64H,65H,66H,67H,68H,69H,70H,71H

DB 72H,73H,74H,75H,76H,77H,78H,79H

DB 80H,81H,82H,83H,84H,85H,86H,87H

DB 88H,89H,90H,91H,92H,93H,94H,95H

DB 96H,97H,98H,99H

;DS18B20 初始化程序

INIT_1820:

SETB DQ

NOP

CLR DQ

MOV R0,#80H

TSR1:

DJNZ R0,TSR1 ;延时

SETB DQ

MOV R0,#25H ;96uS

TSR2:

DJNZ R0,TSR2

JNB DQ,TSR3

LJMP TSR4 ;延时

TSR3:

SETB FLAG1 ;置标志位,表示DS1820 存在

LJMP TSR5

TSR4:

CLR FLAG1 ;清标志位,表示DS1820 不存在

LJMP TSR7

TSR5:

MOV R0,#06BH ;200uS

TSR6:

DJNZ R0,TSR6 ;延时

TSR7:

SETB DQ

RET

;重新写DS18B20 暂存存储器设定值

RE_CONFIG:

JB FLAG1,RE_CONFIG1 ;若DS18B20 存在,转RE_CONFIG1

RET

RE_CONFIG1:

MOV A,#0CCH ;发SKIP ROM 命令

LCALL WRITE_1820

MOV A,#4EH ;发写暂存存储器命令

LCALL WRITE_1820

MOV A,#00H ;TH(报警上限)中写入00H

LCALL WRITE_1820

MOV A,#00H ;TL(报警下限)中写入00H

LCALL WRITE_1820

MOV A,#7FH ;选择12 位温度分辨率

LCALL WRITE_1820

RET

;延时子程序

DELAY:

MOV R7,#00H

MIN:

DJNZ R7,YS500

RET

YS500:

LCALL YS500US

LJMP MIN

YS500US:

MOV R6,#00H

DJNZ R6,$

RET

DELAY1:

MOV R7,#20H

DJNZ R7,$

RET

$INCLUDE(VI2C_ASM.INC) ;包含VIIC 软件包

END

八. 实验思考题

参考图如下电路图,设计一个程序能够实现多路DS18B20数字温度采集功能,并

能使温度数据通过数码管循环显示。

57162d85de58755dc3239d61dca0adce.png

打开APP阅读更多精彩内容

点击阅读全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值