51单片机 | 频率测量控制实现
————————————————————————————————————————————
频率测量方法:
测频法:测试限定时间内检测脉冲的个数(1s)
测周法:采样N个脉冲所使用的时间
————————————————————————————————————————————
测频法实验:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
设计要求:
通过测频法测出时钟发生器的频率并显示在显示屏上
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现过程:
通过DCLOCK时钟发生器产生时钟频率,如下图所示,一秒钟产生233个频率
T0接收时钟发生器产生的脉冲,使用count变量计数,定时器T1完成1s后关闭中断,并将此时的count显示出来
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
元件清单:
AT89C51
7SEG-MPX8-CC-BLUE
DCLOCK(在电压探针列表中)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
实现代码:
1 #include
2 typedef unsigned int uint;
3 typedef unsigned char uchar;
4 uchar code number[] =
5 {
6 0xFC, 0x60, 0xDA, 0xF2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0xEE, 0x3E, 0x9C, 0x7A, 0x9E, 0x8E
7 };
8 uchar code address[] =
9 {
10 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F
11 };
12 uint count = 0, time = 0, temp; //一定要用int类型,char类型只有8位,计数只到255
13 bit flag = 0;
14 void Delay(uchar m)
15 {
16 while(--m);
17 }
18 int main()
19 {
20 uchar i;
21 EA = 1;
22 ET0 = 1;
23 ET1 = 1;
24 TMOD = 0x16; //定时器1为方式1,计数器0为方式2,T0选择C/T=1,计数器方式,脉冲由外部提供
25 TH0 = 0xff;
26 TL0 = 0xff;
27 TR0 = 1;
28 TH1 = (65536 - 50000) / 256;
29 TL1 = (65536 - 50000) % 256;
30 TR1 = 1;
31 while(1)
32 {
33 if (flag == 1)
34 {
35 temp = count;
36 for (i = 0; i < 8; ++i)
37 {
38 P2 = address[i];
39 P1 = number[temp % 10];
40 temp = temp / 10;
41 Delay(500);
42 }
43 }
44 }
45 }
46 void Count0()interrupt 1
47 {
48 ++count;
49 }
50 void Time1()interrupt 3
51 {
52 TH1 = (65536 - 50000) / 256;
53 TL1 = (65536 - 50000) % 256;
54 ++time;
55 if (time == 20)
56 {
57 EA = 0;
58 flag = 1;
59 }
60 }