本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
这里有两个版本的数字频率计
这个是用中断写的,另一个用计数器计数的,中断的是我自己写的,不过好像有点问题,仿真的时候结果不稳定,不知道真的做成硬件是不是好点,后一个挺好,分享给大家了,有问题一起讨论共同学习
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define A 30
code unsigned char TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit P37=P3^7;
uint number;
uchar sig;
void delay(uchar m)
{
while(--m)
{;}
}
void display(uint number)
{
unsigned char B1,B2,B3,B4,B5;//定义数的各个位,万,千,百,十,个位
;
B1=number/10000;//万位
B2=number%10000/1000;//千位
B3=number%1000/100;//百位
B4=number%100/10;//十位
B5=number%10;//个位
while(1){
if(P37==1) break;
P2=0xFE;//显示个位
P0=TAB[B5];
delay(A);
P2=0xFD;//显示十位
P0=TAB[B4];
delay(A);
P2=0xFB;//显示百位
P0=TAB[B3];
delay(A);
P2=0xF7;//显示千位
P0=TAB[B2];
delay(A);
P2=0xEF;//显示万位
P0=TAB[B1];
delay(A);
}
}
void main(void)
{ P0=TAB[0];//刚开始显示00000
P2=0xC0;
TMOD=0X01;
EA=1;
EX0=1;
IT0=1;
PT0=1;
ET0=1;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
TR0=1;
sig=0;
while(1)
{ if(P37==1)
{number=0;
P2=0xc0;
P0=TAB[0];
}
while(sig==1)
{ sig=0;
number=number*20;
display(number);
number=0;
}
}
}
void timer0() interrupt 1
{
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
sig=1;
}
void freint() interrupt 0
{
number++;
}
计数器版本的
/******************************************************************
AT89S51的T0,T1计数器对输入的信号进行频率计数,测量结果用五位数码管
动态显示,要求对0~65KHZ的信号频率进行准确测量,误差不超过5HZ
*****************************************************************/
#include <reg51.h>
#define uint unsigned int
#define A 3
sbit P37=P3^7;
unsigned char num=0;
code unsigned char TAB[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
/*显示变量对应的数值*/
/***************定时器0中断服务函数************************/
void timer0()interrupt 1{
TH0=0x3C;
TL0=0xB0;//定时50ms
num++;//记到20就直接停止
}
/**************************延时函数************************************/
void delay(unsigned char t){
unsigned char i,j;
for(i=0;i<t;i++)
for(j=0;j<125;j++);
}
/*************************显示函数**************************************/
void Display(){
uint number;
unsigned char B1,B2,B3,B4,B5;//定义数的各个位,万,千,百,十,个位
number=TH1*256+TL1;
B1=number/10000;//万位
B2=number%10000/1000;//千位
B3=number%1000/100;//百位
B4=number%100/10;//十位
B5=number%10;//个位
while(1){
if(P37==1) break;
P2=0xFE;//显示个位
P0=TAB[B5];
delay(A);
P2=0xFD;//显示十位
P0=TAB[B4];
delay(A);
P2=0xFB;//显示百位
P0=TAB[B3];
delay(A);
P2=0xF7;//显示千位
P0=TAB[B2];
delay(A);
P2=0xEF;//显示万位
P0=TAB[B1];
delay(A);
}
}
void main(){
P0=TAB[0];//刚开始显示00000
P2=0xC0;
TMOD=0x51;//T0 记时 T1计数
TH0=0x3c;//定时50ms
TL0=0xB0;
TH1=0x00;//计数
TL1=0x00;
TR0=1; //开T0
TR1=1;//开T1
ET0=1;//开中断
EA=1;//打开总中断
while(1){
if(num>=20){//记满一秒
num=0;
TR1=0;
TR0=0;
Display();
}
if(P37==1) break;
}
}
数字频率计.rar
(89.77 KB, 下载次数: 2)
|