利用汇编语言实现基于DS18B20的单片机温度测控范文.docx

上传人:b****9 文档编号:156215 上传时间:2022-10-04 格式:DOCX 页数:7 大小:15.60KB
下载 相关 举报
利用汇编语言实现基于DS18B20的单片机温度测控范文.docx_第1页
第1页 / 共7页
利用汇编语言实现基于DS18B20的单片机温度测控范文.docx_第2页
第2页 / 共7页
利用汇编语言实现基于DS18B20的单片机温度测控范文.docx_第3页
第3页 / 共7页
利用汇编语言实现基于DS18B20的单片机温度测控范文.docx_第4页
第4页 / 共7页
利用汇编语言实现基于DS18B20的单片机温度测控范文.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

利用汇编语言实现基于DS18B20的单片机温度测控范文.docx

《利用汇编语言实现基于DS18B20的单片机温度测控范文.docx》由会员分享,可在线阅读,更多相关《利用汇编语言实现基于DS18B20的单片机温度测控范文.docx(7页珍藏版)》请在冰豆网上搜索。

利用汇编语言实现基于DS18B20的单片机温度测控范文.docx

利用汇编语言实现基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1