#defineSegment P2
#define sl P0
sbit addr0=P1^0; // 定義數(shù)據(jù)端口地址,000時16分頻,100 分頻
sbit addr1=P1^1;
sbit addr2=P1^2;
sbit clear=P1^3; //計數(shù)器清零
sbit ledM=P1^4; //檔位led顯示
sbit ledK=P1^5;
sbit ledB=P1^6;
unsigned char cnt; //定時1s計數(shù)
unsigned char d[4]; //對應(yīng)數(shù)碼管的各位
unsigned char level; //檔位
unsigned int tN; //不同檔位計時值
unsigned int fCnt; //脈沖下降沿次數(shù)
unsigned int regCnt; //脈沖次數(shù)暫存
unsigned int pCnt; //頻率顯示
unsigned char Num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void Delay(unsignedintDelayTime)
{
while(DelayTime--);
}
void disp()
{
if(level==0) //B位檔
{
d[3]=0;
d[2]=pCnt/100;
d[1]=(pCnt%100)/10;
d[0]=pCnt%10;
sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);
sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);
sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
}
else if(level==1)
{
d[3]=pCnt/1000;
d[2]=(pCnt%1000)/100;
d[1]=(pCnt%100)/10;
d[0]=pCnt%10;
sl=0xfe;Delay(1);Segment=Num[d[3]];Delay(300);
sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
sl=0xfb;Delay(1);Segment=Num[d[1]]+0x80;Delay(300); //帶小數(shù)點
sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
}
else if(level==2)
{
d[3]=pCnt/1000;
d[2]=(pCnt%1000)/100;
d[1]=(pCnt%100)/10;
d[0]=pCnt%10;
sl=0xfe;Delay(1);Segment=Num[d[3]]+0x80;Delay(300); //帶小數(shù)點
sl=0xfd;Delay(1);Segment=Num[d[2]];Delay(300);
sl=0xfb;Delay(1);Segment=Num[d[1]];Delay(300);
sl=0xf7;Delay(1);Segment=Num[d[0]];Delay(300);
}
else
{
d[3]=0;
d[2]=0;
d[1]=0;
d[0]=0;
}
}
void intial()
{
clear=1; //分頻器初始化
addr0=0;
addr1=0;
addr2=1;
tN=20; //檔位初始化為Hz檔
level=0;
ledM=1; //顯示Hz檔
ledK=1;
ledB=0;
TMOD=0x61; //定時器0,工作方式1,計數(shù)器1,工作方式2(8位自動重裝)
TH0=(65536-50000)/256; //計數(shù)50ms
TL0=(65536-50000)%256;
TH1=256-1;//計數(shù)器1計數(shù)初值
TL1=256-1;
TR0=1; //開定時器0中斷
ET0=1; //定時器0允許
TR1=1; //開計數(shù)器1中斷
ET1=1; //允許計數(shù)器1中斷
EA=1; //總中斷允許
}
void main()
{
intial();
while(1)
{
disp();
}
}
void timer0() interrupt 1
{
cnt++;
if(cnt==tN)
{
ET1=0; //計時1s時,暫停外部計數(shù)1
TR1=0;
cnt=0;
regCnt=fCnt; //更新顯示
fCnt=0; //頻率計數(shù)清零
clear=0; //硬件分頻器清零
clear=1;
if(level==0) //檔位切換
{
pCnt=regCnt;
if(regCnt>999)
{
pCnt=0; //顯示清零
level=1;
tN=1; // 定時50ms
addr2=0;//進(jìn)行分頻處理
TH1=0xfb; //50分頻 256-5
TL1=0xfb;
}
}
else if(level==1)
{
if(regCnt<1)
{
level=0;
tN=20; //定時1s
addr2=1; //不分頻
th1="0xff;" // 256-1
tl1="0xff;" // 256-1
ledm="1;" //顯示HZ檔
ledk="1;
" ledb="0;
}
else" if(regCnt<1000)//KHz檔
{
level=1;
tN=1; //定時50ms
addr2=0; //硬件分頻處理
TH1=0xfb; //50分頻 256-5
TL1=0xfb; //256-5
pCnt=regCnt*10; //換算成相應(yīng)的顯示:f=regCnt*100
ledM=1; //顯示KHz檔
ledK=0;
ledB=1;
}
else
{
level=2;
tn="1;" //定時50ms
addr2=0; //分頻
TH1=0xf6; // 100分頻 256-10
TL1=0xf6; //256-10
pCnt=0; //換算成相應(yīng)的顯示:f=regCnt*100
ledM=0; //顯示MHz檔
ledK=1;
ledB=1;
}
}
else if(level==2)
{
if(regCnt<500) //KHz檔
{
level=1;
tN=1; //定時50ms
addr2=0; //分頻
th1="0xfb;" // 50分頻 256-5
TL1=0xfb; //256-5
pCnt=0; //換算成相應(yīng)的顯示
ledM=1; //顯示KHz檔
ledK=0;
ledB=1;
}
else if(regCnt<5000)
{
level=2;
tN=1; //定時50ms
addr2=0; //分頻
TH1=0xf6; //100分頻 256-10
TL1=0xf6; //256-10
pcnt="regCnt*2;" //換算成相應(yīng)的顯示:f=regCnt*100
ledM=0; //顯示MHz檔
ledK=1;
ledB=1;
}
else
{
level=3; //超出范圍
ledM=1; //全滅
ledK=1;
ledB=1;
}
}
ET1=1; //恢復(fù)外部計數(shù)1
TR1=1;
}
TH0=0x3c; //(65536-50000)/256;
TL0=0xb0; //(65536-50000)%256;
}
void enterFre() interrupt 3 //外部頻率輸入
{
fCnt++;
}
這個程序 0-999hz是對的 但是1000-9999hz 只能顯示千位的數(shù)字啊
附件里面有程序啊
[此貼子已經(jīng)被作者于2013-4-28 18:06:02編輯過]
作者: ahshmj 時間: 2013-4-29 09:24
沒看到你的附件,帖子里的東西無法看,而且程序不全,根本不可能編譯。
如果是求助,你就............
作者: 王者歸來 時間: 2013-6-18 13:57

作者: fanfan12121 時間: 2013-6-18 20:31
什么東東??
作者: cnc2020 時間: 2014-11-15 23:07
謝謝分享。。。
作者: 1678 時間: 2015-8-12 08:42
做好了沒啊 給個完整程序看一下嗎
作者: XIN_XIN 時間: 2017-4-19 15:03
鳳飛飛的高規(guī)格
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |