第3组 06103班 傅兰涛Word格式.docx
《第3组 06103班 傅兰涛Word格式.docx》由会员分享,可在线阅读,更多相关《第3组 06103班 傅兰涛Word格式.docx(59页珍藏版)》请在冰豆网上搜索。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图3所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分率。
由表1可见,DS18B20温度转换的时间比较长,而且分辨率越高,所需要的温度数据转换时间越长。
因此,在实际应用中要将分辨率和转换时间权衡考虑。
高速暂存RAM的第6、7、8字节保留未用,表现为全逻辑1。
第9字节读出前面所有8字节的CRC码,可用来检验数据,从而保证通信数据的正确性。
当DS18B20接收到温度转换命令后,开始启动转换。
转换完成后的温度值就以16位带符号扩展的二进制补码形式存储在高速暂存存储器的第1、2字节。
单片机可以通过单线接口读出该数据,读数据时低位在先,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;
当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表2是一部分温度值对应的二进制温度数据。
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并对主机发出的报警搜索命令作出响应。
因此,可用多只DS18B20同时测量温度并进行报警搜索。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。
主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理是这这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;
高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55
℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍关闭就重复上述过程,直到温度寄存器值大致被测温度值。
硬件介绍
系统框图
原理图
LCD液晶模块设计:
4*4键盘模块设计:
DS18B20温度采集模块设计:
软件设计
流程图如下:
源程序及程序注释
;
----------KEYBOARD-----------
HOR_DATAEQU08H;
PORTD行
VER_DATAEQU06H;
PORTB列
HOR_TRISEQU88H;
TRISD
VER_TRISEQU86H;
TRISB
FSREQU04H
PCLEQU02H
KEYEQU20H
DATA1EQU21H
DATA2EQU22H
CHARCOUNTEQU23H
TABLEEQU40H
STATUSEQU03H
ZEQU2
COMPAREEQU50H
-----------LCD-----------
LCD_DATAEQU08H;
PORTD
LCD_DATA_TRISEQU88H;
LCD_CTRLEQU09H;
PORTE
LCD_CTRL_TRISEQU89H;
TRISE
ADCON1EQU9FH
LCD_EEQU1
LCD_RSEQU0
TMR0EQU01H
TMR0BEQUD'
176'
INTCONEQU0BH
OPTION_REGEQU81H
----------18B20---------------
PORTAEQU5H
TRISAEQU85H
TEMPEQU24H
TEMP1EQU25H
TEMP2EQU26H
COUNTEQU27H
COUNT1EQU28H
CEQU0
INDFEQU00H
PPEQU29H
KEYDATAEQU2AH
PLUS1EQU71H
PLUS2EQU72H
WARNHHEQU2BH
WARNHLEQU2CH
WARNLHEQU2DH
WARNLLEQU2EH
BIAOZHIEQU2FH
--------------WARNING---------
PORTCEQU7H
TRISCEQU87H
COUNT2EQU31H
---------------------------------
ORG0X00
NOP
GOTOMAIN
---------------------显示WARNINGMAX:
---------------
WARNHTABLE
MOVFCHARCOUNT,w
ADDWFPCL,1
RETLW'
W'
A'
R'
N'
I'
G'
'
M'
X'
RETLW'
:
'
--------------------------显示WARNINGMIN----------------------
WARNLTABLE
-----------------------显示WELCOMETOUSE----------------------
WELCOMETABLE;
显示"
WELCOMEUSE"
E'
L'
C'
O'
T'
U'
S'
---------------------显示TEMPERATURE:
TEMPTABLE;
TEMPERATURE:
"
P'
--------------------显示MAXTEMP-----------------------------
MAXTABLE
--------------------显示MINTEMP-----------------------------
MINTABLE
---------------------显示CHECK:
CHECKTABLE;
B'
D'
F'
-------------------翻译程序----------------------------------
TRANSLATELCD
0'
;
1'
2'
3'
4'
5'
6'
7'
8'
9'
---------------显示AVERAGETEMP---------------------------
AVETABLE
V'
----------------------显示GOODBYE-----------------------------
ENDTABLE
Y'
----------------------主函数------------------------------
MAIN
CALLLCDINTI
MOVLW0X0C;
开显示,关光标
CALLLCDPUTCMD
CALLLCDCLAR
MOVLW0X01;
右移1位显示
CALLLCDDDRAM
CALLDISPWELCOME
CALLDELAY250MS
MOVLW0X00
MOVWFPP
MOVWFBIAOZHI
CALLKEY1
CALLCHECKCHECK;
报警温度输入程序
BANKSELTRISA
CLRFTRISC
MOVLW01H
MOVWFOPTION_REG
MOVLW06H
MOVWFADCON1;
将A,E端口设置成普通I/O端口
BANKSELPORTA
MOVLW00H;
关中断
MOVWFINTCON
CALLDISPTEMP
MOVLW0XC6;
换行再移六位
GOTOLOOP;
温度检测程序
--------------在RAM中建立位置码位---------------------------
KEY1
MOVLW0DBH;
0
MOVWF40H
MOVLW077H;
1
MOVWF41H
MOVLW07BH;
2
MOVWF42H
MOVLW07DH;
3
MOVWF43H
MOVLW07EH;
4
MOVWF44H
MOVLW0B7H;
5
MOVWF45H
MOVLW0BBH;
6
MOVWF46H
MOVLW0BDH;
7
MOVWF47H
MOVLW0BEH;
8
MOVWF48H
MOVLW0D7H;
9
MOVWF49H
MOVLW0DDH;
A
MOVWF4AH
MOVLW0DEH;
B
MOVWF4BH
MOVLW0E7H;
C
MOVWF4CH
MOVLW0EBH;
D
MOVWF4DH
MOVLW0EDH;
E
MOVWF4EH
MOVLW0EEH;
F
MOVWF4FH
RETURN
-------------报警温度输入程序(ABCCEF输入无效)----------------------
CHECKCHECK
CALLDISPWARNH;
WARNINGMAX界面程序
MOVLW0C6H
CALLLCDDDRAM;
换行并右移6个单位
MOVLW0X0F
CALLLCDPUTCMD;
开光标并闪烁
TT1
CALLCHECK;
按键及显示程序
MOVLW0X0A
SUBWFFSR,0
BTFSCSTATUS,0;
比较键值是否比A大
GOTOTIM1;
是,调用函数TIM1
MOVLW30H;
否,把值加30(转换成ASCII码)赋给报警上限温度的十位
ADDWFFSR,0
MOVWFWARNHH
TT2
GOTOTIM2;
是,调用函数TIM2
否,把值加30(转换成ASCII码)赋给报警上限温度的个位
MOVWFWARNHL
CALLLCDCLAR;
清屏函数
CALLDISPWARNL;
WARNINGMIN界面程序
MOVLW0C6H;
MOVLW0X0F;
TT3
GOTOTIM3;
是,调用函数TIM3
否,把值加30(转换成ASCII码)赋给报警下限温度的十位
MOVWFWARNLH
TT4
GOTOTIM4;
是,调用函数TIM4
否,把值加30(转换成ASCII码)赋给报警下限温度的个位
ADDWFFSR,0
MOVWFWARNLL
TIM1
换行并右移6个单位(回位,即输入无效,再次覆盖)
GOTOTT1
TIM2
MOVLW0XC7;
换行并右移7个单位(回位,即输入无效,再次覆盖)
GOTOTT2
TIM3
GOTOTT3
TIM4
GOTOTT4
-----------------按键和键盘防抖及调用显示子程序----------------------
CHECK
CALLSCANBOARD
COMFKEY,0
BTFSCSTATUS,2;
判断是否有键按下
GOTOCHECK;
无键按下
MOVLW.13;
预置外循环变量
MOVWFDATA2
CALLDELAY2;
调用延时子程序,消除抖动影响
再次判断是否有键按下,否,有键按下
是,无键按下
MOVFKEY,0
MOVWFKEYDATA
CALLTRANSLATE;
把键位码翻译成16进制数
MOVFFSR,0
CALLTRANSLATELCD;
把16进制数翻译成用于显示的ASCII码
BANKSELLCD_DATA_TRIS;
把D,E端口设置为输出
CLRFLCD_DATA_TRIS
CLRFLCD_CTRL_TRIS
BANKSELLCD_DATA
CALLLCDPUTCHAR;
调用显示子程序
CHECK1
MOVLW.117
MOVWFDATA2;
产生100毫秒延时
CALLSCANBOARD
COMFKEY,0;
位置码取反
BTFSSSTATUS,2;
测试按键释放否
GOTOCHECK1;
否继续检测
RETURN
------------键盘扫