|
仿真數(shù)字頻率計時1khz以下正常顯示,超過1khz數(shù)碼管顯示就出現(xiàn)閃爍。這是怎么回事?
#include <reg51.H> // 包含頭文件
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//定義數(shù)碼管位選碼
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //定義數(shù)碼管段碼
unsigned char dispbuf[8]={0,0,0,0,0,0,0,0};//顯示數(shù)碼組,因為只用了六個數(shù)碼管,所以將最后兩位賦值為10,對應(yīng)的段碼為0x00,表示不亮。
unsigned char temp[8];//暫存數(shù)組
unsigned char dispcount;//掃描位的記錄
unsigned char T0count;//計數(shù)次數(shù)
unsigned char timecount;//定時器5ms中斷的次數(shù)
bit flag; //定義標(biāo)志位
unsigned long x; //定義變量用來存放頻率值
void main(void) //主函數(shù)
{
unsigned char i;//定義變量
TMOD=0x15; //設(shè)置定時工作模式 T1為定時1模式,T0為計數(shù)器1模式
TH0=0; // 計數(shù)器高8位賦值為0
TL0=0;// 計數(shù)器低8位賦值為0 所以最大可以輸入65535
TH1=(65536-5000)/256;// 定時器1高8位賦初值
TL1=(65536-5000)%256;// 定時器1低8位賦初值
TR1=1;//啟動定時器1
TR0=1;// 啟動計數(shù)器0
ET0=1;//開啟定時器0中斷
ET1=1;// 開啟定時器1中斷
EA=1;//開啟總中斷
while(1)// 大循環(huán)
{
if(flag==1)// 如果定時時間到1s
{
flag=0;// 標(biāo)志位清零
x=T0count*65536+TH0*256+TL0;//獲得整數(shù)的頻率值,T0count計數(shù)器在1s內(nèi)溢出的次數(shù),每溢出一次就
//就計數(shù)了T0count*65536次,再加上當(dāng)前計數(shù)寄存器的值即為實際計數(shù)總數(shù)
for(i=0;i<8;i++) //
{
temp[i]=0; // 暫存緩沖區(qū)清零
}
i=0; //
while(x/10) //將頻率值的每一位分離出來,存進temp數(shù)組,例如63239分離為6、3、2、3、9
{
temp[i]=x%10;//
x=x/10;//
i++;//
}
temp[i]=x;//
for(i=0;i<6;i++)//
{
dispbuf[i]=temp[i];//將暫存數(shù)組的數(shù)據(jù)賦給顯示數(shù)組
}
timecount=0;//計時清零
T0count=0;//計數(shù)清零
TH0=0;// 計數(shù)器初值清零
TL0=0;// 計數(shù)器初值清零
TR0=1;// 重啟計數(shù)器
}
}
}
void t0(void) interrupt 1 using 0 // 計數(shù)器中斷
{
T0count++;//
}
void t1(void) interrupt 3 using 0 // 定時器中斷4ms中斷一次
{
TH1=(65536-5000)/256;// 定時器高8位賦初值
TL1=(65536-5000)%256; // 定時器低8位賦初值
timecount++;// 時間變量++
if(timecount==200)// 判斷中斷250次為1s
{
TR0=0;// 關(guān)閉計數(shù)器0
timecount=0;//清零重新計數(shù)中斷次數(shù)
flag=1;// 標(biāo)志位置1通知主程序1s已到
}
//因為放在該中斷程序中,故4秒掃描一次數(shù)碼管
P2=0xff;//先關(guān)閉所有數(shù)碼管 //
// P2=dispbit[dispcount];//送入位碼
P0=dispcode[dispbuf[dispcount]];// 先確定相應(yīng)數(shù)碼管的段碼,送入段碼
P2=dispbit[dispcount];//送入位碼
dispcount++;// 下一次應(yīng)該掃描下一位數(shù)碼管所以要加一
if(dispcount==8)//因為只有8只數(shù)碼管,判斷是否送入8次。
{
dispcount=0;// 使變量清零
}
}
|
-
-
|