论文利用数码管显示的数字温度计文档格式.docx

上传人:b****1 文档编号:816597 上传时间:2023-04-29 格式:DOCX 页数:32 大小:397.77KB
下载 相关 举报
论文利用数码管显示的数字温度计文档格式.docx_第1页
第1页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第2页
第2页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第3页
第3页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第4页
第4页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第5页
第5页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第6页
第6页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第7页
第7页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第8页
第8页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第9页
第9页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第10页
第10页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第11页
第11页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第12页
第12页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第13页
第13页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第14页
第14页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第15页
第15页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第16页
第16页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第17页
第17页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第18页
第18页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第19页
第19页 / 共32页
论文利用数码管显示的数字温度计文档格式.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

论文利用数码管显示的数字温度计文档格式.docx

《论文利用数码管显示的数字温度计文档格式.docx》由会员分享,可在线阅读,更多相关《论文利用数码管显示的数字温度计文档格式.docx(32页珍藏版)》请在冰点文库上搜索。

论文利用数码管显示的数字温度计文档格式.docx

图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

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2