
常用51单片机频率计有两种方法,一种方法,定时计脉冲个数,如定时100ms,计数器计值是55,则频率为55x10=550hz,另外一种方法,计单个脉冲的周期,可用外部中断,也可不用外部中断,下降沿到来时开定时器,上升沿或另外一个下降沿到来时关闭定时器,读出定时器的值,若脉冲宽度太宽,定时器可能会溢出, 也可以让定时器中断,定时器计时加上中断溢出次数的时间,就是总时间=周期,显然你用的是第二种方法
程序基本没问题,但你的显示程序应该是包括while(1) {while(pulse==0);.....}
这个大偱环内的,不要另起一个偱环,还是真正的死偱环,跳不出来,结果是复位一次,只能测量一次
这种方法测低频比较准,但也有一个缺点,测低频时,更新很慢,测1HZ脉冲,必须要2秒,1S测量计时,另外几ms处理并显示,剩下的近1S空等
测05HZ脉冲,理论上要4秒,所以要求05-1S更新一次和测量的频率下限是矛盾的
既然用了中断TF1会自动清0,TF1=0是多余的
还有,你若是液晶屏显示还可以,数码管测低频还存在着刷新问题,长时间的等待,数码管会只亮一个,如果把数码管刷新程序放在等待空闲内的话,测高频时会错过脉冲上升和下降沿,测低频也会,只不过几率小些,所以用数码管的话,也只能用静态显示
或者间断显示也可以,即将显示子程序偱环50-100次(持续15-3s),然后再次测量,把while(1) {ledxianshi();}死偱环改成FOR偱环
也可以用第一种方法测,若测试低频的话,就要把定时时间设得很长,测01HZ信号,你不定时大于10s,测出来就是0
不太了解ZLG7290,也没有电路图,分析了一下,修改4处先看看是否可行,有问题再交流。
MOV R7,#99 ;(修改) 执行到99
MOV A,#45 ;(修改)
HANDLELOOP:
MOV MTD,A
PUSH ACC
MOV 30H,R7
MOV MTD+1,MRD
MOV SLA,#ZLG7290
MOV SUBA,#07H
MOV NUMBYTE,#02H
LCALL IWRNBYTE
LCALL DELAY
LCALL DELAY ;此处增加一句,整体延时1S
USING 2
MOV R7,30H
POP ACC
INC A
DJNZ R7,HANDLELOOP
SJMP MAINLOOP
DELAY:
MOV R7,#100 ;延时由原来的06S改为05秒
MIN: DJNZ R7,YS500
RET
YS500: LCALL YS500US
LJMP MIN
YS500US:MOV R6,#80H
DJNZ R6,$
RET
DELAY1: MOV R7,#20H
DJNZ R7,$
RET
以上就是关于急!单片机频率计c语言程序,3位8段数码管显示,显示范围从0.01~9.99,数据每0.5s~1s更新全部的内容,包括:急!单片机频率计c语言程序,3位8段数码管显示,显示范围从0.01~9.99,数据每0.5s~1s更新、求单片机程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)