急!单片机频率计c语言程序,3位8段数码管显示,显示范围从0.01~9.99,数据每0.5s~1s更新

急!单片机频率计c语言程序,3位8段数码管显示,显示范围从0.01~9.99,数据每0.5s~1s更新,第1张

常用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更新、求单片机程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9452355.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存