附 录1 电路原理图
30
附 录2 各模块程序
ADPORT EQU 7FF8H ;ADC0809通道0地址 △U EQU 20H ;灵敏度存放在20H U0 EQU 21H ;基准电压存放在21H U EQU 22H ;差值存放在22H ORG 0000H ;LJMP MAIN ;ORG 0013H ;INT1LJMP INT1 ;ORG 0020H ;
MAIN:MOV SP,#60 ;MOV 20H,#N ;N)
MOV R7,#FFH ; R7=1111111 ;MOV 21H,00H ;21HMOV 22H,00H ;22HMOV Rl, #3OH ;R1 RET ;
2.中断服务程序
AD: SETB IT1 ; SETB EA SETB EX1 ;MOV DPTR, #ADPORT MOV A #00H MOV R5,A 31主程序起始地址 转主程序
中断服务程序入口 转NITI中断服务程序 设置堆栈指针
放入灵敏度值(设灵敏度值为
初始化读数标志 单元清零 单元清零
为缓冲区数据地址指针,送
数据缓冲区首址
当ADC0809的EOC输出电平上 跳沿触发中断1
;打开总中断开关(片内中断允许寄存器IE.7=EA)
允许外中断1中断
;数据指针指向通道IN0通道 ; ;
MOVX @DPTR,A ;启动A/D转换 CJNE R7,#00H,$ ; LOOP: NOP
AJMP LOOP ;
ORG 2100H ;中断服务程序入口 NIT1:
PUSH PSW PUSH A
PUSH DPL PUSH DPH MOV DPTR,#7FF8H MOVX A,@DTPR MOV R5,A LCALL FILTER MOV A #00H MOVX @DPTR,A MOV R7,#00H POP DPH POP DPL POP A POP PSW RETI 3.键盘扫描控制程序
KEY: MOV P1,#0FFH MOV A,P1 CPL A ; ;
;数据指针指向通道IN0 ;把该通道的A/D转换结果读到累加器A中
;将A/D结果存入R5 ;调用数字滤波程序 ;
;再次启动刀D转换 ;置读数标志 ; ; ; ; ;中断返回 ;P1口为输入,各位应先置位为高电平 ;读取按键状态
;取反逻辑,高电平表示有键按 下
32
ANL A,#0FH;
JZ KEY ;A=0时无键按下,重新扫描键 盘
LCALL D-10ms ;有键按下时延时去抖动 MOV A,P1 ;读取按键状态
CPL A ;取反逻辑,高电平表示有键按下 ANL A,#0FH JZ KEY MOV B,A MOV A,P1 CPL A ANL A,#0FH KEY1: JNZ KEY1 LCACC D-10ms MOV A,B JB ACC.0,PKEY1 JB ACC.1,PKEY2 JB ACC.2,PKEY3 JB ACC.3,PKEY4 EKEY: RET
PKEY1:LCALL K1 RET PKEY2:LCALL K2
RET PKEY3:LCALL K4 RET
K1: MOV P1,△U; MOV A,P1; RET
;再判别是否有键按下
;A=0时无键按下,重新扫描键盘 ;有键按下时,键值送B暂存 ; ;
;判别按键释放 ;按键未释放,等待 ;释放,延时去抖动 ;取键值送A ;K1按转PKEY1 ;K1命令处理程序 33
K2: MOV P1,△U; MOV A,P1; INC A RET
K3: MOV P1, △U; MOV A,P1; DEC A RET
K4: MOV P1, △U; MOV A,P1; JZ KEY SETB A RET
D-10ms:MOV R7,#10H DS1: MOV R6,#0FFH DS2: DJNZ R6,DS2 DJNZ R7,DS1 RET 4.数字滤波程序
FILTER: CLR A MOV R2, A MOV R4, A MOV R3, #3FH MOV R1, #30H MOV R0, #06H DAV1: ADD A, R4 MOV R4, A CLR C MOV A, R2 ;10ms延时子程序 ;R2、R4清0
; ;
;置最小值初态 ;置数据区首地址 ;置连续采样次数N=6
;累加输入值
;累加和放入R4 ;清进位标志 ;取最大值
34