?? main.c
字號(hào):
/*一個(gè)機(jī)器周期采樣值為1,下一個(gè)機(jī)器周期采樣為0,則計(jì)數(shù)器加1*/
/*外部事件的最高計(jì)數(shù)頻率為晶振的1/24,故最高計(jì)數(shù)為0.9216M;*/
/*目前狀態(tài)下只是顯示0到9999HZ的頻率*/
/*原創(chuàng)作者:陳永剛*/
/*優(yōu)化整理:tiansir*/
/*測(cè)頻率原理*/
/*定時(shí)器T0作為定時(shí)裝置,編程設(shè)定定時(shí)1s,定時(shí)器T1對(duì)外部信號(hào)計(jì)數(shù),每1S中對(duì)計(jì)數(shù)結(jié)果處理*/
#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]
//通用數(shù)碼管顯示函數(shù),傳入數(shù)據(jù)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)
{
//千位數(shù)碼管
temp = number/1000%10;
if (temp)
{
SEG_Q = tab1[temp];
flag = 1;
}
else
{
SEG_Q = 0xff;//數(shù)碼管熄滅
flag = 0;
}
//百位數(shù)碼管
temp = number/100%10;
if(flag | temp)
{
SEG_B = tab1[temp];
flag = 1;
}
else
{
SEG_B = 0xff;//數(shù)碼管熄滅
flag = 0;
}
//十位數(shù)碼管
temp = number/10%10;
if(flag | temp) SEG_S = tab1[temp];
else SEG_S = 0xff;//數(shù)碼管熄滅
//個(gè)位數(shù)碼管
temp = number%10;
SEG_G = tab1[temp];
}
else
{
SEG_Q = 0xbf;
SEG_B = 0xbf;
SEG_S = 0xbf;
SEG_G = 0xbf;
}
}
//T0定時(shí)中斷,晶振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計(jì)數(shù),T0定時(shí)*/
TH1 = 0;
TL1 = 0;
//晶振22.1184M
TH0 = (65536-46063)/256;//定時(shí)25MS
TL0 = (65536-46063)%256;
TR0 = 1; //開定時(shí)器0
TR1 = 1; //啟動(dòng)計(jì)時(shí)器1
EA = 1; //開總中斷
ET0 = 1; //開定時(shí)器0中斷
while(1); //原地踏步,等待中斷
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -