单片机找出最小数

找出以内部RAM单元50H为首地址,长度为16的数据块内的最小数,并把最小数存入41H,怎么编程呢?原理是什么?最好做个注释。

;
MOV 41H, #255 ;先用最大的数字,当做最小值
MOV R0, #50H
MOV R2, #16
LOOP:
MOV A, @R0 ;取来一个数
CJNE A, 41H, L1 ;“减”最小值
L1: JNC L2 ;够减就转移
MOV 41H, @R0 ;否则就更新最小值
L2: INC R0
DJNZ R2, LOOP

END追问

CJNE A, 41H, L1,意思是首先用(A)-(41H)即(A)- 255结果不保存但影响进位C,判断C是否为0,如果为0就表示无进位借位,也就是(A)>(41H)?然后就跳转到L2,修改指针,指向51H,再用51H-255,一直对比完16个数据。如果(A)<(41H)则把(A)当做最小值,然后再接着用下一个数据块51H减去(A)进行判断一直判断完16个数据?

追答

总结的对。

你可以用 KEIL 软件,单步执行,实验一下。

追问

恩,那反过来求最大值呢?

追答

MOV 41H, #0 ;先用最小

……

L1: JNC L2 ;够减就转移

改为:

L1: JC L2 ;不够减就转移

即可。

看看我的百度空间吧。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-08
1定义一个u8 X表示比较次数 定义一个u16 Y表示最小的数
初始化: X=0 表示第0个 Y=RAM[0]
运行:
用Y与RAM中的值比,共比15次,如果用小的,就刷新Y值,并保存RAM[]下标追问

C语言看不懂,能用汇编表示一下么?比如MOV MOVX MOVC ADD之类的指令。

相似回答