数字温度汇编程序.docx
- 文档编号:18319687
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:17
- 大小:131.69KB
数字温度汇编程序.docx
《数字温度汇编程序.docx》由会员分享,可在线阅读,更多相关《数字温度汇编程序.docx(17页珍藏版)》请在冰点文库上搜索。
数字温度汇编程序
单片机实习报告
设计题目:
数字温度计的设计
专业:
组别:
学生姓名:
学号:
起止日期:
指导教师:
目录
1引言1
2硬件电路设计1
2.1主控制器1
2.2显示电路2
2.3温度传感器2
3程序设计4
3.1主程序4
3.2读出温度子程序5
3.3温度转换命令子程序5
3.4计算温度子程序5
3.5显示数据刷新子程序5
4源程序代码6
4.1主程序6
4.2读DS18B20程序6
4.3写DS18B20程序7
4.4处理温度BCD码子程序7
4.5温度值刷新子程序9
4.6显示子程序10
5调试与结论11
总结13
参考文献14
附录15
1引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便也是不可否定的,其中数字温度计就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活、提供更好的更方便的设施就需要从数单片机技术入手,一切向着数字化控制,智能化控制方向发展。
本设计所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确,其输出温度采用数字显示,主要用于对测温比较准确的场所,或科研实验室使用,该设计控制器使用单片机AT89S52,测温传感器使用DS18B20,测温范围为-55~125℃,用4位共阳极LED数码管以串口传送数据,实现温度显示。
2硬件电路设计
按照系统设计功能的要求,确定系统由3各模块组成:
主控制器、测温电路和显示电路,如图2.1所示。
图2.1数字温度计总体电路结构图
2.1主控制器
AT89S52与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:
0Hz~33Hz、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。
2.2显示电路
显示电路采用4位共阳LED数码管,从P1口输出段码,列扫描用P3.0~P3.3口来实现,列驱动用三极管。
2.3温度传感器
2.3.1DS18B20的性能特点
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,可以直接读出被测温度值,而且采用三线制与单片机相连,减少了外部的硬件电路,具有低成本和易使用的特点,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的主要性能特点如下:
(1)独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯;
(2)测温范围-55℃~+125℃,固有测温分辨率0.5℃;
(3)支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现多点测温;
(4)工作电源:
3~5V/DC;
(5)在使用中不需要任何外围元件;
(6)测量结果以9~12位数字量方式串行传送;
(7)适用于DN15~25,DN40~DN250各种介质工业管道和狭小空间设备测温;
2.3.2DS18B20的内部结构
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构如图2.2所示。
64位ROM的开始8位是产品类型的编号,接着是每个器件的唯一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20的存储器包括高速暂存器RAM和可电擦除E2PROM,可电擦除E2PROM又包括温度触发器TH和TL,以及一个配置寄存器。
存储器能完整的确定一线端口的通讯,数字开始用写寄存器的命令写进寄存器,接着也可以用读寄存器的命令来确认这些数字。
当确认以后就可以用复制寄存器的命令来将这些数字转移到可电擦除E2PROM中。
当修改过寄存器中的数时,这个过程能确保数字的完整性。
高速暂存器RAM是由8个字节的存储器组成;第1和第2个字节是温度的显示位。
第3和第4个字节是复制TH和TL,同时第3和第4个字节的数字可以更新;第5个字节是复制配置寄存器,同时第5个字节的数字可以更新;6、7、8三个字节是计算机自身使用。
用读寄存器的命令能读出第9个字节,这个字节是对前面的8个字节进行校验。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
2.3.3DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图2.3所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
图2.3DS18B20与单片机的接口电路图
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
3程序设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
3.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图3.1。
图3.1主程序流程图图3.2读出温度子程序流程图
3.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图3.2所示。
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令。
当采用12位分辨率时,转换时间约为750ms。
在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图3.3所示。
图3.3温度转换命令子程序流程图
3.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.4所示。
图3.4计算温度子程序流程图图3.5显示数据刷新子程序流程图
3.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图3.5所示。
4源程序代码
4.1主程序
ORG0000H
LJMPAA01
ORG000BH;使用T0定时中断地址
LJMPWW01;响应中断后,转移去执行中断服务程序
ORG002BH
AA01:
MOVP0,#0FFH
MOVP1,#0FFH
MOVP2,#0FFH
MOVP3,#0FFH
MOVSP,#70H;设置堆栈起始地址为70H
LCALLBB01;调用传感器复位子程序
;---设置显示数据缓冲寄存器---
;******************************
;高4位显示器
;******************************
MOV37H,#0;设置千位显示数据缓冲寄存器
MOV36H,#0;设置百位显示数据缓冲寄存器
MOV35H,#0;设置十位显示数据缓冲寄存器
MOV34H,#0;设置个位显示数据缓冲寄存器
;******************************
;低4位显示器
;******************************
MOV33H,#0;设置千位显示数据缓冲寄存器
MOV32H,#0;设置百位显示数据缓冲寄存器
MOV31H,#0;设置十位显示数据缓冲寄存器
MOV30H,#0;设置个位显示数据缓冲寄存器
;*******设置中断定时5ms*******
MOVTMOD,#01H;在TMOD寄存器中设置T0为内部定时工作方式1。
MOVTH0,#(65536-5000)/256
MOVTL0,#(65536-5000)/256
CLRTR1
SETBTR0;TCON寄存器的TR0位="1"启动T0定时/计数器。
SETBET0;IE寄存器的ET0位="1"打开T0定时/计数器的中断开关。
SETBEA;IE寄存器的EA位="1"打开中断总开关。
;******************************
;主程序
;******************************
AA03:
LCALLAAA1
LJMPAA03
;*******************************
;传感器温度转换程序
;*******************************
AAA1:
MOVR3,#10
AAA2:
LCALLBB01;调用传感器复位子程序
MOVA,#0CCH;跳过ROM指令代码
LCALLD001;调用向传感器发送串行指令子程序
MOVA,#44H;温度转换指令代码
LCALLD001;调用向传感器发送串行指令子程序
LCALLBB01;调用传感器复位器子程序
MOVA,#0CCH;跳过ROM指令代码
LCALLD001;调用向传感器发送串行指令子程序
MOVA,#0BEH;读温度指令代码
LCALLD001;调用向传感器发送串行指令子程序
LCALLE001;调用读取传感器串行数据子程序
MOV40H,A;读出温度值低字节存入40H
LCALLE001;调用读取传感器串行数据子程序
MOV41H,A;读出温度值低字节存入41H
DJNZR3,AAA2
LCALLBA01
RET
;*********************************
;12位温度数据处理成8位整数温度程序
;*********************************
;*******低8位数据处理程序*********
BA01:
MOVA,40H;把温度值低8字节存入A
ANLA,#11110000B;屏蔽低4位(去掉温度小数点以后的数据)
SWAPA;把高4位换到低4位
MOV57H,A;把处理后的数据暂时保存在57H单元
;*******高8位数据处理程序*********
MOVA,41H
ANLA,#00001111B;屏蔽高4位(12位温度数据只占用高8位的低4位)
SWAPA;把低4位换到高4位
ORLA,57H;把温度的低8位和高8位数据和合并为一个8位数据
MOV41H,A;8位的整数温度数据处理完成后,存入55H
;***把温度的二进制数转换成BCD码程序****
MOVR0,#31H;设置显示数据缓冲寄存器的起始地址号
MOV2DH,#3;设置转换位数为3位数据
MOV4BH,41H;把4EH里面是需要转换的数据转存到4BH
ZA31:
MOVA,4BH;把需要转换的数据转存到A
MOVB,#10;把除数10存入B单元
DIVAB;累加器A里面的数据和B单元的数据进行除法运算
MOV4BH,A;把除法运算的商数存入4BH单元
;-从低位开始保存转换好的BCD码--
MOV@R0,B;把除法运算的余数(BCD码)存入@R0指定的地址号
INCR0;显示数据缓冲寄存器的地址号加1
DJNZ2DH,ZA31;判断是否完成设定位数的BCD码转换
;*********************************
;12位温度数据处理成8位小数点温度程序
;*********************************
MOVDPTR,#DATA2;设置数据表地址
MOVA,40H;把温度值低8字节存入A
ANLA,#00001111B;屏蔽高4位(保留温度小数点以后的数据)
MOVCA,@A+DPTR;把温度的二进制数转换成十进制数表示
MOV30H,A;把小数点位温度值存入个位0-9字符编码地址号的寄存器
RET
;*******传感器复位子程序*******
BB01:
CLRP2.7;把传感器信号线置低电平超过480us,传感器复位。
MOV60H,#250
DJNZ60H,$;延时500μs
SETBP2.7;把传感器信号线置高50us。
MOV60H,#30
DJNZ60H,$;延时50μs
JNBP2.7,$;检测是否连接传感器(连接=0,没有连接=1)
SETBP2.7
LCALLM001;延时200μs
RET
;***向传感器发送串行指令子程序***
D001:
MOVR2,#08H;设置发送8位串行
CLRC;清进位C
D002:
CLRP2.7;把传感器信号线置低电平
MOV60H,#5
DJNZ60H,$;延时10μs
RRCA;把指令码右一位到C
MOVP2.7,C;向传感器发送一位指令码
MOV60H,#25
DJNZ60H,$;延时50μs
SETBP2.7;把传感器信号线置高电平
DJNZR2,D002;8位串行指令是否发送完成
RET
;***读取传感器串行数据子程序***
E001:
MOVR2,#08H;设置读取8位串行
MOVA,#00H;清累加器A
CLRC;清进位C
E002:
CLRP2.7;把传感器信号线置低电平
MOV60H,#10
DJNZ60H,$;延时10μs
SETBP2.7;把传感器信号线置高电平
MOV60H,#10
DJNZ60H,$;延时10μs
MOVC,P2.7;读取位数据(从低位读取)
RRCA;把位数据右移到A
MOV60H,#30
DJNZ60H,$;延时50μs
SETBP2.7;把传感器信号线置高电平
DJNZR2,E002;是否读取完成8位串行数据
RET
M001:
MOV60H,#100
M002:
DJNZ60H,M002
RET
;****************************
;中断服务程序
;****************************
WW01:
CLRET0;IE寄存器的ET0位="0"关闭T0定时/计数器的中断开关
CLRTR0;TCON寄存器的TR0位="0"停止T0定时/计数器。
PUSHACC;压入堆栈(保护累加器A的数据)
PUSHDPH;压入堆栈(保护高位数据表地址号)
PUSHDPL;压入堆栈(保护低位数据表地址号)
PUSH68H;压入堆栈(保护延时程序的数据)
PUSH67H;压入堆栈(保护延时程序的数据)
PUSH66H;压入堆栈(保护延时程序的数据)
PUSH60H
;******************************
;扫描8位显示器子程序
;******************************
;*****读取字符编码子程序*****
AC01:
MOVDPTR,#DATA0;设置数据表的起始地址号
MOV28H,#8;设置需要扫描8只显示器
MOV2AH,#11111110B;设置从右到左逐位扫描显示器的位数据
MOVR1,#30H;设置显示缓冲寄存器的起始地址号为30H
AC02:
MOVA,@R1;从显示缓冲寄存器中取出段码地址号
MOVCA,@A+DPTR;按照段码地址号读取段编码
CJNER1,#31H,AC03
SUBBA,#80H
AC03:
LCALLAD01;调用点亮显示器子程序
MOVA,2AH;把位扫描数据存入A
RLA;把位扫描数据向左移动1位
MOV2AH,A;移动后的位扫描数据存回2AH
INCR1;显示缓冲寄存器的地址号加1
DJNZ28H,AC02;判断是否完成设定只数的显示器扫描
;-------完成中断服务-----
MOVTH0,#(65536-5000)/256
MOVTL0,#(65536-5000)/256
POP60H
POP66H;弹出堆栈(恢复延时程序的数据)
POP67H;弹出堆栈(恢复延时程序的数据)
POP68H;弹出堆栈(恢复延时程序的数据)
POPDPL;弹出堆栈(恢复低位数据表地址号)
POPDPL;弹出堆栈(恢复高位数据表地址号)
POPACC;弹出堆栈(恢复累加器A的数据)
SETBTR0;TCON寄存器的TR0位="1"启动T0定时/计数器。
SETBET0;IE寄存器的ET0位="1"打开T0定时/计数器的中断开关。
RETI;中断控制服务程序执行完成返回主程序
;******************************
;显示器驱动子程序
;******************************
AD01:
;-----输出显示器段编码-----
SETBP2.0;选通锁存器
MOVP0,A;显示器段码传送到P0口
CLRP2.1;段编码存入锁存器
SETBP2.1;锁存段编码
;-----输出显示器位数据-------
MOVP0,2AH;显示器位码送到P0口
CLRP2.2;位数据存入锁存器
LCALLBBM1;调用延时1000μS子程序(每一位显示器亮一定的时间)
SETBP2.2;锁存位数据
CLRP2.0;停止选通锁存器
RET
;---------延时子程序---------
BBM1:
MOV67H,#2
BBM2:
MOV66H,#250
BBM3:
DJNZ66H,BBM3
DJNZ67H,BBM2
RET
;--字符--"0-9"编码
DATA0:
DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH;(共阳极)
DATA2:
DB0,0,1,1,2,3,4,4,5,5,6,6,7,8,8,9
END
5调试与结论
系统的调试以程序调试为主。
硬件调试比较简单,首先检查电路的焊接是是否正确,然后可用万用表测试或通电检测。
软件调试可以先编写显示程序并进行硬件的正确性检验,然后分别进行主程序、读出温度子程序、温度转换命令子程序、计算温度子程序和显示数据刷新子程序等的编写及调试。
由于DS18B20与单片机采用串行数据传送,因此,对DS18B20进行读/写编程时必须严格地保证读/写时序;否则将无法读取测量结果。
本程序采用单片机汇编语言编写,用KeilC51编译器编程调试。
软件调试到能显示温度值,而且在有温度变化时显示温度能改变,就基本完成。
通过小组成员的合作,硬件基本焊完,程序也编写完成,经过编译确认无误,但由于时间及小组成员知识有限,当程序写入硬件后,运行结果与理论预测有偏差。
附录
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 温度 汇编程序