论文利用数码管显示的数字温度计文档格式.docx
《论文利用数码管显示的数字温度计文档格式.docx》由会员分享,可在线阅读,更多相关《论文利用数码管显示的数字温度计文档格式.docx(32页珍藏版)》请在冰点文库上搜索。
图2-5DS18B20接线原理图
2.2.4DS18B20时序图
主机使用时间隙来读写DS18B20的数据位和写命令字的位。
1.初始化时序如下图:
图2-6DS18B20初始化时序
2.DS18B20读写时序:
图2-7DS18B20读写时序
2.2.5数据处理
高速暂存存储器由9个字节组成,其分配如表5所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
图2-8字节分配
下表为12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;
如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,
实际温度=07D0H*0.0625=2000*0.0625=125℃。
例如-55℃的数字输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作运算),
实际温度=370H*0.0625=880*0.0625=55℃。
可见其中低四位为小数位。
图2-9DS18B20温度数据表
2.3显示电路模块
图2-10数码管驱动显示电路
2.3.1MAX7219的性能
(1)10MHz连续串行口
(2)独立的LED段控制
(3)数字的译码与非译码选择
(4)150μA的低功耗关闭模式
(5)亮度的数字和模拟控制
(6)高电压中断显示
(7)共阴极LED显示驱动
(8)限制回转电流的段驱动来减少EMI(MAX7221)
(9)SPI,QSPI,MICROWIRE串行接口(MAX7221)
(10)24脚的DIP和SO封装
2.3.2管脚描述
1:
DIN串行数据输入端口。
在时钟上升沿时数据被载入内部的16位寄存器。
2,3,5-8,10,11:
DIG0–DIG7八个数据驱动线路置显示器共阴极为低电平。
关闭时7219此管脚输出高电平,7221呈现高阻抗。
4,9:
GND地线(4脚和9脚必须同时接地)
12:
LOAD(MAX7219)载入数据。
连续数据的后16位在LOAD端的上升沿时被锁定。
CS(MAX7219)片选端。
该端为低电平时串行数据被载入移位寄存器。
连续数据的后16位在cs端的上升沿时被锁定。
13:
CLK时钟序列输入端。
最大速率为10MHz.在时钟的上升沿,数据移入内部移位寄存器。
下降沿时,数据从DOUT端输出。
对MAX7221来说,只有当cs端为低电平时时钟输入才有效。
14-17,20-23:
SEGA–SEGG,DP7段和小数点驱动,为显示器提供电流。
当一个段驱动关闭时,7219的此端呈低电平,7221呈现高阻抗。
18:
SET通过一个电阻连接到VDD来提高段电流。
19:
V+正极电压输入,+5V
24:
DOUT串行数据输出端口,从DIN输入的数据在16.5个时钟周期后在此端有效。
使用多个MAX7219/MAX7221时用此端方便扩展。
2.3.3时序图
图2-11时序图
2.3.4数据寄存器和控制寄存器
列出了14个可寻址的数据寄存器和控制寄存器。
数据寄存器由一个在片上的8×
8的双向SRAM来实现。
它们可以直接寻址所以只要在V+大于2V的情况下每个数据都可以独立的修改或保存。
控制寄存器包括编码模式、显示亮度、扫描限制、关闭模式以及显示检测五个寄存器。
表2-1数据寄存器和控制寄存器
2.4报警电路模块
当温度超过设定温度值时,实现报警,蜂鸣器鸣叫
图2-12报警电路
第三章软件设计
3.1主程序模块
主程序需要调用3个子程序,分别为:
(1)实时温度显示子程序:
MAX7219驱动数码管把实时温度值送出在LED数码管显示
(2)查询记录温度值子程序:
查询过去存储的温度值
(3)温度设定、报警子程序:
设定报警温度值,当温度超过该值时产生报警,即驱动蜂鸣器鸣叫
主程序流程图:
图2-13主程序流程图
3.2读温度值模块
读温度值模块需要调用4个子程序,分别为:
●DS18B20初始化子程序:
让单片机知道DS18B20在总线上且已准备好操作
●DS18B20写字节子程序:
对DS18B20发出命令
●DS18B20读字节子程序:
读取DS18B20存储器的数据
●延时子程序:
对DS18B20操作时的时序控制
3.2.1读温度值模块流程图
图2-14读温度值子程序流程图
3.2.2DS18B20初始化子程序流程图:
N
Y
图2-14DS18B20初始化子程序流程图
3.2.3DS18B20写字节和读字节子程序流程图:
图2-15DS18B20写字节子程序流程图图2-16DS18B20读字节子程序流程图
3.3中断模块
中断采用T0方式1,初始值定时为50ms。
中断模块需调用两个子程序:
●读温度值子程序:
定时读取温度值,实时更新温度值
●记录温度值子程序:
定时记录温度值,供查询使用
把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。
中断模块流程图:
图2-17中断模块流程图
第四章仿真验证
图3-1
图3-2
图3-3
第五章汇编程序
;
================================================================
;
DS18B20温度计
采用4位LED共阳显示器显示测温值,显示精度0.1℃,测温范围-55~+125℃
用AT89C51单片机,12MHz晶振
============================常数定义=============================
TIMELEQU0E0H;
20ms,定时器0时间常数
TIMEHEQU0B1H
TEMPHEADEQU36H
==========================工作内存定义============================
BITSTDATA20H
TIME1SOKBITBITST.1
TEMPONEOKBITBITST.2
TEMPLDATA26H
TEMPHDATA27H
TEMPHCDATA28H
TEMPLCDATA29H
=============================引脚定义===========================
TEMPDINBITP3.7
CLKEQUP1.2
DINEQUP1.0
LOADEQUP1.1
=============================中断向量区=========================
ORG0000H
LJMPSTART
ORG00BH
LJMPT0IT
=============================系统初始化==========================
ORG100H
START:
MOVSP,#60H
CLSMEM:
MOVR0,#20H
MOVR1,#60H
CLSMEM1:
MOV@R0,#00H
INCR0
DJNZR1,CLSMEM1
MOVTMOD,#00100001B;
定时器0工作方式1(16BIT)
MOVTH0,#TIMEL
MOVTL0,#TIMEH;
20ms
SJMPINIT
ERROR:
NOP
NOP
INIT:
SETBET0
SETBTR0
SETBEA
MOVPSW,#00H
CLRTEMPONEOK
LJMPMAIN
======================定时器0中断服务程序=======================
T0IT:
PUSHPSW
MOVPSW,#10H
MOVTH0,#TIMEH
MOVTL0,#TIMEL
INCR7
CJNER7,#32H,T0IT1
MOVR7,#00H
SETBTIME1SOK;
1s定时到标志
T0IT1:
POPPSW
RETI
=============================主程序=============================
MAIN:
LCALLDISP1;
调用显示子程序
JNBTIME1SOK,MAIN
CLRTIME1SOK;
测温每1s一次
JNBTEMPONEOK,MAIN2;
上电时先温度转换一次
LCALLREADTEMP1;
读出温度值子程序
LCALLCONVTEMP;
温度BCD码计算处理子程序
LCALLDISPBCD;
显示区BCD码温度值刷新子程序
LCALLWR_DATE
MAIN2:
LCALLREADTEMP;
温度转换开始
SETBTEMPONEOK
=============================子程序区===========================
RESETDS18B20
INITDS1820:
SETBTEMPDIN
CLRTEMPDIN
MOVR6,#0A0H;
DELAY480us
DJNZR6,$
MOVR6,#0A0H
MOVR6,#32H;
DELAY70us
MOVR6,#3CH
LOOP1820:
MOVC,TEMPDIN
JCINITDS1820OUT
DJNZR6,LOOP1820
MOVR6,#064H
SJMPINITDS1820
RET
INITDS1820OUT:
SETBTEMPDIN
======读DS18B20的程序,从DS18B20中读出一个字节的数据=============
READDS1820:
MOVR7,#08H
READDS1820LOOP:
CLRTEMPDIN
MOVR6,#07H;
DELAY15us
MOVC,TEMPDIN
MOVR6,#3CH;
DELAY120us
RRCA
DJNZR7,READDS1820LOOP
DELAY120us
========写DS18B20的程序,从DS18B20中写一个字节的数据=============
WRITEDS1820:
WRITEDS1820LOP:
MOVTEMPDIN,C
MOVR6,#34H;
DELAY104us
DJNZR7,WRITEDS1820LOP
=========================READTEMP===========================
READTEMP:
LCALLINITDS1820
MOVA,#0CCH
LCALLWRITEDS1820;
SKIPROM
MOVA,#44H
STARTCONVERSION
DELAY104
READTEMP1:
MOVA,#0BEH
SCRATCHPAD
MOVR5,#09H
MOVR0,#TEMPHEAD
MOVB,#00H
READTEMP2:
LCALLREADDS1820
MOV@R0,A
READTEMP21:
LCALLCRC8CAL
DJNZR5,READTEMP2
MOVA,B
JNZREADTEMPOUT
MOVA,TEMPHEAD+0
MOVTEMPL,A
MOVA,TEMPHEAD+1
MOVTEMPH,A
READTEMPOUT:
RET
==================处理温度BCD码子程序==========================
CONVTEMP:
MOVA,TEMPH
ANLA,#80H
JZTEMPC1
CLRC
MOVA,TEMPL
CPLA
ADDA,#01H
MOVA,TEMPH;
-
ADDCA,#00H
MOVTEMPH,A;
TEMPHCHI=符号位
MOVTEMPHC,#0BH
SJMPTEMPC11
TEMPC1:
MOVTEMPHC,#0AH;
+
TEMPC11:
MOVA,TEMPHC
SWAPA
MOVTEMPHC,A
ANLA,#0FH;
乘0.0625
MOVDPTR,#TEMPDOTTAB
MOVCA,@A+DPTR
MOVTEMPLC,A;
TEMPLCLOW=小数部分BCD
MOVA,TEMPL;
整数部分
ANLA,#0F0H
MOVA,TEMPH
ANLA,#0FH
ORLA,TEMPL
LCALLHEX2BCD1
ORLA,TEMPHC;
TEMPHCLOW=十位数BCD
SWAPA;
TEMPLCHI=个位数BCD
ORLA,TEMPLC
MOVTEMPLC,A
MOVA,R7
JZTEMPC12
MOVR7,A
MOVA,TEMPHC;
TEMPLCHI=百位数BCD
ORLA,R7
TEMPC12:
=========================小数部分码表===========================
TEMPDOTTAB:
DB00H,00H,01H,01H,02H,03H,03H,04H,05H,05H,06H
DB06H,07H,08H,08H,09H
======================显示区BCD码温度值刷新子程序===============
DISPBCD:
MOVA,TEMPLC
MOV70H,A
MOVA,TEMPLC
MOV71H,A
MOVA,TEMPHC
MOV72H,A
MOV73H,A
CJNEA,#010H,DISPBCD0
SJMPDISPBCD2
DISPBCD0:
JNZDISPBCD2;
十位数是0
MOV73H,#0AH;
符号位不显示
MOV72H,A;
十位数显示符号
DISPBCD2:
=======================显示子程序===============================
显示数据在70H~73H单元内,用4位LED共阳数码管显示,P1口输出段码数据,
P3口做扫描控制,每个LED数码管亮1ms时间再逐位循环。
DISP1:
MOVR1,#70H;
指向显示数据首址
MOVR5,#0FEH;
扫描控制字初值
PLAY:
MOVP0,#0FFH
MOVA,R5;
扫描字放入A
MOVP3,A;
从P3口输出
MOVA,@R1;
取显示数据到A
MOVDPTR,#TAB;
取段码表地址
MOVCA,@A+DPTR;
查显示数据对应段码
MOVP1,A;
段码放入P0口
MOVA,R5
JBACC.1,LOOP5;
小数点处理
CLRP1.7
LOOP5:
LCALLDL1MS;
显示1ms
INCR1;
指向下一地址
扫描控制字放入A
JNBACC.3,ENDOUT;
ACC.3=0时一次显示结束
RLA;
A中数据循环左移
MOVR5,A;
放回R5内
AJMPPLAY;
跳回PLAY循环
ENDOUT:
MOVP1,#0FFH;
一次显示结束,P0口复位
MOVP3,#0FFH;
P3口复位
RET;
子程序返回
TAB:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH
共阳段码表“0”“1”“2”“3”“4”“5”“6”“7”“8”“9”“不亮”“-”
DL1MS:
MOVR6,#14H;
1ms延时程序,LED显示程序用
DL1:
MOVR7,#19H
DL2:
DJNZR7,DL2
DJNZR6,DL1
=====================单字节十六进制转BCD=======================
HEX2BCD1:
MOVB,#064H;
十六进制->
BCD
DIVAB;
B=A%100
MOVR7,A;
R7=百位数
MOVA,#0AH
XCHA,B
B=A%B
ORLA,B
CalculateCRC-8Values.UsesTheCCITT-8Polynomial,ExpressedAs
X^8+X^5+X^4+1
CRC8CAL:
PUSHACC
MOVR7,#08H;
NumberBitsInByte
CRC8LOOP1:
XRLA,B;
CalculteCRC
RRCA;
MoveToCarry
MOVA,B;
GetTheLastCRCValue
JNCCRC8LOOP2;
SkipIfData==0
XRLA,#18H;
UpdataTheNewCRC
CRC8LOOP2:
RRCA;
PositionTheNewCRC
MOVB,A;
StoreTheNewCRC
POPACC;
GetTheRemainingBits
RRA;
PositionTheNextBit
PUSHACC;
SaveTheRemainingBits
DJNZR7,CRC8LOOP1;
RepeatFor8Bits