❶ 设计一个以单片机为核心的频率测量装置。求大神给写一下程序。
单片机频率计仿真。
#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=0x00;TL1=0x00;
tt1=0x00;tt2=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=1;P0==0xff;
P2=led[0];P0=0xfe
}
if(tt0==2 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[1];P0=0xfd
}
if(tt0==3 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[2];P0=0xfb
}
if(tt0==4 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[3];P0=0xf7
}
if(tt0==5 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[4];P0=0xef
}
if(tt0==6 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[5];P0=0xdf
}
if(tt0==7 && tb0=1)
{
tb0=1;P0==0xff;
P2=led[6];P0=0xbf
}
if(tt0==8 && tb0=1)
{
tb0=1;P0==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++;
}
❷ 51单片机用定时器计数器测量频率
定时器1对外部脉冲计数时TMOD高4位设置应该是5
因此TMOD=0x51;
以下我的频率计程序:
#include <reg52.h>//因没用到STC12C5410专有特殊功能寄存器,此处用52或51的头文件均可
#define unit unsigned int
#define uchar unsigned char
//定义以I/O口的功能
sbit beiguang=P3^2;//液晶屏背光
sbit rs=P1^3;//液晶屏写选择,0命令 1数据
sbit rw=P1^4;//液晶屏读写选择
sbit lcden=P1^5;//液晶屏使能
sbit fm=P1^7;//蜂鸣器
#define db P2 //定义P2为数据输出口,写数据时用db代替P2,增加液晶屏程序的通用性
//更改硬件接线时,只更改此处,而不必去更改液晶屏读写子程序
uchar aa,bb,cc;//变量声明
unit dd,ee;
void Delay1ms(unsigned int i) //1ms延时程序
{
unsigned int j;
for(;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}
void init()//初始化设置
{
TMOD=0x15;//定时器0作为计数器,定时器1作为定时器用
TH0=0;//计数器清0
TL0=0;
EA=1;//开总中断
ET1=1;//允许定时器1中断
TH1=0x4c;
TL1=0x5c;
TR0=1;//启动计数器
TR1=1;//启动定时器
aa=0;
}
void write_com(uchar com)//向液晶屏写命令
{
db=com;
rs=0;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void write_date(uchar date)//向液晶屏写数据
{
db=date;
rs=1;
rw = 0;
lcden=0;
Delay1ms(10*12);
lcden=1;
Delay1ms(10*12);
lcden=0;
}
void init2()//液晶屏初始化
{
beiguang=0;
rw=0;
write_com(0x38);
Delay1ms(10*12);
write_com(0x0f);
Delay1ms(10*12);
write_com(0x06);
Delay1ms(10*12);
write_com(0x01);
Delay1ms(10*12);
}
void display4(unsigned int number) //单行多位显示程序
{
uchar A1,A2,A3,A4,A5;
init2();//液晶屏初始化
A1=number/10000%10;//分离出万,千,百,十,个,对于int型数据,最大不超过65535
A2=number/1000%10;
A3=number/100%10;
A4=number/10%10;
A5=number%10;
write_com(0x80);//第1个数据的位置设定,第1行第1列
Delay1ms(10);
write_date(0x30+A1);//写数据
Delay1ms(10);
write_date(0x30+A2);
Delay1ms(10);
write_date(0x30+A3);
Delay1ms(10);
write_date(0x30+A4);
Delay1ms(10);
write_date(0x30+A5);
Delay1ms(10);
write_com(0x87);//第6个数据'H'的位置,中间空85和86 二格
write_date('H');
Delay1ms(10);
write_date('z');
Delay1ms(10);
}
void main()//主程序很简单
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//0.5S的计数值
ee=2*dd;//换算为1秒钟的计数值
if(aa==1)
{
if(TH0>12)//预判断,50ms内TH0>12,1s内计数值将超过可计数的最大值65535
fm=0;//报警
}
display4(ee);//显示
fm=1;//报警停止
}
}
void timer1()interrupt 3//注意:定时器1的中断序号为3
{
aa++;
TH1=0x4c;//11.0592Mhz
TL1=0x5c;
if(aa==10)//中断10次,共0.5S
{
TR0=0;//暂停计数
aa=0;
bb=TH0;//读出计数器数据
cc=TL0;
TL0=0;//计数器清0
TH0=0;
TR0=1;//重新启动
}
}
❸ 用单片机怎么测量频率信号希望能回答详细一点,谢谢了
1、单片机内有计数器和计时器,设你固定计时器为1秒钟,用计数器计算频率的脉冲个数,如果是100个,那么频率就是100Hz;另一种方式,用计数器计算100脉冲,然后去读计时器这100个脉冲用了多少时间,如果是2秒,100/2=50Hz那就是50Hz。
2、幅度需要分压取样,可以直接在220V上做个1/100分压,或者做个隔离取样,互感器效果比较好,成本稍高,推荐这种方式。
❹ 怎样用单片机实现频率的测量
这个太简单了,
//搞个外中断,中断来了就计数
#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=1;TR0=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,这就靠你自己了。
加油练吧
❺ 单片机如何检测信号的频率
如果被测信号频率远大于单片机工作频率(机器周期),可以通过外部可编程分频器降到单片机可以接受的频率范围。
如果被测信号频率稍低于单片机工作频率,可以采用单片机定时器从计数引脚输入信号,程序设定计数门限时间的方法来测量频率。
如果被测信号频率远低于单片机工作频率,那么可以采用信号输入外部中断引脚作为单片机定时器的计数门限时间,定时器以工作频率计数来测量频率。
❻ 用单片机测频率的程序
我只有51的程序,没有MSP430的,但是我可以告诉您的思路:
1、你将输入信号输入外部中断引脚。
2、开启您的定时器T0;
3、使用定时器T0计时5S,然后读取外部中断了多少次。
4、计算外部中断的次数N,这样你就得到你所需要的频率了。那就是N*12=1分钟的次数。