温度测控与报警系统汇编程序.docx
《温度测控与报警系统汇编程序.docx》由会员分享,可在线阅读,更多相关《温度测控与报警系统汇编程序.docx(15页珍藏版)》请在冰豆网上搜索。
温度测控与报警系统汇编程序
西安邮电学院
测控仪器课程设计报告书(程序)
题目:
温度测控与报警系统
院部名称
:
自动化学院
学生姓名
:
专业名称
:
班级
:
时间
:
********************************************************************************
;温度传感器在P3.6
;数据经P0.0~3输出到译码器,位数选择经P0.4~7输出到译码器
********************************************************************************/
Start_NUM_ByteEQU50H
Temp_LByteEQU40H
Temp_HByteEQU41H
TemperatureIEQU62H
TemperatureDEQU63H
TemperatureMAXIEQU64H
TemperatureMAXDEQU66H
TemperatureMINIEQU67H
TemperatureMINDEQU68H
Temp_COMP_TagEQU20H.1
Exist_TagEQU20H.0
BEEP_BitbitP3.7
TEMP_PINbitP3.6
DISP_PORTEQUP0;高4位为数码管位数
ORG0000H
LJMPMAIN
ORG000BH
LJMPTIMER0
ORG0080H
;--------------------------------------------------
MAIN:
;LCALLTest_Bit
;LCALLTest_NUM
MOVTemperatureMAXI,#30;温度设定25.5<=正常<=30.5
MOVTemperatureMAXD,#50
MOVTemperatureMINI,#25
MOVTemperatureMIND,#50
;LCALLSetNum
;AAA5:
LCALLDispNum
;AJMPAAA5
;AJMPAAA
LCALLOpen_Timer0Int
AAA:
LCALLRead_Temperature
JMPAAA
;*****定时器0中断服务********************************************************
Open_Timer0Int:
MOVTMOD,#01H
MOVTH0,#LOW(65536-10000);TH0=(65536-10000)mod256
MOVTL0,#HIGH(65536-10000);TL0=(65536-10000)/256,从55536向上计数10000次
SETBET0
SETBTR0
SETBEA
RET
TIMER0:
ACALLDispNUM
MOVTH0,#LOW(65536-10000);定时器10MS中断
MOVTL0,#HIGH(65536-10000)
CLREA
JNBTemp_COMP_Tag,No_Alarm
MOVA,#13H
ACALLBeep
CLRTemp_COMP_Tag
No_Alarm:
SETBEA
RETi
;*****温度传感器********************************************************
Trans_Temperature:
MOVR0,#Start_NUM_Byte
MOVA,Temp_LByte
ANLA,#0F0H
MOV3AH,A
MOVA,Temp_HByte
ANLA,#0FH
ORLA,3AH
SWAPA
MOVB,#10
DIVAB
MOV@R0,A
INCR0
MOV@R0,B
INCR0
MOVDPTR,#TABB
MOVA,Temp_LByte
ANLA,#0FH
MOVB,#2
MULAB
MOVCA,@A+DPTR
MOV@R0,A
INCR0
MOVA,Temp_LByte
ANLA,#0FH
MOVB,#2
MULAB
INCA
MOVCA,@A+DPTR
MOV@R0,A
INCR0
MOV@R0,#0F0H
ACALLGet_Temp_Value
ACALLCompareTemp
RET
TABB:
DB0,0,0,6,1,2,1,8,2,5,3,1,3,7,4,3,5,0
DB5,6,6,2,6,8,7,5,8,1,8,7,9,3
/*将温度转换成10进制数,TemperatureI为整数部分,TemperatureD为小数部分*/
Get_Temp_Value:
MOVR0,#Start_NUM_Byte
MOVA,@R0
MOVB,#10
MULAB
MOVTemperatureI,A
INCR0
MOVA,@R0
ADDA,TemperatureI
MOVTemperatureI,A
INCR0
MOVA,@R0
MOVB,#10
MULAB
MOVTemperatureD,A
INCR0
MOVA,@R0
ADDA,TemperatureD
MOVTemperatureD,A
RET
CompareTemp:
CLRTemp_COMP_Tag
CLRC
MOVR1,TemperatureI
MOVA,TemperatureMAXI
SUBBA,TemperatureI
JCSET_COMP_TAG
;AJMPExit_Comp_88
JZCOMP_MAX_D
AJMPCOMP_MIN_I
COMP_MAX_D:
CLRC
MOVA,TemperatureMAXD
SUBBA,TemperatureD
JCSET_COMP_TAG
COMP_MIN_I:
MOVA,TemperatureI
SUBBA,TemperatureMINI
JCSET_COMP_TAG
JZCOMP_MIN_D
AJMPExit_Comp_88
COMP_MIN_D:
MOVA,TemperatureD
SUBBA,TemperatureMIND
JCSET_COMP_TAG
AJMPExit_Comp_88
SET_COMP_TAG:
SETBTemp_COMP_Tag
Exit_Comp_88:
RET
/*-------------------------------
读:
在A中写:
在A中检查F0,F0==1则无设备
*-------------------------------*/
Read_Temperature:
CLREA;屏蔽中断
LCALLCheck_Exist
JBExist_Tag,EXIT_READ;如果没有应答,返回主程序
MOVA,#0CCH
LCALLSend_Byte;跳过ROM匹配
MOVA,#44H;发出温度转换命令
LCALLSend_Byte
SETBEA
MOV48H,#1;廷时75ms以上准备读
SS2:
MOV49H,#255
SS1:
MOV4AH,#255
SS0:
DJNZ4AH,SS0
DJNZ49H,SS1
DJNZ48H,SS2
CLREA
LCALLCheck_Exist
JBExist_Tag,EXIT_READ
MOVA,#0CCH;跳过ROM匹配
LCALLSend_Byte
MOVA,#0BEH;发出读温度命令
LCALLSend_Byte
LCALLRead_Byte
MOVTemp_LByte,A
LCALLREAD_BYTE
MOVTemp_HByte,A
LCALLTrans_Temperature
EXIT_READ:
SETBEA
RET
/*----------------------------------
18B20由低电平触发,所以主机平常保持高电平
主机下拉480~960us,然后上拉后延时等待15~60us,然后检测总线是否被下拉,
如果下拉,则表示有设备,18B20下拉信号后会延时60~240us。
--------------------------------*/
Check_Exist:
SETBTEMP_PIN
NOP
NOP
CLRTEMP_PIN
MOVR6,#250;主机发复位脉冲:
MOV:
2周期,DJNZ:
2周期,2+2*250+2+2*48=600us
DJNZR6,$
MOVR6,#48
DJNZR6,$
SETBTEMP_PIN;主机释放总线,口线改为输入
MOVR6,#35;延时2+2*35=72us,18B20会在60us内作出响应
DJNZR6,$
MOVC,TEMP_PIN;将状态保存,F0==0则无设备
MOVExist_Tag,C
MOVR6,#120;延时2+2+2*120=244us等待18B20释放总线,否则有可能被重新拉低
DJNZR6,$
SETBTEMP_PIN
RET
;==========================================================
;重新对DS18B20初始化
;将设定的温度报警值写入DS18B20
;==========================================================
SetTempAlarmValue:
ACAllCheck_Exist
JBExist_Tag,EXIT_SetValue2
MOVA,#0CCH;跳过ROM匹配
LCALLSend_Byte
MOVA,#4EH;写暂存寄存器
LCALLSend_Byte
MOVA,#88H;TH(报警上限)
LCALLSend_Byte
MOVA,#08H;TL(报警下限)
LCALLSend_Byte
MOVA,#7FH;12位精确度
LCALLSend_Byte
EXIT_SetValue2:
RET
/*-------------------------------
发送一个字节程序,字节放在A中
带进位位的右移,每移1位到C中,就将C中的1位数据发送出去
--------------------------------*/
Send_Byte:
PUSHB
MOVB,#8
START_A_BIT:
RRCA
ACALLWriteABit
DJNZB,START_A_BIT
POPB
RET
/*-------------------------------
写一位,下降沿触发18B20接收1位,主机在下降沿之后的15us内必须把数据放到总线上,
18B20会在15~60us内采样数据,所以主机必须保持信号持续75us以上,再次发送一位就再次上拉下降
如果主机一直下拉480us,则会产生复位信号。
所以
PIN=1;PIN=0;Delay=5~10us----开始
PIN=0/1(data);Delay=70us---输出
Delay=2us---保持>1us间隙发送下1位
--------------------------------*/
WriteABit:
PUSHB
CLRTEMP_PIN;写开始
MOVB,#3;2+3*2=8us
DJNZB,$
MOVTEMP_PIN,C;C内容到总线
MOVB,#28;等待56Us
DJNZB,$
POPB
SETBTEMP_PIN;释放总线
RET
/*-------------------------------
读1位,15us内由下降、上升沿两个信号触发读
PIN=0;Delay=5~10us,PIN=1;----开始
PIN=0/1(data);Delay=70us---输出
Delay=2us---保持>1us间隙发送下1位
--------------------------------*/
Read_Byte:
;读一个字节程序
MOVR5,#8
READ_A_BIT:
LCALLReadABit
RRCA
DJNZR5,READ_A_BIT
RET
ReadABit:
PUSHB
PUSHACC
SETBTEMP_PIN;先复位至少1US产生读起始信号
NOP
NOP
CLRTEMP_PIN
NOP
NOP
SETBTEMP_PIN;置位DAT准备接收数据
MOVB,#10;等待数据准备好(60us内)2+10*2=22us
DJNZB,$
MOVC,TEMP_PIN
MOVB,#15;等待32us+10+22+2=总66us
DJNZB,$
SETBTEMP_PIN
POPACC
POPB
RET
;*********数码管********************************************************
/*--------------------------------------------
dispNum
*---------------------------------------------*/
DispNum:
MOVR0,#Start_NUM_Byte
MOVR1,#0H
ST_NUM_Dsp:
MOVA,@R0;从Start_NUM_Byte开始读取数据,如果高字节大于0则结束。
MOVR5,A;用R5暂时保存数据,然后获取高4位,低4位inputR5
ANLA,#0F0H
JNZEXIT_DSP
MOVA,R5
ANLA,#0FH
SWAPA
ORLA,R1
SWAPA
MOVDISP_PORT,A;开始显示数据,
ACALLT1MS
INCR1
INCR0
AJMPST_NUM_Dsp
EXIT_DSP:
RET
T1MS:
movr5,#00h;延时子程序
tt889:
movr6,#9
djnzr6,$
djnzr5,tt889
ret
/*--------------------------------------------
testBit
*---------------------------------------------*/
Test_bit:
MOVA,#11111110b
TTT:
MOVP0,A
RLA
ACALLDELAY
AJMPTTT
RET
/*--------------------------------------------
SetNum
*---------------------------------------------*/
SetNum:
MOVR0,#Start_NUM_Byte
MOV@R0,#01H
INCR0
MOV@R0,#02H
INCR0
MOV@R0,#03H
INCR0
MOV@R0,#0CH
INCR0
MOV@R0,#05H
INCR0
MOV@R0,#0F0H
RET
/*--------------------------------------------
TestNum
*---------------------------------------------*/
Test_NUM:
MOVR0,#0
MOVDPTR,#Num_TABLE
TTT_NUM:
MOVA,R0
MOVCA,@A+DPTR
JNZNext_NUM
MOVR0,#0
AJMPTTT_NUM
Next_NUM:
MOVP0,A
incR0
ACALLDELAY
AJMPTTT_NUM
RET
;-------------------------------------------------------
DELAY:
MOVR5,#10
DEL1:
MOVR7,#200
DEL2:
MOVR6,#200
DJNZR6,$
DJNZR7,DEL2
DJNZR5,DEL1
RET
/*----------------------------------
Beep:
时间参数在A中,时间为A*256*256*12/f
f(时钟频率),输出引脚在头部定义
A中低4位为延时,高4位为声音频率0=高音,1=中;2=高
------------------------------------*/
BEEP:
PUSH05h
PUSH06h
PUSH07h
MOVR5,A
ANLA,#0FH
XCHA,R5
ANLA,#0F0H
SWAPA
BEEP_1:
MOVR6,#050H
BEEP_2:
MOVR7,#05FH
BEEP_3:
CJNEA,#0,NextF1
CPLBEEP_Bit
NextF1:
DJNZR7,BEEP_3
CJNEA,#1,NextF2
CPLBEEP_Bit
NextF2:
DJNZR6,BEEP_2
CJNEA,#2,NextF3
CPLBEEP_Bit
NextF3:
DJNZR5,BEEP_1
POP07h
POP06h
POP05h
RET
;-------------------------------------------------------
Num_TABLE:
DB28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,00H
;DB00101000b,01111110b,10100010b,01100010b,01110100b,01100001b,00100001b,01111010b,00100000b,01100000b,00H
;-------------------------------------------------------
END