📄 pulse_count.lst
字号:
C51 COMPILER V6.21 PULSE_COUNT 01/23/2002 17:54:56 PAGE 1
C51 COMPILER V6.21, COMPILATION OF MODULE PULSE_COUNT
OBJECT MODULE PLACED IN Pulse_count.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE Pulse_count.c OPTIMIZE(6,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*------------------------------------------------------------------*-
2
3 Pulse_Count.C (v1.00)
4
5 ------------------------------------------------------------------
6
7 Count pulses from a mechanical switch or similar device.
8 ___
9 Responds to falling edge of pulse: |___
10
11
12 COPYRIGHT
13 ---------
14
15 This code is associated with the book:
16
17 EMBEDDED C by Michael J. Pont
18 [Pearson Education, 2002: ISBN: 0-201-79523-X].
19
20 This code is copyright (c) 2001 by Michael J. Pont.
21
22 See book for copyright details and other information.
23
24 -*------------------------------------------------------------------*/
25
26 #include "Main.H"
27 #include "Port.H"
28
29 #include "Bargraph.H"
30 #include "Pulse_Count.H"
31
32
33 // ------ Private function prototypes ------------------------------
34 void PULSE_COUNT_Check_Below_Threshold(const tByte);
35
36 // ------ Public variable declarations -----------------------------
37 // The data to be displayed
38 extern tBargraph Data_G;
39
40 // ------ Public variable definitions -------------------------------
41 // Set only after falling edge is detected
42 bit Falling_edge_G;
43
44 // ------ Private variable definitions ------------------------------
45 // The results of successive tests of the pulse signal
46 // (NOTE: Can't have arrays of bits...)
47 static bit Test4, Test3, Test2, Test1, Test0;
48
49 static tByte Total_G = 0;
50 static tWord Calls_G = 0;
51
52 // ------ Private constants ----------------------------------------
53
54 // Allows changed of logic without hardware changes
55 #define HI_LEVEL (0)
C51 COMPILER V6.21 PULSE_COUNT 01/23/2002 17:54:56 PAGE 2
56 #define LO_LEVEL (1)
57
58 /*------------------------------------------------------------------*-
59
60 PULSE_COUNT_Init()
61
62 Initialization function for the switch library.
63
64 -*------------------------------------------------------------------*/
65 void PULSE_COUNT_Init(void)
66 {
67 1 Sw_pin = 1; // Use this pin for input
68 1
69 1 // The tests (see text)
70 1 Test4 = LO_LEVEL;
71 1 Test3 = LO_LEVEL;
72 1 Test2 = LO_LEVEL;
73 1 Test1 = LO_LEVEL;
74 1 Test0 = LO_LEVEL;
75 1 }
76
77 /*------------------------------------------------------------------*-
78
79 PULSE_COUNT_Check_Below_Threshold()
80
81 Checks to see if pulse count is below a specified
82 threshold value. If it is, sounds an alarm.
83
84 -*------------------------------------------------------------------*/
85 void PULSE_COUNT_Check_Below_Threshold(const tByte THRESHOLD)
86 {
87 1 if (Data_G < THRESHOLD)
88 1 {
89 2 Alarm_pin = 0;
90 2 }
91 1 else
92 1 {
93 2 Alarm_pin = 1;
94 2 }
95 1 }
96
97 /*------------------------------------------------------------------*-
98
99 PULSE_COUNT_Update()
100
101 This is the main switch function.
102
103 It should be called every 30 ms
104 (to allow for typical 20ms debounce time).
105
106 -*------------------------------------------------------------------*/
107 void PULSE_COUNT_Update(void)
108 {
109 1 // Clear timer flag
110 1 TF2 = 0;
111 1
112 1 // Shuffle the test results
113 1 Test4 = Test3;
114 1 Test3 = Test2;
115 1 Test2 = Test1;
116 1 Test1 = Test0;
117 1
C51 COMPILER V6.21 PULSE_COUNT 01/23/2002 17:54:56 PAGE 3
118 1 // Get latest test result
119 1 Test0 = Sw_pin;
120 1
121 1 // Required result:
122 1 // Test4 == HI_LEVEL
123 1 // Test3 == HI_LEVEL
124 1 // Test1 == LO_LEVEL
125 1 // Test0 == LO_LEVEL
126 1
127 1 if ((Test4 == HI_LEVEL) &&
128 1 (Test3 == HI_LEVEL) &&
129 1 (Test1 == LO_LEVEL) &&
130 1 (Test0 == LO_LEVEL))
131 1 {
132 2 // Falling edge detected
133 2 Falling_edge_G = 1;
134 2 }
135 1 else
136 1 {
137 2 // Default
138 2 Falling_edge_G = 0;
139 2 }
140 1
141 1 // Calculate average every 45 calls to this task
142 1 // - maximum count over this period is 9 pulses
143 1 // if (++Calls_G < 45)
144 1
145 1 // 450 used here for test purposes (in simulator)
146 1 // [Because there is a limit to how fast you can simulate pulses
147 1 // by hand...]
148 1 if (++Calls_G < 450)
149 1 {
150 2 Total_G += (int) Falling_edge_G;
151 2 }
152 1 else
153 1 {
154 2 // Update the display
155 2 Data_G = Total_G; // Max is 9
156 2 Total_G = 0;
157 2 Calls_G = 0;
158 2 PULSE_COUNT_Check_Below_Threshold(3);
159 2 BARGRAPH_Update();
160 2 }
161 1 }
162
163 /*------------------------------------------------------------------*-
164 ---- END OF FILE -------------------------------------------------
165 -*------------------------------------------------------------------*/
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 110 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 ----
IDATA SIZE = ---- ----
BIT SIZE = 6 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -