[quote=淡荣生]; 1.由pic16f84a为核心的35mhz频率计
; 2.lcd显示,4位传输模式,七位数字显示
; 3.闸门时间为0.1秒,精度10hz
; 4.0.1秒内的计数结果在higb、midb、lowb三个单元内
; 5.(higb:midb) × 256 + (lowb)
; 4.编程流程:
; (1)定义各寄存器,lcd及定时参数设置
; (2)各寄存器清零,各端口及tmr0的设置
; (3)lcd初始化
; (4)设定0.1秒定时,ra3设为输入时开始测量
; (5)测试当tmr0溢出(higb)+1
; (6)ra3设为输出时停止测量
; (7)采集测量到的数据(time)→ higb, (tmr0)→ midb, (预分频器)→ lowb
; (8)数据处理
; ①(higb:midb) × 256 + (lowb)
; ②3单元bin → 4单元压缩bcd
; ③4单元压缩bcd → 8个非压缩bcd
; ④8个非压缩bcd → 8个ascⅡ字符
; (9)字符送lcd显示
; (10)go(4)
movlw b' ;
movwf trisa ; ra3设置为输出,关闭计数闸门,停止测量
bcf status,rp0 ;
btfsc intcon,2 ; 确定最终最高计数器的值
incf time,f
bcf intcon,2
; ---------------------------------------------------------------------------------------------------------------------------------------
; 采集三个单元的计数值 (time) → higb,(tmr0) → midb,(预分频器) → lowb
movf tmr0,w
movwf midb ; (tmr0) → midb
movf time,w
movwf higb ; (time) → higb
clrf temp0 ; 以下分析预分频器内的值
countit incf temp0,f
bsf porta,3 ; 产生模拟脉冲使预分频器计数
bcf porta,3 ;
bcf intcon,2 ; 清溢出标志
movf tmr0,w ;
bcf status,z ;
subwf midb,w ; (midb) - (tmr0) → w
btfsc status,z ; 预分频器溢出则跳
goto countit ;
incf temp0,f ;
comf temp0,f ; 256 - (temp0) → temp0
incf temp0,f ;
incf temp0,w ; temp0的值即为预分频器的值
movwf lowb ;
return
;************************
闸门时间到后关闭对测量信号的计数,分析预分频器内的值.具体是porta,3产生模拟脉冲使预分频器继续计数并使之溢出,计算出闸门关闭时预分频器内的真实值.由此可看出,预分频器虽然不能直接读取,这里采用了间接读取的方法得到其值,这也是这个程序设计中的一个比较巧妙的地方.[/quote]
向楼主表示崇高敬意!
受益不浅。
咱业余编程,会51.对楼主提供的资料将作深入学习。目标是采用8*2lcd,做寸方大小的频率计。