我是靠谱客的博主 俊秀书包,最近开发中收集的这篇文章主要介绍基于单片机(STC89C52)的数字频率计,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基于单片机(STC89C52)的数字频率计

    • 设计要求
    • 原理图
    • PCB
    • Proteus仿真
    • 程序源码

转载请联系作者,严禁侵权!

设计要求

利用51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。要求在制作电路前,通过Proteus.v7.10、Keil.uVision5、驱动&下载器等软件工具对电路模拟仿真测试。

原理图

电路原理图

PCB

PCB正面
PCB底面

Proteus仿真

250KHZ时钟设置
Proteus仿真结果

程序源码

//Written by RYQ
#include <AT89X52.H>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};//数码管显示字符转换表
unsigned char dispbuf[8]={0,0,0,0,0,0,10,10};
unsigned char temp[8];
unsigned char dispcount;
unsigned char T0count;
unsigned char timecount;
bit flag;
unsigned long x;
void main(void)
{
	unsigned char i;
	TMOD=0x15;
	TH0=0;
	TL0=0;
	TH1=(65536-8690)/256;
	TL1=(65536-8690)%256;
	TR1=1;
	TR0=1;
	ET0=1;
	ET1=1;
	EA=1;
	while(1)
	{
		if(flag==1)
		{
			flag=0;
			x=T0count*65536+TH0*256+TL0;
			for(i=0;i<8;i++)
			{
				temp[i]=0;
			}
			i=0;
			while(x/10)
			{
				temp[i]=x%10;
				x=x/10;
				i++;
			}
			temp[i]=x;
			for(i=0;i<6;i++)
			{
				dispbuf[i]=temp[i];
			}
			timecount=0;
			T0count=0;
			TH0=0;
			TL0=0;
			TR0=1;
		}
	}
}
void t0(void) interrupt 1 using 0			   // 中断号1,T0---定时器/计数器0中断	using 0 调用同一组寄存器,共有四组,范围为0~3
{
	T0count++;
}
void t1(void) interrupt 3 using 0			   // 中断号3,T1----定时器/计数器1中断	using 0 调用同一组寄存器,共有四组,范围为0~3
{
	TH1=(65536-8690)/256;				   //65536-8690 是计数器的初值,也就是定时器走8690次(1次为1us),到达65536会产生一个中断,定时器的计时时间为8690 us
	TL1=(65536-8690)%256;
	timecount++;
	if(timecount==115)				  //定时11.5次
	{
		TR0=0;
		timecount=0;
		flag=1;
	}
	switch(dispcount)
	{
		case 0:P2 = 0xfe; dispcount++; P0=dispcode[dispbuf[0]];break;
		case 1:P2 = 0xfd; dispcount++; P0=dispcode[dispbuf[1]];break;
		case 2:P2 = 0xfb; dispcount++; P0=dispcode[dispbuf[2]];break;
		case 3:P2 = 0xf7; dispcount++; P0=dispcode[dispbuf[3]];break;
		case 4:P2 = 0xef; dispcount++; P0=dispcode[dispbuf[4]];break;
		case 5:P2 = 0xdf; dispcount=0; P0=dispcode[dispbuf[5]];break;
	}
	if(dispcount==8)
	{
		dispcount=0;
	}
}

最后

以上就是俊秀书包为你收集整理的基于单片机(STC89C52)的数字频率计的全部内容,希望文章能够帮你解决基于单片机(STC89C52)的数字频率计所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部