导航:首页 > 操作系统 > 51单片机频率计程序

51单片机频率计程序

发布时间:2023-09-04 02:26:16

① 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;//重新启动
}
}

② 基于51单片机的数字频率计(0—10MHZ)

再加两个数码管,用T1引脚检测频率,打开T1中断,每中断一次加1计数,

满1秒中后停止T1计数,读出T1计数器的TH1 TL1,

频率= 65536x中断次数+TH1 HL1。

前提是选择高速单片机,即只要T1引脚能够响应10M的频率就没有问题

因为要计数65536次才T1才会中断一次。

③ 单片机频率计

1.实验任务

利用51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。

2.电路原理图

见插图

3.程序设计内容

(1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数的数值,然后进行数据处理。送到数码管显示出来。

(2).T1工作在定时状态下,最大定时时间为65ms,达不到1秒的定时,所以采用定时50ms,共定时20次,即可完成1秒的定时功能。

4.C语言源程序

/******************************************************************************

*定时器+计数器测频

*

*file:frequency.c

*name:zhzhchang

*time:2010.3.17

*V1.0

*blog:http://blog.csdn.net/zhzht19861011

*Nots:本程序定义6个数码管,经过实测,在200HZ~50KHZ时结果较准确,误差小于0.4%,

*50KHZ以上频率未进行测量.据资料表明,可以测量到120KHZ,本程序未证明.

*********************************************************************************/

#include<reg52.h>

bitint_flag;//定时器01S到标志位

unsignedcharvolatileint_count;//定时器0中断次数

unsignedcharvolatileT1count;//定时器1中断次数

unsignedcharcodedofly[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示段码值0123456789

unsignedlongsum;//1S内脉冲总个数

unsignedcharled[6];//LED显示缓存

///////////////软件延时/////////////

voiddelay(unsignedintcnt)

{

while(--cnt);

}

///定时器0初始化

voidinit_t0(void)

{

TMOD=(TMOD&0xF0)||0x01;//定时器0工作于方式1

TH0=(65536-50000)/256;//定时50ms

TL0=(65535-50000)%256;

}

//定时器1初始化

voidinit_t1(void)

{

TMOD=(TMOD&0x0F)|0x50;//timer1forcount

TH1=0x00;

TL1=0x00;

}

//显示

voiddisp(void)

{

unsignedchari;

for(i=0;i<6;i++)

{

P0=dofly[(led[i])];//取显示数据

P2=5-i;//取段码

delay(100);//扫描间隙延时,根据单片机调整,延时1ms即可

}

}

///////////////////////////////////////////////////////

voidmain(void)

{

EA=1;//开总中断

init_t0();//初始化定时器

init_t1();

TR0=1;//定时器开始工作

TR1=1;

ET0=1;//开T0中断

while(1)

{

if(int_flag==1)

{

int_flag=0;

sum=TL1+TH1*256+T1count*65536;//计算1秒内的脉冲个数

//以下将数据格式化,转成LED可显示的BCD码

led[0]=sum%10;//最低位

sum=sum/10;

led[1]=sum%10;//第二位

sum=sum/10;

led[2]=sum%10;

sum=sum/10;

led[3]=sum%10;

sum=sum/10;

led[4]=sum%10;

led[5]=sum/10;

int_count=0x00;

T1count=0;

TH1=0x00;

TL1=0x00;

TR1=1;

}

disp();

}

}

//定时器0中断服务程序

voidint_t0(void)interrupt1

{

TH0=(65535-50000)/256;

TL0=(65535-50000)%256;

int_count++;

if(int_count==20)

{

TR1=0;

int_flag=1;

int_count=0x00;

}

}

//定时器1中断服务程序

voidint_t1(void)interrupt3

{

T1count++;

}

别说你的设计要求用汇编啊!!!

不过既然是课程设计,我这个只是给你参考,你自己一定要弄懂,变成自己的。我实测过,程序没问题,但用到你的硬件上可能需要改一下,因为你的硬件数码管不一定和我的硬件接法一样,但整体思路我都给你了。

④ 51单片机制作频率计,测周法如何测量(用T0和T1两个就可以了吗),求大虾帮忙啊,最好详细点

#include<REG51.H>

#defineU8unsignedchar

U8codetab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};

U8codescn[]={0x7f,0xbf,0xdf,0xef};//先点亮左边一个数码管

U8buf[4]={0,0,0,0};//显示缓冲区

U8cnt=0;//扫描计数

unsignedintfreq=0;

unsignedintF;

voidmain(void)

{EA=1;//允许中断

TMOD=0x01;//设定时器0为模式1(16位)

ET0=1;//定时器0中断允许

TH0=(65536-5000)/256;//晶振12MHz,中断周期5mS

TL0=(65536-5000)%256;;

TR0=1;//开始计数

PX0=1;//外部中断优先级高

EX0=1;//允许外部中断

IT0=1;//外部中断下降沿触发

while(1);

}

voidexint0(void)interrupt0//外部中断0服务程序

{freq++;

}

voidtimeint(void)interrupt1//定时器0中断服务程序

{chari;

TH0=(65536-5000)/256;//晶振12MHz,中断周期5mS

TL0=(65536-5000)%256;;

i=cnt&0x03;//求应点亮的LED号(从左到右依次为0,1,2,3)

P0=tab[buf[i]];//笔划代码送P0口

P2=scn[i];//控制扫描码送P2口

cnt++;

if(cnt==200)

{cnt=0;//到1秒钟,显示的数字加一

F=freq;freq=0;

buf[0]=F/1000;

buf[1]=(F/100)%10;

buf[2]=(F/10)%10;

buf[3]=F%10;

}

}

⑤ 51单片机频率计的中断程序怎么设计

定时器11MS中断一次,5次是5ms,乘200就是1秒种,其初值由晶振频率决定,有计算软件
当然,也可以中断10次或20次,频率判断更准确,但响应速度慢了
1600或800方波接入定时器/计数器0的外部输入引脚上,好像是P3.4
程序如下:
void
init()//初始化设置
{
TMOD=0x15;//定时器0作为计数器,定时器1作为定时器用
TH0=.0;//计数器清0
TL0=0;
EA=1;//开总中断
ET1=1;//允许定时器1中断
TH1=......;
TL1=.......;
TR0=1;//启动计数器
TR1=1;//启动定时器
aa=0;
}
void
main()//主程序很简单
{
init();//初始化
while(1)//循环程序
{
dd=bb*256+cc;//
5ms的计数值
ee=200*dd;//换算为1秒钟的计数值
if((ee>750)&&(ee<850))
{
P3.5=0;
}
if((ee>1550)&&(ee<1650))
{
P3.5=1;
}
}
}
void
timer1()interrupt
3//注意:定时器1的中断序号为3
{
aa++;
TH1=....;.
TL1=....;.
if(aa==5)//中断5次,共5ms
{
TR0=0;//暂停计数
aa=0;
bb=TH0;//读出计数器数据
cc=TL0;
TL0=0;//计数器清0
TH0=0;
TR0=1;//重新启动计数器
}
}

⑥ 51单片机制作简易数字频率计程序

这里有一个四位数码管的频率计,供参考

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
ucharan[10]={0xc0,0Xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //所需的段的位码
//ucharwei[4]={0XEf,0XDf,0XBf,0X7f};//位的控制端 (开发板)
ucharwei[4]={0X80,0X40,0X20,0X10};//位的控制端 (仿真)
uintz,x,c,v,date; //定义数据类型
uintdispcount=0;
uintlck=0;
uintdisp=0;
/******************************************************************

延时函数

******************************************************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{;
}
}
}

/**********************************************************************
数码管动态扫描
*********************************************************************/
voidxianshi()
{
/*****************数据转换*****************************/
z=date/1000; //求千位
x=date%1000/100; //求百位
c=date%100/10; //求十位
v=date%10; //求个位

P2=wei[0];
P0=an[z];
delay(50);
P2=wei[1];
P0=an[x];
delay(50);
P2=wei[2];
P0=an[c];
delay(50);
P2=wei[3];
P0=an[v];
delay(50);


}

/*************************************************************************
定时器初值1ms
**************************************************************************/
voidinitTimer(void)
{
TMOD=0x0;
TH0=0xe3;
TL0=0xc;
}

/*************************************************************************
定时器函数
**************************************************************************/
voidtimer0(void)interrupt1
{
TH0=0xe3;
TL0=0xc;
lck++;
if(lck==1000)
{
disp=dispcount;
lck=0;
dispcount=0;
}

}

/*************************************************************************
中断函数
**************************************************************************/
voidint0(void)interrupt0
{

dispcount++;//每一次中断,计数加一

}

/*************************************************************************
主函数
**************************************************************************/
voidmain(void)
{

IT0=1;//INT0下降沿中断
EX0=1;//允许INT1中断
initTimer();//装入初值
TR0=1;
ET0=1;
EA=1;
while(1)

{
date=disp;
xianshi();
}
}

阅读全文

与51单片机频率计程序相关的资料

热点内容
android开源集合 浏览:860
华为云服务器登录密码和账号 浏览:154
中世纪java程序员 浏览:786
什么开发引擎使用python 浏览:176
sh脚本运行命令 浏览:316
广联达加密锁怎么看到期 浏览:172
cad轨迹命令 浏览:979
同事刷到女程序员自媒体视频 浏览:571
校验算法的缺点是什么 浏览:717
PHP商品分类功能实现 浏览:330
php取字符串中间 浏览:432
程序员经常用工具 浏览:837
降服主力指标源码主图 浏览:502
python实用库 浏览:693
电脑默认7个文件夹 浏览:13
新唐单片机安装c51后编译错误 浏览:532
红包源码引流神器 浏览:235
学生初中毕业撕书解压 浏览:749
命令方块刷铜点教学 浏览:692
php邮件订阅系统 浏览:999