?? main.c
字號:
/*一個機器周期采樣值為1,下一個機器周期采樣為0,則計數器加1*/
/*外部事件的最高計數頻率為晶振的1/24,故最高計數為0.9216M;*/
/*目前狀態下只是顯示0到9999HZ的頻率*/
/*原創作者:陳永剛*/
/*優化整理:tiansir*/
/*測頻率原理*/
/*定時器T0作為定時裝置,編程設定定時1s,定時器T1對外部信號計數,每1S中對計數結果處理*/
#include<reg51.h>
#include<absacc.h>
#define SEG_Q XBYTE[0xfcec]
#define SEG_B XBYTE[0xfced]
#define SEG_S XBYTE[0xfcee]
#define SEG_G XBYTE[0xfcef]
//通用數碼管顯示函數,傳入數據0~9999
void renew_disp(unsigned int number)
{
unsigned char code tab1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char temp,flag=0;
if(number < 10000)
{
//千位數碼管
temp = number/1000%10;
if (temp)
{
SEG_Q = tab1[temp];
flag = 1;
}
else
{
SEG_Q = 0xff;//數碼管熄滅
flag = 0;
}
//百位數碼管
temp = number/100%10;
if(flag | temp)
{
SEG_B = tab1[temp];
flag = 1;
}
else
{
SEG_B = 0xff;//數碼管熄滅
flag = 0;
}
//十位數碼管
temp = number/10%10;
if(flag | temp) SEG_S = tab1[temp];
else SEG_S = 0xff;//數碼管熄滅
//個位數碼管
temp = number%10;
SEG_G = tab1[temp];
}
else
{
SEG_Q = 0xbf;
SEG_B = 0xbf;
SEG_S = 0xbf;
SEG_G = 0xbf;
}
}
//T0定時中斷,晶振22.1184M
void T0_int(void) interrupt 1
{
static char counter=0;
TH0=(65536-46063)/256;
TL0=(65536-46063)%256;
if(counter++==39)
{
counter=0;
TR1=0;
renew_disp(256*TH1+TL1);
TH1=TL1=0;
TR1=1;
}
}
void main()
{
TMOD = 0x51;/*01010001 T1計數,T0定時*/
TH1 = 0;
TL1 = 0;
//晶振22.1184M
TH0 = (65536-46063)/256;//定時25MS
TL0 = (65536-46063)%256;
TR0 = 1; //開定時器0
TR1 = 1; //啟動計時器1
EA = 1; //開總中斷
ET0 = 1; //開定時器0中斷
while(1); //原地踏步,等待中斷
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -