📄 job2.asm
字号:
;接口与数据定义
DATA_IN EQU 28H
DATA_OUT EQU 29H
CHR EQU 2CH ;频道号
BIT_COUNT EQU 40H
TIMER EQU 41H
TIMER1 EQU 42H
GEW EQU 43H
TENTH EQU 44H
HUNDREDTH EQU 45H
SUMH EQU 4AH
SUML EQU 4BH
GRD EQU 66H
SCL BIT P0.0 ; UV1316
SDA BIT P0.1
ZENGB BIT P0.5
CLK BIT P1.4 ; 2543
DIN BIT P1.5
DOUT BIT P1.6
CS BIT P1.7
CS1 BIT P2.0 ; 7279
CLK12 BIT P2.1
DAT BIT P2.2
KEY BIT P2.3
CS2 BIT P2.4
;;;;;;;;;;;;;;;主程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0030H
AJMP START
START: ; ----------------------------------------------
;---------------------------------
CALL DELAY_25MS
MOV DATA_OUT,#10100100B ;发复位指令
CALL SEND
MOV DATA_OUT,#10111111B ;发送闪烁指令
CALL SEND
SETB CS1 ;恢复cs为高电平
MOV R3,#00H
MAIN: JB KEY,MAIN ;检测是否有键按下
CJNE R3,#00H,ONEADD
MOV DATA_OUT,#10100100B ;发复位指令
CALL SEND
MOV DATA_OUT,#81H ;方式0译码 数码管第2位显示0
CALL SEND
MOV DATA_OUT,#00H
CALL SEND
ONEADD: MOV DATA_OUT,#80H ;方式0译码 数码管第1位显示N
CALL SEND
MOV DATA_OUT,R3
CALL SEND
SETB CS1
HH1: CJNE R3,#01H,HH2
AJMP GAP1
HH2: CJNE R3,#02H,HH3
AJMP GAP2
HH3: CJNE R3,#03H,HH4
AJMP GAP3
HH4: CJNE R3,#04H,HH5
AJMP GAP4
HH5: CJNE R3,#05H,HH6
AJMP GAP5
HH6: CJNE R3,#06H,HH7
AJMP GAP6
HH7: CJNE R3,#07H,HH8
AJMP GAP7
HH8: CJNE R3,#08H,HH0
AJMP GAP8
HH0: MOV R3,#00H
WAIT: JNB KEY,WAIT ;等待按踺放开
INC R3
JMP MAIN
;--------------------------------
;----------------------------------------------
GAP1: MOV DATA_OUT,#00H ;采集第一个通道
CALL TLC2543
CALL ZHUAN
MOV DATA_OUT,#87H ;方式0译码 数码管高位第8显示
CALL HD7279
SETB CS1
CALL DL500
JB KEY,GAP1
AJMP WAIT
GAP2: MOV DATA_OUT,#10H ;采集第二个通道
CALL TLC2543
CALL ZHUAN
MOV DATA_OUT,#87H ;方式0译玛 数码管位第5位显示
CALL HD7279
SETB CS1
CALL DL500
JB KEY,GAP2
AJMP WAIT
GAP3: CALL GET_TEMPER
CALL ZHUAN
MOV DATA_OUT,#87H
CALL HD7279
SETB CS1
AJMP WAIT
GAP4: AJMP WAIT
GAP5: AJMP WAIT
GAP6: AJMP WAIT
GAP7: AJMP WAIT
GAP8: MOV R3,#00H
AJMP WAIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;采集子程序:TLC2543;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;入口:DATA_OUT:采集口,串行方式
;;;;;;;;;;;;;;;出口:SUMH、SUML:采集结果
TLC2543: SETB CS ;TLC2543的初始化 MOV P1,#11101111
CLR CLK
MOV R5,#5 ;对同一个通道采集5次,第一次为无效字节
MOV R1, #GRD ;R1保存寄存器首地址
KC: CLR CS ;下降沿到开始采集
MOV R0, #0CH ;传送12BIT计数
MOV A, DATA_OUT ;取采集口
GATHER: CLR C
MOV C, DOUT ;读入转换数据到C
RLC A ;进位C(1位转换数据)左移入A,将1位控制位移入C
MOV DIN,C ;送出串行输出控制位
SETB CLK
NOP
NOP
CLR CLK
CJNE R0, #5, D4
MOV @R1, A ;保留高八位转换结果,在@GRD中
INC R1
CLR A
D4: DJNZ R0, GATHER
SETB CS ;接收完转换数据
ANL A, #0FH ;保留低四位
MOV @R1, A ;存入单元
DEC R1
MOV A,@R1 ;存放格式规范化
INC R1
SWAP A
XCHD A,@R1
DEC R1
MOV @R1,A
CJNE R5, #5, ADD5
MOV SUMH, #00H ;第一个转换结果无效
MOV SUML, #00H
JMP AVERAGE
ADD5: MOV A, SUML ;对同一个口采四次,四次结果相加
ADD A, @R1
MOV SUML, A
INC R1
MOV A, SUMH
ADDC A, @R1
MOV SUMH, A
DEC R1
AVERAGE: DJNZ R5, KC ;五个没采完,继续
CLR C ;求均值:总和除4,即右移2次
MOV A, SUMH
RRC A
MOV SUMH, A
MOV A, SUML
RRC A
MOV SUML, A
CLR C
MOV A, SUMH
RRC A
MOV SUMH, A
MOV A, SUML
RRC A
MOV SUML, A
RET
;;;;;;;;;;;;;;;采集子程序:TLC2543;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;12位二进制数转换成三位BCD码;;;;;;;;;;
;;;;;;;;;;;;;;;入口:SUMH,SUML;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;出口:GEW,TENTH,HUNDREDTH;;;;;;;;;;;;
ZHUAN: MOV R1, #GRD ;R1保存寄存器首地址
MOV @R1,SUML
INC R1
MOV @R1,SUMH
DEC R1
ACALL MUL5 ;X5
ANL A,#0F0H ;保存BCD码
SWAP A
MOV GEW,A ;保存整数部分
ACALL MUL5 ;X10
ACALL MUL2
ANL A,#0F0H ;保存BCD码
SWAP A
MOV TENTH,A ;保存十分位
ACALL MUL5 ;X10
ACALL MUL2
ANL A,#0F0H
SWAP A
MOV HUNDREDTH,A ;保存百分位
ACALL MUL5 ;X10
ACALL MUL2
ANL A,#0F0H ;取BCD码的值进行四舍五入
CLR C
SUBB A,#50H ;??????????????????????????????????????
CPL C
CLR PSW.6 ;;;;;;;;;;;;;;;;;;;个人认为应该在这个地方加 clr psw.6
MOV A,HUNDREDTH
ADDC A,#0
DA A
MOV HUNDREDTH,A
CLR c ;;;;;;;;;;;;;;;
MOV c,PSW.6 ;;;;;;;;;;;;;;;
MOV A,TENTH ;这个地方应该判断PSW.6位的数据
ADDC A,#0
DA A
MOV TENTH,A
MOV C,PSW.6 ;;;;;;;;;;;;;;;;;
MOV A,GEW ;;;;;;;;;;;;;;;;;
ADDC A,#0 ;;;;;;;;;;;;;;;;;
MOV GEW,A ;;;;;;;;;;;;;;;;;
RET
MUL5: MOV A,@R1 ;目标数(两字节)乘五,得数覆盖该目标数
MOV B,#05H
MUL AB
MOV @R1,A
MOV R2,B
INC R1
MOV A,@R1
ANL A,#0FH
MOV B,#05H
MUL AB
ADD A,R2 ;A中保存着乘以5后的高字节
MOV @R1,A
DEC R1
RET
MUL2: CLR C ;目标乘数二,相当于左移一次
MOV A,@R1
RLC A
MOV @R1,A
INC R1
MOV A,@R1
RLC A
MOV @R1,A
DEC R1
RET
;;;;;;;;;;;;;;;12位二进制数转换成三位BCD码;;;;;;;;;
;;;;;;;;;;;;;;显示子程序:HD7279;;;;;;;;;;;;;;;;;;;;
HD7279: MOV A,#00H
ORL GEW,A ; 逻辑或指令
MOV R0,DATA_OUT
CALL SEND
MOV DATA_OUT,GEW ;发送个位数据到HD7279A
CALL SEND
MOV A,#0F0H
ORL TENTH,A
DEC R0
MOV DATA_OUT,R0
CALL SEND
MOV DATA_OUT,TENTH ;发送十分位数据到HD7279A
CALL SEND
DEC R0
MOV DATA_OUT,R0
CALL SEND
MOV DATA_OUT,HUNDREDTH ;发送百分位数据到HD7279A
CALL SEND
RET
;;;;;;;;;;;;;发送1个字节到HD7279,高位在前;;;;;;;;;;;;;;;;
SEND: MOV BIT_COUNT, #8
CLR CS1
CALL LONG_DELAY
SEND_LP: MOV C,DATA_OUT.7
MOV DAT, C
SETB CLK12
MOV A, DATA_OUT
RL A
MOV DATA_OUT, A
CALL SHORT_DELAY
CLR CLK12
CALL SHORT_DELAY
DJNZ BIT_COUNT, SEND_LP
CLR DAT ;重设DAT口为低电平(输出状态)
RET
;;;;;;;;;从HD7279接收一个字节,高位在前;;;;;;;;;;;;;;;;;;;;;
RECEIVE: MOV BIT_COUNT, #8
SETB DAT
CALL LONG_DELAY
RECEIVE_LP:SETB CLK12
CALL SHORT_DELAY
MOV A, DATA_IN
RL A
MOV DATA_IN, A
MOV C, DAT
MOV DATA_IN.0,C
CLR CLK12
CALL SHORT_DELAY
DJNZ BIT_COUNT, RECEIVE_LP
CLR DAT
RET
;;;;;;;;;;;;;;;;;延时子程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LONG_DELAY: MOV TIMER, #25 ;50uS
DELAY_LOOP: DJNZ TIMER, DELAY_LOOP
RET
SHORT_DELAY: MOV TIMER, #4 ;8uS
SHORT_LOOP: DJNZ TIMER, SHORT_LOOP
RET
DL50: MOV TIMER, #0C8H ;100ms
DL501: MOV TIMER1,#0FAH
DL502: DJNZ TIMER1,DL502
DJNZ TIMER, DL501
RET
DL5: MOV TIMER,#20 ;10ms
DL51: MOV TIMER1,#0E6H
DL52: DJNZ TIMER1,DL52
DJNZ TIMER,DL51
RET
DL500: MOV R7,#5 ;500ms
DL5001: CALL DL50
DJNZ R7,DL5001
RET
DELAY_25MS: MOV TIMER,#50 ;延迟约25MS
START_DELAY: MOV TIMER1, #255
START_DELAY1: DJNZ TIMER1,START_DELAY1
DJNZ TIMER,START_DELAY
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;温度采集子程序;温度采集子程序;;;;;;;;;;;;;;
; ;;;;;;;;;;;;;;读出转换后的温度值;;;;;;;;;;;;;;;;;;;;;;
GET_TEMPER: SETB P0.2
LCALL INIT_1820 ;先复位DS18B20
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
LCALL DL500
LCALL DL50
LCALL DL50
LCALL INIT_1820 ;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ; 将读出的温度数据保存到SUML/SUMH
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 这是DS18B20复位初始化子程序
INIT_1820:
SETB P0.2
NOP
CLR P0.2
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P0.2 ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB P0.2,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3:
LJMP TSR5
TSR4:
LJMP TSR7
TSR5:
MOV R0,#117
TSR6:
DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:
SETB P0.2
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8 ;一共8位数据
CLR C
WR1:
CLR P0.2
MOV R3,#6
DJNZ R3,$
RRC A
MOV P0.2,C
MOV R3,#23
DJNZ R3,$
SETB P0.2
NOP
DJNZ R2,WR1
SETB P0.2
RET
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,SUML ; 低位存入SUML(TEMPER_L),高位存入SUMH(TEMPER_H)
RE00:
MOV R2,#8 ;数据一共有8位
RE01:
CLR C
SETB P0.2
NOP
NOP
CLR P0.2
NOP
NOP
NOP
SETB P0.2
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,P0.2
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
END
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -