基于51单片机单总线高精度温度采集系统Word格式.docx
- 文档编号:19048737
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:26
- 大小:54.99KB
基于51单片机单总线高精度温度采集系统Word格式.docx
《基于51单片机单总线高精度温度采集系统Word格式.docx》由会员分享,可在线阅读,更多相关《基于51单片机单总线高精度温度采集系统Word格式.docx(26页珍藏版)》请在冰豆网上搜索。
14H
键盘输入的温度上限值
6系统软件中各个子程序的功能描述
子程序名称
入口参数
出口参数
功能描述
GET_TEMPER
无
温度值高四位TEMPER_L、温度值低8位TEMPER_H
从DS18B20中读出12位温度数据
TEMPER_COV
将读出的12位温度数据转换并保存
INT_1820
FLAG1
初始化DS18B20
WRITE_1820
A
向DS18B20中写入数据
INT_T1
TH1
TL1
定时器T1中断。
装定时初值,初值为温度差值,并对P3.5取反驱动蜂鸣器。
DISPLAY
将温度通过数码管显示出来
READ_18200
从DS18B20中读出数据并储存
7主程序程序流程图
N
Y
8程序清单
TEMPER_LEQU36H
;
存放读出温度低位数据
TEMPER_HEQU35H
存放读出温度高位数据
TEMPEREQU34H
存放转换后的8位温度值
TEMPER_XSEQU33H
存放转换温度的小数部分
TEMPER_NUMEQU60H
缓冲单元
TEMPER_NUM_XSEQU61H
FLAG1BIT00H
DQBITP3.3
一线总线控制端口
LIMITEQU14H
WSLAEQU070H
RSLAEQU071H
SDABITP1.0
SCLBITP1.1
ORG8000H
LJMPMAIN
ORG8003H;
外中断Int0的入口地址
LJMPINT_7290
ORG801BH;
定时器T1的入口地址
LJMPINT_T1
ORG8100H
MAIN:
MOVSP,#70H
CLRP1.2;
7290复位
LCALLDELAY
SETBP1.2
MOVLIMIT,#0FFH
LP1:
SETBEX0;
开外中断0
SETBEA
MOVTCON,#00H
SETBET1;
开T1中断
MOVTMOD,#10H;
T1初值
MOVTL1,#33H
MOVTH1,#0FEH
LCALLGET_TEMPER;
从DS18B20读出温度数据
LCALLTEMPER_COV;
转换读出的温度数据并保存
MOVA,TEMPER
CJNEA,LIMIT,NEXT
NEXT:
JNCNEXT1;
TEMPER>
=LIMIT
JMPNEXT2
NEXT1:
SETBTR1
LJMPNEXT3
NEXT2:
CLRTR1
NEXT3:
MOV31H,#00H;
显示整数部分
MOV30H,#01H
MOVB,#10
DIVAB
ADDA,#02H
MOV37H,A
MOVA,B
ADDA,#0CH
MOV36H,A
MOVA,TEMPER_XS;
显示小数部分
MOVB,#4
MULAB
ADDA,#16H
MOV35H,A
INCA
MOV34H,A
MOV33H,A
MOV32H,A
MOVDPTR,#LEDSEG1
CLRA
MOVR7,#08H
MOVR0,#20H
MOVR1,#30H
LOOP1:
MOVA,@R1
MOVCA,@A+DPTR
MOV@R0,A
INCR1
INCR0
DJNZR7,LOOP1
MOVR2,#10H
MOVR3,#WSLA
LCALLWRNBYT
LCALLDELAY2
SJMPLP1
T1中断服务程序
INT_T1:
PUSHACC
PUSHPSW
CLRTF1
SUBBA,LIMIT
MOVB,#2
ADDA,#33H
MOVTL1,A;
赋定时器t1初值
MOVTH1,#0FEH
CPLP3.5
POPPSW
POPACC
RETI
LEDSEG1:
DB0C6H,9CH;
查表
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E4H,0FEH,0F6H
DB0FDH,61H,0DBH,0F3H,67H,0B7H,0BFH,0E5H,0FFH,0F7H
DB0FCH,0FCH,0FCH,0FCH,0FCH,0BEH,0DAH,0B6H,60H,0DAH,0B6H,0FCH,60H,0FEH,0E4H,0B6H
DB0DAH,0B6H,0FCH,0FCH,0F2H,60H,0DAH,0B6H,0F2H,0E4H,0B6H,0FCH
DB66H,0F2H,0E4H,0B6H
DB0B6H,0FCH,0FCH,0FCH
DB0B6H,0BEH,0DAH,0B6H
DB0BEH,0DAH,0B6H,0FCH
DB0BEH,0FEH,0E4H,0B6H
DB0E4H,0B6H,0FCH,0FCH
DB0FEH,60H,0DAH,0B6H
DB0FEH,0E4H,0B6H,0FCH
DB0F6H,0F2H,0E4H,0B6H
DB00H,0EEH,10H
DELAY2:
PUSH00H
PUSH01H
MOVR0,#00H
DELAY3:
MOVR1,#00H
DJNZR1,$
DJNZR0,DELAY3
POP01H
POP00H
RET
******************************读取温度值
GET_TEMPER:
;
读出转换后的温度值
SETBDQ;
定时入口
BCD:
LCALLINIT_1820
JBFLAG1,S22
LJMPBCD
若DS18B20不存在则返回
S22:
LCALLDELAY1
MOVA,#0CCH
跳过ROM匹配0CCH
LCALLWRITE_1820
MOVA,#44H;
发出温度转换命令
LCALLWRITE_1820
LCALLDELAY
CBA:
JBFLAG1,ABC
LJMPCBA
ABC:
MOVA,#0CCH;
跳过ROM匹配
MOVA,#0BEH;
发出读温度命令
LCALLREAD_18200;
READ_1820
RET
WRITE_1820:
;
写DS18B20的程序
MOVR2,#8
CLRC
WR1:
CLRDQ
MOVR3,#6;
延时24us
DJNZR3,$
RRCA
MOVDQ,C
MOVR3,#23;
延时60us
SETBDQ;
一个写周期至少要维持60us以上
NOP;
离下一个写周期至少要有1us间隔
DJNZR2,WR1
SETBDQ
RET
READ_18200:
读DS18B20的程序,从DS18B20中读出两个字节的温度数据
MOVR4,#2;
将温度高位和低位从DS18B20中读出
MOVR1,#36H;
低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOVR2,#8
RE01:
CLRC
SETBDQ
NOP
CLRDQ;
DQ;
DQ=015US内
NOP;
18B20送数,主控器
必须完成DQ的采样
SETBDQ;
主控器释放DQ
MOVR3,#2
DJNZR3,$;
延时10us
MOVC,DQ;
取dq数据位
MOVR3,#23;
DJNZR3,$
RRCA
DJNZR2,RE01
MOV@R1,A
DECR1
DJNZR4,RE00
RET
TEMPER_COV:
;
将读出的数据进行转换
MOVA,#0F0H
ANLA,TEMPER_L
SWAPA
MOVTEMPER_NUM,A
MOVA,TEMPER_L
ANLA,#0FH
MOVTEMPER_NUM_XS,A
MOVTEMPER_XS,TEMPER_NUM_XS
TEMPER_COV1:
MOVA,TEMPER_H
ANLA,#07H
ADDA,TEMPER_NUM
MOVTEMPER,TEMPER_NUM
INIT_1820:
DS18B20初始化程序
SETBDQ
CLRDQ
MOVR0,#80H
TSR1:
DJNZR0,TSR1
MOVR0,#25H
TSR2:
DJNZR0,TSR2
JNBDQ,TSR3
LJMPTSR4
TSR3:
SETBFLAG1
LJMPTSR5
TSR4:
CLRFLAG1
LJMPTSR7
TSR5:
MOVR0,#06BH
TSR6:
DJNZR0,TSR6
TSR7:
DELAY1:
MOVR7,#20H
DJNZR7,$
DELAY:
MOVR0,#00
LP:
DJNZR0,LP
******************************键盘设定温度上限值
INT_7290:
PUSH02H
PUSH03H
PUSH04H
PUSH07H
LCALLRDKEY
CJNEA,#0AH,DOWN1
LJMPAKEY
DOWN1:
LJMPDOWN
AKEY:
LCALLDISPLAYA
闪烁控制
PUSH05H
PUSH06H
MOVR5,#70H
MOVR6,#08H
MOVR7,#02H
MOVR0,#05H
MOVR2,#07H
POP06H
POP05H
CXUN:
JBP3.2,$
CJNEA,#0AH,NEXT4;
查询输入值是否为数字
NEXT4:
JNCCXUN
NEXT5:
MOV40H,A
LCALLDISPLAY1
MOVA,40H
MOV14H,A;
存十位
MOVR6,#04H
CXUN1:
CJNEA,#0AH,NEXT6;
NEXT6:
JNCCXUN1
NEXT7:
MOVR6,#00H
MOV41H,A;
存个位
LCALLDISPLAY2;
显示个位数
MOVA,41H
ADDA,14H
MOVLIMIT,A;
设定报警值
FH1:
CJNEA,#0BH,FH1
DOWN:
CLRIE0
POPPSW
POP07H
POP04H
POP03H
POP02H
RDKEY:
MOVR0,#1FH;
键值缓冲单元
MOVR7,#01H;
取一个数据(键值)
MOVR2,#01H;
指向内部数据键值寄存器地址
MOVR3,#WSLA_7290;
取器件地址(写)
MOVR4,#RSLA_7290;
取器件地址(读)
LCALLRDADD;
读出7290的01H单元中的键值
MOVA,1FH;
取健值送缓冲单元
DECA
DISPLAY2:
;
显示输入的个位数
MOV31H,#00H
MOV34H,#56H
MOV35H,#56H
MOV36H,#56H
MOV37H,#57H
LOOP2:
DJNZR7,LOOP2
DISPLAYA:
;
显示A
MOV32H,#58H
MOV33H,#58H
LOOP3:
DJNZR7,LOOP3
DISPLAY1:
显示输入的十位数
LOOP4:
DJNZR7,LOOP4
【附录一】由汇编语言编制的I2C通讯子程序
(1)带有内部单元地址的多字节写操作子程序WRNBYT
*******************************
通用的I2C通讯子程序(多字节写操作)
入口参数R7字节数,R0:
源数据块首地址
R0原数据块首地址;
R2从器件内部子地址;
R3:
外围器件地址(写)
相关子程序WRBYT、STOP、CACK、STA
WRNBYT:
PUSHPSW
PUSHACC
WRADD:
MOVA,R3;
取外围器件地地址(包含r/w=0)
LCALLSTA;
发送起始信号S
LCALLWRBYT;
发送外围地址
LCALLCACK;
检测外围器件的应答信号
JBF0,WRADD;
如果应
MOVA,R2
发送内部寄存器首地址
如果应答不正确返回重来
WRDA:
MOVA,@R0
如果应答不正确返回重来
INCR0
DJNZR7,WRDA
LCALLSTOP
POPACC
POPPSW
RET
(2)带有内部单元地址的多字节读操作子程序RDADD
入口参数R7字节数;
R0目标数据块首地址;
R2从器件内部子地址;
R3器件地址(写);
R4器件地址(读)
相关子程序WRBYT、STOP、CACK、STA、MNACK
RDADD:
PUSHPSW;
从PCF8563的02H单元读入7个参数
PUSHACC;
存放于20H-26H单元
RDADD1:
LCALLSTA
MOVA,R3;
JBF0,RDADD1;
MOVA,R2;
取内部地址
如果应答不正确返回重来
LCALLSTA
MOVA,R4;
RDN:
LCALLRDBYT
MOV@R0,A
DJNZR7,ACK
LCALLMNACK
LCALLSTOP
ACK:
LCALLMACK
SJMPRDN
(3)I2C各个信号子程序
启动信号子程序S
STA:
SETBSDA;
启动信号S
SETBSCL
产生4.7US延时
NOP
NOP
CLRSDA
NOP
CLRSCL
停止信号子程序P
STOP:
CLRSDA;
停止信号P
SETBSDA
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 总线 高精度 温度 采集 系统