附录三(程序清单)
ORG 0000H ; 0-125度的温度计
[3]
TEMPER_L EQU 41H ;用于保存读出温度的低8位 TEMPER_H EQU 40H ;用于保存读出温度的高8位 FLAG1 EQU 38H ;是否检测到标志位
A_BIT1 EQU 30H ;数码管小数点位数存放内存位置 B_BIT1 EQU 31H ;数码管个位数存放内存位置 C_BIT1 EQU 32H ;数码管十位数存放内存位置
DQ EQU P3.7 ;30H,31H,32H: 小数点位 个位 十位 ORG 0013H AJMP INT1
MOD7: MOV SP,#60H
LCALL A/D ;调用读A/D程序 LCALL TEMPCOV
LCALL DISPLAY ;调用数码管显示子程序 AJMP MOD7 TEMP0: INC A A/D转换子程序[4]
;==========================================================================
A/D:
START: MOV 40H,#00H
MOV R0,#40H
SETB EA ;CUP开中断
SETB EX1 ;外部中断1开中断 SETB DPTR,#0000H ;选通ADC0809 MOV A,#00H
MOVX @DPTR,A AJMP $ 中断服务子程序
;==========================================================================
INT1: PUSH ACC ;保留现场
MOVX A,@DPTR ;产生读信号来读取结果 MOV @R0,A
MOV DPTR,#0000H MOV A,#00H
MOV @DPTR,A ;在此启动A/D转换 POP , ACC
RETI ;中断返回
- 32 -
END
数据处理
;========================================================================== AJMP TEMP1
TEMPCOV: MOV A,TEMPER_L ;A /D转换后数据处理 MOV B,#10H DIV AB
JB B.3,TEMP0
TEMP1: MOV 34H,A ;将TEMPER_L的高四位右移四位,存入34H中(温度值)
MOV A,B ;将TEMPER_L的低四位X10/16得小数后一位数 MOV B,#0AH MUL AB MOV B,#10H DIV AB
MOV 30H,A ;将小数后一位数.存入30H中
MOV A,TEMPER_H ;TEMPER_H中存放高8位数,权重16 MOV B,#10H MUL AB
ADD A,34H ;34H中存入温度值的整数部分 MOV B,#0AH DIV AB
MOV 31H,B ;个位存入31H中 MOV B,#0AH DIV AB
MOV 32H,B ;十位存入32H中 MOV A,TEMPER_H MOV 34H,#10H JB ACC.7,EXIT7 MOV 34H,#00H EXIT7: RET
复位初始化子程序
;========================================================================== INIT_1820:SETB P3.2 NOP
CLR P3.2 ;主机发出延时500微秒的复位低脉冲 MOV R1,#03H TSR1: MOV R0,#6BH DJNZ R0,$ DJNZ R1,TSR1
SETB P3.2 ;然后拉高数据线 NOP
- 33 -
NOP NOP
MOV R0,#25H
TSR2: JNB P3.2,TSR3 ;等待回应 DJNZ R0,TSR2 LJMP TSR4 ;延时
;========================================================================== 显示子程序
;========================================================================== DISPLAY: MOV DPTR,#TAB ;指定查表启始地址 MOV R0,#04H
DPL1: MOV R1,#0FAH ;显示1000次 DPLOP: MOV A,A_BIT1 ;取小数点后位数
MOVC A,@A+DPTR ;查小数点后位数的7段代码 MOV P0,A ;送出小数点后位的7段代码 CLR P2.2 ;开小数点后位显示 ACALL D1MS ;显示1MS SETB P2.2
MOV DPTR,#TAB2 ;个位需要小数点点亮 MOV A,B_BIT1 ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码 MOV P0,A ;送出个位的7段代码 CLR P2.3 ;开个位显示 ACALL D1MS ;显示1MS SETB P2.3
MOV DPTR,#TAB ;重新为DPTR赋TAB值 MOV A,C_BIT1 ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码 MOV P0,A ;送出十位的7段代码 CLR P2.4 ;开十位显示 ACALL D1MS ;显示1MS SETB P2.5 MOV P0,#00H
DJNZ R1,DPLOP ;小于100次循环 DJNZ R0,DPL1 ;小于4个100次循环 RET 1MS延时(按12MHZ算)
;========================================================================== D1MS: MOV R7,#0FFH DJNZ R7,$ DJNZ R7,$ RET
;========================================================================== 实验板上的7段数码管0~9数字的共阴显示代码
- 34 -
TAB: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH
TAB2: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH END
- 35 -