測量頻率
我這裏用到了一個計數器,一個定時器,看一下圖片
C/T 主要是用來選擇是定時器還是計數器,置0爲定時器使用,置1爲計數器使用,這裏我把定時器0作爲計數器,定時器1作爲定時器來使用,可以令TMOD=0X04;
P34引腳是定時器0作爲計數器時對外部脈衝進行計數,每來一個脈衝就讓計數的值加1,定時器1定時1s後脈衝的個數就是測得的頻率
#include<stc15f2k60s2.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uchar code smg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
int yi,er,san,si,wu,liu,qi,ba,pin;
int t,maichong;
void shangdian();
void delay1ms(int ms);
void display1();
void display2();
void Timer0Init(void); //100微秒@11.0592MHz
void Timer1Init(void); //100微秒@11.0592MHz;
main()
{
shangdian();
Timer0Init();
Timer1Init();
while(1)
{
yi=pin/10000;
er=pin%10000/1000;
san=pin%10000%1000/100;
si=pin%10000%1000%100/10;
wu=pin%10;
display1();
display2();
}
}
void shangdian()
{
P2=0XA0;P0=0X00;
P2=0X80;P0=0XFF;
P2=0XC0;P0=0XFF;
P2=0XE0;P0=0XFF;
}
void delay1ms(int ms)
{
int i;
for(;ms>0;ms--)
{
for(i=845;i>0;i--) ;
}
}
void display1()
{
P2=0XC0;P0=0X01;
P2=0XE0;P0=smg[yi];
delay1ms(1);
P2=0XC0;P0=0X02;
P2=0XE0;P0=smg[er];
delay1ms(1);
P2=0XC0;P0=0X04;
P2=0XE0;P0=smg[san];
delay1ms(1);
P2=0XC0;P0=0X08;
P2=0XE0;P0=smg[si];
delay1ms(1);
}
void display2()
{
P2=0XC0;P0=0X10;
P2=0XE0;P0=smg[wu];
delay1ms(1);
P2=0XC0;P0=0X20;
P2=0XE0;P0=smg[liu];
delay1ms(1);
P2=0XC0;P0=0X40;
P2=0XE0;P0=smg[qi];
delay1ms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=smg[ba];
delay1ms(1);
P2=0XC0;P0=0X80;
P2=0XE0;P0=0xff;
}
void Timer0Init(void) //100微秒@11.0592MHz
{
AUXR |= 0x80; //定時器時鐘1T模式
TMOD = 0xf4; //設置定時器模式
TL0 = 0xff; //設置定時初值
TH0 = 0xff; //設置定時初值
TF0 = 0; //清除TF0標誌
TR0 = 1; //定時器0開始計時
ET0=1;
EA=1;
}
void time0() interrupt 1
{
maichong++;
}
void Timer1Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x40; //定時器時鐘1T模式
TMOD &= 0x0F; //設置定時器模式
TL1 = 0xCD; //設置定時初值
TH1 = 0xD4; //設置定時初值
TF1 = 0; //清除TF1標誌
TR1 = 1; //定時器1開始計時
ET1=1;
EA=1;
}
void time1() interrupt 3
{
t++;
if(t==1000)
{ TR0=0;
t=0;
pin=maichong;
maichong=0;
TR0=1;
}
}