1、单片机数据采集、处理及显示程序设计一 总体设计方案:LED初始显示为0,采用查询的方式进行键盘扫描,以确定是否有输入,不停地扫描直到有输入为止:输入为1时,按键无效,继续扫描直到再次有输入,输入为0时,则开始进行数据的采集;采集一个周期,将采集后的数据进行滤波,再求出0、1/2Vmax、Vmax,送到LED显示,结束后进行键盘扫描,确定是否有按键1输入,有则停止,无则继续进行数据采集,如此循环。二 硬件逻辑图:1 下图为硬件逻辑图:2 单片机及各外设参数选择:A 单片机为8031/8051;B 采用外部时钟,振荡频率为12MHz,则机器周期为1us;C 由于本实验只需0、1两个按键就能实现控制
2、(0实现启动,1实现关闭),所以采用简单的12非编码键盘;D 由于已知输入信号为幅值5V的正弦信号,并要求A/D转换的误差小于0.02V,因此,选用ADC0809,其能处理的信号为05V,不需要进行信号放大;其分辨率为8位,转换的误差为0.0196V,能满足要求;其转换时间大约为100us;E 为了保证转换精度,在信号源与ADC之间还需加一S/H,采用LF398,保持电容选择为1000PF;F 由于要显示3个数据,且小数点后保留两位有效数据,所以需要34=12个LED,本实验选用7段LED;且从左到右,依次显示0、1/2Vmax、Vmax;G 由于要求利用串行口扩展接口来显示数据,所以需连接一
3、寄存器,本实验采用串行输入、并行输出的移位寄存器:74LS164。三 软件编写:1 流程图如下:本实验采用查询的方式来实现键盘的控制;在采集的过程中由于可能会有随机干扰,信号本身会在某一数值范围附近上下波动,所以采用算术平均滤波的方式进行滤波;由于输入信号最大频率为0.2Hz,选择采样周期为2Hz,即采样周期为500ms。键0YNN键1Y键0键1YNYNLED初始显示为0是否有按键?延时10ms去抖仍有按键?键0?键1?启动ADC 数据采集一个周期算术平均值滤波计算采集到的数值的最小值、中间值及最大值显示在LED上是否仍有按键?键0?键1?是否有按键?延时10ms去抖2 采用汇编进行编程,具体
4、的代码及其说明如下: ORG 0000H LJMP START ORG 0300HSTART: ACALL DSP1 ;初始化显示0.00、0.00、0.00SCAN: ACALL KEXAM ;判断是否有按键 JNZ SCAN ;没按键就继续SCAN ACALL D10ms ;去抖 ACALL KEXAM JNZ SCANKEY: SETB P1.1 ;检查键值 SETB P1.3 CLR P1.2 MOV A,P1 ANL A,#02H CJNE A,#02H,SCAN ;按键为1则返回继续查询是否有按键;按键为0,进入到数据采集、转换及显示ADC: MOV R1,#40H MOV DPT
5、R,#07FF8H MOV R2,#10 ;一个周期采集10个点L9: MOV R0,#30H MOV R3,#4L10: MOV A,#0 SETB P1.4 ;S/H保持 MOVX DPTR,A ;启动ADC JNB P3.3 $ ;转换结束 CLR P1.4 ;S/H采样 MOVX A,DPTR MOV R0,A INC R0 ACALL D5ms DJNZ R3,L10ACALL Filter ;滤波 INC R1 ACALL D500ms DJNZ R2,L9 ACALL ORDER ;计算要显示的值:最小值、最大值及中间值 ACALL DSP2 ;显示值 ;查询按键 ACALL K
6、EXAM JNZ ADC ACALL D10ms ACALL KEXAM JNZ ADC SETB P1.1 SETB P1.3 CLR P1.2 MOV A,P1 ANL A,#02H CJNE A,#02H,START ;按键为1则返回开始,并显示0 AJMP ADC;下面为子程序:;判断是否有按键KEXAM: SETB P1.1 CLR P1.2 CLR P1.3 MOV A,P1 ANL A,#02H ;0000 0010 RET;初始化显示0.00、0.00、0.00DSP1: MOV R0,#30H MOV R1,#40H MOV R2,#3L0: MOV R1,#0 ACALL
7、CHANGE0 ;将R1中的值转换为有物理意义的值,存入4个R0中 ACALL CHANGE1 ;将4个R0中的值转化为能显示的数模 ACALL DPLED ;显示4个R0中的值 INC R1 DJNZ R2,L0 RET;输出显示一个LEDDPLED: MOV R0,#30H MOV R4,#4L1: MOV R3,#8 MOV A,R0L2: RLC A MOV P3.0,C CLR P3.1 SETB P3.1 DJNZ R3,L2 INC R0 DJNZ R4,L1 RET;将R0中要显示的转换为字模,然后覆盖R0CHANGE1: MOV R0,#30H MOV R4,#4L3: PU
8、SH ACC MOV DPTR,#TABLE MOV A,R0 MOV A,A+DPTR MOV R0,A INC R0 DJNZ R4,L3 RET;标度变换:将R1中的值转换为有物理意义的值,并存入4个R0中(如将125转换为2.45V)CHANGE0: PUSH ACC PUSH B ;除17 MOV A,R1 MOV B,#11H ;除以17 DIV AB MOV R0,A INC R0 MOV A,B MOV B,#0AH MUL AB MOV A,B MOV B,#11H ;除以17 DIV AB MOV R0,A INC R0 MOV A,B MOV B,#0AH MUL AB
9、MOV A,B MOV B,#11H ;除以17 DIV AB MOV R0,A ;除3 DEC R0 DEC R0 DEC R0 MOV A,R0 MOV B,#03H ;除以3 DIV AB MOV R0,A INC R0 MOV A,B MOV B,#0AH MUL AB MOV A,B ADD A,R0 MOV B,#03H ;除以3 DIV AB MOV R0,A INC R0 MOV A,B MOV B,#0AH MUL AB MOV A,B ADD A,R0 MOV B,#03H ;除以3 DIV AB ;将小数点10加上 INC R0 MOV R0,A DEC R0 DEC R
10、0 MOV A,R0 INC R0 MOV R0,A DEC R0 MOV R0,#10H POP B POP ACC RET;延时5msD5ms: MOV R2,#0AH ;10L4:MOV R3,#F8H ;248L5:DJNZ R3,L5 ;248*2=496 DJNZ R2,L4 ;500*10=5000us=5ms RET;延时10msD10ms: MOV R2,#14H ;20L4:MOV R3,#F8H ;248L5:DJNZ R3,L5 ;248*2=496 DJNZ R2,L4 ;500*20=10000us=10ms RET;延时500msD500ms: MOV R2,#1
11、00L6:MOV R3,#4L7:MOV R4,#249L8:NOP NOP NOP DJNZ R4,L8 ;125*5=1245 DJNZ R3,L7 ;1249*4=4996 DJNZ R2,L6 ;5000*100=500000us=500ms RET;算术平均滤波,将得到的值存入R1中Filter: PUSH PSW PUSH A PUSH B MOV FLAG,#00H MOV R4,#4 MOV R0,#30H CLR AL11: ADD A,R0 JNC NEXT INC FLAGNEXT: INC R0 DJNZ R4,L11 MOV R5,#4DIVIDE: MOV B,A
12、MOV A,FLAG CLR C RRC A MOV FLAG A MOV A,B RRC A DJNZ R5,DIVIDE MOV R1,A POP B POP A POP PSW RET;将采集到的R1中的10个值进行排序,采用冒泡法ORDER: MOV R3,#9L12: MOV A,R3 MOV R4,A MOV R1,#40HL13: MOV A,R1 INC R1 CLR C SUBB A,R1 JC DONE MOV A,R1 DEC R1 XCH A,R1 INC R1 MOV R1,ADONE: DJNZ R4,L13 DJNZ R3,L12 RET;显示R1中的值DSP2:
13、 MOV R1,#40H ACALL CHANGE0 ;将R1中的值转换为有物理意义的值,存入4个R0中 ACALL CHANGE1 ;将4个R0中的值转化为能显示的数模 ACALL DPLED ;显示4个R0中的值 INC R1 MOV R3,#2L14: MOV R4,#4 INC R1 DJNZ R4,L14 ACALL CHANGE0 ;将R1中的值转换为有物理意义的值,存入4个R0中 ACALL CHANGE1 ;将4个R0中的值转化为能显示的数模 ACALL DPLED ;显示4个R0中的值 DJNZ R3,L14 RET;数模表TABLE: DB 3FH,06H,5BH;0,1,2 DB 4FH,66H,6DH;3,4,5 DB 7DH,07H,7FH;6,7,8 DB 6FH,77H,7CH;9,10,11 DB 39H,5EH,7BH;12,13,14 DB 71H,80H ;15,.