《等精度数字频率计 EDA技术综合应用实例与分析 ppt课件.ppt》由会员分享,可在线阅读,更多相关《等精度数字频率计 EDA技术综合应用实例与分析 ppt课件.ppt(145页珍藏版)》请在三一办公上搜索。
1、第13章 等精度数字频率计的设计与分析,13.1 系统设计要求 13.2 系统设计方案 13.3 主要VHDL和单片机源程序 13.4 系统仿真/硬件验证 13.5 设计技巧分析 13.6 系统扩展思路,13.1 系统设计要求,基于传统测频原理的频率计的测量精度将随被测信号频率的下降而降低,在实用中有较大的局限性,而等精度频率计不但具有较高的测量精度,而且在整个测频区域内保持恒定的测试精度。本系统设计的基本指标如下:,(1) 对于频率测试功能,测频范围为0.1 Hz70 MHz;对于测频精度,测频全域相对误差恒为百万分之一。 (2) 对于周期测试功能,信号测试范围与精度要求与测频功能相同。 (
2、3) 对于脉宽测试功能,测试范围为0.1 s1 s,测试精度为0.01 s。 (4) 对于占空比测试功能,测试精度为1%99%。,13.2 系统设计方案,13.2.1 系统设计方案选择 根据频率计的设计要求,我们可将整个电路系统划分为几个基本模块,如图13.1所示。各模块的实现均有几种不同的设计方案。,图13.1 频率计组成模块框图,1频率测量模块 (1) 直接测频法:把被测频率信号经脉冲整形电路处理后加到闸门的一个输入端,只有在闸门开通时间T(以秒计)内,被计数的脉冲送到十进制计数器进行计数。 (2) 组合测频法:是指在高频时采用直接测频法,低频时采用直接测量周期法测信号的周期,然后换算成频
3、率。,(3) 倍频法:是指把频率测量范围分成多个频段,使用倍频技术,根据频段设置倍频系数,将经整形的低频信号进行倍频后再进行测量,对高频段则直接进行测量。倍频法较难实现。 (4) 等精度测频法:其实现方式可用图13.2来说明。,(13.1),由此可推得,(13.2),图13.2 等精度测频法原理框图,若所测频率值为fx,其真实值为fxe,标准频率为fs,一次测量中,由于fx计数的起停时间都是由该信号的上跳沿触发的,因此在Tpr时间内对fx的计数Nx无误差,在此时间内的计数Ns最多相差一个脉冲,即et1,则下式成立:,(13.3),(13.4),可分别推得,(13.5),(13.6),根据相对误
4、差的公式有,(13.7),经整理可得到,(13.8),因et1,故et/Ns1/Ns,即,Ns=Tprfs,(13.9),2周期测量模块 (1) 直接周期测量法:用被测信号经放大整形后形成的方波信号直接控制计数门控电路,使主门开放时间等于信号周期Tx,时标为Ts的脉冲在主门开放时间进入计数器。设在Tx期间计数值为N,可以根据以下公式来算得被测信号周期: Tx=NTs (13.10) 经误差分析,可得结论:用该测量法测量时,被测信号的频率越高,测量误差越大。,(2) 等精度周期测量法:该方法在测量电路和测量精度上与等精度频率测量完全相同,只是在进行计算时公式不同,用周期1/T代换频率f即可,其计
5、算公式为 Tx=,(13.11),3脉宽测量模块 在进行脉冲宽度测量时,首先经信号处理电路进行处理,限制只有信号的50%幅度及其以上部分才能输入数字测量部分。脉冲边沿被处理得非常陡峭,然后送入测量计数器进行测量。 测量电路在检测到脉冲信号的上升沿时打开计数器,在下降沿时关闭计数器,设脉冲宽度为Twx,计算公式为 Twx=,(13.12),4占空比测量模块 测一次脉冲信号的脉宽,记录其值为Twx1,然后将信号反相,再测一次脉宽并记录其值为Twx2,通过下式计算占空比:,占空比= 100%,5标准频率发生电路 本模块采用高频率稳定度和高精度的晶振作为标准频率发生器。,13.2.2 系统总体设计方案
6、 等精度数字频率计涉及到的计算包括加、减、乘、除,耗用的资源比较大,用一般中小规模CPLD/FPGA芯片难以实现。因此,我们选择单片机和CPLD/FPGA的结合来实现。电路系统原理框图如图13.3所示,其中单片机完成整个测量电路的测试控制、数据处理和显示输出;CPLD/FPGA完成各种测试功能;键盘信号由AT89C51单片机进行处理,它从CPLD/FPGA读回计数数据并进行运算,向显示电路输出测量结果;显示器电路采用七段LED动态显示,由8个芯片74LS164分别驱动数码管。,图13.3 等精度数字频率计电路系统原理框图,系统的基本工作方式如下: (1) P0口是单片机与FPGA的数据传送通信
7、口,P1口用于键盘扫描,实现各测试功能的转换;P2口为双向控制口。P3口为LED的串行显示控制口。系统设置5个功能键:占空比、脉宽、周期、频率和复位。 (2) 7个LED数码管组成测量数据显示器,另一个独立的数码管用于状态显示。 (3) BCLK为测频标准频率50 MHz信号输入端,由晶体振荡源电路提供。 (4) 待测信号经放大整形后输入CPLD/FPGA的TCLK。,13.2.3 CPLD/FPGA测频专用模块的VHDL程序设计 利用VHDL设计的测频模块逻辑结构如图13.4所示,其中有关的接口信号规定如下: (1) TF(P2.7):TF=0时等精度测频;TF=1时测脉宽。 (2) CLR
8、/TRIG(P2.6):当TF=0时系统全清零功能;当TF=1时CLRTRIG的上跳沿将启动CNT2,进行脉宽测试计数。 (3) ENDD(P2.4):脉宽计数结束状态信号,ENDD=1计数结束。,(4) CHOICE(P3.2):自校/测频选择,CHOICE=1测频;CHOICE=0自校。 (5) START(P2.5):当TF=0时,作为预置门闸,门宽可通过键盘由单片机控制,START=1时预置门开;当TF=1时,START有第二功能,此时,当START=0时测负脉宽,当START=1时测正脉宽。利用此功能可分别获得脉宽和占空比数据。 (6) EEND(P2.3):等精度测频计数结束状态信
9、号,EEND=0时计数结束。 (7) SEL2.0(P2.2,P2.1,P2.0):计数值读出选通控制。,图13.4 测频模块逻辑图,1测频/测周期的实现 (1) 令TF=0,选择等精度测频,然后在CONTRL的CLR端加一正脉冲信号以完成测试电路状态的初始化。 (2) 由预置门控信号将CONTRL的START端置高电平,预置门开始定时,此时由被测信号的上沿打开计数器CNT1进行计数,同时使标准频率信号进入计数器CNT2。,(3) 预置门定时结束信号把CONTRL的START端置为低电平(由单片机来完成),在被测信号的下一个脉冲的上沿到来时,CNT1停止计数,同时关断CNT2对fs的计数。 (
10、4) 计数结束后,CONTRL的EEND端将输出低电平来指示测量计数结束,单片机得到此信号后,即可利用ADRC(P2.2)、ADRB(P2.1)、ADRA(P2.0)分别读回CNT1和CNT2的计数值,并根据等精度测量公式进行运算,计算出被测信号的频率或周期值。,2控制部件设计 如图13.5所示,当D触发器的输入端START为高电平时,若FIN端来一个上升沿,则Q端变为高电平,导通FINCLK1和FSDCLK2,同时EEND被置为高电平作为标志;当D触发器的输入端START为低电平时,若FIN端输入一个脉冲上沿,则FINCLK1与FSDCLK2的信号通道被切断。,图13.5 测频与测周期控制部
11、分电路,3计数部件设计 图13.4中的计数器CNT1/CNT2是32位二进制计数器,通过DSEL模块的控制,单片机可分4次将其32位数据全部读出。 4脉冲宽度测量和占空比测量模块设计 根据上述脉宽测量原理,设计如图13.6(CONTRL2)所示的电路原理示意图。,图13.6 脉冲宽度测量原理图,测量脉冲宽度的工作步骤如下: (1) 向CONTRL2的CLR端送一个脉冲以便进行电路的工作状态初始化。 (2) 将GATE的CNL端置高电平,表示开始脉冲宽度测量,这时CNT2的输入信号为FSD。 (3) 在被测脉冲的上沿到来时,CONTRL2的PUL端输出高电平,标准频率信号进入计数器CNT2。,(
12、4) 在被测脉冲的下沿到来时,CONTRL2的PUL端输出低电平,计数器CNT2被关断。 (5) 由单片机读出计数器CNT2的结果,并通过上述测量原理公式计算出脉冲宽度。CONTRL2子模块的主要特点是:电路的设计保证了只有CONTRL2被初始化后才能工作,否则PUL输出始终为零。,只有在先检测到上沿后PUL才为高电平,然后在检测到下沿时,PUL输出为低电平;ENDD输出高电平以便通知单片机测量计数已经结束;如果先检测到下沿,PUL并无变化;在检测到上沿并紧接一个下沿后,CONTRL2不再发生变化直到下一个初始化信号到来。占空比的测量方法是通过测量脉冲宽度记录CNT2的计数值N1,然后将输入信
13、号反相,再测量脉冲宽度,测得CNT2计数值N2则可以计算出: 占空比,100%,(13.14),13.2.4 单片机控制与运算程序的设计 主要单片机控制与运算程序流程图如图13.7图13.14所示。,图13.7 主程序流程图,图13.8 显示子程序流程图,图13.9 频率、周期计数子程序流程图,图13.10 键扫子程序流程图,图13.11 测周期子程序流程图,图13.12 测频率子程序流程图,图13.13 测脉宽子程序流程图,图13.14 脉宽、占空比计数子程序流程图,13.3 主要VHDL和单片机源程序,13.3.1 主要VHDL源程序-频率计测试模块DJDPLJ.VHDLIBRARY IE
14、EE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DJDPLJ IS PORT(CHEKF, FINPUT, CHOICE: IN STD_LOGIC; START, CLRTRIG, FSTD, TF: IN STD_LOGIC;,SEL: IN STD_LOGIC_VECTOR(2 DOWNTO 0); OO: OUT STD_LOGIC_VECTOR(7 DOWNTO 0); EEND: OUT STD_LOGIC; -CPBZ ENDD: OUT STD_LOGIC; END ENTITY
15、DJDPLJ; ARCHITECTURE ART OF DJDPLJ IS COMPONENT FIN ISPORT(CHKF, FIN, CHOIS: IN STD_LOGIC; FOUT: OUT STD_LOGIC);,END COMPONENT FIN; COMPONENT CONTRL ISPORT(FIN, START, CLR, FSD: IN STD_LOGIC; CLK1, EEND, CLK2, CLRC: OUT STD_LOGIC); END COMPONENT CONTRL; COMPONENT CNT ISPORT(CLK, CLR: IN STD_LOGIC; Q
16、: OUT STD_LOGIC_VECTOR(31 DOWNTO 0);,END COMPONENT CNT ; COMPONENT CONTRL2 ISPORT(FIN, START, CLR: IN STD_LOGIC; ENDD, PUL: OUT STD_LOGIC); END COMPONENT CONTRL2; COMPONENT GATE ISPORT(CLK2, FSD, CNL, PUL: IN STD_LOGIC; CLKOUT: OUT STD_LOGIC);,END COMPONENT GATE; SIGNAL INCLK: STD_LOGIC; SIGNAL FOUT
17、, CLRC: STD_LOGIC; SIGNAL CLK1, CLK2, CLKOUT, PUL: STD_LOGIC; SIGNAL Q1, Q2: STD_LOGIC_VECTOR(31 DOWNTO 0); BEGIN OO= Q1(7 DOWNTO 0) WHEN SEL=000 ELSE Q1(15 DOWNTO 8) WHEN SEL=001 ELSE Q1(23 DOWNTO 16) WHEN SEL=010 ELSE,Q1(31 DOWNTO 24) WHEN SEL=011 ELSE Q2(7 DOWNTO 0) WHEN SEL=100 ELSE Q2(15 DOWNTO
18、 8) WHEN SEL=101 ELSE Q2(23 DOWNTO 16) WHEN SEL=110 ELSE Q2(31 DOWNTO 24) WHEN SEL=111 ELSE 00000000; FENPIN: PROCESS(FSTD) IS BEGIN IF FSTDEVENT AND FSTD=1 THEN INCLK=NOT INCLK;,END IF; END PROCESS FENPIN; FCH: FIN PORT MAP(CHKF=CHEKF, FIN=FINPUT, CHOIS=CHOICE, FOUT=FOUT); CON: CONTRL PORT MAP(FIN=
19、FOUT, START=START, CLR=CLRTRIG, FSD=INCLK, CLK1=CLK1, EEND=EEND, CLK2=CLK2, CLRC=CLRC); CONT1: CNT PORT MAP(CLK=CLK1, CLR=CLRC, Q=Q1);,CONT2: CNT PORT MAP(CLK=CLKOUT, CLR=CLRC, Q=Q2); CON2: CONTRL2 PORT MAP(FIN=FOUT, START=START, CLR=CLRC,PUL=PUL, ENDD=ENDD); GATE1: GATE PORT MAP(CLK2=CLK2, FSD=INCL
20、K, CNL=TF, PUL=PUL, CLKOUT=CLKOUT); END ARCHITECTURE ART;,-计数模块CNT.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CNT IS PORT(CLK, CLR: IN STD_LOGIC; Q: OUT STD_LOGIC_VECTOR(31 DOWNTO 0); END ENTITY CNT; ARCHITECTURE ART OF CNT IS,SIGNAL CNT: STD_LOGIC_VECTOR(3
21、1 DOWNTO 0); BEGIN PROCESS(CLK, CLR) ISBEGINIF CLR=1 THEN CNT=00000000000000000000000000000000; ELSIF CLKEVENT AND CLK=1 THEN CNT=CNT+1; END IF; END PROCESS; Q=CNT; END ARCHITECTURE ART;,-测频、周期控制模块CONTRL.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY CONTRL IS PORT(FIN, START, CLR, FSD: IN STD
22、_LOGIC; CLK1, EEND, CLK2, CLRC: OUT STD_LOGIC); END ENTITY CONTRL; ARCHITECTURE ART OF CONTRL IS SIGNAL QQ1: STD_LOGIC; BEGIN PROCESS(FIN, CLR, START) IS,BEGINIF CLR=1 THEN QQ1=0; ELSIF FINEVENT AND FIN=1 THEN QQ1=START; END IF; END PROCESS; CLRC=CLR; EEND=QQ1; CLK1=FIN AND QQ1; CLK2=FSD AND QQ1; EN
23、D ARCHITECTURE ART; -测脉宽、占空比控制模块CONTRL2.VHDLIBRARY IEEE;,USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY CONTRL2 IS PORT (FIN, START, CLR: IN STD_LOGIC; ENDD, PUL: OUT STD_LOGIC); END ENTITY CONTRL2; ARCHITECTURE ART OF CONTRL2 IS SIGNAL QQ: STD_LOGIC_VECTOR(3 DOWNTO 1); SIGNAL
24、A0, B0, C0, F2: STD_LOGIC; SIGNAL S: STD_LOGIC_VECTOR(1 DOWNTO 0);,BEGIN S(0)=QQ(3); S(1)=QQ(2); PROCESS(START, S) ISBEGIN IF START=1 THEN F2=FIN; ELSE F2=NOT FIN; END IF; IF S=2 THEN PUL=1; ELSE PUL=0; END IF; IF S=3 THEN ENDD=1;ELSE ENDD=0;,END IF; END PROCESS; A0=F2 AND QQ(1); B0=NOT A0; C0=NOT F
25、2; PROCESS(C0, CLR) ISBEGINIF CLR=1 THEN QQ(1)=0; ELSIF C0EVENT AND C0=1 THEN QQ(1)=1; END IF; END PROCESS;,PROCESS(A0, CLR) ISBEGINIF CLR=1 THEN QQ(2)=0; ELSIF A0EVENT AND A0=1 THEN QQ(2)=1; END IF; END PROCESS; PROCESS(B0, CLR) IS BEGINIF CLR=1 THEN QQ(3)=0; ELSIF B0EVENT AND B0=1 THEN QQ(3)=1; EN
26、D IF; END PROCESS; END ARCHITECTURE ART;,-自校/测试频率选择模块FIN.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY FIN IS PORT (CHKF, FIN, CHOIS: IN STD_LOGIC; FOUT: OUT STD_LOGIC); END ENTITY FIN; ARCHITECTURE RTL OF FIN IS BEGIN FOUT=(FIN AND CHOIS) OR (CHKF AND NOT CHOIS); END ARCHITECTURE RTL;,-计数器二频
27、率切换模块GATE.VHDLIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY GATE IS PORT (CLK2, FSD, CNL, PUL: IN STD_LOGIC; CLKOUT: OUT STD_LOGIC); END ENTITY GATE; ARCHITECTURE ART OF GATE IS BEGIN PROCESS(CLK2, PUL, FSD, CNL) IS,BEGIN IF CNL=0 THEN CLKOUT=CLK2; ELSE CLKOUT=PUL AND FSD; END IF; END PROCESS; EN
28、D ARCHITECTURE ART;,13.3.2 单片机源程序LED8 EQU 7FHLED7 EQU 7EHLED6 EQU 7DHLED5 EQU 7CHLED4 EQU 7BHLED3 EQU 7AHLED2 EQU 79HLED1 EQU 78HTF BIT P2.7CLRTRIG BIT P2.6,START BIT P2.5ENDD BIT P2.4EEND BIT P2.3ADRC BIT P2.2ADRB BIT P2.1ADRA BIT P2.0CHOICE BIT P3.2SB1 BIT P1.0; TEST频率SB2 BIT P1.1; TEST周期SB3 BIT P
29、1.2; TEST脉宽SB4 BIT P1.3; TEST占空比SB5 BIT P1.4; RET,AD0 EQU 30HAD1 EQU 31HAD2 EQU 32HAD3 EQU 33HAD4 EQU 34HAD5 EQU 35HAD6 EQU 36HADA EQU 4FHADB EQU 5FHADC EQU 4DHADE EQU 5DHKEYNUM EQU 29HINT_R1 EQU 46H,INT_R0 EQU 47HINT_R2 EQU 48H; 主程序ORG 0000H LJMP MAIN ORG 0030HMAIN : CLEAR: MOV R0, #00H MOV R1, #12
30、8 MOV A, #00H,L1: MOV R0, A INC R0 DJNZ R1, L1 MOV SP, #60H MOV P2, #00H ; 控制信号初始化为0 SETB CHOICE LCALL NL0 ; 7个数码管熄灭 MOV LED8, #13H ; 开始显示“P.” MOV LED7, #0CFH,DIR: LCALL DISP ; 调显示子程序KKE1: LCALL KKEYII ; 调键扫子程序KK0: CJNE A, #00H, KK1KKK0: LCALL TESTF; 调用测频子程序 LCALL KKEYI LCALL DELAY LCALL DELAY JB 28
31、H.4, KK0 SJMP KKK0KK1: CJNE A, #01H, KK2,KKKK1: SETB 28H.1 LCALL TESTT; 调测周期子程序 CLR 28H.1 LCALL KKEYI JB 28H.4, KK0 SJMP KKKK1KK2: CJNE A, #02H, KK3,KKKK2: SETB 28H.2 LCALL TESPW; 调用测脉宽子程序 CLR 28H.2 LCALL KKEYI JB 28H.4, KK0 SJMP KKKK2KK3: CJNE A, #03H, KK4,KKKK3: SETB 28H.2 CLR 28H.1 LCALL TESZKB;
32、调用测占空比子程序 CLR 28H.2 LCALL KKEYI JB 28H.4, KK0 SJMP KKKK3KK4: SJMP KKE1; 测频子程序,TESTF: ; 测频 LCALL FTJS ; 控制测试计数程序IF 1=8 MOV R1, #3FH ; 另存Ns和Nx MOV R0, #LED8 MOV R2, #08HMML1: MOV A, R0 MOV R1, A DEC R1 DEC R0 DJNZ R2, MML1,ENDIF MOV 4CH, #01H ; 标准频率值fs=25 MHz,高位 MOV 4DH, #7DH MOV 4EH, #78H MOV 4FH, #4
33、0H MOV R0, #LED1 ; Nx=(5FH5CH) MOV R1, #ADB MOV R3, #04H,TFL0: MOV A, R0 MOV R1, A DEC R1 INC R0 DJNZ R3, TFL0 LCALL MULNM ; (4CH 4D, 4E, 4FH)(5C 5D, 5E, 5FH)=(57H5FH) ; fsNx,IF 1=3 ; 乘法未经处理送显缓 MOV R0, #5FH MOV R1, #LED1 MOV R2, #07HLLL3: MOV A, R0 MOV R1, A DEC R0 INC R1 DJNZ R2, LLL3,ENDIF ; 除法运算参
34、数传递 MOV R0, #5FH ; 先送乘法结果到4F4AH MOV R1, #4FH MOV R2, #08HTFL1: MOV A, R0 MOV R1, A DEC R0 DEC R1 DJNZ R2, TFL1 MOV R0, #LED5 ; Ns 送5FH57H中 MOV R1, #5FH MOV R3, #04H,TFL2: MOV A, R0 MOV R1, A DEC R1 INC R0 DJNZ R3, TFL2 LCALL DIVD1 ; (4A, 4B, 4C, 4D, 4E, 4FH)/(5D, 5E, 5FH)=(4D, 4E, 4FH) ; (fsNx)/Ns=f
35、x MOV 22H, 4DH ; 高位, 计算结果fx,MOV 21H, 4EH MOV 20H, 4FH JB 28H.1, NEXT3 LCALL HEXBCD2 ; 待显示数据转换为BCD码放于7E77H共8个单元 MOV LED8, #0FH;“F” LCALL DISP ; 显示NEXT3: RET; 周期测试子程序,TESTT: ; 测周期 LCALL TESTF MOV R0, #4FH MOV R1, #5FH MOV R2, #04HTETL1: MOV A, R0 MOV R1, A DEC R0 DEC R1 DJNZ R2, TETL1 MOV 48H, #00H,MO
36、V 49H, #00H MOV 4AH, #00H MOV 4BH, #00H MOV 4CH, #00H ; *(1000)D MOV 4DH, #0FH MOV 4EH, #42H MOV 4FH, #40H ; 除法运算参数传递 LCALL DIVD1 ; (4A, 4B, 4C, 4D, 4E, 4FH)/(5D, 5E) MOV 22H, 4DH ; 高位,MOV 21H, 4EH MOV 20H, 4FH LCALL HEXBCD2 ; 待显示数据转换为BCD码放于7E77H共8个单元 MOV LED8, #10H ; “P” LCALL DISP ; 显示 RET ; 频率周期测
37、试计数子程序,FTJS: ; 频率周期测试计数子程序 SETB CHOICE SETB CLRTRIG ; 计数器清零 CLR CLRTRIG SETB START ; 打开预置门 LCALL T1S LCALL T1S LCALL T1S LCALL T1S,LCALL T1S LCALL T1S LCALL T1S LCALL T1S CLR STARTFL0: JB EEND, FL0; ; 等待计数 ; 中断延时结束,即计数完 MOV R0, #LED1 ; 读入数据最低位缓冲单元 MOV R3, #08H ; 读8次P0口,FL1: MOV A, P0 MOV R0, A INC R
38、0 MOV A, P2 INC A ; 指向CPLD/FPGA下一个数据ADRC、ADRB、ADRA MOV P2, A DJNZ R3, FL1 MOV P2, #00H RET,T1S: MOV INT_R1, #0FFHTSM3: MOV INT_R0, #0FFHTSM4: DJNZ INT_R0, TSM4 DJNZ INT_R1, TSM3 RET; 测脉宽子程序TESPW:,MOV R4, #02H LCALL PWZJS MOV R0, #3FH ; + MOV R1, #4FH MOV R2, #04HTEL2: MOV A, R0 MOV R1, A DEC R0 DEC
39、R1 DJNZ R2, TEL2,MOV 4BH, #00H MOV 4AH, #00H MOV 49H, #00H MOV 48H, #00H MOV 5CH, #00H ; 标准频率值fs=25 MHz,高位 MOV 5DH, #00H MOV 5EH, #00H MOV 5FH, #19H LCALL DIVD1 MOV 22H, 4DH ; 高位,MOV 21H, 4EH MOV 20H, 4FH LCALL HEXBCD2 ; 待显示数据转换为BCD码放于7E77H共8个单元 MOV LED8, #0AH ; “A” LCALL DISP ; 显示 RET; 测占空比子程序,TESZ
40、KB : MOV R4, #02HTEL1: LCALL PWZJS DJNZ R4, TEL1 SETB 28H.2 MOV R0, #3FH ; + MOV R1, #4FH MOV R2, #04HTEL4: MOV A, R0,MOV R1, A DEC R0 DEC R1 DJNZ R2, TEL4 MOV R0, #57H MOV R1, #5FH MOV R2, #04HTEL3: MOV A, R0 MOV R1, A,DEC R0 DEC R1 DJNZ R2, TEL3 LCALL ADDMB MOV R0, #5FH MOV R1, #3FH MOV R2, #04HTE
41、L7: MOV A, R0 MOV R1, A DEC R0,DEC R1 DJNZ R2, TEL7 MOV 5CH, #00H MOV 5DH, #00H MOV 5EH, #03H MOV 5FH, #0E8H LCALL MULNM MOV R0, #5FH MOV R1, #4FH MOV R2, #04H,TEL5: MOV A, R0 MOV R1, A DEC R0 DEC R1 DJNZ R2, TEL5 MOV R0, #3FH MOV R1, #5FH MOV R2, #04H,TEL8: MOV A, R0 MOV R1, A DEC R0 DEC R1 DJNZ R2
42、, TEL8 MOV 48H, #00H MOV 49H, #00H MOV 4AH, #00H MOV 4BH, #00H LCALL DIVD1 MOV 22H, 4DH ; 高位,MOV 21H, 4EH MOV 20H, 4FH LCALL HEXBCD2 ; 待显示数据转换为BCD码放于7E77H共8个单元 MOV LED8, #0BH ; “B” LCALL DISP ; 显示 RET ; 脉宽/占空比测量计数子程序,PWZJS: SETB P2.2 SETB CHOICE; P3.2 SETB TF JNB 28H.2, PWL1 SETB START CLR 28H.2 LJM
43、P PWL2PWL1: CLR START,PWL2: SETB CLRTRIG CLR CLRTRIG ; P2.6 MOV R1, #0FH ; 延时PWL3: LCALL T1S DJNZ R1, PWL3PL0: JNB P3.3, PL0 ; P2.4 MOV A, R4 CJNE A, #02, PL2,MOV R0, #3FH ; 读入数据最低位缓冲单元 MOV R3, #04H ; 读8次P0口PL1: MOV A, P0 MOV R0, A DEC R0 MOV A, P2 INC A ; 指向CPLD/FPGA下一个数据 MOV P2, A DJNZ R3, PL1 LJM
44、P NEXT6,PL2: MOV R0, #57H ; 读入数据最低位缓冲单元 MOV R3, #04H ; 读8次P0口PL3: MOV A, P0 MOV R0, A DEC R0 MOV A, P2 INC A ; 指向CPLD/FPGA下一个数据 MOV P2, A DJNZ R3, PL3,LOPP1: MOVR0, A INCR0 DJNZR7, LOPP1 MOVR7, #18H ; 32BITLOOP4: MOVR1, #20H MOVR6, #03H CLRC,LOPP2: MOV A, R1 RLCA MOVR1, A INCR1 DJNZR6, LOPP2 MOVR5,
45、#04H MOVR0, #23H,LOOP3: MOVA, R0 ADDCA, R0 DA A MOVR0, A INCR0 DJNZR5, LOOP3 DJNZR7, LOOP4SBCD: MOV R0, #23H MOV R1, #40H MOV R3, #04H,HEX1: MOV A, R0 ANL A, #0FH MOV R1, A INC R1 MOV A, R0 ANL A, #0F0H SWAP A MOV R1, A INC R1 INC R0 DJNZ R3, HEX1,MOV A, 47H CJNE A, #00H, HEX3 CLR 28H.0 MOV R0, #40H
46、 MOV R1, #LED1 MOV R2, #07HHEX4: MOV A, R0 MOV R1, A INC R0 INC R1 DJNZ R2, HEX4 LJMP NEXT2,HEX3: SETB 28H.0 MOV R0, #47H MOV R1, #LED7 MOV R2, #07HHEX2: MOV A, R0 MOV R1, A DEC R0 DEC R1 DJNZ R2, HEX2NEXT2: RET,; 2N BYTE / N BYTE = N BYTE , HERE N=3 IN 31H; (4A, 4B, 4C, 4D, 4E, 4FH)/(5D, 5E, 5FH)=(
47、4D, 4E, 4FH)DIVD1: NOP MOVAD0, #08H ; 被除数的字节数为6,AD0=06H MOVAD1, #04H; 除数的字节数,DIVPP: MOVA, AD1 ; MOVR2, A ; R2=03H RL A RL A RL A MOVR3, A ; R3=18H=24D CLR0F0H ; B.0=0,清标志位 CLRC ; C=0 MOVA, #ADA SUBBA, R2 MOVAD3, A ; AD3=4CH MOVR1, #ADB,DIVMB2B: MOVA, R1 JNZDIVM2B DECR1 DJNZR2, DIVMB2B SETB0F0H RETDI
48、VM2B: MOVR2, AD1 MOVR1, #ADB MOVR0, AD3,DIVM2L: MOVA, R0 SUBBA, R1 DECR0 DECR1 DJNZR2, DIVM2L JNCDIVM20DIVM2D: LCALL SHIL1 JC DIVM2SDIVM2C: MOVR0, AD3 MOVR1, #ADB MOVR2, AD1,DIVM2CL: MOVA, R0 SUBBA, R1 DECR0 DECR1 DJNZR2, DIVM2CL JCDIVM2EDIVM2S: INCADA MOVR2, AD1 MOVR0, AD3 MOVR1, #ADB LCALLSUBMBB,D
49、IVM2E: DJNZR3, DIVM2D RETDIVM20: SETB0F0H RET DB 02H, 12HSHIL1: MOVR2, AD0 MOVR0, #ADA,SHIL1B: CLRCSHILL: MOVA, R0 RLCA MOVR0, A DECR0 DJNZR2, SHILL RET,SUBMB:MOVR2, AD0 ; NO SIGN N BYTES MINUSE N BYTES MOVR0, #ADA ;(.4FH)-(.5FH)=(.4FH) MOVR1, #ADBSUBMBB: CLRCSUBMB1: MOVA, R0 SUBBA, R1 MOV R0, A DEC
50、 R0 DECR1 DJNZR2, SUBMB1 RET,MULNM: NOP ; N BYTES X M BYTES = N+M BYTES HERE N=3; M=3 MOVAD0, #04H ; (4CH 4D, 4E, 4FH)(5C 5D, 5E, 5FH)=(57H5FH) MOVAD1, #04HMULTT: MOVA, AD0 ; MOVR3, AD1 MOVR2, A ADDA, R3; INCA,MOVAD2, A MOVA, #ADB CLRC SUBBA, R3 MOVAD6, A MOVR1, A SUBBA, R2 MOVAD5, A INCR2,MULNMZ: M