温度测控与报警系统汇编程序Word文档下载推荐.docx
《温度测控与报警系统汇编程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《温度测控与报警系统汇编程序Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
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
定时器10MS中断
MOVTL0,#HIGH(65536-10000)
CLREA
JNBTemp_COMP_Tag,No_Alarm
MOVA,#13H
ACALLBeep
CLRTemp_COMP_Tag
No_Alarm:
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
MOVDPTR,#TABB
MOVB,#2
MULAB
MOVCA,@A+DPTR
INCA
MOV@R0,#0F0H
ACALLGet_Temp_Value
ACALLCompareTemp
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
MOVTemperatureI,A
ADDA,TemperatureI
MOVTemperatureD,A
ADDA,TemperatureD
CompareTemp:
CLRC
MOVR1,TemperatureI
MOVA,TemperatureMAXI
SUBBA,TemperatureI
JCSET_COMP_TAG
AJMPExit_Comp_88
JZCOMP_MAX_D
AJMPCOMP_MIN_I
COMP_MAX_D:
MOVA,TemperatureMAXD
SUBBA,TemperatureD
COMP_MIN_I:
MOVA,TemperatureI
SUBBA,TemperatureMINI
JZCOMP_MIN_D
COMP_MIN_D:
MOVA,TemperatureD
SUBBA,TemperatureMIND
SET_COMP_TAG:
SETBTemp_COMP_Tag
Exit_Comp_88:
/*-------------------------------
读:
在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
JBExist_Tag,EXIT_READ
MOVA,#0CCH;
MOVA,#0BEH;
发出读温度命令
LCALLRead_Byte
MOVTemp_LByte,A
LCALLREAD_BYTE
MOVTemp_HByte,A
LCALLTrans_Temperature
EXIT_READ:
/*----------------------------------
18B20由低电平触发,所以主机平常保持高电平
主机下拉480~960us,然后上拉后延时等待15~60us,然后检测总线是否被下拉,
如果下拉,则表示有设备,18B20下拉信号后会延时60~240us。
--------------------------------*/
Check_Exist:
SETBTEMP_PIN
NOP
CLRTEMP_PIN
MOVR6,#250;
主机发复位脉冲:
MOV:
2周期,DJNZ:
2周期,2+2*250+2+2*48=600us
DJNZR6,$
MOVR6,#48
SETBTEMP_PIN;
主机释放总线,口线改为输入
MOVR6,#35;
延时2+2*35=72us,18B20会在60us内作出响应
MOVC,TEMP_PIN;
将状态保存,F0==0则无设备
MOVExist_Tag,C
MOVR6,#120;
延时2+2+2*120=244us等待18B20释放总线,否则有可能被重新拉低
==========================================================
重新对DS18B20初始化
将设定的温度报警值写入DS18B20
SetTempAlarmValue:
ACAllCheck_Exist
JBExist_Tag,EXIT_SetValue2
MOVA,#4EH;
写暂存寄存器
MOVA,#88H;
TH(报警上限)
MOVA,#08H;
TL(报警下限)
MOVA,#7FH;
12位精确度
EXIT_SetValue2:
发送一个字节程序,字节放在A中
带进位位的右移,每移1位到C中,就将C中的1位数据发送出去
Send_Byte:
PUSHB
MOVB,#8
START_A_BIT:
RRCA
ACALLWriteABit
DJNZB,START_A_BIT
POPB
写一位,下降沿触发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:
CLRTEMP_PIN;
写开始
MOVB,#3;
2+3*2=8us
DJNZB,$
MOVTEMP_PIN,C;
C内容到总线
MOVB,#28;
等待56Us
释放总线
RET
读1位,15us内由下降、上升沿两个信号触发读
PIN=0;
Delay=5~10us,PIN=1;
----开始
Read_Byte:
读一个字节程序
MOVR5,#8
READ_A_BIT:
LCALLReadABit
DJNZR5,READ_A_BIT
ReadABit:
PUSHB
PUSHACC
先复位至少1US产生读起始信号
置位DAT准备接收数据
MOVB,#10;
等待数据准备好(60us内)2+10*2=22us
MOVC,TEMP_PIN
MOVB,#15;
等待32us+10+22+2=总66us
POPACC
*********数码管********************************************************
/*--------------------------------------------
dispNum
*---------------------------------------------*/
DispNum:
MOVR1,#0H
ST_NUM_Dsp:
MOVA,@R0;
从Start_NUM_Byte开始读取数据,如果高字节大于0则结束。
MOVR5,A;
用R5暂时保存数据,然后获取高4位,低4位inputR5
JNZEXIT_DSP
MOVA,R5
ORLA,R1
MOVDISP_PORT,A;
开始显示数据,
ACALLT1MS
INCR1
AJMPST_NUM_Dsp
EXIT_DSP:
T1MS:
movr5,#00h;
延时子程序
tt889:
movr6,#9
djnzr6,$
djnzr5,tt889
ret
testBit
Test_bit:
MOVA,#11111110b
TTT:
MOVP0,A
RLA
ACALLDELAY
AJMPTTT
SetNum
SetNum:
MOV@R0,#01H
MOV@R0,#02H
MOV@R0,#03H
MOV@R0,#0CH
MOV@R0,#05H
TestNum
Test_NUM:
MOVR0,#0
MOVDPTR,#Num_TABLE
TTT_NUM:
MOVA,R0
JNZNext_NUM
AJMPTTT_NUM
Next_NUM:
MOVP0,A
incR0
-------------------------------------------------------
DELAY:
MOVR5,#10
DEL1:
MOVR7,#200
DEL2:
MOVR6,#200
DJNZR7,DEL2
DJNZR5,DEL1
Beep:
时间参数在A中,时间为A*256*256*12/f
f(时钟频率),输出引脚在头部定义
A中低4位为延时,高4位为声音频率0=高音,1=中;
2=高
------------------------------------*/
BEEP:
PUSH05h
PUSH06h
PUSH07h
MOVR5,A
ANLA,#0FH
XCHA,R5
BEEP_1:
MOVR6,#050H
BEEP_2:
MOVR7,#05FH
BEEP_3:
CJNEA,#0,NextF1
CPLBEEP_Bit
NextF1:
DJNZR7,BEEP_3
CJNEA,#1,NextF2
NextF2:
DJNZR6,BEEP_2
CJNEA,#2,NextF3
NextF3:
DJNZR5,BEEP_1
POP07h
POP06h
POP05h
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