8051数字温度计1文档格式.docx
- 文档编号:8632524
- 上传时间:2023-05-12
- 格式:DOCX
- 页数:13
- 大小:18.37KB
8051数字温度计1文档格式.docx
《8051数字温度计1文档格式.docx》由会员分享,可在线阅读,更多相关《8051数字温度计1文档格式.docx(13页珍藏版)》请在冰点文库上搜索。
MINEQU21H;
数码管十位数存放内存位置
TEMPLEQU30H;
TEMPHEQU31H;
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;
跳至定时器T0执行中断服务程序
ORG0013H;
外中断1中断入口
跳至INTEX1执行中断服务程序
ORG001BH;
定时器T1中断入口地址
中断返回(不开中断)
ORG0023H;
串行口中断入口地址
两位数码管来显示温度,显示范围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;
然后拉高数据线
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:
RET
****************************************
读出转换后的温度值
GET_TEMPER:
LCALLINIT_1820;
先复位DS18B20
JBFLAG1,TSS2
RET;
判断DS1820是否存在?
若DS18B20不存在则返回
TSS2:
CLRP3.3;
DS18B20已经被检测到!
!
MOVA,#0CCH;
跳过ROM匹配
LCALLWRITE_1820
MOVA,#44H;
发出温度转换命令
*****************************************
这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALLDISPLAY
准备读温度前先复位
MOVA,#0BEH;
发出读温度命令
LCALLREAD_18200;
将读出的温度数据保存到35H/36H
*******************************************
写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOVR2,#8;
一共8位数据
CLRC;
WR1:
MOVR3,#6
DJNZR3,$
RRCA
MOVTEMPDIN,C;
MOVR3,#23
DJNZR2,WR1;
处理温度BCD码子程序
CONVTEMP:
MOVA,TEMPH;
ANLA,#80H;
JZTEMPC1;
判断温度是否在零下?
温度值补码变成原码
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;
ANLA,#0FH;
乘0.0625
MOVDPTR,#TEMPDOTTAB;
MOVCA,@A+DPTR;
MOVTEMPLC,A;
TEMPLCLOW=小数部分BCD
计算整数位温度BCD值
ANLA,#0F0H;
SWAPA;
ORLA,TEMPL;
MOVTEMPER_L,A;
LCALLHEX2BCD1;
调用单字节十六进制转BCD子程序
************************************
ORLA,TEMPHC;
TEMPHCLOW=十位数BCD
TEMPLCHI=个位数BCD
ORLA,TEMPLC;
MOVA,R7;
JZTEMPOUT;
MOVR7,A;
TEMPHCHI=百位数BCD
ORLA,R7;
TEMPOUT:
小数部分分码表
TEMPDOTTAB:
DB00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB06H,07H,08H,08H,09H,09H;
显示区BCD码温度值刷新子程序
DISPBCD:
MOVA,TEMPLC;
温度数据移入显示寄存器
MOVBUF1,A;
显示小数
MOVBUF2,A;
显示个位
MOVBUF3,A;
显示十位
MOVBUF4,A;
显示百位
CJNEA,#10H,DISPBCD0;
百位数=0?
SJMPDISPOUT;
DISPBCD0:
MOVA,TEMPHC;
ANLA,#0FH;
JNZDISPOUT;
十位数是0?
MOVBUF4,0AH;
符号位不显示
十位数显示符号
DISPOUT:
单字节十六进制转BCD
HEX2BCD1:
MOVB,#64H;
十六进制->
BCD
DIVAB;
B=A%100
R7=百位数
MOVA,#0AH;
XCHA,B;
B=A%B
ORLA,B;
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:
PositionTheNewCRC
MOVB,A;
StoreTheNewCRC
POPACC;
GetTheRemainingBits
RRA;
PossitionTheNextBit
SaveTheRemainingBits
DJNZR7,CRC8LOOP1;
RepeatFor9Bits
******************************************
读DS18B20的程序,从DS18B20中读出9个字节数据
开始的两个字节为温度数据
READ_18200:
MOVR4,#9;
将温度高位和低位从DS18B20中读出
MOVR1,#TEMPER_L;
低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
MOVB,#00H;
************************************
RE00:
数据一共有8位
RE01:
CLRC
MOVR3,#9
RE10:
DJNZR3,RE10;
MOVC,TEMPDIN;
RE20:
DJNZR3,RE20;
DJNZR2,RE01;
MOV@R1,A;
INCR1;
LCALLCRC8CAL;
DJNZR4,RE00;
JNZREAD_OUT;
MOVTEMPL,TEMPER_L;
MOVTEMPH,TEMPER_H;
READ_OUT:
显示子程序
DISPLAY:
MOVDPTR,#NUMTAB;
指定查表启始地址
MOVR0,#4
DP11:
MOVR1,#250;
显示1000次
DPLP:
SETBP1.7
MOVA,BUF1;
取小位数
查小位数的7段代码
MOVP1,A;
送出小位的7段代码
CLRP3.0;
开小位显示
ACALLDL1ms;
显示1ms
SETBP3.0;
MOVA,BUF2;
取个位数
查个位数的7段代码
送出个位的7段代码
CLRP1.7
CLRP3.1;
开个位显示
SETBP3.1;
MOVA,BUF3;
取十位数
查十位数的7段代码
送出十位的7段代码
CLRP3.2;
开十位显示
SETBP3.2;
MOVA,BUF4;
取百位数
查百位数的7段代码
送出百位的7段代码
CLRP3.3;
开百位显示
SETBP3.3;
DJNZR1,DPLP;
250次没完循环
DJNZR0,DP11;
4个100次没完循环
0.2MS延时(按12MHZ算)
DL1MS:
MOVR7,#100
DJNZR7,$
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 8051 数字 温度计