8051数字温度计1.docx

上传人:b****5 文档编号:11655118 上传时间:2023-03-29 格式:DOCX 页数:13 大小:18.37KB
下载 相关 举报
8051数字温度计1.docx_第1页
第1页 / 共13页
8051数字温度计1.docx_第2页
第2页 / 共13页
8051数字温度计1.docx_第3页
第3页 / 共13页
8051数字温度计1.docx_第4页
第4页 / 共13页
8051数字温度计1.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

8051数字温度计1.docx

《8051数字温度计1.docx》由会员分享,可在线阅读,更多相关《8051数字温度计1.docx(13页珍藏版)》请在冰豆网上搜索。

8051数字温度计1.docx

8051数字温度计1

8051数字温度计1

设计制作一台热敏电阻温度计,要求如下。

a.测量温度为10~150℃。

b.温度误差不大于0.5%。

c.温度用4位数码管显示。

d.以热敏电阻作为温度检测元件。

e.对输入值进行线性化处理。

根据已设计出的软件系统框图,用MCS-51汇编语言编制出各功能模块的子程序及整机软件系统的主程序,程序设计时,要充分考虑与所设计硬件电路的连接及有关定量的要求.

望高手把汇编语言的代码和设计思路及一些过程电路图发上来

-55~125度,你自己修改:

;***************WAVE-E6000/T**********************

;*MCU:

AT892051*

;*MCU-crystal:

12M*

;*Version:

01*

;*LastUpdata:

2007-5-27*

;*Author:

zhaojun*

;*Description:

*

;DS18B20的读写程序,数据脚P3.4*

;温度传感器18B20汇编程序,采用器件默认的12位转化*

;最大转化时间750微秒,显示温度-55到+125度,显示精度*

;为0.1度,显示采用4位LED共阳显示测温值*

;*************************************************

;单片机内存分配申明!

;*************************************************

TEMPER_LEQU40H;用于保存读出温度的低8位

TEMPER_HEQU41H;用于保存读出温度的高8位

FLAG1EQU38H;是否检测到DS18B20标志位

SECEQU20H;数码管个位数存放内存位置

MINEQU21H;数码管十位数存放内存位置

TEMPLEQU30H;用于保存读出温度的低8位

TEMPHEQU31H;用于保存读出温度的高8位

TEMPHCEQU32H;温度转换寄存器低8位

TEMPLCEQU33H;温度转换寄存器高8位

BUF1EQU34H;显示缓冲寄存器小数位

BUF2EQU35H;显示缓冲寄存器个数位

BUF3EQU36H;显示缓冲寄存器十数位

BUF4EQU37H;显示缓冲寄存器百数位

TEMPDINBITP3.4;数据脚定义

DINBITP1.7;小数点控制

;**********************************************

ORG0000H;主程序入口地址

AJMPMAIN;转主程序

ORG0003H;外中断0中断入口

DB00H,00H,00H,00H,00H,00H,00H;

RETI;跳至INTEX0执行中断服务程序

ORG000BH;定时器T0中断入口地址

DB00H,00H,00H,00H,00H,00H,00H;

RETI;跳至定时器T0执行中断服务程序

ORG0013H;外中断1中断入口

DB00H,00H,00H,00H,00H,00H,00H;

RETI;跳至INTEX1执行中断服务程序

ORG001BH;定时器T1中断入口地址

DB00H,00H,00H,00H,00H,00H,00H;

RETI;中断返回(不开中断)

ORG0023H;串行口中断入口地址

DB00H,00H,00H,00H,00H,00H,00H;

RETI;中断返回(不开中断)

;**********************************************

;两位数码管来显示温度,显示范围00到99度,显示精度为1度

;因为12位转化时每一位的精度为0.0625度,我们不要求显示小数所以可以抛弃29H的低4位

;将28H中的低4位移入29H中的高4位,这样获得一个新字节,这个字节就是实际测量获得的温度

;无需乘于0.0625系数

;**********************************************

MAIN:

MOVSP,#50H;

MOVP1,#0FFH;

LPTEMP:

LCALLGET_TEMPER;调用读温度子程序

LCALLCONVTEMP;温度BCD码计算处理子程序

LCALLDISPBCD;显示区BCD码温度值刷新子程序

;*************************************

LCALLDISPLAY;调用数码管显示子程序

;*************************************

;CPLP3.0;

AJMPLPTEMP;

;*************************************

;这是DS18B20复位初始化子程序

;*************************************

INIT_1820:

SETBTEMPDIN

NOP

CLRTEMPDIN;主机发出延时537微秒的复位低脉冲

MOVR1,#3

TSR1:

MOVR0,#107

DJNZR0,$

DJNZR1,TSR1

SETBTEMPDIN;然后拉高数据线

NOP

NOP

NOP

MOVR0,#25H

TSR2:

JNBTEMPDIN,TSR3;等待DS18B20回应

DJNZR0,TSR2

LJMPTSR4;延时

TSR3:

SETBFLAG1;置标志位,表示DS1820存在

;CLRP3.7;检查到DS18B20就点亮P3.7LED

LJMPTSR5

TSR4:

CLRFLAG1;清标志位,表示DS1820不存在

;CLRP3.1

LJMPTSR7

TSR5:

MOVR0,#117

TSR6:

DJNZR0,TSR6;时序要求延时一段时间

TSR7:

SETBTEMPDIN;

RET

;****************************************

;读出转换后的温度值

;****************************************

GET_TEMPER:

SETBTEMPDIN;

LCALLINIT_1820;先复位DS18B20

JBFLAG1,TSS2

RET;判断DS1820是否存在?

若DS18B20不存在则返回

TSS2:

;CLRP3.3;DS18B20已经被检测到!

!

MOVA,#0CCH;跳过ROM匹配

LCALLWRITE_1820

MOVA,#44H;发出温度转换命令

LCALLWRITE_1820

;*****************************************

;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒

;*****************************************

LCALLDISPLAY

;*****************************************

LCALLINIT_1820;准备读温度前先复位

MOVA,#0CCH;跳过ROM匹配

LCALLWRITE_1820

MOVA,#0BEH;发出读温度命令

LCALLWRITE_1820

LCALLREAD_18200;将读出的温度数据保存到35H/36H

RET

;*******************************************

;写DS18B20的子程序(有具体的时序要求)

;*******************************************

WRITE_1820:

MOVR2,#8;一共8位数据

CLRC;

WR1:

CLRTEMPDIN;

MOVR3,#6

DJNZR3,$

RRCA

MOVTEMPDIN,C;

MOVR3,#23

DJNZR3,$

SETBTEMPDIN;

NOP

DJNZR2,WR1;

SETBTEMPDIN;

RET

;*************************************

;处理温度BCD码子程序

;*************************************

CONVTEMP:

MOVA,TEMPH;

ANLA,#80H;

JZTEMPC1;判断温度是否在零下?

CLRC;温度值补码变成原码

MOVA,TEMPL;

CPLA

ADDA,#01H;

MOVTEMPL,A;

MOVA,TEMPH;-

CPLA;

ADDCA,#00H;

MOVTEMPH,A;TEMPHCHI=符号位

MOVTEMPHC,#0BH;置"-"标志

SJMPTEMPC11;

TEMPC1:

MOVTEMPHC,#0AH;置"+"标志

;**************************************

TEMPC11:

MOVA,TEMPHC;计算小数位温度BCD值

SWAPA

MOVTEMPHC,A;

MOVA,TEMPL;

ANLA,#0FH;乘0.0625

MOVDPTR,#TEMPDOTTAB;

MOVCA,@A+DPTR;

MOVTEMPLC,A;TEMPLCLOW=小数部分BCD

;**************************************

MOVA,TEMPL;计算整数位温度BCD值

ANLA,#0F0H;

SWAPA;

MOVTEMPL,A;

MOVA,TEMPH;

ANLA,#0FH;

SWAPA;

ORLA,TEMPL;

MOVTEMPER_L,A;

LCALLHEX2BCD1;调用单字节十六进制转BCD子程序

;************************************

MOVTEMPL,A;

ANLA,#0F0H;

SWAPA;

ORLA,TEMPHC;TEMPHCLOW=十位数BCD

MOVTEMPHC,A;

MOVA,TEMPL;

ANLA,#0FH;

SWAPA;TEMPLCHI=个位数BCD

ORLA,TEMPLC;

MOVTEMPLC,A;

MOVA,R7;

JZTEMPOUT;

ANLA,#0FH;

SWAPA;

MOVR7,A;

MOVA,TEMPHC;TEMPHCHI=百位数BCD

ANLA,#0FH;

ORLA,R7;

MOVTEMPHC,A;

TEMPOUT:

RET;

;**************************************

;小数部分分码表

;**************************************

TEMPDOTTAB:

DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06H

DB06H,07H,08H,08H,09H,09H;

;**************************************

;显示区BCD码温度值刷新子程序

;**************************************

DISPBCD:

MOVA,TEMPLC;温度数据移入显示寄存器

ANLA,#0FH;

MOVBUF1,A;显示小数

MOVA,TEMPLC;

SWAPA;

ANLA,#0FH;

MOVBUF2,A;显示个位

MOVA,TEMPHC;

ANLA,#0FH;

MOVBUF3,A;显示十位

MOVA,TEMPHC;

SWAPA;

ANLA,#0FH;

MOVBUF4,A;显示百位

MOVA,TEMPHC;

ANLA,#0F0H;

CJNEA,#10H,DISPBCD0;百位数=0?

SJMPDISPOUT;

DISPBCD0:

MOVA,TEMPHC;

ANLA,#0FH;

JNZDISPOUT;十位数是0?

MOVA,TEMPHC;

SWAPA;

ANLA,#0FH;

MOVBUF4,0AH;符号位不显示

MOVBUF3,A;十位数显示符号

DISPOUT:

RET;

;*************************************

;单字节十六进制转BCD

;*************************************

HEX2BCD1:

MOVB,#64H;十六进制->BCD

DIVAB;B=A%100

MOVR7,A;R7=百位数

MOVA,#0AH;

XCHA,B;

DIVAB;B=A%B

SWAPA;

ORLA,B;

RET;

;*************************************

;CalculateCRC-8Values,UsesThe

;CCITT-8Polynomial,ExpressedAs

;X^8+X^5+X^4+1

;*************************************

CRC8CAL:

PUSHACC;

MOVR7,#08H;NumberBitsByte

CRC8LOOP1:

XRLA,B;CalculateCRC

RRCA;MoveT0Carry

MOVA,B;GetTheLastCRCValue

JNCCRC8LOOP2;SkipIfData==0

XRLA,#18H;UpdateTheCRCValue

CRC8LOOP2:

RRCA;PositionTheNewCRC

MOVB,A;StoreTheNewCRC

POPACC;GetTheRemainingBits

RRA;PossitionTheNextBit

PUSHACC;SaveTheRemainingBits

DJNZR7,CRC8LOOP1;RepeatFor9Bits

POPACC;

RET;

;******************************************

;读DS18B20的程序,从DS18B20中读出9个字节数据

;开始的两个字节为温度数据

;******************************************

READ_18200:

MOVR4,#9;将温度高位和低位从DS18B20中读出

MOVR1,#TEMPER_L;低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)

MOVB,#00H;

;************************************

RE00:

MOVR2,#8;数据一共有8位

RE01:

CLRC

SETBTEMPDIN;

NOP

NOP

CLRTEMPDIN;

NOP

NOP

NOP

SETBTEMPDIN;

MOVR3,#9

RE10:

DJNZR3,RE10;

MOVC,TEMPDIN;

MOVR3,#23

RE20:

DJNZR3,RE20;

RRCA

DJNZR2,RE01;

;************************************

MOV@R1,A;

INCR1;

LCALLCRC8CAL;

DJNZR4,RE00;

MOVA,B;

JNZREAD_OUT;

MOVTEMPL,TEMPER_L;

MOVTEMPH,TEMPER_H;

READ_OUT:

RET

;*****************************************

;显示子程序

;*****************************************

DISPLAY:

MOVDPTR,#NUMTAB;指定查表启始地址

MOVR0,#4

DP11:

MOVR1,#250;显示1000次

DPLP:

SETBP1.7

MOVA,BUF1;取小位数

MOVCA,@A+DPTR;查小位数的7段代码

MOVP1,A;送出小位的7段代码

CLRP3.0;开小位显示

ACALLDL1ms;显示1ms

SETBP3.0;

MOVA,BUF2;取个位数

MOVCA,@A+DPTR;查个位数的7段代码

MOVP1,A;送出个位的7段代码

CLRP1.7

CLRP3.1;开个位显示

ACALLDL1ms;显示1ms

SETBP3.1;

SETBP1.7

MOVA,BUF3;取十位数

MOVCA,@A+DPTR;查十位数的7段代码

MOVP1,A;送出十位的7段代码

CLRP3.2;开十位显示

ACALLDL1ms;显示1ms

SETBP3.2;

SETBP1.7

MOVA,BUF4;取百位数

MOVCA,@A+DPTR;查百位数的7段代码

MOVP1,A;送出百位的7段代码

CLRP3.3;开百位显示

ACALLDL1ms;显示1ms

SETBP3.3;

DJNZR1,DPLP;250次没完循环

DJNZR0,DP11;4个100次没完循环

RET

;****************************************

;0.2MS延时(按12MHZ算)

;****************************************

DL1MS:

MOVR7,#100

DJNZR7,$

RET

;****************************************

;7段数码管0~9数字的共阳显示代码

;****************************************

NUMTAB:

DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH;

;"0""1""2""3""4""5""6""7""8""9""不亮""-"

;****************************************

END

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

当前位置:首页 > 初中教育 > 中考

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

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