سلام برنامه فرکانس متر حداقل تا 1 مگا هرتز را میخوام .... یه برنامه تو همی انجمن پیدا کردم تو پروتوس امتحانش کردم منتها تا 225 کیلو می گیره و مشکلی که داره اینه مثلا فرکانس 60 کیلو را 600 کیلو وخورده ای می گیره
عزیزان لطف کنند کمک کنند اینم برنامه
LCD_PORT EQU P1
RS BIT P3.0
EN BIT P3.1
CONTROL BIT P3.4
rec_a equ 47
;--------------------------
; *** MAIN *** ---
;--------------------------
ORG 0000H
MAIN: CALL INIT
MOV DPTR,#DATA_FR
CALL WRITE
LOOP_MAIN:
MOV TH1,#00
MOV TL1,#00
CLR CONTROL
SETB TR1
CALL DELAY_100msec
CLR TR1
JBC TF1,DISPLAY_ERROR
MOV A,TH1
CJNE A,#HIGH(650),NOT_650
MOV A,TL1
CJNE A,#LOW(650),NOT_650
NOT_650:
JNC GR_65K
MOV TH1,#00
MOV TL1,#00
SETB CONTROL
SETB TR1
CALL DELAY_1SEC
CLR TR1
CALL DIS_LT_65K
JMP LOOP_MAIN
DISPLAY_ERROR:
CALL ERROR
JMP MAIN
GR_65K:
MOV A,TH1
CJNE A,#HIGH(6550),NOT_6550
MOV A,TL1
CJNE A,#LOW(6550),NOT_6550
NOT_6550:
JNC GR_650K
MOV TH1,#00
MOV TL1,#00
CLR CONTROL
SETB TR1
CALL DELAY_1SEC
CLR TR1
CALL DIS_LT_650K
JMP LOOP_MAIN
GR_650K:
CALL DIS_LT_6500K
JMP LOOP_MAIN
;--------------------------
; *** ERROR *** ---
;--------------------------
ERROR:
MOV A,#01
CALL COM
MOV DPTR,#DATA1_ERROR
CALL WRITE
MOV A,#0C0H
CALL COM
MOV DPTR,#DATA2_ERROR
CALL WRITE
CALL DELAY_1SEC
CALL DELAY_1SEC
RET
;--------------------------
; *** DIV 10000 ***--
;--------------------------
DIV_10000:
MOV A,TH1
CJNE A,#HIGH(10000),NO_10000
MOV A,TL1
CJNE A,#LOW(10000),NO_10000
MOV TH1,#00
MOV TL1,#00
INC R5
EXIT_DIV_10000:
RET
NO_10000:
JC EXIT_DIV_10000
MOV A,TL1
CLR C
SUBB A,#LOW(10000)
MOV TL1,A
MOV A,TH1
SUBB A,#HIGH(10000)
MOV TH1,A
INC R5
JMP DIV_10000
;--------------------------
; *** DIV 1000 *** --
;--------------------------
DIV_1000:
MOV A,TH1
CJNE A,#HIGH(1000),NO_1000
MOV A,TL1
CJNE A,#LOW(1000),NO_1000
MOV TH1,#00
MOV TL1,#00
INC R5
EXIT_DIV_1000:
RET
NO_1000:
JC EXIT_DIV_1000
MOV A,TL1
CLR C
SUBB A,#LOW(1000)
MOV TL1,A
MOV A,TH1
SUBB A,#HIGH(1000)
MOV TH1,A
INC R5
JMP DIV_1000
;--------------------------
; *** DIV 100 *** --
;--------------------------
DIV_100:
MOV A,TH1
CJNE A,#HIGH(100),NO_100
MOV A,TL1
CJNE A,#LOW(100),NO_100
MOV TH1,#00
MOV TL1,#00
INC R5
EXIT_DIV_100:
RET
NO_100:
JC EXIT_DIV_100
MOV A,TL1
CLR C
SUBB A,#LOW(100)
MOV TL1,A
MOV A,TH1
SUBB A,#HIGH(100)
MOV TH1,A
INC R5
JMP DIV_100
;--------------------------
; *** DIS_LT_65K ***-
;--------------------------
DIS_LT_65K:
MOV A,#0C0H
CALL COM
MOV R5,#30H
CALL DIV_10000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_1000
MOV A,R5
CALL DATAW
MOV A,#','
CALL DATAW
MOV R5,#30H
CALL DIV_100
MOV A,R5
CALL DATAW
MOV A,TL1
MOV B,#10
DIV AB
ADD A,#30H
CALL DATAW
MOV A,B
ADD A,#30H
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#'H'
CALL DATAW
MOV A,#'z'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
RET
;--------------------------
; *** DIS_LT_650K ***
;--------------------------
DIS_LT_650K:
MOV A,#0C0H
CALL COM
MOV R5,#30H
CALL DIV_10000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_1000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_100
MOV A,R5
CALL DATAW
MOV A,#','
CALL DATAW
MOV A,TL1
MOV B,#10
DIV AB
ADD A,#30H
CALL DATAW
MOV A,B
ADD A,#30H
CALL DATAW
MOV A,#'0'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#'H'
CALL DATAW
MOV A,#'z'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
RET
;--------------------------
; *** DIS_LT_6500K **
;--------------------------
DIS_LT_6500K:
MOV A,#0C0H
CALL COM
MOV R5,#30H
CALL DIV_10000
MOV A,R5
CALL DATAW
MOV A,#','
CALL DATAW
MOV R5,#30H
CALL DIV_1000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_100
MOV A,R5
CALL DATAW
MOV A,TL1
MOV B,#10
DIV AB
ADD A,#30H
CALL DATAW
MOV A,#','
CALL DATAW
MOV A,B
ADD A,#30H
CALL DATAW
MOV A,#'0'
CALL DATAW
MOV A,#'0'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#'H'
CALL DATAW
MOV A,#'z'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
RET
;--------------------------
; *** INIT *** ---
;--------------------------
INIT:
MOV TMOD,#51H ;T1=counter 16bit T0=timer 16bit
MOV A,#38H ;dotmatrix of lcd=5*7
CALL COM ;send command to lcd
MOV A,#0CH ;display=on cursor=off
CALL COM ;send command to lcd
MOV A,#06 ;inc cursor
CALL COM ;send command to lcd
MOV A,#01 ;clear lcd
CALL COM ;send command to lcd
RET ;return to main
;--------------------------
; *** convert *** ---
;--------------------------
convert:
mov rec_a,a
mov c,acc.0
mov acc.7,c
mov c,acc.1
mov acc.6,c
mov c,acc.2
mov acc.5,c
mov c,acc.3
mov acc.4,c
mov c,rec_a.7
mov acc.0,c
mov c,rec_a.6
mov acc.1,c
mov c,rec_a.5
mov acc.2,c
mov c,rec_a.4
mov acc.3,c
ret
;--------------------------
; *** COM *** ---
;--------------------------
COM:
call convert
MOV LCD_PORT,A ;get data
CLR RS ;tish data is command
SETB EN ;enable en pin
CLR EN ;disable en pin
CALL DELAY_2msec ;rate of lcd is low
RET
;--------------------------
; *** DELAY 2msec ***
;--------------------------
DELAY_2msec: ;8*250*1usec= 2,000 usec = 2 msec
MOV R7,#8
LOOP_DELAY_2msec:
MOV R6,#250
DJNZ R6,$
DJNZ R7,LOOP_DELAY_2msec
RET
;--------------------------
; *** DATAW *** ---
;--------------------------
DATAW:
call convert
MOV LCD_PORT,A ;get data
SETB RS ;this data for display
SETB EN ;enable en pin
CLR EN ;disable en pin
CALL DELAY_2msec
RET
;--------------------------
; *** WRITE *** ---
;--------------------------
WRITE:
CLR A ;A=0
MOVC A,@A+DPTR ;A=@A+DPTR
INC DPTR
CJNE A,#255,WR_A
RET
WR_A:
CALL DATAW
JMP WRITE
;--------------------------
; *** DELAY_25msec **
;--------------------------
DELAY_25msec:
MOV TH0,#HIGH(-50000+10)
MOV TL0,#LOW(-50000+10)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
;--------------------------
; *** DELAY 100msec *
;--------------------------
DELAY_100msec:
MOV R7,#4
LOOP_DELAY_100msec:
CALL DELAY_25msec
DJNZ R7,LOOP_DELAY_100msec
RET
;--------------------------
; *** DELAY 1SEC ***-
;--------------------------
DELAY_1SEC:
MOV R7,#40
LOOP_DELAY_1SEC:
CALL DELAY_25msec
DJNZ R7,LOOP_DELAY_1SEC
RET
;--------------------------
; *** DATA *** ---
;--------------------------
DATA_FR:
DB 'Frequency':',255
DATA1_ERROR:
DB ' *** ERROR ***',255
DATA2_ERROR:
DB ' FR is high !!!',255
;--------------------------
; *** END PROGEAM ***
;--------------------------
END
عزیزان لطف کنند کمک کنند اینم برنامه
LCD_PORT EQU P1
RS BIT P3.0
EN BIT P3.1
CONTROL BIT P3.4
rec_a equ 47
;--------------------------
; *** MAIN *** ---
;--------------------------
ORG 0000H
MAIN: CALL INIT
MOV DPTR,#DATA_FR
CALL WRITE
LOOP_MAIN:
MOV TH1,#00
MOV TL1,#00
CLR CONTROL
SETB TR1
CALL DELAY_100msec
CLR TR1
JBC TF1,DISPLAY_ERROR
MOV A,TH1
CJNE A,#HIGH(650),NOT_650
MOV A,TL1
CJNE A,#LOW(650),NOT_650
NOT_650:
JNC GR_65K
MOV TH1,#00
MOV TL1,#00
SETB CONTROL
SETB TR1
CALL DELAY_1SEC
CLR TR1
CALL DIS_LT_65K
JMP LOOP_MAIN
DISPLAY_ERROR:
CALL ERROR
JMP MAIN
GR_65K:
MOV A,TH1
CJNE A,#HIGH(6550),NOT_6550
MOV A,TL1
CJNE A,#LOW(6550),NOT_6550
NOT_6550:
JNC GR_650K
MOV TH1,#00
MOV TL1,#00
CLR CONTROL
SETB TR1
CALL DELAY_1SEC
CLR TR1
CALL DIS_LT_650K
JMP LOOP_MAIN
GR_650K:
CALL DIS_LT_6500K
JMP LOOP_MAIN
;--------------------------
; *** ERROR *** ---
;--------------------------
ERROR:
MOV A,#01
CALL COM
MOV DPTR,#DATA1_ERROR
CALL WRITE
MOV A,#0C0H
CALL COM
MOV DPTR,#DATA2_ERROR
CALL WRITE
CALL DELAY_1SEC
CALL DELAY_1SEC
RET
;--------------------------
; *** DIV 10000 ***--
;--------------------------
DIV_10000:
MOV A,TH1
CJNE A,#HIGH(10000),NO_10000
MOV A,TL1
CJNE A,#LOW(10000),NO_10000
MOV TH1,#00
MOV TL1,#00
INC R5
EXIT_DIV_10000:
RET
NO_10000:
JC EXIT_DIV_10000
MOV A,TL1
CLR C
SUBB A,#LOW(10000)
MOV TL1,A
MOV A,TH1
SUBB A,#HIGH(10000)
MOV TH1,A
INC R5
JMP DIV_10000
;--------------------------
; *** DIV 1000 *** --
;--------------------------
DIV_1000:
MOV A,TH1
CJNE A,#HIGH(1000),NO_1000
MOV A,TL1
CJNE A,#LOW(1000),NO_1000
MOV TH1,#00
MOV TL1,#00
INC R5
EXIT_DIV_1000:
RET
NO_1000:
JC EXIT_DIV_1000
MOV A,TL1
CLR C
SUBB A,#LOW(1000)
MOV TL1,A
MOV A,TH1
SUBB A,#HIGH(1000)
MOV TH1,A
INC R5
JMP DIV_1000
;--------------------------
; *** DIV 100 *** --
;--------------------------
DIV_100:
MOV A,TH1
CJNE A,#HIGH(100),NO_100
MOV A,TL1
CJNE A,#LOW(100),NO_100
MOV TH1,#00
MOV TL1,#00
INC R5
EXIT_DIV_100:
RET
NO_100:
JC EXIT_DIV_100
MOV A,TL1
CLR C
SUBB A,#LOW(100)
MOV TL1,A
MOV A,TH1
SUBB A,#HIGH(100)
MOV TH1,A
INC R5
JMP DIV_100
;--------------------------
; *** DIS_LT_65K ***-
;--------------------------
DIS_LT_65K:
MOV A,#0C0H
CALL COM
MOV R5,#30H
CALL DIV_10000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_1000
MOV A,R5
CALL DATAW
MOV A,#','
CALL DATAW
MOV R5,#30H
CALL DIV_100
MOV A,R5
CALL DATAW
MOV A,TL1
MOV B,#10
DIV AB
ADD A,#30H
CALL DATAW
MOV A,B
ADD A,#30H
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#'H'
CALL DATAW
MOV A,#'z'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
RET
;--------------------------
; *** DIS_LT_650K ***
;--------------------------
DIS_LT_650K:
MOV A,#0C0H
CALL COM
MOV R5,#30H
CALL DIV_10000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_1000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_100
MOV A,R5
CALL DATAW
MOV A,#','
CALL DATAW
MOV A,TL1
MOV B,#10
DIV AB
ADD A,#30H
CALL DATAW
MOV A,B
ADD A,#30H
CALL DATAW
MOV A,#'0'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#'H'
CALL DATAW
MOV A,#'z'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
RET
;--------------------------
; *** DIS_LT_6500K **
;--------------------------
DIS_LT_6500K:
MOV A,#0C0H
CALL COM
MOV R5,#30H
CALL DIV_10000
MOV A,R5
CALL DATAW
MOV A,#','
CALL DATAW
MOV R5,#30H
CALL DIV_1000
MOV A,R5
CALL DATAW
MOV R5,#30H
CALL DIV_100
MOV A,R5
CALL DATAW
MOV A,TL1
MOV B,#10
DIV AB
ADD A,#30H
CALL DATAW
MOV A,#','
CALL DATAW
MOV A,B
ADD A,#30H
CALL DATAW
MOV A,#'0'
CALL DATAW
MOV A,#'0'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#'H'
CALL DATAW
MOV A,#'z'
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
MOV A,#' '
CALL DATAW
RET
;--------------------------
; *** INIT *** ---
;--------------------------
INIT:
MOV TMOD,#51H ;T1=counter 16bit T0=timer 16bit
MOV A,#38H ;dotmatrix of lcd=5*7
CALL COM ;send command to lcd
MOV A,#0CH ;display=on cursor=off
CALL COM ;send command to lcd
MOV A,#06 ;inc cursor
CALL COM ;send command to lcd
MOV A,#01 ;clear lcd
CALL COM ;send command to lcd
RET ;return to main
;--------------------------
; *** convert *** ---
;--------------------------
convert:
mov rec_a,a
mov c,acc.0
mov acc.7,c
mov c,acc.1
mov acc.6,c
mov c,acc.2
mov acc.5,c
mov c,acc.3
mov acc.4,c
mov c,rec_a.7
mov acc.0,c
mov c,rec_a.6
mov acc.1,c
mov c,rec_a.5
mov acc.2,c
mov c,rec_a.4
mov acc.3,c
ret
;--------------------------
; *** COM *** ---
;--------------------------
COM:
call convert
MOV LCD_PORT,A ;get data
CLR RS ;tish data is command
SETB EN ;enable en pin
CLR EN ;disable en pin
CALL DELAY_2msec ;rate of lcd is low
RET
;--------------------------
; *** DELAY 2msec ***
;--------------------------
DELAY_2msec: ;8*250*1usec= 2,000 usec = 2 msec
MOV R7,#8
LOOP_DELAY_2msec:
MOV R6,#250
DJNZ R6,$
DJNZ R7,LOOP_DELAY_2msec
RET
;--------------------------
; *** DATAW *** ---
;--------------------------
DATAW:
call convert
MOV LCD_PORT,A ;get data
SETB RS ;this data for display
SETB EN ;enable en pin
CLR EN ;disable en pin
CALL DELAY_2msec
RET
;--------------------------
; *** WRITE *** ---
;--------------------------
WRITE:
CLR A ;A=0
MOVC A,@A+DPTR ;A=@A+DPTR
INC DPTR
CJNE A,#255,WR_A
RET
WR_A:
CALL DATAW
JMP WRITE
;--------------------------
; *** DELAY_25msec **
;--------------------------
DELAY_25msec:
MOV TH0,#HIGH(-50000+10)
MOV TL0,#LOW(-50000+10)
SETB TR0
JNB TF0,$
CLR TR0
CLR TF0
RET
;--------------------------
; *** DELAY 100msec *
;--------------------------
DELAY_100msec:
MOV R7,#4
LOOP_DELAY_100msec:
CALL DELAY_25msec
DJNZ R7,LOOP_DELAY_100msec
RET
;--------------------------
; *** DELAY 1SEC ***-
;--------------------------
DELAY_1SEC:
MOV R7,#40
LOOP_DELAY_1SEC:
CALL DELAY_25msec
DJNZ R7,LOOP_DELAY_1SEC
RET
;--------------------------
; *** DATA *** ---
;--------------------------
DATA_FR:
DB 'Frequency':',255
DATA1_ERROR:
DB ' *** ERROR ***',255
DATA2_ERROR:
DB ' FR is high !!!',255
;--------------------------
; *** END PROGEAM ***
;--------------------------
END