概述
基于单片机(STC89C52)的数字频率计
- 设计要求
- 原理图
- PCB
- Proteus仿真
- 程序源码
转载请联系作者,严禁侵权!
设计要求
利用51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。要求在制作电路前,通过Proteus.v7.10、Keil.uVision5、驱动&下载器等软件工具对电路模拟仿真测试。
原理图
PCB
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)的数字频率计所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复