单片机课程设计题目 :单总线和 I2C 总线结合实现数字温度计实验
班级:
设计者:
指导教师 :
单总线和 I2C 总线结合实现数字温度计实验
一、实验目的
通过本实验 ,理解掌握单总线器件和 I2C 总线器件的应用 ,熟悉串行总线的操作技巧。
二、实验设备及器件
IBM PC 机一台
DP-51PROC 单片机综合仿真实验仪一台
三、实验内容
1. 编写程序 ,通过单片机的 P3.3 口控制一个 DS18B20 完成数字温度的采集 ,然后用程序处理采集到的数据结果。
2. 编写程序 ,通过 I2C 总线器件 ZLG7290 实现温度数据的输出显示。
3. 结合以上两部分程序 ,编程实现数字式温度计的程序设计。
四、实验要求
熟练掌握单总线方式器件的应用,熟悉I2C总线协议,学习I2C器件的使用方法。
五、实验过程和步骤
(一、新建工程文件
1、点击工具栏 Project 选项,在下拉菜单中选择 New Project 命令 ,弹出项目文件保存对话框 ,输入项目名后 ,点击保存按钮。
2、在工程建立完毕以后,uVision 会弹出器件选择窗口,选择相应的器件型号。
如想修改 ,可点击工具栏 Project 选项,在下拉菜单中选择 Select Device for
Target …Target ?命令。
3、点击工具栏 File 选项,选中 New 命令,新建文件 ,输入源程序。
4、把文件保存到磁盘中,如用汇编语言编写程序用.asm为扩展名,如用C语言编写程序用 .c 为扩展名。
5、添加该文件到工程中 ,在 Projectwindos 窗口内 ,选中 Source Group1 然后点击鼠标右键 ,选择 Add files to Group “Source Group1 ”,选择刚才创建的源程序文件 ,单击 Add 按钮。
(二、程序文件的编译、链接
1. 安装B4区JP12接口上的短路帽,将B4区的DQ 与A2区INT1(P3.3相连。
2. 安装 D5 区 JP1 接口上的短路帽 ,将 D5 区的 SDA、 SCL 分别与 A2 区的 P17、
P16 相连。
3. 将 D5 区的 RST_L 针接上高电平。
4. 按照下面的程序在 Keil C51 集成开发环境中建立工程文件 ,并进行调试仿
真。
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 DA TA 50H ; 器件的从地址
SUBA DA TA 51H ; 器件的子地址NUMBYTE DA TA 52H ; 读 / 写的字节数变量ORG 0000H
LJMP MAIN
ORG 0100H
; ---- 温度计主程序如下 :
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:
MOV R4,#2 ; 将温度高位和低位从 DS18B20 中读出
MOV R1,#36H ; 低位存入 36H(TEMPER_L,高位存入 35H(TEMPER_H REOO: MOV R2,#8
REO1: CLR C
SETB DQ
NOP
NOP
CLR DQ
NOP
NOP
NOP
SETB DQ
MOV R3,#7
DJNZ R3,$
MOV C,DQ
SWAP A 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 ; 舍去温度低位中小数点后的四位温度数值
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB A CC.3,TEMPER_COV1 ; 四舍五入去温度值
INC T EMPER_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:。