程序实例(search.asm):
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP DIN1
MAIN:
;定义频率200和300//////////////////////////////////
F2H EQU 30H
F2L EQU 31H
F3H EQU 32H
F3L EQU 33H
;//////////////////////////////////////////////////
DISFLAG EQU 34H ;显示标志
DISL EQU 35H ;显示低位
DISH EQU 36H ;显示高位
ADNUMBER EQU 37H ;AD值
DISADL EQU 38H ;显示AD低位
DISADH EQU 39H ;显示AD高位
ADTIME EQU 40H ;AD转换时间值
SCHNUMBER EQU 41H ;搜频比较值
HOLDADL EQU 42H
70
HOLDADH EQU 43H ;搜到的AD值
HOLDFL EQU 44H
HOLDFH EQU 45H ;搜到的频率值
;//////////////////////////////////////////////////
MOV SCHNUMBER,#00H
MOV HOLDADL,#00H
MOV HOLDADH,#00H
MOV HOLDFL,#00H
MOV HOLDFH,#00H ;赋初值
;/////////////////////////////////////////////
;定义频率保持初值/////////////////////////////
MOV R1,#100
MOV R2,#02H
;/////////////////////////////////////////////
MOV ADNUMBER,#00H ;AD转换数初值
;显示高低位初值///////////////////////////////
MOV DISADL,#00H
MOV DISADH,#00H
;/////////////////////////////////////////////
;显示赋初值///////////////////////////////////
MOV DISFLAG,#00H
MOV DISL,#00H
MOV DISH,#00H
;////////////////////////////////////////////
;频率赋初值//////////////////////////////////
MOV F2H,#0F6H
MOV F2L,#3BH
MOV F3H,#0F8H
71
MOV F3L,#2FH
;/////////////////////////////////////////////
CLR P1.0 ;在P1.0口产生一个低电平,
一个脉冲是由一个高电平和一个低电平组成的
MOV TMOD,#00010000B;定时器工作于方式1
MOV TH1,F2H
MOV TL1,F2L ;200HZ输出
SETB EA ;开总中断
SETB TR1 ;开定时器1运行
SETB ET1 ;开定时器1允许
ADDIS: ACALL AD ;呼叫AD子程序
;将转换的数字量屏蔽高位低位送DISADL保存///////
MOV A,ADNUMBER
ANL A,#0FH
MOV DISADL,A
;/////////////////////////////////////////////
;将转换的数字量屏蔽低位,将高位送DISADH保存////
MOV A,ADNUMBER
ANL A,#0F0H
SWAP A
MOV DISADH,A
;/////////////////////////////////////////////
DISPLAY:
MOV A,DISADL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D1: JNB TI,D1
72
CLR TI
MOV A,DISADH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D2: JNB TI,D2
CLR TI
MOV A,DISL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D3: JNB TI,D3
CLR TI
MOV A,DISH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D4: JNB TI,D4
CLR TI
ACALL DELAY
;过程检定,即模拟搜到极值//////////////////////
MOV A,ADNUMBER
CLR C
SUBB A,SCHNUMBER ;取AD值与初值比较
JNC SW
;搜频是否完成,完成去显示搜到的值,没有继续搜//
MOV A,DISH
CJNE A,#05H,ADDIS1
73
MOV A,DISL
CJNE A,#00H,ADDIS1
AJMP DISSEARCH
;/////////////////////////////////////////////
;始终将初值赋于最大值,并将此时的频率与AD值保存
SW: MOV SCHNUMBER,ADNUMBER
MOV HOLDADL,DISADL
MOV HOLDADH,DISADH
MOV HOLDFL,DISL
MOV HOLDFH,DISH
;/////////////////////////////////////////////
CJNE A,#05H,ADDIS1
MOV A,DISL
CJNE A,#00H,ADDIS1
AJMP DISSEARCH
ADDIS1:
AJMP ADDIS
;搜到的频率与AD值显示/////////////////////////
DISSEARCH:
MOV A,HOLDADL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D11: JNB TI,D11
CLR TI
MOV A,HOLDADH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
74
MOV SBUF,A
D12: JNB TI,D12
CLR TI
MOV A,HOLDFL
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D13: JNB TI,D13
CLR TI
MOV A,HOLDFH
MOV DPTR,#SETTAB
MOVC A,@A+DPTR
MOV SBUF,A
D14: JNB TI,D14
CLR TI
;/////////////////////////////////////////////
LOOP: AJMP LOOP
DIN1:
PUSH ACC
CPL P1.0 ;取反P1.0口,实际是为了不断的将
p1.0的电平关系转换,即产生了频率
;频率保持时间/////////////////////////////////
DJNZ R1,RE
MOV R1,#100
DJNZ R2,RE
MOV R2,#02H
;/////////////////////////////////////////////
INC DISFLAG
75
MOV A,DISFLAG
CJNE A,#0AH,FF
MOV DISFLAG,#00H
INC DISL
MOV A,DISL
CJNE A,#0AH,FF
MOV DISL,#00H
INC DISH
;/////////////////////////////////////////////
FF: MOV A,F2H
CJNE A,F3H,XIA ;频率高位到300HZ的高位
了吗?
AJMP JIA
;频率高位没到300HZ的高位值,直接将低位值加1////
XIA: INC F2L
MOV A,F2L
CJNE A,#00H,RE
INC F2H
MOV A,F2H
CJNE A,F3H,RE
;/////////////////////////////////////////////
;频率高位加到300HZ的高位值了,低位加一,到300HZ的低
位值了吗,没到出去,到了关定时器//////////////
JIA:
INC F2L ;到了将200HZ频率的低位加1
MOV A,F2L
CJNE A,#F3L,RE
CLR TR1
76
;/////////////////////////////////////////////
RE:
MOV TH1,F2H
MOV TL1,F2L
POP ACC
RETI
AD: MOV DPTR,#7F00H ;指向转换地址
MOV A,#03H ;指向转换口
MOVX @DPTR,A ;转换
MOV ADTIME,#64H
D6: DJNZ ADTIME,D6 ;等100微秒转换完
MOVX A,@DPTR ;转换后的值给A
MOV ADNUMBER,A ;转换的值给30H
RET
DELAY:
MOV R3,#0FFH
D5: DJNZ R3,D5
RET
SETTAB:
DB 0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H,
0FEH,0F6H
DB 0EEH,3EH,9CH,7AH,9EH,8EH ;数显代码
END
77