单片机课程设计——温度测控系统程序

  • 格式:doc
  • 大小:83.00 KB
  • 文档页数:15

SDA EQU P1.3 ;I2C数据线

SCL EQU P1.4 ;I2C时钟线

DQ EQU P1.5 ;3-WIR数据线

CLK EQU P1.6 ;3-WIR时钟线

NRST EQU P1.7 ;3-WIR复位线

SLAW EQU 70H ;SAA1064写命令,地址为70H,最低位为0表示写

SLAR EQU 71H ;SAA1064读命令,地址为71H,最低位为1表示读

TH EQU 34 ;最高极限温度

TL EQU 32 ;最低极限温度

TZ EQU 33

DSEG AT 20H

NUMBYT: DS 1 ;向SAA1064I2C传送字节数N存放单元

BUFTC: DS 2 ;SAA1064发送命令缓冲区

BUFTD: DS 4 ;向SAA1064发送数据缓冲区

BUFRD: DS 6 ;从SAA1064接收缓冲区

DAT1: DS 1 ;温度值存储单元

POINT: DS 1 ;小数点后温度值的存储单元

CSEG AT 0000H

JMP MAIN1

ORG 0003H

LJMP KEY

ORG 0100H

MAIN1: MOV SP,#60H ;已用参数R0,R1,R2,R5,R6,R7,C,F0

MOV PSW,#00H

MOV 50H,#33

MOV 51H,#25

MOV 52H,#29

MAIN0: SETB EX0

SETB EA

MOV 45H,#2 ;写入判断条件

MOV 33H,#1 ;写入循环条件

MOV 44H,#1

MOV A,38H

CJNE A,#00H,AA1

MOV 38H,#01H

RETI

AA1:CLR IE0

CLR P1.0

LCALL BEGIN ;复位命令

MOV A,#0CH ;写配置寄存器命令

LCALL W8BIT

MOV A,#0AH ;连续转换模式数据 LCALL W8BIT

LCALL BEGIN ;结束上一次通讯,开始下一次通讯

MOV A,#01H ;写TH寄存器命令

LCALL W8BIT

MOV A,#TH

MOV A,50H ;写最高温度值

MOV POINT,#0

LCALL W9BIT

LCALL BEGIN ;结束上一次通讯,开始下一次通讯

MOV A,#02H ;写TL寄存器命令

LCALL W8BIT

MOV A,#TL

MOV A,51H;写最低温度值

MOV POINT,#0

LCALL W9BIT

LCALL BEGIN ;结束上一次通讯,开始下一次通讯

MOV A,#0EEH ;开始温度转换命令

LCALL W8BIT

CLR NRST ;结束上一次通讯

LCALL DELAY2 ;延时1s

RENU: LCALL BEGIN ;复位命令

MOV A,#0AAH ;写读温度值命令

LCALL W8BIT

LCALL R9BIT ;读9位温度值

MOV 57H,R0 ;加如的判断温度和设定之间的关系,并跳到相应的子程序

MOV 46H,A

MOV A,50H

DEC A

MOV B,46H

SUBB A,B

JB ACC.7,S5

JMP S6

S5:LJMP KBS

S6:MOV A,52H

ADD A,#2

MOV B,46H

SUBB A,B

JB ACC.7,S7

JMP S8

S7:LJMP QJKS S8:MOV B,51H

MOV A,46H

SUBB A,B

JB ACC.7,S11

JMP S10

S11:LJMP KBJ

S10:MOV A,52H

SUBB A,#2

MOV B,A

MOV A,46H

SUBB A,B

JB ACC.7,S9

JMP S12

S9:LJMP KJ

S12: MOV R0,57H ;判断结束5

MOV A,46H ;AAAAAAAAAAAAAAAAAAAAAAAAAAAAA

MOV DAT1,A ;将1-8位温度值送DAT保存

CLR NRST ;结束一次读温度

LCALL STORE ;将温度值转换为可显示的形式

MOV NUMBYT,#6 ;显示温度值

LCALL WRNBYT

SJMP RENU

STORE: MOV R0,#BUFTC ;用到参数DAT,POINT

MOV A,#00H ;SAA1064子地址

MOV @R0,A

INC R0

MOV A,#47H ;SAA1064控制字节

MOV @R0,A

MOV R0,#BUFTD

MOV A,DAT1 ;判断温度值是正是负

JB ACC.7,NEG

MOV A,#00H ;正温度的符号位不显示,数码管不亮

MOV @R0,A

AJMP NST

NEG: CPL A ;将负数转换成相应的正数

MOV B,A

MOV A,POINT

CPL A

CLR ACC.1

INC A MOV C,ACC.1

XCH A,B

ADDC A,#0

MOV DAT1,A ;把负温度值1-8位变正存储

MOV POINT,B ;把负温度值第9位变正存储

MOV A,#40H ;负号显示

MOV @R0,A

NST: INC R0 ;显示缓冲区地址加1

MOV A,DAT1 ;取温度值

MOV B,#10 ;除法后寄存器ACC是十位数,寄存器B是个位数

DIV AB

MOV DPTR,#TAB0 ;将十位和个位的数转换为数码管的字形码值

MOVC A,@A+DPTR

MOV @R0,A ;存十位数

INC R0 ;显示缓冲区地址加1

MOV A,B

MOVC A,@A+DPTR

SETB ACC.7

MOV @R0,A ;存个位数和小数点

INC R0 ;显示缓冲区地址加1

MOV A,POINT ;取小数点后的值

JB ACC.0,FLOAT ;如果有小数转FLOAT

MOV A,#3FH ;将0的字形码值存缓冲区

MOV @R0,A

AJMP E

FLOAT: MOV A,#6DH ;将5的字形码值存缓冲区

MOV @R0,A

E: RET

TAB0: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0~9段码值表

;3-WIR初始化子程序

BEGIN: CLR NRST ;复位线置0

CALL DELAY1 ;延时20mS,这是为了写EEPROM时有足够长的等待时间

SETB CLK ;置3-WIR时钟为高

SETB NRST ;复位线置1

RET

;向3-WIR数据线上发送9位温度值,第9位数据在POINT中,1-8位数据在ACC中

W9BIT: CLR CLK ;置3-WIR时钟为低

SETB DQ ;置3-WIR数据线为1,即默认第9位数据为1

MOV R0,POINT ;从POINT读出第9位数据送R0

CJNE R0,#0,W1 ;第9位数据不为0转W1

CLR DQ ;置3-WIR数据线为0,即第9位数据为0 W1: SETB CLK ;置3-WIR时钟为高,发送数据

;下一段程序也可单独作为写8位数据使用

W8BIT: MOV R0,#08H ;置R0为8,为写8位数据建立计数器初值

W2: CLR CLK ;置3-WIR时钟为低

SETB DQ ;置3-WIR数据线为1,即默认数据为1

RRC A ;右移将被发送数据放入进位C

JC W3 ;进位为1(即发送数据为1)转W3

CLR DQ ;置3-WIR数据线为0,即发送数据为0

W3: SETB CLK ;置3-WIR时钟为高,发送数据

DJNZ R0,W2 ;8位数据没送完转W2

RET

;读9位温度值。第9位存到POINT,第1-8位存到累加器ACC

R9BIT: SETB DQ ;置3-WIR数据为高,为接收数据做准备

CLR CLK ;置3-WIR时钟为低

MOV POINT,#1 ;默认小数点后的数据为1

MOV C,DQ ;传送小数点后的数据到进位C

JC RR1 ;进位为1转RR1

MOV POINT,#0 ;将0存入POINT

RR1: SETB CLK ;置3-WIR时钟为高

;下一段程序也可单独作为写8位数据使用

R8BIT: MOV R0,#08H ;置R0为8,为读8位数据建立计数器初值

RR2: CLR CLK ;置3-WIR时钟为低

MOV C,DQ ;传送读出的数据到进位C

RRC A ;通过右移将读出的数放入ACC

SETB CLK ;置3-WIR时钟为高

DJNZ R0,RR2 ;8位数据没读完转RR2

RET

;模拟I2C总线发送N个字节数据,N存放在NUMBYT中

;数据区的第一个字节为从器件的地址SUBADR

;数据区的第二个字节是控制寄存器字节COM

WRNBYT: LCALL STAR0 ;发出启动传输命令

MOV A,#SLAW ;发出发送数据命令

LCALL WRBYT

LCALL CACK ;调用应答子程序

JB F0,WRNBYT ;如果错误应答,转WRNBYT重新开始

MOV R1,#BUFTC ;放发送数据区的首地址在R1中

WRDAT: MOV A,@R1 ;从数据区中取出1个字节发送

LCALL WRBYT

LCALL CACK ;调用应答子程序

JB F0,WRNBYT ;如果错误应答,转WRNBYT重新开始

INC R1 ;数据区地址加1