基于单片机多路数据采集系统 下载本文

行调用。主要程序内容如下:

MAIN: CLR P2.5 CLR P3.7

;清A/D启动信号和地址锁存信号

;清A/D输出允许控制端

TE:LCALL KEY ; 调用键盘扫描子程序 LCALL ADC MOV 80H,A LCALL LED

LJMP TE

开始

初始化 ; 调用A/D转换子程序

;将A/D转换结果存于80H

;调用显示子程序

N 按键扫描,判断有无键按下

Y A/D转换 LED显示 主程序流程图

5.2 键盘扫描子程序设计

采用行扫描法。首先判别有无键按下,由单片机I/O口向建攀输出全扫描字,然后读入列线状态来判断。判断键盘中哪一个键被按下是通=通过将行线逐行置低电平后,检查列输

入状态实现的。如果全为1,则所按下的键不在此行;如果不全为1,则所按下的键必在此行,而且是在与零电平列线相交的交点上的那个键。

KEY: ;键盘扫描子程序 LCALL KS ;判断有无键按下 JZ KND LCALL T10MS LCALL KS JZ KND

MOV R2,#0FEH MOV R4,#00H LK1:

MOV P3,R2 MOV A,P3 JB ACC.3,ONE MOV A,#00H LJMP KP ONE:

JB ACC.2,NEXT MOV A,#02H KP:

ADD A,R4 PUSH ACC

LK:LCALL KS JNZ LK POP ACC MOV R3,A KND:RET

NEXT:INC R4 MOV A,R2 JNB ACC.1,KND RL A MOV R2,A AJMP LK1

KS:MOV P3,#0FCH MOV A,P3 CPL A

ANL A,#0CH RET

;无键按下,退出扫描 ;有键按下,延时去抖动 ;首行扫描子送R2 ;首行号#00H送入R4 ;首行扫描字送P3口 ;0列无键按下,转1列 ;0列有键按下,该列首号#00H送A ;转求键号 ;1列无键按下,转下行 ;1列有键按下,该列首号#02H送A ;求键号 ;键号进栈保护 ;等待键释放 ;未释放,等待 ;键释放,,键号送A ;键号送入R3保存 ;行号加1 ;判断两行扫描完了吗 ;扫描完成,退出 ;未扫描完,扫描字左移一位 ;扫描字入R2 ;转扫下一行 ;全扫描字送P3口 ;读入P3口状态 ;取正逻辑,高电平表示有键按下

T10MS:MOV R7,#10H TS1:MOV R6,#0FFH TS2:DJNZ R6,TS2 DJNZ R7,TS1 RET

;延时10ms子程序

5.3 A/D转换子序设计

ADC: ;A/D转换程序 MOV A,R3 ;键号送A

JB ACC.0,IN4 ;若A最低位为1,选择通道4,否则为通道3 CLR P3.6 ;通道3 SETB P3.5 SETB P3.4

SETB P2.5 ;启动A/D转换 NOP NOP CLR P2.5 NOP NOP

HERE:JNB P2.4,HERE ;判断转换完成否 SETB P3.7 ;转换完成,送出数据 NOP NOP

MOV A,P1 ;将转换数据送入A CLR P3.7 RET IN4: ;通道4 SETB P3.6 CLR P3.5 CLR P3.4 SETB P2.5 NOP NOP CLR P2.5 NOP NOP

AJMP HERE

5.3 中值滤波子程序的设计

FILT1:

MOV A,40H ;40H<41H吗? CLR C

SUBB A,41H JC FILT1

MOV A,40H ;40H>41H时,交换40H和41H XCH A,41H MOV 41H,A FILT2:

MOV A,41H ;41H<42H吗? CLR C

SUBB A,42H

JC FILE3 ;41H<42H时,排序结束

MOV A,42H ;41H>42H时,交换41H和42H XCH A,41H

XCH A,42H ;41H>40H吗? CLR C

SUBB A,41H

JNC FILT3 ;41H>40H时,排序结束

MOV A,40H ;41H<40H时,以40H为中值 MOV 41H,A FILT3:

RET ;中值在41H中

5.4 LED显示子程序的设计

LED:MOV A,80H ;LED显示子程序 MOV B,#05H MUL AB

MOV 31H,B ;乘5取高八位,送入LED第二位显示 MOV B,#0AH

MUL AB

MOV 32H,B ;余数乘10取高八位送入LED第三位显示

XIANSHI:

MOV DPTR,#TAB MOV A,R3