利用汇编语言实现基于DS18B20的单片机温度测控范文.docx
《利用汇编语言实现基于DS18B20的单片机温度测控范文.docx》由会员分享,可在线阅读,更多相关《利用汇编语言实现基于DS18B20的单片机温度测控范文.docx(7页珍藏版)》请在冰豆网上搜索。
利用汇编语言实现基于DS18B20的单片机温度测控
利用汇编语言实现基于DS18B20的单片机温度测控
以下是完成单片机温度测量的汇编参考程序:
/******************************************************************
** 本程序主要功能:
通过DS18B20检测温度,单片机数码管显示温度(1位小数),超过上限50、低于下限30时继电器动作
**并将温度值以16进制形式(2个字节)通过串口发送给PC
**晶振频率:
11.0592M
**线路->单片机实验开发板B
******************************************************************/
;单片机内存分配申明!
A_BYTE EQU20H;数码管小数点后第1位数存放内存位置B_BYTE EQU21H;数码管个位数存放内存位置
C_BYTE EQU22H;数码管十位数存放内存位置TEMPER_HEQU23H;用于保存读出温度的高8位
TEMPER_LEQU24H;用于保存读出温度的低8位TEMP_HEQU28H;用于保存温度*0.625后高位TEMP_LEQU29H;用于保存温度*0.625后低位FLAG1BIT38H;是否检测到DS18B20标志位
DQ BITP3.6;18B20的数据接口
JDQ1 BITP2.0;继电器1控制JDQ2 BITP2.1;继电器2控制
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
MOV
A,R5
SUBB
A,#05H
JC
C0014
CLR
JDQ1
SETB
JDQ2
SJMP
LOOP
C0014:
CLR
C
MOV
A,R6
SUBB
A,#0
MOV
A,R5
SUBB
A,#3H
JNC
C0025
SETB
JDQ1
CLR
JDQ2
SJMP
LOOP
C0025:
SETB
JDQ1
SETB
JDQ2
SJMP
LOOP
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;发出温度转换命令
ACALLWRITE_1820
ACALLDISPLAY ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12
位的话750微秒
ACALLINIT_1820;准备读温度前先复位
MOVA,#0CCH;跳过ROM匹配
ACALLWRITE_1820
MOVA,#0BEH;发出读温度命令
ACALLWRITE_1820
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
acalld1ms;显示1ms
mova,C_BYTE;取十位数
MOVCA,@A+DPTR;查十位数的7段代码movp0,a;送出十位的7段代码
SETBPS1CLRPS2
acalld1ms;显示1ms
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
RLCA
MOVR3,A
MOVA,R2
RLCA
MOVR2,A
MOVF0,C
CLRC
SUBBA,R7
JBF0,NDV312
JCNDV313
NDV312:
MOVR2,A
INCR4
NDV313:
DJNZB,NDV311
POPACC
CLROV
JZNDV314
SETBOV
NDV314:
XCHA,R2
MOVR7,A
RET
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
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
A