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