怎样用单片机实现频率的测量

怎样用单片机实现频率的测量,第1张

这个太简单了,

//搞个外中断,中断来了就计数

#include<包头reg51.h>

void

t0(void)

interrupt

0

{

T0count++

//这是全局变量

}

//T1工作在定时状态下,每定时1秒钟到,刷新T0的计数,

void

t1(void)

interrupt

1

{

TR0=1//搞个计数器中断

TH0=0x3c//重新初始化

TL0=0xb0//这是12M晶振的

timecount++

//中断一次,记个数

if(timecount==20)

//一个计数器,一次记不到一秒的,只有记很多次,才能算一秒,这就一秒了

{

frequency=T0count

//看看中断多少次,frequency就是你要的频率

T0count=0//把这个清了,记下一秒的次数。

}

}

main()

{

TMOD

=

0x01

//选择计数器0的模式

EA=1

//

打开总中断

EX0=1

IT0=1//开0外中断

ET0=1TR0=1//开0计时器

这里你加点代码,把frequency显示出来。

}

万一你想要周期

知道频率了,已经很简单了。

T=1/f单位是多少?是秒!

T=1000000000/f单位是多少?是纳秒!

主程序加个

long

T=0

T=1000000000/f//T就是周期,单位是NS。

万一你测的频率很低

if(timecount==20)

//一个计数器,一次记不到一秒的,只有记很多次,才能算一秒,这就一秒了

改为

if(timecount==200)//这就成十秒记一次了,不够就2000,

不过记得要frequency/10,否者频率就大了10倍。

测频率的就在这了

你要显示,看你用什么了

是数码管

还是1602,这就靠你自己了。

加油练吧

单片机频率计仿真。

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit p0=P1^0

bit  tb0,tb1

uchar tt0,tt1,tt2,tt3

uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}

void main()

{

TMOD=0x11

TH0=(65535-50000)/256

TL0=(65535-50000)%256

EA=1

ET0=1//开定时器0中断

ET1=1//开定时器1中断

TR0=1//启动定时器0

TR1=1//启动定时器1

while(1)

{

if(TR1==0)

{

//  tt3=65536*tt2+266*TH1+TL1

TH1=0x00TL1=0x00

tt1=0x00tt2=0x00

tb1=1

led[0]=tt3/1000000

led[1]=tt3/100000%10

led[2]=tt3/100000%10

led[3]=tt3/10000%10

led[4]=tt3/1000%10

led[5]=tt3/100%10

led[6]=tt3/10%10

led[7]=tt3%10

}

if(tt0==1 &&tb0=1)

{

tb0=1P0==0xff

P2=led[0]P0=0xfe

}

if(tt0==2 &&tb0=1)

{

tb0=1P0==0xff

P2=led[1]P0=0xfd

}

if(tt0==3 &&tb0=1)

{

tb0=1P0==0xff

P2=led[2]P0=0xfb

}

if(tt0==4 &&tb0=1)

{

tb0=1P0==0xff

P2=led[3]P0=0xf7

}

if(tt0==5 &&tb0=1)

{

tb0=1P0==0xff

P2=led[4]P0=0xef

}

if(tt0==6 &&tb0=1)

{

tb0=1P0==0xff

P2=led[5]P0=0xdf

}

if(tt0==7 &&tb0=1)

{

tb0=1P0==0xff

P2=led[6]P0=0xbf

}

if(tt0==8 &&tb0=1)

{

tb0=1P0==0xff

P2=led[7]P0=0x7f

tt0=0

}

}

}

void timer0() interrupt 1

{

TH0=(65535-2000)/256

TL0=(65535-2000)%256

tt1++

if(tt1==500)

{

TR1=0//启动定时器1

tb1=0

}

tt0++tb0=1

if(tb1==1 &&TR1==0)TR1=1

}

void timer1() interrupt 3

{

tt2++

}


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

原文地址: https://outofmemory.cn/yw/8137416.html

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

发表评论

登录后才能评论

评论列表(0条)

保存