概述
参数:测量范围1HZ-50KHZ 测量波形:半波,正弦波,方波,三角波,锯齿波
数码管显示频率
一、频率计原理
我们采用的方案是,用信号触发外部中断,外部中断触发定时器定时一秒,一秒时间到了之后计算一秒内触发了多少次外部中断,外部中断采用的是下降沿触发。
二、使用步骤
1.引入库
如果只需要玩玩那么直接复制就可以了,开发版是用的普中A2开发版,如果无法使用发私信联系。
只需要看定时器中断和外部中断。
#include <STC89C5xRC.H>
#define uint unsigned int
#define uchar unsigned char
sbit DIN = P1^0;//信号输入
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uint HATA=0,lpoi=0;//计数位
uchar ii=0;
//**************************************************************************************************************************************
//***************数码管
uchar code sz1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//***************三八译码器
uchar code sp2[]={0xff,0x18,0x14,0x10,0xc,0x8,0x4,0x00};
//**************************************************************************************************************************************
uchar sp3[5];
/****************************************************************************
*函数名;dalay
*输 入:时间
*输 出:无
*功 能:延时
****************************************************************************/
void delay(time)
{
uchar ti=0;
while(time--)
{
for(ti=10;ti>0;ti--);
}
}
/****************************************************************************
*函数名;Timer0Init
*输 入:无
*输 出:无
*功 能:定时器0初始化
****************************************************************************/
void Timer0Init(void) //0微秒@11.0592MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
EA=1;
EX0=1;
IT0 = 1;//下降沿
ET0=1;
}
/****************************************************************************
*函数名;show
*输 入:iny
*输 出:无
*功 能:数码管显示
****************************************************************************/
void show()
{
uchar i,b=0;
for(i=0;i<6;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=1;LSB=0;LSC=1; break;//显示第2位
case(1):
LSA=0;LSB=0;LSC=1; break;//显示第3位
case(2):
LSA=1;LSB=1;LSC=0; break;//显示第4位
case(3):
LSA=0;LSB=1;LSC=0; break;//显示第5位
case(4):
LSA=1;LSB=0;LSC=0; break;//显示第6位
case(5):
LSA=0;LSB=0;LSC=0; break;//显示第7位
}
P0 = sz1[sp3[i]];
delay(10);
P0 = 0x00;
}
}
/****************************************************************************
*函数名;Calculation_data()
*输 入:无
*输 出:无
*功 能:把计数值按位放到数组方便调用
****************************************************************************/
void Calculation_data()//计算数据
{
HATA=lpoi;
lpoi=0;
sp3[0]=(HATA/100000);
sp3[1]=(HATA%100000/10000);
sp3[2]=(HATA%100000%10000/1000);
sp3[3]=(HATA%100000%10000%1000/100);
sp3[4]=(HATA%100000%10000%1000%100/10);
sp3[5]=(HATA%100000%10000%1000%100%10);
}
void main()
{
Timer0Init();
while(1)
{
show();//数码管显示
}
}
/****************************************************************************
*函数名;外部中断
*输 入:无
*输 出:无
*功 能:计触发次数
****************************************************************************/
void EX00() interrupt 0
{
lpoi++;//记触发次数
if(TR0==0)//***************此判断用来减小误差
{
lpoi-=1;
} //***************
TR0=1;
}
/****************************************************************************
*函数名;定时器中断
*输 入:无
*输 出:无
*功 能:定时一秒后计算数据
***********************************************************************/
void ET00() interrupt 1
{
TL0 = 0x00; //设置定时初始值
TH0 = 0x4C; //设置定时初始值
ii++;
if(ii>=20) //判断达到一秒后
{
ii=0; //时间计数清零
TR0=0; //关闭定时器
Calculation_data();//计算数据
}
}
2.知识点讲解
这一段代码是外部中断里的,加这个判断是为了测低频的时候减小误差用的
原理:判断定时器有没有触发,如果没有触发表示此脉冲是第一个脉冲,这一个脉冲我们不能要因为定时器还没有打开,所以此脉冲不能要
if(TR0==0)//***************此判断用来减小误差
{
lpoi-=1;
} //***************
# 总结
主要理解以上两个中断的程序,如果您有不同的方式请留言我们共同学习
最后
以上就是温暖滑板为你收集整理的简易单片机制作频率计的全部内容,希望文章能够帮你解决简易单片机制作频率计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复