|
#include "STC12C5A60S2.h"
//#include <reg52.h>
#define Segment P0
#define sl P2
sbit clear=P1^3;
sbit fp2=P1^2; //定義數(shù)據(jù)端口地址,0時(shí)分頻處理,1時(shí)不分頻
unsigned char count; //定時(shí) 1s 計(jì)數(shù)
unsigned char d[4]; //對(duì)應(yīng)數(shù)碼管的各位
unsigned char dangwei; //檔位
unsigned int timeN; //不同檔位計(jì)時(shí)值
unsigned int fCount; //脈沖下降沿次數(shù)
unsigned int regCount; //脈沖次數(shù)暫存
unsigned int pCount; //頻率顯示
unsigned char Num[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//七段數(shù)碼管代碼共陽極
void Delay(unsigned int DelayTime)
{
while(DelayTime--);
}
void dispbuf()
{
{
if(dangwei==0) //檔位
{
d[3]=0;
d[2]=(pCount/100)%10;
d[1]=(pCount/10)%10;
d[0]=pCount%10;
sl=0x01;Delay(1);Segment=Num[d[3]];Delay(200);
sl=0x02;Delay(1);Segment=Num[d[2]];Delay(200);
sl=0x04;Delay(1);Segment=Num[d[1]];Delay(200);
sl=0x08;Delay(1);Segment=Num[d[0]];Delay(200);
}
else if(dangwei==1)
{
d[3]=pCount/1000;
d[2]=(pCount/100)%10;
d[1]=(pCount/10)%10;
d[0]=pCount%1;
sl=0x01;Delay(1);Segment=Num[d[3]];Delay(200);
sl=0x02;Delay(1);Segment=Num[d[2]];Delay(200);
sl=0x04;Delay(1);Segment=Num[d[1]]&0x7f;Delay(200); //帶小數(shù)點(diǎn)
sl=0x08;Delay(1);Segment=Num[d[0]];Delay(200);
}
else
{
d[3]=0;
d[2]=0;
d[1]=0;
d[0]=0;
}
}
}
void intial()
{
clear=1; //分頻器初始化
fp2=1;
timeN=20; //檔位初始化為 Hz 檔
dangwei=0;
TMOD=0x61; //定時(shí)器0,工作方式1,計(jì)數(shù)器1,工作方式1
TH0= (65536-50000)/256;
TL0= (65536-50000)%256;
//計(jì)數(shù)器1計(jì)數(shù)初值
TH1=0xff; // 256-1;
TL1=0xff; // 256-1;
TR0=1; //開定時(shí)器0中斷
ET0=1; //定時(shí)器0允許
TR1=1; //開計(jì)數(shù)器1中斷
ET1=1; //允許計(jì)數(shù)器1中斷
EA=1; //總中斷允許
}
void main()
{
intial();
while(1)
{
dispbuf();
}
}
void timer0() interrupt 1
{
count++;
if(count==timeN)
{
ET1=0; //計(jì)時(shí)1s,暫停外部計(jì)數(shù)1
TR1=0;
count=0;
regCount=fCount; //更新顯示
fCount=0; //頻率計(jì)數(shù)清零
clear=0; //硬件分頻器清零
clear=1;
}
if(dangwei==0) //檔位切換
{
pCount=regCount;
if(regCount>999)
{
pCount=0; //顯示清零
dangwei=1;
timeN=1; //定時(shí) 50ms
fp2=0; //硬件分頻處理
TH1=0xfb; //50分頻 256-5
TL1=0xfb; //256-5
pCount=regCount*10; //換算成相應(yīng)的顯示:f=regCount*100
}
}
else if(dangwei==1)
{
if(regCount<1)
{
dangwei=0;
timeN=20; //定時(shí) 1s
fp2=1; //不分頻
TH1=0xff; //256-1
TL1=0xff; //256-1
}
else if(regCount<1000) //KHz 檔
{
dangwei=1;
timeN=1; //定時(shí) 50ms
fp2=0; //硬件分頻處理
TH1=0xfb; //50分頻 256-5
TL1=0xfb; //256-5
pCount=regCount*10; //換算成相應(yīng)的顯示:f=regCount*100
}
else
{
dangwei=3; //超出范圍
}
}
ET1=1; //恢復(fù)外部計(jì)數(shù) 1
TR1=1;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
}
void enterFre() interrupt 3 //外部頻率輸入
{
fCount++;
}
|
評(píng)分
-
查看全部評(píng)分
|