📄 main.lst
字号:
C51 COMPILER V7.09 MAIN 07/01/2006 09:37:42 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*
2 Main.C
3 直流电机测速程序
4 */
5
6
7 #include <REG51.H>
8 #include <ABSACC.H>
9 #include <CTYPE.H>
10
11
12 //定义I/O接口
13 sbit PWM = P1^6; //PWM方波输出(接至ZDJA,控制直流电机转速)
14 sbit KEY1 = P2^0; //按键1(电机加速)
15 sbit KEY2 = P2^1; //按键2(电机减速)
16
17
18 //定义全局变量
19 unsigned char DispBuf[8]; //定义数码管显示缓冲区(由T1定时中断自动扫描)
20 unsigned char Speed; //预设的电机转速值,范围20~250
21 bit SWTR; //软件定时器运行标志
22 bit SWTF; //软件定时器溢出标志
23 unsigned int SWTV; //软件定时器定时值
24
25
26 /*
27 函数:T1INTSVC()
28 功能:定时器T1的中断服务函数(每100μs中断一次)
29 */
30 void T1INTSVC() interrupt 3
31 {
32 1 code unsigned char com[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
33 1 static unsigned char n = 0;
34 1 static unsigned char t = 0;
35 1 //扫描数码管
36 1 P0 = 0xFF; //暂停显示
37 1 XBYTE[0xE800] = ~DispBuf[n]; //更新扫描数据
38 1 P0 = ~com[n]; //重新显示
39 1 n++;
40 1 n &= 0x07;
41 1 //产生PWM方波,驱动电机
42 1 t++;
43 1 if ( t < Speed )
44 1 {
45 2 PWM = 1;
46 2 }
47 1 else
48 1 {
49 2 PWM = 0;
50 2 }
51 1 //模拟一个软件定时器
52 1 if ( SWTR )
53 1 {
54 2 if ( --SWTV == 0 ) SWTF = 1;
55 2 }
C51 COMPILER V7.09 MAIN 07/01/2006 09:37:42 PAGE 2
56 1 }
57
58
59 /*
60 函数:DispChar()
61 功能:在数码管上显示字符
62 参数:
63 x:显示位置(0~7)
64 c:要显示的字符(仅限0~9、AbCdEF和-)
65 */
66 void DispChar(unsigned char x, unsigned char c)
67 {
68 1 code unsigned char Tab[] =
69 1 {//0123456789AbCdEF的数码管字型数据
70 1 0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
71 1 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71
72 1 };
73 1 unsigned char t;
74 1 x &= 0x07;
75 1 x = 7 - x;
76 1 if ( c == '-' )
77 1 {
78 2 DispBuf[x] = 0x40;
79 2 }
80 1 else
81 1 {
82 2 t = toint(c);
83 2 if ( t < 16 )
84 2 {
85 3 DispBuf[x] = Tab[t];
86 3 }
87 2 }
88 1 }
89
90
91 /*
92 函数:DispStr()
93 功能:在数码管上显示字符串
94 参数:
95 x:起始显示位置(0~7)
96 *s:要显示的字符串(其中的字符仅限0~9、AbCdEF和-)
97 */
98 void DispStr(unsigned char x, unsigned char *s)
99 {
100 1 unsigned char c;
101 1 for (;;)
102 1 {
103 2 c = *s++;
104 2 if ( c == '\0' ) break;
105 2 DispChar(x++,c);
106 2 }
107 1 }
108
109
110 /*
111 函数:Delay()
112 功能:延时0.1ms~6.5536s
113 参数:
114 t>0时,延时(t*0.1)ms
115 t=0时,延时6.5536s
116 */
117 void Delay(unsigned int t)
C51 COMPILER V7.09 MAIN 07/01/2006 09:37:42 PAGE 3
118 {
119 1 SWTV = t; //软件定时器赋初值
120 1 SWTR = 1; //启动软件定时器
121 1 while ( !SWTF ); //等待溢出
122 1 SWTR = 0; //停止软件定时器
123 1 SWTF = 0; //清除溢出标志
124 1 }
125
126
127 /*
128 函数:ByteToStr()
129 功能:字节型变量c转换为十进制字符串
130 */
131 void ByteToStr(unsigned char idata *s, unsigned char c)
132 {
133 1 code unsigned char Tab[] = {100,10};
134 1 unsigned char i;
135 1 unsigned char t;
136 1 for ( i=0; i<2; i++ )
137 1 {
138 2 t = c / Tab[i];
139 2 *s++ = '0' + t;
140 2 c -= t * Tab[i];
141 2 }
142 1 *s++ = '0' + c;
143 1 *s = '\0';
144 1 }
145
146
147 /*
148 函数:MeasureSpeed()
149 功能:测量电机转速
150 返回:转速值(单位:转/秒)
151 */
152 unsigned char MeasureSpeed()
153 {
154 1 TH0 = TL0 = 0; //清除计数器T0
155 1 TR0 = 1; //启动计数器T0
156 1 Delay(2500); //延时250ms(因为直流电机转盘上正好有4个槽)
157 1 TR0 = 0; //停止计数
158 1 TF0 = 0; //清除(可能的)溢出标志
159 1 return TL0; //返回结果(单位:转/秒;已知电机转速不会超过100)
160 1 }
161
162
163 /*
164 函数:KeyScan()
165 功能:键盘扫描
166 返回:扫描到的键值
167 */
168 unsigned char KeyScan()
169 {
170 1 unsigned char k = '\0';
171 1 if ( KEY1 == 0 ) k = '+';
172 1 if ( KEY2 == 0 ) k = '-';
173 1 return k;
174 1 }
175
176
177 /*
178 函数:SysInit()
179 功能:系统初始化
C51 COMPILER V7.09 MAIN 07/01/2006 09:37:42 PAGE 4
180 */
181 void SysInit()
182 {
183 1 unsigned char i;
184 1 for ( i=0; i<8; i++ )
185 1 {
186 2 DispBuf[i] = 0x00; //数码管初始化为全灭
187 2 }
188 1 Speed = 30; //设置电机初始转速
189 1 SWTR = 0;
190 1 SWTF = 0;
191 1 SWTV = 0;
192 1 TMOD &= 0x0F;
193 1 TMOD |= 0x20; //设置T1为8位定时器,自动重装
194 1 TH1 = TL1 = 0xA4; //设置T1初值,对应100μs
195 1 ET1 = 1; //使能T1中断
196 1 TR1 = 1; //启动T1
197 1 EA = 1; //使能总中断
198 1 TMOD &= 0xF0;
199 1 TMOD |= 0x05;
200 1 }
201
202
203 void main()
204 {
205 1 unsigned char k;
206 1 unsigned char spd;
207 1 unsigned char s[4];
208 1 SysInit();
209 1 for (;;)
210 1 {
211 2 for (;;)
212 2 {
213 3 spd = MeasureSpeed();
214 3 ByteToStr(s,spd);
215 3 DispStr(5,s);
216 3 k = KeyScan(); //键盘扫描
217 3 if ( k != '\0' ) break; //如果有键按下,退出循环
218 3 }
219 2 switch ( k ) //判断键值,执行具体功能
220 2 {
221 3 case '+':
222 3 if ( Speed < 250 ) Speed += 5;
223 3 break;
224 3 case '-':
225 3 if ( Speed > 20 ) Speed -= 5;
226 3 break;
227 3 default:
228 3 break;
229 3 }
230 2 for (;;)
231 2 {
232 3 spd = MeasureSpeed();
233 3 ByteToStr(s,spd);
234 3 DispStr(5,s);
235 3 if ( KeyScan() == '\0' ) break; //如果按键抬起,退出循环
236 3 }
237 2 }
238 1 }
239
C51 COMPILER V7.09 MAIN 07/01/2006 09:37:42 PAGE 5
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 392 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 11
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -