兩個版本的數字頻率計帶仿真:這里有兩個版本的數字頻率計
這個是用中斷寫的,另一個用計數器計數的,中斷的是我自己寫的,不過好像有點問題,仿真的時候結果不穩定,不知道真的做成硬件是不是好點,后一個挺好,分享給大家了,有問題一起討論共同學習
#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;
}
}