温度测控与报警系统汇编程序.docx

上传人:b****5 文档编号:6445295 上传时间:2023-01-06 格式:DOCX 页数:15 大小:18.30KB
下载 相关 举报
温度测控与报警系统汇编程序.docx_第1页
第1页 / 共15页
温度测控与报警系统汇编程序.docx_第2页
第2页 / 共15页
温度测控与报警系统汇编程序.docx_第3页
第3页 / 共15页
温度测控与报警系统汇编程序.docx_第4页
第4页 / 共15页
温度测控与报警系统汇编程序.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

温度测控与报警系统汇编程序.docx

《温度测控与报警系统汇编程序.docx》由会员分享,可在线阅读,更多相关《温度测控与报警系统汇编程序.docx(15页珍藏版)》请在冰豆网上搜索。

温度测控与报警系统汇编程序.docx

温度测控与报警系统汇编程序

西安邮电学院

测控仪器课程设计报告书(程序)

 

题目:

温度测控与报警系统

 

院部名称

自动化学院

学生姓名

专业名称

班级

时间

 

********************************************************************************

;温度传感器在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

 

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

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1