Apple-Ⅱ数字频率计程序

🏠 首页 《无线电》杂志 1990年 🔗 第7期 🔗 第29页 分类:无线电技术自学经验交流 🔗 吴东明 🔗

(吴东明)APPLE-Ⅱ微机及兼容机可用录音机作外部存储器。读信息时,从接口输入的信号经判别整形后将送到数据选择器的输入端。访问$C060单元,就可以从数据总线7D位上取得当前信号状态,7D=1则波形为高电平,否则为低电平。若用程序定期访问$C060单元(采样),并将每次所采集的信息进行分析比较,然后将信号状态改变次数记录下来,再结合总采样分析时间即可计算出信号频率,最后将频率值显示到屏幕上。

程序1是机器语言子程序,它首先在X、Y寄存器内设初值,然后采集初样并存入$FA,以后每次采样的数据均与初样进行异或,根据标志N的状态可判别两次采样时的7D位是否相同,也就能判断当前波形状态是否与初次采样波形状态相同。N=1表示两次采样时的波形状态不相同;N=0表示两次采样时的波形状态相同。子程序的核心是一个小循环,即采样→与初样异或→标志位N发生了变化了吗?→计数器减1→计数器为0吗?→不为0重新采样。$310~$319可判断当前波形状态是否与初样相同;$31A~$326可判断当前波形状态是否变为与初样不同的波形;只要当前波形状态发生跳变,Y寄存器(波形状态变化计数器)就减1,否则X寄存器(程序循环次数计数器)减1;再判断X或Y寄存器是否为0,不为0则重新循环;其中任一个寄存器为0,则将X、Y寄存器内的数据分别送入$FB和$FC单元,然后返回主程序。

程序2的10~160句为BASIC主程序,10~60句清屏设置显示画面,再设定Y计数器初值T,调用机器语言子程序。70~90句用初值分别减专用单元$FB和$FC中的值,再进行相应的运算即可得信号跳变次数B和采样、分析、次数的总循环次数(A+B);将B除以2后再除以采样、计数循环的总肘间(采样记数总次数A+B、一次小循环的时钟周期数和一个时钟周期之积),即可得信号频率F。100~120句处理频率值使之保持6位整数并显示在固定位置。130~150句重新设定Y记数器初值,使之尽可能大,这样在子程序退出时X记数器总不等于0,从而增加测频精度。

本文介绍的频率计不需任何外围元件,使用时只需正确键入程序2(子程序、主程序合并),或者将存储在磁带或磁盘上的该程序调入内存,再将待测信号引入微机录音机输入接口。调试程序时可用录音机作信号源,信号峰—峰电压值应不小于1V,但也不可大于3.5V。最后键人命令“RUN”并回车,屏幕即显示信号频率,按CTRL-S键可锁定瞬时频率,按其它键可恢复实时测频,接CTRL-RESET键退出测频。

由于子程序完成一次采样记数循环需要13个时钟周期,约13.0us,X、Y寄存器只能计数255次,所以程序只能分析显示150~38000Hz的信号频率;而且存在一定的误差,频率愈高、误差愈大。

程序1:

300:A2 FF ;LDX $FF

302:A4 FF ;LDY $FF

304:AD 60 C0 ;LDA $C0 60

307:85 FA ;STA

309:AD 60 C0 ;LDA $C0 60

30C:45 FA ;EOR

30E:10 F9 ;BTL $309

310:AD 60 C0 ;LDA $C0 6O

313:45 FA ;EOR

315:30 10 ;BMI $327

317:88 ;DEY

318:F0 16 ;BEQ $330

31A:AD 60 C0 ;LDA $C0 60

31D:45 FA ;EOR

31D:10 0C ;BPL $32D

321:88 ;DEY

322:D0 EC ;BNE $310

324:4C 30 03 ;JMP $330

327 ;DEX

328:DO E6 ;BNE $310

32A:4C 30 03 ;JMP $330

32D ;DEX

32E:D0 EA ;BNE $31A

330:86 FB ;STX

332:84 FC ;STY $FC

334:60 ;RTS

程序2:

5 DATA 162,255,164,255,173,96,

192,133,250,173,96,192,69,250,

16,249,173,96,192,69,250,48,

16,136,240,22,173,96,192

6 DATA 69,250,16,12,136,208,

236,76,48,3,202,208,230,76,48,

3,202,208,234,134,251,132,256,

96

7 FOR I=768 TO 820

8 READ X:POKE I,X

9 NEXT I

10 HOME

20 VTAB 11:HTAB 17:PRINT“===”

30 VTAB 13:HTAB 17:PRINT“===”

40 T=20

50 POKE 255,T

60 CALL 768

70 A=255-PEEK(251):B=T-PEEK(252)

80 IF A=0 OR B<=0 THEN 40

90 F=B*500000/[(A+B)*13*1.0]

100 P$=STR $(INT(F))

110 IF LEN(P$)<6 THEN P$=“0”+P$:

GOTO 110

120 VTAB 12:HTAB 17:PRINT P$

130 C=INT(B*PEEK(251)/A)

140 T=B+C

150 IF T>254 THEN T=250

160 GOTO 50