利用汇编语言实现基于DS18B20的单片机温度测控范文Word文档格式.docx
《利用汇编语言实现基于DS18B20的单片机温度测控范文Word文档格式.docx》由会员分享,可在线阅读,更多相关《利用汇编语言实现基于DS18B20的单片机温度测控范文Word文档格式.docx(7页珍藏版)》请在冰点文库上搜索。
![利用汇编语言实现基于DS18B20的单片机温度测控范文Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/67e56892-4712-4849-a02e-5fec1006c189/67e56892-4712-4849-a02e-5fec1006c1891.gif)
PS0 BITP2.4;
数码管小数点后第1位PS1 BITP2.5;
数码管个位
PS2 BITP2.6;
数码管十位
PS3 BITP2.7;
数码管百位
进行温度显示,这里我们考虑用网站提供的两位数码管来显示温度
显示范围00到99度,显示精度为1度
因为12位转化时每一位的精度为0.0625度,我们不要求显示小数,所以可以抛弃
第7页
TEMPER_L的
个字节就是
低4位,将TEMPER_H中的低4位移入TEMPER_L中的高4位,这样获得一个新字节,这
实际测量获得的温度这个转化温度的方法非常简洁无需乘于0.0625系数ORG0000H
SJMPMAINORG0030H
MAIN:
MOVSP,#60H
MOVSCON,#50H;
设置成串口1方式
MOVTMOD,#20H;
波特率发生器T1工作在模式2上
MOVTH1,#0FDH;
预置初值(按照波特率9600BPS预置初值)MOVTL1,#0FDH;
预置初值(按照波特率9600BPS预置初值)
ORL PCON,#80H;
波特率加倍
SETBTR1;
启动定时器T1
LOOP:
ACALLGET_TEMPER;
调用读温度子程序MOVR3,TEMPER_H
MOVR4,TEMPER_L
MOVR7,#5 ;
乘以5再除以8等与乘以0.625ACALLNMUL21
MOVR7,#8ACALLNDIV31MOVTEMP_L,R4MOVTEMP_H,R3MOVA,R3
MOVR2,AMOVA,R4MOVR3,A
ACALLHTD;
转换成十进制
MOVA,R6ANLA,#0FH
MOVA_BYTE,AMOVA,R6SWAPA
ANLA,#0FHMOVB_BYTE,AMOVA,R5
ANLA,#0FHMOVC_BYTE,A
ACALLSEND;
调用串口显示子程序
ACALLDISPLAY;
调用数码管显示子程序
SETB
C;
判断温度>
500(>
50度)
MOV
A,R6
SUBB
A,#0
A,R5
A,#05H
JC
C0014
CLR
JDQ1
JDQ2
SJMP
LOOP
C0014:
C
A,#3H
JNC
C0025
C0025:
INIT_1820:
SETBDQ
这是DS18B20复位初始化子程序
NOP
CLRDQ
MOVR1,#3;
主机发出延时537微秒的复位低脉冲TSR1:
MOVR0,#107
DJNZR0,$DJNZR1,TSR1
SETBDQ;
然后拉高数据线
NOPNOPNOP
MOVR0,#25H
TSR2:
JNBDQ,TSR3;
等待DS18B20回应
DJNZR0,TSR2AJMPTSR4;
延时
TSR3:
SETBFLAG1;
置标志位,表示DS1820存在
AJMPTSR5
TSR4:
CLRFLAG1;
清标志位,表示DS1820不存在
AJMPTSR7
TSR5:
MOVR0,#117
TSR6:
DJNZR0,TSR6;
时序要求延时一段时间
TSR7:
SETBDQRET
GET_TEMPER:
SETBDQ;
读出转换后的温度值
LCALLINIT_1820;
先复位DS18B20JBFLAG1,TSS2
RET;
判断DS1820是否存在?
若DS18B20不存在则返回
TSS2:
MOVA,#0CCH;
跳过ROM匹配
ACALLWRITE_1820
MOVA,#44H;
发出温度转换命令
ACALLDISPLAY ;
这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12
位的话750微秒
ACALLINIT_1820;
准备读温度前先复位
MOVA,#0CCH;
MOVA,#0BEH;
发出读温度命令
ACALLREAD_18200;
将读出的温度数据保存到TEMPER_L/TEMPER_HRET
WRITE_1820:
MOVR2,#8;
写DS18B20的子程序(有具体的时序要求),一共8位数据CLRC
WR1:
CLRDQMOVR3,#5DJNZR3,$RRCAMOVDQ,C
MOVR3,#21DJNZR3,$SETBDQNOP
DJNZR2,WR1SETBDQRET
READ_18200:
MOVR4,#2;
读DS18B20的程序,从DS18B20中读出两个字节的温度数据,将温度高位
和低位从DS18B20中读出
MOVR1,#TEMPER_L;
低位存入TEMPER_L,高位存入TEMPER_HRE00:
MOVR2,#8;
数据一共有8位
RE01:
CLRCSETBDQNOPNOPCLRDQNOPNOPNOPSETBDQ
MOVR3,#8
RE10:
DJNZR3,RE10MOVC,DQMOVR3,#21
RE20:
DJNZR3,RE20RRCA
DJNZR2,RE01MOV@R1,ADECR1
DJNZR4,RE00RET
----------------------
串口发送数据子程序
----------------------SEND:
CLRTI
MOVA,TEMP_HMOVSBUF,AJNBTI,$
CLRTI
MOVA,TEMP_LMOVSBUF,AJNBTI,$
RET
DISPLAY:
MOVDPTR,#NUMTAB;
指定查表启始地址MOVR0,#4
DPL1:
MOVR1,#250;
显示1000次
DPLOP:
mova,A_BYTE;
取小数点后第1位数MOVCA,@A+DPTR;
查个位数的7段代码movp0,a;
送出个位的7段代码
CLRPS0SETBPS1SETBPS2SETBPS3
acalld1ms;
显示1ms
mova,B_BYTE;
取个位数
MOVCA,@A+DPTR;
查十位数的7段代码ORLA,#01H
movp0,a;
送出十位的7段代码SETBPS0
CLRPS1
mova,C_BYTE;
取十位数
查十位数的7段代码movp0,a;
送出十位的7段代码
SETBPS1CLRPS2
SETBPS2
djnzr1,dplop;
100次没完循环djnzr0,dpl1;
4个100次没完循环ret
单字节无符号数乘法程序(R3R4*R7)=(R2R3R4)
入口:
R3,R4,R7
占用资源:
ACC,B
堆栈需求:
2字节
出口:
R2,R3,R4
NMUL21:
MOVA,R4
MOVB,R7MULABMOVR4,AMOVA,BXCHA,R3MOVB,R7MULABADDA,R3MOVR3,ACLRAADDCA,BMOVR2,ACLROVRET
单字节无符号除法程序(R2R3R4/R7)=(R2)R3R4余数R7
R2,R3,R4,R7
ACC,B,F0
3字节
(R2),R3,R4,R7,OV
NDIV31:
MOVA,R2
MOVB,R7
DIVAB
PUSHACC
MOVR2,B
MOVB,#10H
NDV311:
CLRC
MOVA,R4
RLCA
MOVR4,A
MOVA,R3
MOVR3,A
MOVR2,A
MOVF0,C
SUBBA,R7
JBF0,NDV312
JCNDV313
NDV312:
INCR4
NDV313:
DJNZB,NDV311
POPACC
CLROV
JZNDV314
SETBOV
NDV314:
XCHA,R2
MOVR7,A
HTD:
CLR A
R2和R3是程序数据入口
MOV R4,A
转换后的数放在R4,R5,R6
MOV R5,A
转换完后在分别屏蔽高位和低位取出数据
MOV R6,A
MOV R7,#10H
ZH:
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV A,R5
ADDC A,R5
MOV A,R4
ADDC A,R4
DJNZ R7,ZHRET
D1MS:
MOVR7,#80;
1MS延时
DJNZR7,$RET
实验板上的7段数码管0~9数字的共阴显示代码
numtab:
DB0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,0FEH,0F6H;
END