8052計(jì)數(shù)器(定時(shí)器0和計(jì)數(shù)器1)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
之前由于同學(xué)的一個(gè)小實(shí)驗(yàn),需要用到頻率計(jì),所以自己想搞一個(gè)出來(lái),于是網(wǎng)上找了很多資料,簡(jiǎn)單的有用8052單片機(jī)的定時(shí)器和計(jì)數(shù)器的結(jié)合來(lái)測(cè)其信號(hào)的頻率,還有的是c8051f的捕捉功能,想來(lái)想去,還是想用用自己熟悉的8052的計(jì)數(shù)器功能,畢竟平時(shí)都用的是定時(shí)器功能,很少用到計(jì)數(shù)器功能,以便更加深入的運(yùn)用8052,以后再學(xué)習(xí)C8051F。
搞了好幾天,時(shí)鐘沒(méi)有結(jié)果,計(jì)數(shù)功能倒是有了,但是不能在1s的時(shí)間里計(jì)數(shù),很是頭痛,忽然有一天,我的同學(xué)找到了一段代碼,說(shuō)是可以運(yùn)行的,于是我拿過(guò)來(lái),把LED改了一改,燒錄之后,還真的成功了!甚是大喜啊!這里附上源代碼;
/*******http://hi.baidu.com/zhangjiayue123/home************************************
函數(shù)功能:51單片機(jī)制作的頻率計(jì)(當(dāng)然這個(gè)頻率計(jì)的頻率范圍是有限制的理論值為2Hz-1MHz)
編譯環(huán)境:keil4
設(shè)計(jì)思想:測(cè)頻率,其實(shí)就是一個(gè)定時(shí)計(jì)數(shù)的過(guò)程,在一定時(shí)間內(nèi),檢測(cè)脈沖的個(gè)數(shù),最后用脈沖個(gè)數(shù)除以時(shí)間便可以得到頻率
修改 : LiMing WangQiDong
板子 : CCDZ-C board
CPU : STC89C52RC
晶振 : 12MHz
修改部分: LED顯示部分 4位顯示 2Hz - 9999Hz
版本 : 0.1.0
********http://hi.baidu.com/zhangjiayue123/home****************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
//uchar seg_du[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //數(shù)碼管的段選
uchar seg_du[]={
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,0x7f,0x6f}; //數(shù)碼管的段選
uchar dbuf[4]={0,0,0,0}; //用來(lái)裝顯示數(shù)據(jù)的空數(shù)組
uint count;
uint cou,cou1;
void delay(void) //延時(shí)函數(shù)用于數(shù)碼管動(dòng)態(tài)掃描
{
uchar i;
for(i=0;i<110;i++)
;
}
void display() // 數(shù)碼管顯示函數(shù)
{
dula=1;
P0=seg_du[dbuf[3]];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay();
//
dula=1;
P0=seg_du[dbuf[2]];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay();
//
dula=1;
P0=seg_du[dbuf[1]];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay();
//
dula=1;
P0=seg_du[dbuf[0]];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay();
}
void timer0 (void )interrupt 1 //定時(shí)器中斷,用與定時(shí)計(jì)數(shù)
{
count++;
if(count == 4000) //定時(shí)1s,
{
count=0; // 將定時(shí)標(biāo)志清零
TR1=0; //關(guān)閉計(jì)數(shù)器
cou1=TL1-6; //將小于250次脈沖的計(jì)數(shù)加上
dbuf[3]=(cou*250+cou1)/1000;
dbuf[2]=((cou*250+cou1)%1000)/100;
dbuf[1]=((cou*250+cou1)%100)/10;
dbuf[0]=(cou*250+cou1)%10; //顯示處理函數(shù)
cou=0; //計(jì)數(shù)器清零
TL1=6; // 打開(kāi)計(jì)數(shù)器中斷
TR1=1; //開(kāi)啟計(jì)數(shù)器,使之工作
}
}
void time1(void )interrupt 3 //計(jì)數(shù)器中斷,用于計(jì)數(shù)
{
cou++;
}
void time0_init() //定時(shí)器0初始化
{
TMOD=0x62; // 設(shè)置定時(shí)器0,和計(jì)數(shù)器1的模式
TH0=6;
TL0=6; //定時(shí)器的初值,用于中斷一次計(jì)時(shí)250us
ET0=1; //開(kāi)定時(shí)器0中斷
TR0=1; //開(kāi)定時(shí)器0
}
void time1_init() // 計(jì)數(shù)器1初始化
{
TH1=6;
TL1=6; //裝載計(jì)數(shù)器的初值
ET1=1; //開(kāi)計(jì)數(shù)器1 中斷
TR1=1; //開(kāi)計(jì)數(shù)器1
EA=1; //開(kāi)總中斷
}
void main()
{
count=0;
time0_init();
time1_init();
while(1)
{
display();
}
}
也感謝網(wǎng)上的網(wǎng)友提供,
結(jié)果還是可以的,只不過(guò)和自由四位顯示,附上幾張照片:
信號(hào)發(fā)生器的頻率為5.677kHZ,LED上顯示還可以吧。。。