📄 startcount.lst
字号:
C51 COMPILER V8.02 STARTCOUNT 07/19/2007 15:19:54 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE STARTCOUNT
OBJECT MODULE PLACED IN startCount.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE startCount.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*===============================================================*/
2 /*函数名称: startCount.c */
3 /*函数功能: 对frenum个脉冲进行计时 */
4 /*入口参数: val-----------------------------------所计的脉冲数目*/
5 /*函数说明: T4被配置在P0.0口上面,加外部脉冲时最好加个3 k的上拉电阻
6 */
7 /*修改记录: 无修改记录 */
8 /*编写作者: t483-4-19chenyong */
9 /*编写日期: 2007-4-06 */
10 /*===============================================================*/
11 #include "common.h"
12 #include "delay.h"
13 #define fre_factor 73728
14 #define frenum 10 //设定的脉冲数
15 extern ulong freTime;
16 uchar tf2num,temp_page;
17 extern bit isnewdata;
18 bit isfilter;
19 ulong freTime; //所用时间
20 uchar h=0;
21
22 /*================================================================*/
23 /*开始计时 */
24 /*================================================================*/
25
26 void startCount(uint val)
27 {
28 1 // T4_Setvalue(1);
29 1 // while(!isfilter); //等待上升沿的到来
30 1 T4_Setvalue(val); //设定要计数的脉冲个数
31 1 T4RUN;
32 1 tf2num=0;
33 1 T2_Start();
34 1 isnewdata=0;
35 1 }
36 /*================================================================*/
37 /*计数器初始化说明: 计数器工作在自动重载模式下,采用系统时钟12分频
38 中断益处时需要软件对标志位清0,但是不能位寻址,只
39 能进行字操作.计数时,不需时钟设置.
40 C/T2(计数模式)--------------------------------1
41 CP/RL4(自动重载)------------------------------0
42 */
43 /*================================================================*/
44
45 void T4_Initial() //T4为计数模式
46 {
47 1 temp_page=SFRPAGE;
48 1 SFRPAGE=0x02;
49 1 TMR4CF=0x00;
50 1
51 1 TMR4CN=0x02;
52 1 SFRPAGE=0x00;
53 1 //CT4=1,T4为计数器模式,下降沿触发加1
54 1 EIE2|=0X04; //T4中断使能
55 1 SFRPAGE=temp_page;
C51 COMPILER V8.02 STARTCOUNT 07/19/2007 15:19:54 PAGE 2
56 1 }
57 /*================================================================*/
58 /*定时器2初始化说明:定时器2工作在自动重载模式下,采用系统时钟12分频
59 中断益处时需要软件对标志位清0,
60 C/T2(定时器模式)-----------------------------0
61 CP/RL2(自动重载)-----------------------------0
62 T2M(系统时钟12分频)--------------------------0
63 */
64 /*================================================================*/
65 void T2_Initial() //t2为定时器模式,采用系统时钟12分频
66 {
67 1 temp_page=SFRPAGE;
68 1 SFRPAGE=0x00;
69 1 TMR2CN=0x00;
70 1 TMR2CF=0x00;
71 1
72 1 RCAP2=0x0000;
73 1 TMR2=0x0000; //定时初始化
74 1 SFRPAGE=0x00;
75 1 IE|=0X20; //T2中断使能
76 1 SFRPAGE=temp_page;
77 1 }
78 /*================================================================*/
79 /*定时器2开始工作 */
80 /*================================================================*/
81 void T2_Start()
82 {
83 1 temp_page=SFRPAGE;
84 1 SFRPAGE=0x00;
85 1 TMR2=0x0000;
86 1 TF2=0;
87 1 TR2=1; //启动定时器
88 1 SFRPAGE=temp_page;
89 1 }
90 /*================================================================*/
91 /*设置计数器要计的脉冲数 */
92 /*================================================================*/
93 void T4_Setvalue(uint val)
94 {
95 1 temp_page=SFRPAGE;
96 1 SFRPAGE = 0x02;
97 1 RCAP4=(~val+1);
98 1 TMR4=RCAP4; //装载初始值
99 1 SFRPAGE=temp_page;
100 1 }
101
102 /*================================================================*/
103 /*计数器初始化 */
104 /*================================================================*/
105 void Count_Initial(void)
106 {
107 1
108 1
109 1 T2_Initial(); //定时器2初始化
110 1 T4_Initial(); //定时器4初始化
111 1 EA=1; //打开所有中断
112 1 delay_nus(10);
113 1 startCount(frenum); //开始数脉冲
114 1 isnewdata=0;
115 1
116 1 }
117 /*================================================================*/
C51 COMPILER V8.02 STARTCOUNT 07/19/2007 15:19:54 PAGE 3
118 /*读计数器的值 */
119 /*================================================================*/
120 float Read_Number(void)
121 {
122 1
123 1 float t3frequency[10],sum=0;
124 1 float average_frequncy=0,temp; //所测频率值
125 1 float return_value;
126 1 unsigned char n=0;
127 1 if (isfilter)
128 1 {
129 2 temp = (float)fre_factor/freTime;
130 2 temp = (float)temp*100;
131 2 t3frequency[h++] = (float)temp*100;
132 2 Port_Initial(); //端口初始化
133 2 Count_Initial();
134 2 delay_nms(100);
135 2 startCount(frenum);
136 2 if(h>=10)
137 2
138 2 //可以设置断点观测频率值
139 2 {
140 3 h=0;
141 3 for(n=0;n<10;n++)
142 3 {
143 4 sum+=t3frequency[n];
144 4
145 4 }
146 3 sum = sum-t3frequency[0];
147 3 return_value=(float)sum/9;
148 3 }
149 2 //结束if
150 2 }
151 1 return(return_value);
152 1
153 1 }
154
155 void T4_Service() interrupt 16
156 {
157 1 //frenum个频率计满,产生T4中断
158 1 temp_page=SFRPAGE;
159 1 SFRPAGE=0x00;
160 1 TR2=0;
161 1
162 1 freTime=TMR2; //计算所用时间
163 1 SFRPAGE = 0x02;
164 1 TR4=0; //关闭计数器
165 1 TF4=0;
166 1 isfilter=1;
167 1 freTime+=65536L*tf2num-34; //需要加上T2的溢出时间
168 1 // freTime=freTime*0.344140206;
169 1 //0.3441402此数据为经验值,对50个数据处理的结果
170 1 SFRPAGE=temp_page;
171 1 }
172 /*================================================================*/
173 /*中断服务函数 */
174 /*================================================================*/
175 void T2_Service() interrupt 5
176 { //T2定时溢出处理
177 1 temp_page=SFRPAGE;
178 1 SFRPAGE=0x00;
179 1 TF2=0;
C51 COMPILER V8.02 STARTCOUNT 07/19/2007 15:19:54 PAGE 4
180 1 tf2num++;
181 1 SFRPAGE=temp_page;
182 1 }
183
184 /*=============================end=================================*/
185
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 535 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 57
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -