CPU控制锁相环频率合成分频比N程序.docx
《CPU控制锁相环频率合成分频比N程序.docx》由会员分享,可在线阅读,更多相关《CPU控制锁相环频率合成分频比N程序.docx(45页珍藏版)》请在冰豆网上搜索。
CPU控制锁相环频率合成分频比N程序
;**************************************************
;CPU控制锁相环频率合成分频比N
;**************************************************
;程序执行如下
;**************************************************
NSEQU30H;数据存储缓冲区8位
NEW_NUMEQU38H
FPBDEQU40H
FPBGEQU41H
FPBD1EQU48H
FPBG1EQU49H
FKEYEQU20H.0;按键标志,若有按键为1
KEY_NOEQU44H;按键标号
ORG00H
AJMPBEGIN
BEGIN:
MOVSP,#70H
ACALLHELLO
SCAN:
CLRFKEY
SCAN0:
ACALLKEY_SCAN;调用扫描键盘子程序
SCAN1:
JBFKEY,WAIT_OFF;若有按键就等待按键放开
AJMPSCAN;无则继续扫描和键盘
WAIT_OFF:
ACALLKEY_SCAN
JBFKEY,WAIT_OFF
;++++++++++++++++++++++++键值判断++++++++++++++++++
SWPD:
MOVA,KEY_NO
SW_A:
CJNEA,#0AH,SW_B;OK键,确认数据输入完毕
ACALLPL_FPB;把输入的接收频率转化位分频比N送出
AJMPSCAN
SW_B:
CJNEA,#0BH,SW_C
ACALLXIAOYIN;消隐等待输入新数据
AJMPSCAN
SW_C:
CJNEA,#0CH,SW_D
;ACALLQPSS;全频搜索
ACALLSW_UP1
AJMPSCAN
SW_D:
CJNEA,#0DH,SW_E
;ACALLUPDW;手动加减5KHZ—1加,2减
ACALLSW_DOWN1
AJMPSCAN
SW_E:
CJNEA,#0EH,SW_F;HIBABY存台
ACALLHIBABY
MOVR5,#10
ACALLDELAY
ACALLCUNTAI
AJMPSCAN
SW_F:
CJNEA,#0FH,YES;HELLO读台
ACALLHELLO
MOVR5,#10
ACALLDELAY
ACALLDUTAI
AJMPSCAN
YES:
;显示出输入数据并存起来
ACALLXSQ
ACALLNUM_STORE
AJMPSCAN
;OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK
;主程序结束,以下为子程序
;OKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOKOK
;**************************************************
;键盘(矩阵式)扫描,子程序1
;**************************************************
KEY_SCAN:
MOVR3,#0EFH;加载扫描输出初始信号11101111B
MOVR4,#0
MOVR1,#4
CLRPSW.5
S1:
MOVA,R3;循环扫描16个按键
MOVP1,A
MOVR5,#1
ACALLDELAY
MOVA,P1;读取P1口数据判断按键是否有效
ANLA,#0FH
MOVR2,#4
S2:
JBACC.0,N1;判断有无按键,若为1则表示没按键按下
MOVKEY_NO,R4
SETBPSW.5
N1:
INCR4
RRA
DJNZR2,S2;对一行进行扫描
MOVA,R3
RLA;移至下一行扫描
MOVR3,A
DJNZR1,S1
BACK:
JNBPSW.5,NO_KEY
SETBFKEY
RET
NO_KEY:
CLRFKEY
RET
;!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
;消隐子程序,2
;!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
XIAOYIN:
MOVSCON,#00H
SETBEA
MOVR3,#08H
MOVR0,#00H
MOVDPTR,#TAB5
LOOP13:
MOVA,R0
MOVCA,@A+DPTR
MOVSBUF,A
WAIT13:
JNBTI,WAIT13
CLRTI
MOVR5,#1
ACALLDELAY
INCR0
DJNZR3,LOOP13
RET
;!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
;HELLO!
程序,3
;!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
HELLO:
MOVSCON,#00H
SETBEA
MOVR0,#08H
MOVR1,#00H
MOVDPTR,#TAB3
LOOP1:
MOVA,R1
MOVCA,@A+DPTR
MOVSBUF,A
WAIT:
JNBTI,WAIT
CLRTI
MOVR5,#1
ACALLDELAY
INCR1
DJNZR0,LOOP1
RET
;!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
;HIBABY!
子程序,4
;!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
HIBABY:
MOVSCON,#00H
SETBEA
MOVR0,#08H
MOVR1,#00H
MOVDPTR,#TAB4
LOOP11:
MOVA,R1
MOVCA,@A+DPTR
MOVSBUF,A
WAIT11:
JNBTI,WAIT11
CLRTI
MOVR5,#1
ACALLDELAY
INCR1
DJNZR0,LOOP11
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;串行显示子程序,5
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
XSQ:
MOVSCON,#00H
SETBEA
LOOP2:
MOVA,KEY_NO
MOVDPTR,#TAB1
MOVCA,@A+DPTR
MOVSBUF,A
XSQ1:
JNBTI,XSQ1
CLRTI
RET
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
;数据存储子程序,6
;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NUM_STORE:
MOVA,KEY_NO
MOVDPTR,#TAB2
MOVCA,@A+DPTR
MOVNEW_NUM,A
MOVNS+7,NS+6
MOVNS+6,NS+5
MOVNS+5,NS+4
MOVNS+4,NS+3
MOVNS+3,NS+2
MOVNS+2,NS+1
MOVNS+1,NS
MOVNS,NEW_NUM
RET
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;数据处理子程序,7(送出分频比N)
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PL_FPB:
MOVR1,#00H;R1存N的低位,先赋值0
MOVR2,#00H;R2存N的高位,先赋值0
MOVR0,#33H;数据缓冲区所存频率的值调出来
MOVR3,#1;个十百...转换
MOVR4,#3;三位,所以循环3次
SHU_N1:
;把输入(接收)的频率值存入R1,R2中
MOVA,@R0
MOVB,R3
MULAB;把每一个的数依次和所对应的进位值相乘*1,*10,*100
ADDA,R1;将所得数低位与低位相加
MOVR1,A;把相加后的低位数存入R1中
MOVA,B
ADDCA,R2;将所得的数高位与高位相加(*带进位相加*)
MOVR2,A;把相加后的高位数存入R2中
INCR0
MOVA,#10
MOVB,R3
MULAB
MOVR3,A;每次循环R3都乘以10
DJNZR4,SHU_N1;判断是否继续执行循环
SHU_N2:
MOVA,@R0
MOVR3,A
MOVR6,#00H
MOVR7,#00H
LOOP3:
MOVA,#0E8H
ADDA,R6
MOVR6,A
MOVA,#03H
ADDCA,R7
MOVR7,A
DJNZR3,LOOP3
SHU_N3:
MOVA,R1
ADDA,R6
MOVR1,A
MOVA,R2
ADDCA,R7
MOVR2,A
SHU_N4:
INCR0
MOVA,@R0
MOVR3,A
MOVR6,#00H
MOVR7,#00H
LOOP4:
MOVA,#10H
ADDA,R6
MOVR6,A
MOVA,#27H
ADDCA,R7
MOVR7,A
DJNZR3,LOOP4
SHU_N5:
MOVA,R1
ADDA,R6
MOVR1,A
MOVA,R2
ADDCA,R7
MOVR2,A
SHU_N6:
;把接收的频率减去10.7M(10700即29CCH)得到本振的频率值
MOVA,R1
SUBBA,#0D1H;把低位减去0CCH,带借位相减
MOVR1,A;所得的数存入R1
MOVA,R2
SUBBA,#29H;把高位减去借位C和29H
MOVR2,A;所得的数存入R2
CHUFA:
MOVR4,#00H
MOVR5,#00H
MOVA,R2
MOVR6,A
MOVA,R1
MOVR7,A
MOVR2,#00H
MOVR3,#05H
NDIV:
MOVA,R5
CLRC
SUBBA,R3
MOVA,R4
SUBBA,R2
JNCNDIV1
MOVB,#16
NDIV2:
CLRC
MOVA,R7
RLCA
MOVR7,A
MOVA,R6
RLCA
MOVR6,A
MOVA,R5
RLCA;R4R5R6R7/R2R3=R6R7......R4R5
MOVR5,A
XCHA,R4
RLCA
XCHA,R4
MOVF0,C
CLRC
SUBBA,R3
MOVR1,A
MOVA,R4
SUBBA,R2
JBF0,NDIV3
JCNDIV4
NDIV3:
MOVR4,A
MOVA,R1
MOVR5,A
INCR7
NDIV4:
DJNZB,NDIV2
CLRF0
NDIV1:
SETBF0
SHU_N7:
MOVA,R7
MOVP0,A;低位送给P0口
MOV40H,A
MOVA,R6
MOVP2,A;高位送给P2口
MOV41H,A
RET
;--------------------------------------------------
;延迟子程序,8*10ms
;--------------------------------------------------
DELAY:
MOVR6,#100
D1:
MOVR7,#100
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
;++++++++++++++++++++++++++++++++++++++++++++++++++
;全频搜索子程序,9
;++++++++++++++++++++++++++++++++++++++++++++++++++
QPSS:
MOVA,FPBD
MOVR1,A
MOVA,FPBG
MOVR2,A
CLRC
ACALLUP
;*************判断是否有锁台信号*******************
YTM:
JBP3.6,STOP
;*******判断是否上升到最高频点*********************
;搜索范围N为3860——5860
DDM:
MOVA,FPBD1
SUBBA,#0E4H
MOVR1,A
MOVA,FPBG1
SUBBA,#16H
MOVR2,A
CJNER2,#00H,JIXV
CJNER1,#00H,JIXV
MOVA,#14H
MOVR1,A
MOVA,#0FH
MOVR2,A
JIXV:
MOVR5,#50
LCALLUP
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;有台则停止搜索,10
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
STOP:
AJMPSCAN
;**************************************************
;UP与DOWN,子程序11
;**************************************************
UPDW:
ACALLXSQ2
CLRFKEY
ACALLKEY_SCAN
SCAN4:
JBFKEY,WAIT_OFF3;若有按键就等待按键放开
AJMPUPDW;无则继续扫描键盘
WAIT_OFF3:
ACALLKEY_SCAN
JBFKEY,WAIT_OFF3
;*********************键值判断*********************
MOVA,KEY_NO
SW_UP:
CJNEA,#01H,SW_DOWN
ACALLSW_UP1
AJMPUPDW
SW_DOWN:
CJNEA,#02H,YES2
ACALLSW_DOWN1
AJMPUPDW
YES2:
ACALLXSQ2
AJMPSCAN
RET
;**************************************************
;手动搜索加5KHZ子程序,12
;**************************************************
SW_UP1:
MOVR1,FPBD
MOVR2,FPBG
CLRC
UP:
MOVA,R1
ADDA,#01H
MOVR1,A;分频比N加1,相当于加5KHZ
MOVB,#00H
MOVA,R2
ADDCA,B
MOVR2,A
MOVA,R1
MOVP0,A;加1后的N再送给MC145151
MOVFPBD,A;把N存起来
MOVFPBD1,A
MOVA,R2
MOVP2,A
MOVFPBG,A
MOVFPBG1,A
ACALLCHENG
;AJMPUPDW
AJMPSCAN
RET
;**************************************************
;手动搜索减5KHZ子程序,13
;**************************************************
SW_DOWN1:
MOVR1,FPBD
MOVR2,FPBG
CLRC
;**************************************************
;开始减5KHZ子程序,14
;**************************************************
DOWN:
MOVA,R1;分频比N减1,相当于减5KHZ
CLRC
SUBBA,#01H
MOVR1,A
MOVB,#00H
MOVA,R2
SUBBA,B
MOVR2,A
MOVA,R1
MOVP0,A;加1后的N再送给MC145151
MOVFPBD,A;把N存起来
MOVFPBD1,A
MOVA,R2
MOVP2,A
MOVFPBG,A
MOVFPBG1,A
ACALLCHENG
AJMPSCAN
RET
;**************************************************
;分频比转化位数据并显示,15
;**************************************************
CHENG:
MOVR5,#4
LOOP5:
MOVA,FPBD1
ADDA,R1
MOVFPBD1,A
MOVA,FPBG1
ADDCA,R2
MOVFPBG1,A
DJNZR5,LOOP5
;******************本振频率加10.7MHZ***************
CLRC
MOVA,FPBD1
ADDA,#0D1H
MOVR1,A
MOVA,FPBG1
ADDCA,#29H
MOVR2,A
;***双字节二进制数(存于R2R1)转换为压缩的BCD码****
;转换结果放入R4R5R6中
;R1,R6为低位
;**************************************************
BINBCD2:
CLRA
MOVR4,A
MOVR5,A
MOVR6,A
MOVR7,#16
LOOP6:
CLRC
MOVA,R1
RLCA
MOVR1,A;R3左移1位
MOVA,R2
RLCA
MOVR2,A;R2左移1位
MOVA,R6
ADDCA,R6
DAA
MOVR6,A
MOVA,R5
ADDCA,R5
DAA
MOVR5,A
MOVA,R4
ADDCA,R4
DAA
MOVR4,A
DJNZR7,LOOP6
;************************解压缩********************
OUTBCD:
MOVA,R6
ANLA,#0FH
MOV33H,A
MOVA,R6
ANLA,#0F0H
SWAPA
MOV34H,A
MOVA,R5
ANLA,#0FH
MOV35H,A
MOVA,R5
ANLA,#0F0H
SWAPA
MOV36H,A
MOVA,R4
ANLA,#0FH
MOV37H,A
MOV30H,#00H
MOV31H,#00H
MOV32H,#00H
ACALLCX2
RET
;**********************送给显示器******************
CX2:
MOVSCON,#00H
SETBEA
MOVR4,#08H
MOVR0,#37H
MOVDPTR,#TAB1
LOOP8:
MOVA,@R0
MOVCA,@A+DPTR
MOVSBUF,A
WAIT1:
JNBTI,WAIT1
CLRTI
DECR0
DJNZR4,LOOP8
MOVA,FPBD
MOVR1,A
MOVA,FPBG
MOVR2,A
RET
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;存台子程序,16
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
CUNTAI:
ACALLXIAOYIN
CLRFKEY
ACALLKEY_SCAN
SCAN2:
JBFKEY,WAIT_OFF1;若有按键就等待按键放开
AJMPCUNTAI;无则继续扫描键盘
WAIT_OFF1:
ACALLKEY_SCAN
JBFKEY,WAIT_OFF1
;*********************键值判断*********************
SWPD1:
MOVA,KEY_NO
SW_0:
CJNEA,#00H,SW_1
ACALLZERO
AJMPSCAN
SW_1:
CJNEA,#01H,SW_2
ACALLONE
AJMPSCAN
SW_2:
CJNEA,#02H,SW_3
ACALLTWO
AJMPSCAN
SW_3:
CJNEA,#03H,SW_4
ACALLTHREE
AJMPSCAN
SW_4:
CJNEA,#04H,SW_5
ACALLFOUR
AJMPSCAN
SW_5:
CJNEA,#05H,SW_6
ACALLFIVE
AJMPSCAN
SW_6:
CJNEA,#06H,SW_7
ACALLSIX
AJMPSCAN
SW_7:
CJNEA,#07H,SW_8
ACALLSEVEN
AJMPSCAN
SW_8:
CJNEA,#08H,SW_9
ACALLEIGHT
AJMPSCAN
SW_9:
CJNEA,#09H,SW_10
ACALLNINE
AJMPSCAN