单片机课程设计——温度测控系统程序
- 格式: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