最高输入频率是主时钟频率的一半
要两个定时器,一个用来计数,另一个用来测量时间
9年前做的频率计:
- #include"reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- sbit ww=P2^0;//万位
- sbit qw=P2^1;//千位
- sbit bw=P2^2;//百位
- sbit sw=P2^3;//十位
- sbit gw=P2^4;//个位
- uchar wan,qian,bai,shi,ge,a;
- ulong count,b;
- uint code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极数码管不带小数点代码表
- void delay(uint i)//延时i*100微秒
- {
- uint j,k;
- for(j=i;j>0;j--)
- for(k=9;k>0;k--);
- }
- void init()//初始化函数
- {
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- PX0=0;
- PT0=1;
- IT0=1;
- EA=1;
- ET0=1;
- EX0=1;
- TR0=1;
- a=0;
- count=0;
- }
- void display()//显示函数
- {
- wan=count/10000;
- qian=count%10000/1000;
- bai=count%1000/100;
- shi=count%100/10;
- ge=count%10;
- P0=table[wan];
- ww=1;
- delay(5);
- ww=0;
- P0=table[qian];
- qw=1;
- delay(5);
- qw=0;
- P0=table[bai];
- bw=1;
- delay(5);
- bw=0;
- P0=table[shi];
- sw=1;
- delay(5);
- sw=0;
- P0=table[ge];
- gw=1;
- delay(5);
- gw=0;
- }
- void main()//主函数
- {
- init();
- while(1)
- {
- display();
- if(a>=20)
- {
- a=0;
- count=b;
- b=0;
- }
- }
- }
- void add() interrupt 0
- {
- b++;
- }
- void time() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- a++;
- }
复制代码
|