单片机测量频率+c语言大全.docx
《单片机测量频率+c语言大全.docx》由会员分享,可在线阅读,更多相关《单片机测量频率+c语言大全.docx(17页珍藏版)》请在冰豆网上搜索。
![单片机测量频率+c语言大全.docx](https://file1.bdocx.com/fileroot1/2022-10/27/3ab36d74-d859-413f-b1d2-ae4e6ce96a6f/3ab36d74-d859-413f-b1d2-ae4e6ce96a6f1.gif)
单片机测量频率+c语言大全
目录
第一篇:
51单片机C语言实验及实践教程_31.6位数显频率计数器
第二篇:
方波测频-频率计
第三篇:
单片机频率计程序
第四篇:
《单片机原理与应用》实验报告
51单片机C语言实验及实践教程_31.6位数显频率计数器
发布:
2009-4-0418:
07 | 作者:
孙青安 | 查看:
80次
1. 实验任务电子园51单片机学习网6fuM!
~Q?
{f2WY
利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。
要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。
电子园51单片机学习网!
p4{"L7o#?
:
trm/v)E@v
2. 电路原理图电子园51单片机学习网/NC)BA[
电子园51单片机学习网G2Y;O!
WF7C%Ua)cj
图4.31.1电子园51单片机学习网UF1vN]
电子园51单片机学习网tj"y*mnm
3. 系统板上硬件连线电子园51单片机学习网nV3@DU#q]
(1). 把“单片机系统”区域中的P0.0-P0.7与“动态数码显示”区域中的ABCDEFGH端口用8芯排线连接。
电子园51单片机学习网Y"oW0~"T)m#N
(2). 把“单片机系统”区域中的P2.0-P2.7与“动态数码显示”区域中的S1S2S3S4S5S6S7S8端口用8芯排线连接。
s7G0loPs"X41921
(3). 把“单片机系统”区域中的P3.4(T0)端子用导线连接到“频率产生器”区域中的WAVE端子上。
电子园51单片机学习网"av"qE(^N5I,E[s
4. 程序设计内容
*\$lg4^8Hy41921
(1). 定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:
T0的最大计数频率为250KHz。
对于频率的概念就是在一秒只数脉冲的个数,即为频率值。
所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。
送到数码管显示出来。
(2). T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。
电子园51单片机学习网0E9r&K|R,NN
#include
unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
unsignedchardispbuf[8]={0,0,0,0,0,0,10,10};
unsignedchartemp[8];电子园51单片机学习网Ui3A$@He+W
unsignedchardispcount;电子园51单片机学习网I
K"Sh2|a
unsignedcharT0count;
unsignedchartimecount;
bitflag;
unsignedlongx;电子园51单片机学习网Qk;sty)e9F.E@
voidmain(void)
{电子园51单片机学习网)u#h+N8O[%i^.I
unsignedchari;电子园51单片机学习网s:
\3D8e?
r3H,k)m
TMOD=0x15;电子园51单片机学习网c/v2Su0p$fYe
TH0=0;
TL0=0;
TH1=(65536-4000)/256;电子园51单片机学习网"^5da$KS
Ei-|#@
TL1=(65536-4000)%256;
TR1=1;
TR0=1;
ET0=1;电子园51单片机学习网v%k(k8o1v9i0a0as#|
ET1=1;电子园51单片机学习网BNl:
Sbn
EA=1;电子园51单片机学习网;`D"H8tF'}
while
(1)电子园51单片机学习网-\}n5N(v0Y
{
if(flag==1)电子园51单片机学习网ET4VnH~!
\1P
{电子园51单片机学习网s3K9_1JttN8k
flag=0;
x=T0count*65536+TH0*256+TL0;电子园51单片机学习网5I+r)|Gw[v
for(i=0;i<8;i++)
{
temp[i]=0;电子园51单片机学习网y+z*}1|6jS,v
}
i=0;
while(x/10)
{电子园51单片机学习网V'dk&l4|(V
temp[i]=x%10;电子园51单片机学习网|-YJgR9K|E
x=x/10;
i++;电子园51单片机学习网
^N:
Wz1R)x
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];
}
timecount=0;电子园51单片机学习网?
jG%s]b
T0count=0;
TH0=0;
TL0=0;电子园51单片机学习网+A|+hmam
TR0=1;
}电子园51单片机学习网fEXPvye0p5E"Z
}
}
voidt0(void)interrupt1using0电子园51单片机学习网C3cZZ8~-kc_
{
T0count++;
}
voidt1(void)interrupt3using0
{
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
timecount++;
if(timecount==250)电子园51单片机学习网8UV;L&xKt
{电子园51单片机学习网Eag/OxB(wA
TR0=0;电子园51单片机学习网nN;w_R
timecount=0;
flag=1;
}电子园51单片机学习网;kZ9f0}&Z1[.WC
P0=dispcode[dispbuf[dispcount]];
P2=dispbit[dispcount];电子园51单片机学习网OM+G[#Z0c0o
dispcount++;
if(dispcount==8)电子园51单片机学习网J5Q3sovt
{
dispcount=0;
}电子园51单片机学习网l}[#?
:
O["hU3Y
}
方波测频-频率计
2009-02-1811:
15
完成功能:
用查询的方法测一个方波的频率,并送数码管显示(P3.3输入1HZ方波,T1(P3.5)输入fx)
测周期测频
说明:
这个题在做的时候,会出现一些问题,就是说当方波频率比较低的时候,会产生溢出,这样的数码管驱动就可能不对!
按照老师的方法,我这里加进了一个原本程序没有的中断程序,其中我用红色标注,这样程序就能记低频,希望大家能自己验证一下。
程序如下:
#include"at89x52.h"//头文件
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetv[]={0xfe,0xfd,0xfb,0xf7};
ucharcodea[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,0x7f,
0x6f,0x77,0x7c};
uchardataled[4];
unsignedlongintdataf;//定义长整形全局变量f
ints=0;
voiddelay(void)//延时函数
{
uinti;
for(i=0;i<100;i++);
}
ledxianshi()//显示函数,也就是数码管驱动
{
uchark,i;
led[0]=f/10000;//取万位数(可能不够,可加)
led[1]=f%10000/1000;//取千位数
led[2]=f%1000/100;//取百位数
led[3]=f%100/10;//取十位数
led[4]=f%10;//取个位数
for(k=0;k<4;k++)
{i=led[k];
P0=a[i];
if(k==1){P0|=0x80;}//固定在第2个数码管输出一个小数点
P2=tv[k];
delay();
}
}
voidkT1(void)interrupt3
{s++;
TF1=0;//溢出清零
TH1=0;//寄存器清零
TL1=0;//寄存器清零
}
voidmain()
{EA=1;//CPU开放中断
ET1=1;//允许T1中断
TMOD=0x10;//使T1工作在定时方式,用方式1
TH1=0;//寄存器清零
TL1=0;//寄存器清零
while
(1)
{while(P3_5==0);//等待一个低电平
while(P3_5==1);//等待一个高电平
TR1=1;//允许T1开始定时
while(P3_5==0);//等待一个低电平
while(P3_5==1);//等待一个高电平
TR1=0;//关定时定时器T1
f=(TH1<<8)+TL1+s*65536;//把T1定时送入变量f\
S=0;
f=100000000/f;//f=1000000L/f;//周期的倒数是频率
while
(1)//死循环
{ledxianshi();}
}
}
单片机频率计程序
2009-03-0313:
21
#include
//********数码管位代码表(P0口)**********//
unsignedcharcodedispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
//********数码管段代码表(P2口,共阴且高位接a,低位接h笔段)**********//
unsignedcharcodedispcode[]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,
0xFE,0xF6,0xEE,0x3E,0x9C,0x7A,0x9E,0x8E,0x00};
//********8位数据缓冲器**********//
unsignedchardispbuf[8];
unsignedchartemp[8];
unsignedchardispcount;