1、单片机数据采集、处理及显示程序设计一 总体设计方案:LED 初始显示为 0,采用查询的方式进行键盘扫描,以确定是否有输入,不停地扫描直到有输入为止:输入为 1 时,按键无效,继续扫描直到再次有输入,输入为 0 时,则开始进行数据的采集;采集一个周期,将采集后的数据进行滤波,再求出0、 1/2Vmax、Vmax ,送到 LED 显示,结束后进行键盘扫描,确定是否有按键 1 输入,有则停止,无则继续进行数据采集,如此循环。二 硬件逻辑图:1 下图为硬件逻辑图:2 单片机及各外设参数选择:A 单片机为 8031/8051;B 采用外部时钟,振荡频率为 12MHz,则机器周期为 1us;C 由于本实验
2、只需 0、1 两个按键就能实现控制(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;且从左到右,
3、依次显示 0、1/2Vmax、Vmax;G 由于要求利用串行口扩展接口来显示数据,所以需连接一寄存器,本实验采用串行输入、并行输出的移位寄存器:74LS164 。三 软件编写:1 流程图如下:本实验采用查询的方式来实现键盘的控制;在采集的过程中由于可能会有随机干扰,信号本身会在某一数值范围附近上下波动,所以采用算术平均滤波的方式进行滤波;由于输入信号最大频率为 0.2Hz,选择采样周期为 2Hz,即采样周期为 500ms。键 0YNN键 1Y键 0键 1YNYNLED 初始显示为 0是否有按键?延时 10ms 去抖仍有按键?键 0?键 1?启动 ADC 数据采集一个周期算术平均值滤波计算采集到
4、的数值的最小值、中间值及最大值显示在 LED上是否仍有按键?键 0?键 1?是否有按键?延时 10ms 去抖2 采用汇编进行编程,具体的代码及其说明如下:ORG 0000HLJMP STARTORG 0300HSTART:ACALL DSP1 ;初始化显示 0.00、0.00、0.00SCAN:ACALL KEXAM ;判断是否有按键JNZ SCAN ;没按键就继续 SCANACALL D10ms ;去抖ACALL KEXAMJNZ SCANKEY:SETB P1.1 ;检查键值SETB P1.3CLR P1.2MOV A,P1ANL A,#02HCJNE A,#02H,SCAN ;按键为 1
5、 则返回继续查询是否有按键;按键为 0,进入到数据采集、转换及显示ADC:MOV R1,#40HMOV DPTR,#07FF8HMOV R2,#10 ;一个周期采集 10 个点L9:MOV R0,#30HMOV R3,#4L10:MOV A,#0SETB P1.4 ;S/H 保持MOVX DPTR,A ;启动 ADCJNB P3.3 $ ;转换结束CLR P1.4 ;S/H 采样MOVX A,DPTRMOV R0,AINC R0ACALL D5msDJNZ R3,L10ACALL Filter ;滤波INC R1ACALL D500msDJNZ R2,L9ACALL ORDER ;计算要显示的
6、值:最小值、最大值及中间值ACALL DSP2 ;显示值;查询按键ACALL KEXAMJNZ ADCACALL D10msACALL KEXAMJNZ ADCSETB P1.1SETB P1.3CLR P1.2MOV A,P1ANL A,#02HCJNE A,#02H,START ;按键为 1 则返回开始, 并显示 0AJMP ADC;下面为子程序:;判断是否有按键KEXAM:SETB P1.1CLR P1.2CLR P1.3MOV A,P1ANL A,#02H ;0000 0010RET;初始化显示 0.00、0.00、0.00DSP1:MOV R0,#30HMOV R1,#40HMOV
7、R2,#3L0:MOV R1,#0ACALL CHANGE0 ;将 R1 中的值转换为有物理意义的值,存入 4 个 R0 中ACALL CHANGE1 ;将 4 个 R0 中的值转化为能显示的数模ACALL DPLED ;显示 4 个 R0 中的值INC R1DJNZ R2,L0RET;输出显示一个 LEDDPLED:MOV R0,#30HMOV R4,#4L1:MOV R3,#8MOV A,R0L2:RLC AMOV P3.0,CCLR P3.1SETB P3.1DJNZ R3,L2INC R0DJNZ R4,L1RET;将 R0 中要显示的转换为字模,然后覆盖 R0CHANGE1:MOV
8、R0,#30HMOV R4,#4L3:PUSH ACCMOV DPTR,#TABLEMOV A,R0MOV A,A+DPTRMOV R0,AINC R0DJNZ R4,L3RET;标度变换:将 R1 中的值转换为有物理意义的值,并存入 4 个 R0 中(如将125 转换为 2.45V)CHANGE0:PUSH ACCPUSH B;除 17MOV A,R1MOV B,#11H ;除以 17DIV ABMOV R0,AINC R0MOV A,BMOV B,#0AHMUL ABMOV A,BMOV B,#11H ;除以 17DIV ABMOV R0,AINC R0MOV A,BMOV B,#0AHM
9、UL ABMOV A,BMOV B,#11H ;除以 17DIV ABMOV R0,A;除 3DEC R0DEC R0DEC R0MOV A,R0MOV B,#03H ;除以 3DIV ABMOV R0,AINC R0MOV A,BMOV B,#0AHMUL ABMOV A,BADD A,R0MOV B,#03H ;除以 3DIV ABMOV R0,AINC R0MOV A,BMOV B,#0AHMUL ABMOV A,BADD A,R0MOV B,#03H ;除以 3DIV AB;将小数点 10 加上INC R0MOV R0,ADEC R0DEC R0MOV A,R0INC R0MOV R0
10、,ADEC R0MOV R0,#10HPOP BPOP ACCRET;延时 5msD5ms:MOV R2,#0AH ;10L4:MOV R3,#F8H ;248L5:DJNZ R3,L5 ;248*2=496DJNZ R2,L4 ;500*10=5000us=5msRET;延时 10msD10ms:MOV R2,#14H ;20L4:MOV R3,#F8H ;248L5:DJNZ R3,L5 ;248*2=496DJNZ R2,L4 ;500*20=10000us=10msRET;延时 500msD500ms:MOV R2,#100L6:MOV R3,#4L7:MOV R4,#249L8:NO
11、PNOPNOPDJNZ R4,L8 ;125*5=1245DJNZ R3,L7 ;1249*4=4996DJNZ R2,L6 ;5000*100=500000us=500msRET;算术平均滤波,将得到的值存入 R1 中Filter:PUSH PSWPUSH APUSH BMOV FLAG,#00HMOV R4,#4MOV R0,#30HCLR AL11:ADD A,R0JNC NEXTINC FLAGNEXT:INC R0DJNZ R4,L11MOV R5,#4DIVIDE:MOV B,AMOV A,FLAGCLR CRRC AMOV FLAG AMOV A,BRRC ADJNZ R5,DI
12、VIDEMOV R1,APOP BPOP APOP PSWRET;将采集到的 R1 中的 10 个值进行排序 ,采用冒泡法ORDER:MOV R3,#9L12:MOV A,R3MOV R4,AMOV R1,#40HL13:MOV A,R1INC R1CLR CSUBB A,R1JC DONEMOV A,R1DEC R1XCH A,R1INC R1MOV R1,ADONE:DJNZ R4,L13DJNZ R3,L12RET;显示 R1 中的值DSP2:MOV R1,#40HACALL CHANGE0 ;将 R1 中的值转换为有物理意义的值,存入 4 个 R0 中ACALL CHANGE1 ;将
13、4 个 R0 中的值转化为能显示的数模ACALL DPLED ;显示 4 个 R0 中的值INC R1MOV R3,#2L14:MOV R4,#4INC R1DJNZ R4,L14ACALL CHANGE0 ;将 R1 中的值转换为有物理意义的值,存入 4 个 R0 中ACALL CHANGE1 ;将 4 个 R0 中的值转化为能显示的数模ACALL DPLED ;显示 4 个 R0 中的值DJNZ R3,L14RET;数模表TABLE:DB 3FH,06H,5BH;0,1,2DB 4FH,66H,6DH;3,4,5DB 7DH,07H,7FH;6,7,8DB 6FH,77H,7CH;9,10,11DB 39H,5EH,7BH;12,13,14DB 71H,80H ;15,.