//搞个外中断,中断来了就计数
#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++
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)